- signal(SIGINT, sigint_handler);
- setup_io();
-
- //Enable 200MHz CLK output on GPIO4, adjust divider and pll source depending on pi model
- printf("Enable GPCLK0 on GPIO4\n");
-
- *(gpclk+ (CLK_GP0_CTL/4)) = CLK_PASSWD | (1 << 5);
- usleep(10);
- while ( (*(gpclk+(CLK_GP0_CTL/4))) & (1 << 7));
- usleep(100);
- *(gpclk+(CLK_GP0_DIV/4)) = CLK_PASSWD | (6 << 12); //divider , 6=200MHz on pi3
- usleep(10);
- *(gpclk+(CLK_GP0_CTL/4)) = CLK_PASSWD | 5 | (1 << 4); //pll? 6=plld, 5=pllc
- usleep(10);
- while (((*(gpclk+(CLK_GP0_CTL/4))) & (1 << 7))== 0);
- usleep(100);
-
- SET_GPIO_ALT(4,0); //gpclk0
-
- //set SA to output
- INP_GPIO(2);
- OUT_GPIO(2);
- INP_GPIO(3);
- OUT_GPIO(3);
- INP_GPIO(5);
- OUT_GPIO(5);
-
- //set gpio0 (aux0) and gpio1 (aux1) to input
- INP_GPIO(0);
- INP_GPIO(1);
-
- // Set GPIO pins 6,7 and 8-23 to output
- for (g=6; g<=23; g++)
- {
- INP_GPIO(g);
- OUT_GPIO(g);
- }
- printf ("Precalculate GPIO8-23 aus Output\n");
- gpfsel0_o =*(gpio); //store gpio ddr
- printf ("gpfsel0: %#x\n", gpfsel0_o);
- gpfsel1_o =*(gpio+1); //store gpio ddr
- printf ("gpfsel1: %#x\n", gpfsel1_o);
- gpfsel2_o =*(gpio+2); //store gpio ddr
- printf ("gpfsel2: %#x\n", gpfsel2_o);
-
- // Set GPIO pins 8-23 to input
- for (g=8; g<=23; g++)
- {
- INP_GPIO(g);
- }
- printf ("Precalculate GPIO8-23 as Input\n");
- gpfsel0 =*(gpio); //store gpio ddr
- printf ("gpfsel0: %#x\n", gpfsel0);
- gpfsel1 =*(gpio+1); //store gpio ddr
- printf ("gpfsel1: %#x\n", gpfsel1);
- gpfsel2 =*(gpio+2); //store gpio ddr
- printf ("gpfsel2: %#x\n", gpfsel2);
-
- GPIO_CLR = 1<<2;
- GPIO_CLR = 1<<3;
- GPIO_SET = 1<<5;
-
- GPIO_SET = 1<<6;
- GPIO_SET = 1<<7;
-
- //reset cpld statemachine first
-
- write_reg(0x01);
- usleep(100);
- usleep(1500);
- write_reg(0x00);
- usleep(100);
-
-/*
- maprom = 0;
- FILE * fp;
- fp = fopen("kick.rom", "rb");
- if (!fp)
- {
- printf("kick.rom cannot be opened\n");
- } else {
- printf("kick.rom found, using that instead of motherboard rom\n");
- while (1)
- {
- unsigned int reads = fread(&g_kick, sizeof(g_kick), 1, fp);
- if (reads == 0){
- printf("failed loading kick.rom\n");
- }else{
- printf("loaded kick.rom\n");
- maprom = 1;
- }
- break;
- }
- }
- */
- maprom = 1;
- int fd=0;
- fd = open("kick.rom",O_RDONLY);
- if(fd<1){
- printf("failed loading kick.rom, using motherboard kickstart\n");
- maprom = 0;
- }else{
- int size = (int)lseek(fd, 0, SEEK_END);
- if(size==0x40000){
- lseek(fd, 0, SEEK_SET);
- read(fd, &g_kick, size);
- lseek(fd, 0, SEEK_SET);
- read(fd, &g_kick[0x40000], size);
- }else{
- lseek(fd, 0, SEEK_SET);
- read(fd, &g_kick, size);
- }
- printf("loaded kick.rom with size %d kib\n",size/1024);
- }
-
- ovl=1;
- m68k_write_memory_8(0xbfe201,0x0001); //AMIGA OVL
- m68k_write_memory_8(0xbfe001,0x0001); //AMIGA OVL high (ROM@0x0)
-
-
- usleep(1500);
-
- m68k_init();
- m68k_set_cpu_type(M68K_CPU_TYPE_68030);
- m68k_pulse_reset();
-
- if (maprom == 1){
- m68k_set_reg(M68K_REG_PC, 0xF80002);
- }else{
- m68k_set_reg(M68K_REG_PC, 0x0);
- }
-
-/*
- pthread_t id;
- int err;
- //err = pthread_create(&id, NULL, &iplThread, NULL);
- if (err != 0)
- printf("\ncan't create IPL thread :[%s]", strerror(err));
- else
- printf("\n IPL Thread created successfully\n");
-*/
-
- m68k_pulse_reset();
- while(42) {
-
- m68k_execute(3000);
- if (GET_GPIO(1) == 0){
- srdata = read_reg();
- m68k_set_irq((srdata >> 13)&0xff);
- } else {
- m68k_set_irq(0);
- };
- }
-
- return 0;