amalgamation
[picodrive.git] / Pico / MemoryCmn.c
index 02d45d8..09710be 100644 (file)
@@ -1,4 +1,19 @@
-/* common code for Memory.c and cd/Memory.c */
+// common code for Memory.c and cd/Memory.c
+// (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
+
+#ifndef UTYPES_DEFINED
+typedef unsigned char  u8;
+typedef unsigned short u16;
+typedef unsigned int   u32;
+#define UTYPES_DEFINED
+#endif
+
+#ifdef _ASM_MEMORY_C
+u32 OtherRead16End(u32 a, int realsize);
+#endif
+#ifdef _ASM_CD_MEMORY_C
+static void OtherWrite8End(u32 a,u32 d,int realsize);
+#endif
 
 static int PadRead(int i)
 {
@@ -98,14 +113,15 @@ u32 OtherRead16(u32 a, int realsize)
   // |=0x80 for Shadow of the Beast & Super Offroad; rotate fakes next fetched instruction for Time Killers
   if (a==0xa11100) { // z80 busreq
     d=Pico.m.z80Run&1;
+#if 1
     if (!d) {
       // needed by buggy Terminator (Sega CD)
-      extern int z80stopCycle;
       int stop_before = SekCyclesDone() - z80stopCycle;
       dprintf("stop before: %i", stop_before);
       if (stop_before > 0 && stop_before <= 32) // Gens uses 16 here
         d = 1; // bus not yet available
     }
+#endif
     d=(d<<8)|0x8000|Pico.m.rotate++;
     dprintf("get_zrun: %04x [%i|%i] @%06x", d, Pico.m.scanline, SekCyclesDone(), SekPc);
     goto end;
@@ -149,16 +165,21 @@ void OtherWrite8(u32 a,u32 d,int realsize)
     return;
   }
   if (a==0xa11100) {
-    extern int z80startCycle, z80stopCycle;
     //int lineCycles=(488-SekCyclesLeft)&0x1ff;
     d&=1; d^=1;
     if(!d) {
       // this is for a nasty situation where Z80 was enabled and disabled in the same 68k timeslice (Golden Axe III)
       if (Pico.m.z80Run) {
-        int lineCycles=(488-SekCyclesLeft)&0x1ff;
+        int lineCycles;
         z80stopCycle = SekCyclesDone();
-        lineCycles=(lineCycles>>1)-(lineCycles>>5);
-        z80_run(lineCycles);
+        if (Pico.m.z80Run&2)
+             lineCycles=(488-SekCyclesLeft)&0x1ff;
+        else lineCycles=z80stopCycle-z80startCycle; // z80 was started at current line
+        if (lineCycles > 0 && lineCycles <= 488) {
+          dprintf("zrun: %i/%i cycles", lineCycles, (lineCycles>>1)-(lineCycles>>5));
+          lineCycles=(lineCycles>>1)-(lineCycles>>5);
+          z80_run(lineCycles);
+        }
       }
     } else {
       z80startCycle = SekCyclesDone();