]> git.sesse.net Git - pistorm/commitdiff
started kickrom loading from filesystem,not functional yet...
authorClaude <claude.schwarz@gmail.com>
Wed, 18 Nov 2020 18:50:14 +0000 (18:50 +0000)
committerClaude <claude.schwarz@gmail.com>
Wed, 18 Nov 2020 18:50:14 +0000 (18:50 +0000)
emulator.c

index a931df6f3b497d5deca4fc255fd28023e16d289f..91d80a5527e6bda57cc67b95eba0e869d0cb3531 100644 (file)
@@ -107,8 +107,12 @@ volatile uint32_t srdata2;
 volatile uint32_t srdata2_old;
 
 
+unsigned char g_kick[524288];
 unsigned char g_ram[FASTSIZE+1];                 /* RAM */
 unsigned char toggle;
+static volatile unsigned char ovl;
+static volatile unsigned char maprom;
+
 
 /* Signal Handler for SIGINT */
 void sigint_handler(int sig_num)
@@ -258,9 +262,31 @@ const struct sched_param priority = {99};
  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;
+  }
+ }
+
+ ovl=1;
+ m68k_write_memory_8(0xbfe201,0x0001); //AMIGA OVL
+ m68k_write_memory_8(0xbfe001,0x0001); //AMIGA OVL high (ROM@0x0)
 
- write8(0xbfe201,0x0001); //AMIGA OVL
- write8(0xbfe001,0x0001); //AMIGA OVL high (ROM@0x0)
 
  usleep(1500);
 
@@ -350,6 +376,13 @@ unsigned int  m68k_read_memory_8(unsigned int address){
         return g_ram[address- FASTBASE];
         }
 
+        if (maprom == 1){
+            if (ovl == 1 && address<0x07FFFF ){
+               return g_kick[address];}
+              if (ovl == 0 && (address>0xF80000-1 && address<0xFFFFFF)){
+               return g_kick[address-0xF80000];}
+        }
+
         return read8((uint32_t)address);
 }
 
@@ -364,13 +397,24 @@ unsigned int  m68k_read_memory_16(unsigned int address){
         value = (value << 8) | (value >> 8);
        return value;
         }
+
+       if (maprom == 1){
+           if (ovl == 1 && address<0x07FFFF ){
+              uint16_t value = *(uint16_t*)&g_kick[address];
+              return (value << 8) | (value >> 8);}
+              if (ovl == 0 && (address>0xF80000-1 && address<0xFFFFFF)){
+              //printf("kread16/n");
+              uint16_t value = *(uint16_t*)&g_kick[address-0xF80000];
+              return (value << 8) | (value >> 8);}
+        }
+
         return (unsigned int)read16((uint32_t)address);
 }
 
 unsigned int  m68k_read_memory_32(unsigned int address){
 
        if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
-        return readGayleL(address);
+         return readGayleL(address);
        }
 
        if(address>FASTBASE){
@@ -379,6 +423,19 @@ unsigned int  m68k_read_memory_32(unsigned int address){
         return value << 16 | value >> 16;
         }
 
+        if (maprom == 1){
+            if (ovl == 1 && address<0x07FFFF){
+              uint32_t value = *(uint32_t*)&g_kick[address];
+              value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
+              return value << 16 | value >> 16;}
+
+              if (ovl == 0 && (address>0xF80000-1 && address<0xFFFFFF)){
+               //printf("kread32/n");
+              uint32_t value = *(uint32_t*)&g_kick[address-0xF80000];
+               value = ((value << 8) & 0xFF00FF00 ) | ((value >> 8) & 0xFF00FF );
+               return value << 16 | value >> 16;}
+        }
+
         uint16_t a = read16(address);
         uint16_t b = read16(address+2);
        return (a << 16) | b;
@@ -387,6 +444,12 @@ unsigned int  m68k_read_memory_32(unsigned int address){
 void m68k_write_memory_8(unsigned int address, unsigned int value){
 
 
+       if (address == 0xbfe001){
+       ovl = (value & (1<<0));
+        //printf("OVL:%x\n", ovl );
+       }
+
+
        if(address>GAYLEBASE && address<GAYLEBASE + GAYLESIZE){
         writeGayleB(address, value);
         return;
@@ -410,6 +473,9 @@ void m68k_write_memory_16(unsigned int address, unsigned int value){
         return;
        }
 
+       if (address == 0xbfe001)
+       printf("16CIA Output:%x\n", value );
+
 
       if(address>FASTBASE){
        uint16_t* dest = (uint16_t*)&g_ram[address- FASTBASE];