mcd: text shows up
authornotaz <notasas@gmail.com>
Tue, 2 Jan 2007 22:17:05 +0000 (22:17 +0000)
committernotaz <notasas@gmail.com>
Tue, 2 Jan 2007 22:17:05 +0000 (22:17 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@14 be3aeb3a-fb24-0410-a615-afba39da0efa

13 files changed:
Pico/Pico.c
Pico/VideoPort.c
Pico/cd/LC89510.c
Pico/cd/Memory.c
Pico/cd/Pico.c
Pico/cd/Sek.c
cpu/musashi/m68kcpu.c
cpu/musashi/m68kcpu.h
platform/gp2x/Makefile
platform/gp2x/emu.c
platform/gp2x/menu.c
platform/gp2x/version.h
platform/linux/port_config.h

index b430d66..90b06d6 100644 (file)
@@ -23,7 +23,7 @@ struct PicoSRAM SRam;
 int z80startCycle = 0, z80stopCycle = 0; // in 68k cycles\r
 //int z80ExtraCycles = 0;\r
 int PicoPad[2]; // Joypads, format is SACB RLDU\r
-int PicoMCD = 0; // mega CD status\r
+int PicoMCD = 1; // mega CD status: scd_started\r
 \r
 // to be called once on emu init\r
 int PicoInit(void)\r
index 75267c3..527f2f0 100644 (file)
@@ -58,26 +58,6 @@ static unsigned int VideoRead()
   return d;\r
 }\r
 \r
-#if 0\r
-// calculate the number of cycles 68k->VDP dma operation would take\r
-static int DmaSlowBurn(int len)\r
-{\r
-  // test: Legend of Galahad, Time Killers\r
-  int burn,maxlen,line=Pico.m.scanline;\r
-\r
-  if(line == -1) line=vcounts[SekCyclesDone()>>8];\r
-  maxlen=(224-line)*18;\r
-  if(len <= maxlen)\r
-    burn = len*(((488<<8)/18))>>8;\r
-  else {\r
-    burn  = maxlen*(((488<<8)/18))>>8;\r
-    burn += (len-maxlen)*(((488<<8)/180))>>8;\r
-  }\r
-\r
-  return burn;\r
-}\r
-#endif\r
-\r
 static int GetDmaLength()\r
 {\r
   struct PicoVideo *pvid=&Pico.video;\r
@@ -95,7 +75,7 @@ static void DmaSlow(int len)
   u16 *pd=0, *pdend, *r;\r
   unsigned int a=Pico.video.addr, a2, d;\r
   unsigned char inc=Pico.video.reg[0xf];\r
-  unsigned int source; // , burn;\r
+  unsigned int source;\r
 \r
   source =Pico.video.reg[0x15]<<1;\r
   source|=Pico.video.reg[0x16]<<9;\r
@@ -105,27 +85,22 @@ static void DmaSlow(int len)
     Pico.video.type, source, a, len, inc, (Pico.video.status&8)||!(Pico.video.reg[1]&0x40),\r
     Pico.m.scanline, SekCyclesDone(), SekPc);\r
 \r
+  if(Pico.m.scanline != -1) {\r
+    Pico.m.dma_bytes += len;\r
+    SekSetCyclesLeft(SekCyclesLeft - CheckDMA());\r
+  } else {\r
+    // be approximate in non-accurate mode\r
+    SekSetCyclesLeft(SekCyclesLeft - (len*(((488<<8)/167))>>8));\r
+  }\r
+\r
   if ((source&0xe00000)==0xe00000) { pd=(u16 *)(Pico.ram+(source&0xfffe)); pdend=(u16 *)(Pico.ram+0x10000); } // Ram\r
-  else if(source<Pico.romsize)     { pd=(u16 *)(Pico.rom+(source&~1)); pdend=(u16 *)(Pico.rom+Pico.romsize); } // Rom\r
-  else return; // Invalid source address\r
-\r
-#if 0\r
-  // CPU is stopped during DMA, so we burn some cycles to compensate that\r
-  if((Pico.video.status&8)||!(Pico.video.reg[1]&0x40)) { // vblank?\r
-      burn = (len*(((488<<8)/167))>>8); // very approximate\r
-      if(!(Pico.video.status&8)) burn+=burn>>1; // a hack for Legend of Galahad\r
-  } else burn = DmaSlowBurn(len);\r
-  SekCyclesBurn(burn);\r
-#else\r
-  Pico.m.dma_bytes += len;\r
-#endif\r
-  //if(!(Pico.video.status&8))\r
-//    SekEndRun(0);\r
-       //Pico.m.dma_endcycles  = 0;//SekCyclesLeft;\r
-       //Pico.m.dma_endcycles -= Pico.m.dma_endcycles>>3; // hack\r
-       SekSetCyclesLeft(SekCyclesLeft - CheckDMA());\r
-//    CheckDMA();\r
-//  dprintf("DmaSlow burn: %i @ %06x", burn, SekPc);\r
+  else if(PicoMCD & 1) {\r
+    if(source<0x20000) { pd=(u16 *)(Pico_mcd->bios+(source&~1)); pdend=(u16 *)(Pico_mcd->bios+0x20000); } // Bios area\r
+    else { dprintf("unsupported src"); return; } // Invalid source address\r
+  } else {\r
+    if(source<Pico.romsize) { pd=(u16 *)(Pico.rom+(source&~1)); pdend=(u16 *)(Pico.rom+Pico.romsize); } // Rom\r
+    else { dprintf("invalid dma src"); return; } // Invalid source address\r
+  }\r
 \r
   switch (Pico.video.type)\r
   {\r
index 2b6079d..96d0966 100644 (file)
@@ -536,7 +536,7 @@ void CDD_Export_Status(void)
        csum += Pico_mcd->cdd.Ext;\r
        Pico_mcd->s68k_regs[0x38+9] = ~csum & 0xf;\r
 \r
-       Pico_mcd->s68k_regs[0x36] &= 3; // CDD.Control\r
+       Pico_mcd->s68k_regs[0x37] &= 3; // CDD.Control\r
 \r
        if (Pico_mcd->s68k_regs[0x33] & (1<<4))\r
        {\r
index a1cadb1..cbaeb9d 100644 (file)
@@ -34,11 +34,14 @@ static u32 m68k_reg_read16(u32 a, int realsize)
 {\r
   u32 d=0;\r
   a &= 0x3e;\r
-  dprintf("m68k_regs r%2i: [%02x] @%06x", realsize&~1, a+(realsize&1), SekPc);\r
+  // dprintf("m68k_regs r%2i: [%02x] @%06x", realsize&~1, a+(realsize&1), SekPc);\r
 \r
   switch (a) {\r
+    case 0:\r
+      d = ((Pico_mcd->s68k_regs[0x33]<<13)&0x8000) | Pico_mcd->m68k_regs[1]; // here IFL2 is always 0, just like in Gens\r
+      goto end;\r
     case 2:\r
-      d = (Pico_mcd->m68k_regs[a]<<8) | Pico_mcd->m68k_regs[a+1] | 1; // for now 2M to m68k\r
+      d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0xc7);\r
       goto end;\r
     case 8:\r
       dprintf("m68k host data read");\r
@@ -64,54 +67,66 @@ static u32 m68k_reg_read16(u32 a, int realsize)
 \r
 end:\r
 \r
-  dprintf("ret = %04x", d);\r
+  // dprintf("ret = %04x", d);\r
   return d;\r
 }\r
 \r
 static void m68k_reg_write8(u32 a, u32 d, int realsize)\r
 {\r
   a &= 0x3f;\r
-  dprintf("m68k_regs w%2i: [%02x] %02x @%06x", realsize, a, d, SekPc);\r
+  // dprintf("m68k_regs w%2i: [%02x] %02x @%06x", realsize, a, d, SekPc);\r
 \r
   switch (a) {\r
     case 0:\r
+      d &= 1;\r
       if ((d&1) && (Pico_mcd->s68k_regs[0x33]&(1<<2))) { dprintf("m68k: s68k irq 2"); SekInterruptS68k(2); }\r
       break;\r
     case 1:\r
+      d &= 3;\r
       if (!(d&1)) PicoMCD |= 2; // reset pending, needed to be sure we fetch the right vectors on reset\r
       if ( (Pico_mcd->m68k_regs[1]&1) != (d&1)) dprintf("m68k: s68k reset %i", !(d&1));\r
       if ( (Pico_mcd->m68k_regs[1]&2) != (d&2)) dprintf("m68k: s68k brq %i", (d&2)>>1);\r
       if (/*!(Pico_mcd->m68k_regs[1]&1) &&*/ (PicoMCD&2) && (d&3)==1) {\r
         SekResetS68k(); // S68k comes out of RESET or BRQ state\r
        PicoMCD&=~2;\r
-       dprintf("m68k: resetting s68k");\r
+       dprintf("m68k: resetting s68k, cycles=%i", SekCyclesLeft);\r
       }\r
       break;\r
+    case 2:\r
+      Pico_mcd->s68k_regs[2] = d; // really use s68k side register\r
+      return;\r
     case 3:\r
-      if ((Pico_mcd->m68k_regs[3]>>6) != ((d>>6)&3))\r
-        dprintf("m68k: prg bank: %i -> %i", (Pico_mcd->m68k_regs[a]>>6), ((d>>6)&3));\r
-      if ((Pico_mcd->m68k_regs[3]&4) != (d&4)) dprintf("m68k: ram mode %i mbit", (d&4) ? 1 : 2);\r
-      if ((Pico_mcd->m68k_regs[3]&2) != (d&2)) dprintf("m68k: %s", (d&4) ? ((d&2) ? "word swap req" : "noop?") :\r
-                                                   ((d&2) ? "word ram to s68k" : "word ram to m68k"));\r
-      break;\r
+      d &= 0xc2;\r
+      if ((Pico_mcd->s68k_regs[3]>>6) != ((d>>6)&3))\r
+        dprintf("m68k: prg bank: %i -> %i", (Pico_mcd->s68k_regs[a]>>6), ((d>>6)&3));\r
+      //if ((Pico_mcd->s68k_regs[3]&4) != (d&4)) dprintf("m68k: ram mode %i mbit", (d&4) ? 1 : 2);\r
+      //if ((Pico_mcd->s68k_regs[3]&2) != (d&2)) dprintf("m68k: %s", (d&4) ? ((d&2) ? "word swap req" : "noop?") :\r
+      //                                             ((d&2) ? "word ram to s68k" : "word ram to m68k"));\r
+      d |= Pico_mcd->s68k_regs[3]&0x1d;\r
+      if (d & 2) d &= ~1; // returning word RAM to s68k\r
+      Pico_mcd->s68k_regs[3] = d; // really use s68k side register\r
+      return;\r
     case 0xe:\r
-      dprintf("m68k: comm flag: %02x", d);\r
+      //dprintf("m68k: comm flag: %02x", d);\r
 \r
-      dprintf("s68k @ %06x", SekPcS68k);\r
+      //dprintf("s68k @ %06x", SekPcS68k);\r
 \r
       Pico_mcd->s68k_regs[0xe] = d;\r
       break;\r
   }\r
 \r
-  if ((a&0xff) == 0x10) {\r
+  if (a < 0x10) {\r
+    Pico_mcd->m68k_regs[a] = (u8) d;\r
+    return;\r
+  }\r
+\r
+  if ((a&0xf0) == 0x10) {\r
       Pico_mcd->s68k_regs[a] = d;\r
+      return;\r
   }\r
 \r
   if (a >= 0x20 || (a >= 0xa && a <= 0xd) || a == 0x0f)\r
     dprintf("m68k: invalid write?");\r
-\r
-  if (a < 0x10)\r
-    Pico_mcd->m68k_regs[a] = (u8) d;\r
 }\r
 \r
 \r
@@ -121,11 +136,14 @@ static u32 s68k_reg_read16(u32 a, int realsize)
   u32 d=0;\r
   a &= 0x1fe;\r
 \r
-  dprintf("s68k_regs r%2i: [%02x] @ %06x", realsize&~1, a+(realsize&1), SekPcS68k);\r
+  // dprintf("s68k_regs r%2i: [%02x] @ %06x", realsize&~1, a+(realsize&1), SekPcS68k);\r
 \r
   switch (a) {\r
     case 0:\r
       d = 1; goto end; // ver = 0, not in reset state\r
+    case 2:\r
+      d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0x1f);\r
+      goto end;\r
     case 6:\r
       d = CDC_Read_Reg();\r
       goto end;\r
@@ -145,7 +163,7 @@ static u32 s68k_reg_read16(u32 a, int realsize)
 \r
 end:\r
 \r
-  dprintf("ret = %04x", d);\r
+  // dprintf("ret = %04x", d);\r
 \r
   return d;\r
 }\r
@@ -153,10 +171,17 @@ end:
 static void s68k_reg_write8(u32 a, u32 d, int realsize)\r
 {\r
   a &= 0x1ff;\r
-  dprintf("s68k_regs w%2i: [%02x] %02x @ %06x", realsize, a, d, SekPcS68k);\r
+  //dprintf("s68k_regs w%2i: [%02x] %02x @ %06x", realsize, a, d, SekPcS68k);\r
 \r
   // TODO: review against Gens\r
   switch (a) {\r
+    case 2:\r
+      return; // only m68k can change WP\r
+    case 3:\r
+      d &= 0x1d;\r
+      d |= Pico_mcd->s68k_regs[3]&0xc2;\r
+      if (d&1) d &= ~2; // returning word RAM to m68k\r
+      break;\r
     case 4:\r
       dprintf("s68k CDC dest: %x", d&7);\r
       Pico_mcd->s68k_regs[4] = (Pico_mcd->s68k_regs[4]&0xC0) | (d&7); // CDC mode\r
@@ -180,12 +205,17 @@ static void s68k_reg_write8(u32 a, u32 d, int realsize)
     case 0x34: // fader\r
       Pico_mcd->s68k_regs[a] = (u8) d & 0x7f;\r
       return;\r
-    case 0x37:\r
-      if ((d&4) && !(Pico_mcd->s68k_regs[0x37]&4)) {\r
+    case 0x36:\r
+      return; // d/m bit is unsetable\r
+    case 0x37: {\r
+      u32 d_old = Pico_mcd->s68k_regs[0x37];\r
+      Pico_mcd->s68k_regs[0x37] = d&7;\r
+      if ((d&4) && !(d_old&4)) {\r
         CDD_Export_Status();\r
        // counter75hz = 0; // ???\r
       }\r
-      break;\r
+      return;\r
+    }\r
     case 0x4b:\r
       Pico_mcd->s68k_regs[a] = (u8) d;\r
       CDD_Import_Command();\r
@@ -302,7 +332,10 @@ static u32 OtherRead16(u32 a, int realsize)
 \r
   if ((a&0xe700e0)==0xc00000) { d=PicoVideoRead(a); goto end; }\r
 \r
-  if ((a&0xffffc0)==0xa12000) { d=m68k_reg_read16(a, realsize); goto end; }\r
+  if ((a&0xffffc0)==0xa12000) {\r
+    d=m68k_reg_read16(a, realsize);\r
+    goto end;\r
+  }\r
 \r
   d = UnusualRead16(a, realsize);\r
 \r
@@ -410,15 +443,21 @@ u8 PicoReadM68k8(u32 a)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     d = *(prg_bank+((a^1)&0x1ffff));\r
     goto end;\r
   }\r
 \r
   if ((a&0xff4000)==0xa00000) { d=z80Read8(a); goto end; } // Z80 Ram\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs r8: [%02x] @%06x", a&0x3f, SekPc);\r
+\r
   d=OtherRead16(a&~1, 8|(a&1)); if ((a&1)==0) d>>=8;\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("ret = %02x", (u8)d);\r
+\r
   end:\r
 \r
 #ifdef __debug_io\r
@@ -439,13 +478,19 @@ u16 PicoReadM68k16(u32 a)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     d = *(u16 *)(prg_bank+(a&0x1fffe));\r
     goto end;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs r16: [%02x] @%06x", a&0x3f, SekPc);\r
+\r
   d = (u16)OtherRead16(a, 16);\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("ret = %04x", d);\r
+\r
   end:\r
 \r
 #ifdef __debug_io\r
@@ -466,14 +511,20 @@ u32 PicoReadM68k32(u32 a)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     u16 *pm=(u16 *)(prg_bank+(a&0x1fffe));\r
     d = (pm[0]<<16)|pm[1];\r
     goto end;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs r32: [%02x] @%06x", a&0x3f, SekPc);\r
+\r
   d = (OtherRead16(a, 32)<<16)|OtherRead16(a+2, 32);\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("ret = %08x", d);\r
+\r
   end:\r
 #ifdef __debug_io\r
   dprintf("r32: %06x, %08x @%06x", a&0xffffff, d, SekPc);\r
@@ -499,12 +550,15 @@ void PicoWriteM68k8(u32 a,u8 d)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     u8 *pm=(u8 *)(prg_bank+((a^1)&0x1ffff));\r
     *pm=d;\r
     return;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs w8: [%02x] %02x @%06x", a&0x3f, d, SekPc);\r
+\r
   OtherWrite8(a,d,8);\r
 }\r
 \r
@@ -522,11 +576,13 @@ void PicoWriteM68k16(u32 a,u16 d)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     *(u16 *)(prg_bank+(a&0x1fffe))=d;\r
     return;\r
   }\r
 \r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs w16: [%02x] %04x @%06x", a&0x3f, d, SekPc);\r
 \r
   OtherWrite16(a,d);\r
 }\r
@@ -549,12 +605,19 @@ void PicoWriteM68k32(u32 a,u32 d)
 \r
   // prg RAM\r
   if ((a&0xfe0000)==0x020000) {\r
-    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->m68k_regs[3]>>6];\r
+    u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];\r
     u16 *pm=(u16 *)(prg_bank+(a&0x1fffe));\r
     pm[0]=(u16)(d>>16); pm[1]=(u16)d;\r
     return;\r
   }\r
 \r
+  // word RAM\r
+  if (a!=0x200000 && (a&0xfc0000)==0x200000) // tmp hack\r
+    return;\r
+\r
+\r
+  if ((a&0xffffc0)==0xa12000)\r
+    dprintf("m68k_regs w32: [%02x] %08x @%06x", a&0x3f, d, SekPc);\r
 \r
   OtherWrite16(a,  (u16)(d>>16));\r
   OtherWrite16(a+2,(u16)d);\r
@@ -578,7 +641,9 @@ u8 PicoReadS68k8(u32 a)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs r8: [%02x] @ %06x", a&0x1ff, SekPcS68k);\r
     d = s68k_reg_read16(a&~1, 8|(a&1)); if ((a&1)==0) d>>=8;\r
+    dprintf("ret = %02x", (u8)d);\r
     goto end;\r
   }\r
 \r
@@ -606,7 +671,9 @@ u16 PicoReadS68k16(u32 a)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs r16: [%02x] @ %06x", a&0x1fe, SekPcS68k);\r
     d = s68k_reg_read16(a, 16);\r
+    dprintf("ret = %04x", d);\r
     goto end;\r
   }\r
 \r
@@ -635,7 +702,9 @@ u32 PicoReadS68k32(u32 a)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs r32: [%02x] @ %06x", a&0x1fe, SekPcS68k);\r
     d = (s68k_reg_read16(a, 32)<<16)|s68k_reg_read16(a+2, 32);\r
+    dprintf("ret = %08x", d);\r
     goto end;\r
   }\r
 \r
@@ -666,8 +735,12 @@ void PicoWriteS68k8(u32 a,u8 d)
     return;\r
   }\r
 \r
+  if (a != 0xff0011 && (a&0xff8000) == 0xff0000) // PCM hack\r
+    return;\r
+\r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs w8: [%02x] %02x @ %06x", a&0x1ff, d, SekPcS68k);\r
     s68k_reg_write8(a,d,8);\r
     return;\r
   }\r
@@ -691,6 +764,7 @@ void PicoWriteS68k16(u32 a,u16 d)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs w16: [%02x] %04x @ %06x", a&0x1ff, d, SekPcS68k);\r
     s68k_reg_write8(a,  d>>8, 16);\r
     s68k_reg_write8(a+1,d&0xff, 16);\r
     return;\r
@@ -716,6 +790,7 @@ void PicoWriteS68k32(u32 a,u32 d)
 \r
   // regs\r
   if ((a&0xfffe00) == 0xff8000) {\r
+    dprintf("s68k_regs w32: [%02x] %08x @ %06x", a&0x1ff, d, SekPcS68k);\r
     s68k_reg_write8(a,   d>>24, 32);\r
     s68k_reg_write8(a+1,(d>>16)&0xff, 32);\r
     s68k_reg_write8(a+2,(d>>8) &0xff, 32);\r
index d4560fd..d987956 100644 (file)
@@ -1,7 +1,7 @@
 // This is part of Pico Library
 
 // (c) Copyright 2004 Dave, All rights reserved.
-// (c) Copyright 2006 notaz, All rights reserved.
+// (c) Copyright 2007 notaz, All rights reserved.
 // Free for non-commercial use.
 
 // For commercial use, separate licencing terms must be obtained.
@@ -11,7 +11,7 @@
 #include "../sound/sound.h"
 
 
-int counter75hz = 0;
+static int counter75hz = 0; // TODO: move 2 context
 
 
 int PicoInitMCD(void)
@@ -33,6 +33,7 @@ int PicoResetMCD(int hard)
   // clear everything except BIOS
   memset(Pico_mcd->prg_ram, 0, sizeof(mcd_state) - sizeof(Pico_mcd->bios));
   PicoMCD |= 2; // s68k reset pending
+  Pico_mcd->s68k_regs[3] = 1; // 2M word RAM mode with m68k access after reset
   counter75hz = 0;
 
   LC89510_Reset();
@@ -71,7 +72,7 @@ extern unsigned char s68k_regs[0x200];
 static int PicoFrameHintsMCD(void)
 {
   struct PicoVideo *pv=&Pico.video;
-  int total_z80=0,lines,y,lines_vis = 224,z80CycleAim = 0,line_sample;
+  int total_z80=0,lines,y,lines_vis = 224,z80CycleAim = 0,line_sample,counter75hz_lim;
   const int cycles_68k=488,cycles_z80=228,cycles_s68k=795; // both PAL and NTSC compile to same values
   int skip=PicoSkipFrame || (PicoOpt&0x10);
   int hint; // Hint counter
@@ -81,11 +82,13 @@ static int PicoFrameHintsMCD(void)
     //cycles_z80 = (int) ((double) OSC_PAL  / 15 / 50 / 312 + 0.4); // 228
     lines  = 312;    // Steve Snake says there are 313 lines, but this seems to also work well
     line_sample = 68;
+    counter75hz_lim = 2080;
     if(pv->reg[1]&8) lines_vis = 240;
   } else {
     //cycles_68k = (int) ((double) OSC_NTSC /  7 / 60 / 262 + 0.4); // 488
     //cycles_z80 = (int) ((double) OSC_NTSC / 15 / 60 / 262 + 0.4); // 228
     lines  = 262;
+    counter75hz_lim = 2096;
     line_sample = 93;
   }
 
@@ -160,6 +163,7 @@ static int PicoFrameHintsMCD(void)
 
     // Run scanline:
       //dprintf("m68k starting exec @ %06x", SekPc);
+    if(Pico.m.dma_bytes) SekCycleCnt+=CheckDMA();
     SekRun(cycles_68k);
     if ((Pico_mcd->m68k_regs[1]&3) == 1) { // no busreq/no reset
 #if 0
@@ -185,9 +189,8 @@ static int PicoFrameHintsMCD(void)
       total_z80+=z80_run(z80CycleAim-total_z80);
     }
 
-    // if cdd is on, counter elapsed and irq4 is not masked, do irq4
-    if ((Pico_mcd->s68k_regs[0x37]&4) && ++counter75hz > 209 && (Pico_mcd->s68k_regs[0x33]&(1<<4))) {
-      counter75hz = 0;
+    if ((counter75hz+=10) >= counter75hz_lim) {
+      counter75hz -= counter75hz_lim;
       Check_CD_Command();
     }
   }
index c9d3737..e0ea83a 100644 (file)
@@ -22,7 +22,7 @@ m68ki_cpu_core PicoS68kCPU; // Mega CD's CPU
 #ifdef EMU_M68K
 int SekIntAckS68k(int level)
 {
-  dprintf("s68k: int %i ack [%i|%i]", level, Pico.m.scanline, SekCyclesDone());
+  dprintf("s68kACK %i", level);
   CPU_INT_LEVEL = 0;
   return M68K_INT_ACK_AUTOVECTOR;
 }
index b3cd36d..e4212a8 100644 (file)
@@ -39,8 +39,8 @@ static const char* copyright_notice =
 /* ================================= DATA ================================= */\r
 /* ======================================================================== */\r
 \r
-int  m68ki_initial_cycles;\r
-int  m68ki_remaining_cycles = 0;                     /* Number of clocks remaining */\r
+// int  m68ki_initial_cycles; // moved to m68k_execute() stack\r
+// int  m68ki_remaining_cycles = 0;                     /* Number of clocks remaining */\r
 uint m68ki_tracing = 0;\r
 uint m68ki_address_space;\r
 \r
@@ -771,6 +771,8 @@ void m68k_set_cpu_type(unsigned int cpu_type)
 /* ASG: removed per-instruction interrupt checks */\r
 int m68k_execute(int num_cycles)\r
 {\r
+       int  m68ki_initial_cycles;\r
+\r
        /* Make sure we're not stopped */\r
        if(!CPU_STOPPED)\r
        {\r
@@ -827,17 +829,19 @@ int m68k_execute(int num_cycles)
        return num_cycles;\r
 }\r
 \r
-\r
+#if 0\r
 int m68k_cycles_run(void)\r
 {\r
        return m68ki_initial_cycles - GET_CYCLES();\r
 }\r
+#endif\r
 \r
 int m68k_cycles_remaining(void)\r
 {\r
        return GET_CYCLES();\r
 }\r
 \r
+#if 0\r
 /* Change the timeslice */\r
 void m68k_modify_timeslice(int cycles)\r
 {\r
@@ -851,7 +855,7 @@ void m68k_end_timeslice(void)
        m68ki_initial_cycles = GET_CYCLES();\r
        SET_CYCLES(0);\r
 }\r
-\r
+#endif\r
 \r
 /* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */\r
 /* KS: Modified so that IPL* bits match with mask positions in the SR\r
index 8885595..79a6979 100644 (file)
@@ -891,13 +891,16 @@ typedef struct
        void (*set_fc_callback)(unsigned int new_fc);     /* Called when the CPU function code changes */\r
        void (*instr_hook_callback)(void);                /* Called every instruction cycle prior to execution */\r
 \r
+       sint cyc_remaining_cycles;\r
 } m68ki_cpu_core;\r
 \r
 \r
 extern m68ki_cpu_core *m68ki_cpu_p;\r
 #define m68ki_cpu (*m68ki_cpu_p) // test\r
 \r
-extern sint           m68ki_remaining_cycles;\r
+// extern sint           m68ki_remaining_cycles;\r
+#define m68ki_remaining_cycles m68ki_cpu_p->cyc_remaining_cycles\r
+\r
 extern uint           m68ki_tracing;\r
 extern uint8          m68ki_shift_8_table[];\r
 extern uint16         m68ki_shift_16_table[];\r
index a524cc0..fc729b0 100644 (file)
@@ -92,10 +92,15 @@ ifeq "$(up)" "1"
        @cmd //C copy $@ \\\\10.0.1.2\\gp2x\\mnt\\sd\\games\\PicoDrive\\\r
 endif\r
 \r
-up: up940\r
-       @cmd //C copy PicoDrive.gpe \\\\10.0.1.2\\gp2x\\mnt\\sd\\games\\PicoDrive\\\r
+up: # up940\r
+       @cp -v PicoDrive.gpe /mnt/gp2x/mnt/sd/games/PicoDrive/\r
+\r
+#      @cmd //C copy PicoDrive.gpe \\\\10.0.1.2\\gp2x\\mnt\\sd\\games\\PicoDrive\\\r
+\r
 up940:\r
-       @cmd //C copy code940.bin \\\\10.0.1.2\\gp2x\\mnt\\sd\\games\\PicoDrive\\\r
+       @cp -v code940.bin /mnt/gp2x/mnt/sd/games/PicoDrive/\r
+\r
+#      @cmd //C copy code940.bin \\\\10.0.1.2\\gp2x\\mnt\\sd\\games\\PicoDrive\\\r
 \r
 testrefr.gpe : test.o gp2x.o asmutils.o\r
        @echo $@\r
index 6e0021b..a90d850 100644 (file)
@@ -79,14 +79,15 @@ static void strlwr(char* string)
        while ( (*string++ = (char)tolower(*string)) );\r
 }\r
 \r
-static int try_rfn_ext(char *ext)\r
+static int try_rfn_cut(void)\r
 {\r
        FILE *tmp;\r
        char *p;\r
 \r
-       p = romFileName + strlen(romFileName) - 4;\r
-       if (p < romFileName) p = romFileName;\r
-       strcpy(p, ext);\r
+       p = romFileName + strlen(romFileName) - 1;\r
+       for (; p > romFileName; p--)\r
+               if (*p == '.') break;\r
+       *p = 0;\r
 \r
        if((tmp = fopen(romFileName, "rb"))) {\r
                fclose(tmp);\r
@@ -156,8 +157,7 @@ int emu_ReloadRom(void)
                        sprintf(menuErrorMsg, "Invalid GMV file.");\r
                        return 0;\r
                }\r
-               dummy = try_rfn_ext(".zip") || try_rfn_ext(".bin") ||\r
-                       try_rfn_ext(".smd") || try_rfn_ext(".gen");\r
+               dummy = try_rfn_cut() || try_rfn_cut();\r
                if (!dummy) {\r
                        sprintf(menuErrorMsg, "Could't find a ROM for movie.");\r
                        return 0;\r
index 588e0c9..7b18517 100644 (file)
@@ -352,11 +352,11 @@ static char *romsel_loop(char *curr_path)
        for (;;)\r
        {\r
                draw_dirlist(curr_path, namelist, n, sel);\r
-               inp = wait_for_input(GP2X_UP|GP2X_DOWN|GP2X_LEFT|GP2X_RIGHT|GP2X_B|GP2X_X);\r
+               inp = wait_for_input(GP2X_UP|GP2X_DOWN|GP2X_LEFT|GP2X_RIGHT|GP2X_L|GP2X_R|GP2X_B|GP2X_X);\r
                if(inp & GP2X_UP  )  { sel--;   if (sel < 0)   sel = n-2; }\r
                if(inp & GP2X_DOWN)  { sel++;   if (sel > n-2) sel = 0; }\r
-               if(inp & GP2X_LEFT)  { sel-=10; if (sel < 0)   sel = 0; }\r
-               if(inp & GP2X_RIGHT) { sel+=10; if (sel > n-2) sel = n-2; }\r
+               if(inp &(GP2X_LEFT|GP2X_L))  { sel-=10; if (sel < 0)   sel = 0; }\r
+               if(inp &(GP2X_RIGHT|GP2X_R)) { sel+=10; if (sel > n-2) sel = n-2; }\r
                if(inp & GP2X_B)     { // enter dir/select\r
                        again:\r
                        if (namelist[sel+1]->d_type == DT_REG) {\r
@@ -827,7 +827,7 @@ static void draw_menu_credits(void)
        int tl_x = 15, tl_y = 70, y;\r
        memset(gp2x_screen, 0, 320*240);\r
 \r
-       gp2x_text_out8(tl_x, 20, "PicoDrive v" VERSION " (c) notaz, 2006");\r
+       gp2x_text_out8(tl_x, 20, "PicoDrive v" VERSION " (c) notaz, 2006,2007");\r
        y = tl_y;\r
        gp2x_text_out8(tl_x, y, "Credits:");\r
        gp2x_text_out8(tl_x, (y+=10), "Dave: Cyclone 68000 core,");\r
index 1331a8a..8d13814 100644 (file)
@@ -1,2 +1,2 @@
-#define VERSION "0.964"\r
+#define VERSION "0.965"\r
 \r
index be76af4..e5c88bb 100644 (file)
@@ -12,7 +12,7 @@
 // pico.c
 #define CAN_HANDLE_240_LINES   1
 
-#define dprintf(f,...) printf("%05i: " f "\n",Pico.m.frame_count,##__VA_ARGS__)
+#define dprintf(f,...) printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__)
 //#define dprintf(x...)
 
 #endif //PORT_CONFIG_H