switch DMNA Silpheed hack to timeslice hack
authornotaz <notasas@gmail.com>
Wed, 12 Aug 2009 14:06:40 +0000 (14:06 +0000)
committernotaz <notasas@gmail.com>
Wed, 12 Aug 2009 14:06:40 +0000 (14:06 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@747 be3aeb3a-fb24-0410-a615-afba39da0efa

pico/cd/memory.c
pico/cd/pico.c
pico/pico_int.h
pico/videoport.c
platform/linux/Makefile

index 593a4cb..32c9515 100644 (file)
@@ -27,6 +27,7 @@ typedef unsigned int   u32;
 #define rdprintf(...)\r
 //#define wrdprintf dprintf\r
 #define wrdprintf(...)\r
+//#define r3printf elprintf\r
 #define r3printf(...)\r
 #endif\r
 \r
@@ -57,8 +58,6 @@ static u32 m68k_reg_read16(u32 a)
       goto end;\r
     case 2:\r
       d = (Pico_mcd->s68k_regs[a]<<8) | (Pico_mcd->s68k_regs[a+1]&0xc7);\r
-      // the DMNA delay must only be visible on s68k side (Lunar2, Silpheed)\r
-      if (Pico_mcd->m.state_flags&2) { d &= ~1; d |= 2; }\r
       r3printf(EL_STATUS, "m68k_regs r3: %02x @%06x", (u8)d, SekPc);\r
       goto end;\r
     case 4:\r
@@ -109,8 +108,8 @@ void m68k_reg_write8(u32 a, u32 d)
     case 1:\r
       d &= 3;\r
       if (!(d&1)) Pico_mcd->m.state_flags |= 1; // reset pending, needed to be sure we fetch the right vectors on reset\r
-      if ( (Pico_mcd->m.busreq&1) != (d&1)) dprintf("m68k: s68k reset %i", !(d&1));\r
-      if ( (Pico_mcd->m.busreq&2) != (d&2)) dprintf("m68k: s68k brq %i", (d&2)>>1);\r
+      if ( (Pico_mcd->m.busreq&1) != (d&1)) elprintf(EL_INTSW, "m68k: s68k reset %i", !(d&1));\r
+      if ( (Pico_mcd->m.busreq&2) != (d&2)) elprintf(EL_INTSW, "m68k: s68k brq %i", (d&2)>>1);\r
       if ((Pico_mcd->m.state_flags&1) && (d&3)==1) {\r
         SekResetS68k(); // S68k comes out of RESET or BRQ state\r
         Pico_mcd->m.state_flags&=~1;\r
@@ -131,20 +130,14 @@ void m68k_reg_write8(u32 a, u32 d)
       //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
-      if (dold & 4) {\r
-        d ^= 2;                // writing 0 to DMNA actually sets it, 1 does nothing\r
+      if (dold & 4) {   // 1M mode\r
+        d ^= 2;         // writing 0 to DMNA actually sets it, 1 does nothing\r
       } else {\r
-        //dold &= ~2; // ??\r
-#if 1\r
-       if (d & (d ^ dold) & 2) { // DMNA is being set\r
-          Pico_mcd->m.state_flags |= 2; // we must delay setting DMNA bit (needed for Silpheed)\r
-          d &= ~2;\r
-       }\r
-        else\r
-          Pico_mcd->m.state_flags &= ~2;\r
-#else\r
-        if (d & 2) dold &= ~1; // return word RAM to s68k in 2M mode\r
-#endif\r
+       if ((d ^ dold) & d & 2) { // DMNA is being set\r
+          dold &= ~1;   // return word RAM to s68k\r
+          /* Silpheed hack: bset(w3), r3, btst, bne, r3 */\r
+          SekEndRun(20+16+10+12+16);\r
+        }\r
       }\r
       Pico_mcd->s68k_regs[3] = d | dold; // really use s68k side register\r
 #ifdef USE_POLL_DETECT\r
@@ -324,9 +317,9 @@ void s68k_reg_write8(u32 a, u32 d)
         }\r
         else\r
           d |= dold&1;\r
+        // s68k can only set RET, writing 0 has no effect\r
         if (d&1) d &= ~2; // return word RAM to m68k in 2M mode\r
       }\r
-      Pico_mcd->m.state_flags &= ~2;\r
       break;\r
     }\r
     case 4:\r
index f76a7f9..7335158 100644 (file)
@@ -208,20 +208,6 @@ static __inline void update_chips(void)
        // update gfx chip
        if (Pico_mcd->rot_comp.Reg_58 & 0x8000)
                gfx_cd_update();
-
-       // delayed setting of DMNA bit (needed for Silpheed)
-       if (Pico_mcd->m.state_flags & 2) {
-               Pico_mcd->m.state_flags &= ~2;
-               if (!(Pico_mcd->s68k_regs[3] & 4)) {
-                       Pico_mcd->s68k_regs[3] |=  2;
-                       Pico_mcd->s68k_regs[3] &= ~1;
-#ifdef USE_POLL_DETECT
-                       if ((s68k_poll_adclk&0xfe) == 2) {
-                               SekSetStopS68k(0); s68k_poll_adclk = 0;
-                       }
-#endif
-               }
-       }
 }
 
 
index df3a661..1c95c56 100644 (file)
@@ -41,10 +41,7 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k;
        (((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
 #define SekCyclesLeftS68k \\r
        ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuCS68k.cycles)\r
-#define SekSetCyclesLeftNoMCD(c) PicoCpuCM68k.cycles=c\r
-#define SekSetCyclesLeft(c) { \\r
-       if ((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \\r
-}\r
+#define SekEndTimeslice(after) PicoCpuCM68k.cycles=after\r
 #define SekPc (PicoCpuCM68k.pc-PicoCpuCM68k.membase)\r
 #define SekPcS68k (PicoCpuCS68k.pc-PicoCpuCS68k.membase)\r
 #define SekSetStop(x) { PicoCpuCM68k.state_flags&=~1; if (x) { PicoCpuCM68k.state_flags|=1; PicoCpuCM68k.cycles=0; } }\r
@@ -67,10 +64,7 @@ extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;
        (((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
 #define SekCyclesLeftS68k \\r
        ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuFS68k.io_cycle_counter)\r
-#define SekSetCyclesLeftNoMCD(c) PicoCpuFM68k.io_cycle_counter=c\r
-#define SekSetCyclesLeft(c) { \\r
-       if ((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \\r
-}\r
+#define SekEndTimeslice(after) PicoCpuFM68k.io_cycle_counter=after\r
 #define SekPc     fm68k_get_pc(&PicoCpuFM68k)\r
 #define SekPcS68k fm68k_get_pc(&PicoCpuFS68k)\r
 #define SekSetStop(x) { \\r
@@ -100,10 +94,7 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k;
        (((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
 #define SekCyclesLeftS68k \\r
        ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuMS68k.cyc_remaining_cycles)\r
-#define SekSetCyclesLeftNoMCD(c) SET_CYCLES(c)\r
-#define SekSetCyclesLeft(c) { \\r
-       if ((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCycleCnt=SekCycleAim-(c); else SET_CYCLES(c); \\r
-}\r
+#define SekEndTimeslice(after) SET_CYCLES(after)\r
 #define SekPc m68k_get_reg(&PicoCpuMM68k, M68K_REG_PC)\r
 #define SekPcS68k m68k_get_reg(&PicoCpuMS68k, M68K_REG_PC)\r
 #define SekSetStop(x) { \\r
@@ -125,7 +116,7 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k;
 }\r
 \r
 #endif\r
-#endif\r
+#endif // EMU_M68K\r
 \r
 extern int SekCycleCnt; // cycles done in this frame\r
 extern int SekCycleAim; // cycle aim\r
@@ -141,9 +132,9 @@ extern unsigned int SekCycleCntT; // total cycle counter, updated once per frame
 #define SekCyclesDoneT() (SekCycleCntT+SekCyclesDone()) // total nuber of cycles done for this rom\r
 \r
 #define SekEndRun(after) { \\r
-       SekCycleCnt -= SekCyclesLeft - after; \\r
-       if(SekCycleCnt < 0) SekCycleCnt = 0; \\r
-       SekSetCyclesLeft(after); \\r
+       SekCycleCnt -= SekCyclesLeft - (after); \\r
+       if (SekCycleCnt < 0) SekCycleCnt = 0; \\r
+       SekEndTimeslice(after); \\r
 }\r
 \r
 extern int SekCycleCntS68k;\r
@@ -157,13 +148,11 @@ extern int SekCycleAimS68k;
 \r
 #ifdef EMU_CORE_DEBUG\r
 extern int dbg_irq_level;\r
-#undef SekSetCyclesLeftNoMCD\r
-#undef SekSetCyclesLeft\r
+#undef SekEndTimeslice\r
 #undef SekCyclesBurn\r
 #undef SekEndRun\r
 #undef SekInterrupt\r
-#define SekSetCyclesLeftNoMCD(c)\r
-#define SekSetCyclesLeft(c)\r
+#define SekEndTimeslice(c)\r
 #define SekCyclesBurn(c) c\r
 #define SekEndRun(c)\r
 #define SekInterrupt(irq) dbg_irq_level=irq\r
@@ -325,7 +314,7 @@ struct mcd_misc
        unsigned short hint_vector;\r
        unsigned char  busreq;\r
        unsigned char  s68k_pend_ints;\r
-       unsigned int   state_flags;     // 04: emu state: reset_pending, dmna_pending\r
+       unsigned int   state_flags;     // 04: emu state: reset_pending\r
        unsigned int   counter75hz;\r
        unsigned int   pad0;\r
        int            timer_int3;      // 10\r
index 3d74f51..6d62029 100644 (file)
@@ -94,7 +94,7 @@ static void DmaSlow(int len)
 \r
   Pico.m.dma_xfers += len;\r
   if ((PicoAHW & PAHW_MCD) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCyclesBurn(CheckDMA());\r
-  else SekSetCyclesLeftNoMCD(SekCyclesLeftNoMCD - CheckDMA());\r
+  else SekEndTimeslice(SekCyclesLeftNoMCD - CheckDMA());\r
 \r
   if ((source&0xe00000)==0xe00000) { // Ram\r
     pd=(u16 *)(Pico.ram+(source&0xfffe));\r
index bd612d6..747cc83 100644 (file)
@@ -59,6 +59,7 @@ OBJS += unzip/unzip.o unzip/unzip_stream.o
 ifeq "$(use_musashi)" "1"
 DEFINES += EMU_M68K
 OBJS += cpu/musashi/m68kops.o cpu/musashi/m68kcpu.o
+OBJS += cpu/musashi/m68kdasm.o
 endif
 ifeq "$(use_fame)" "1"
 DEFINES += EMU_F68K
@@ -76,10 +77,8 @@ endif
 ifeq "$(use_fame)" "1"
 ifeq "$(use_musashi)" "1"
 OBJS += pico/debugCPU.o
-OBJS += cpu/musashi/m68kdasm.o
 endif
 endif
-OBJS += cpu/musashi/m68kdasm.o
 
 CFLAGS += $(addprefix -D,$(DEFINES))