new z80 scheduling method, timers are still wip
[picodrive.git] / Pico / PicoInt.h
index d348598..8525198 100644 (file)
@@ -137,7 +137,7 @@ extern unsigned int SekCycleCntT; // total cycle counter, updated once per frame
        SekCycleAim=0; \\r
 }\r
 #define SekCyclesBurn(c)  SekCycleCnt+=c\r
-#define SekCyclesDone()  (SekCycleAim-SekCyclesLeft)    // nuber of cycles done in this frame (can be checked anywhere)\r
+#define SekCyclesDone()  (SekCycleAim-SekCyclesLeft)    // number of cycles done in this frame (can be checked anywhere)\r
 #define SekCyclesDoneT() (SekCycleCntT+SekCyclesDone()) // total nuber of cycles done for this rom\r
 \r
 #define SekEndRun(after) { \\r
@@ -174,10 +174,9 @@ extern int dbg_irq_level;
 #if defined(_USE_MZ80)\r
 #include "../cpu/mz80/mz80.h"\r
 \r
-#define z80_run(cycles)    mz80_run(cycles)\r
+#define z80_run(cycles)    { mz80GetElapsedTicks(1); mz80_run(cycles) }\r
 #define z80_run_nr(cycles) mz80_run(cycles)\r
 #define z80_int()          mz80int(0)\r
-#define z80_resetCycles()  mz80GetElapsedTicks(1)\r
 \r
 #elif defined(_USE_DRZ80)\r
 #include "../cpu/DrZ80/drz80.h"\r
@@ -190,7 +189,8 @@ extern struct DrZ80 drZ80;
   drZ80.z80irqvector = 0xFF; /* default IRQ vector RST opcode */ \\r
   drZ80.Z80_IRQ = 1; \\r
 }\r
-#define z80_resetCycles()\r
+\r
+#define z80_cyclesLeft     drZ80.cycles\r
 \r
 #elif defined(_USE_CZ80)\r
 #include "../cpu/cz80/cz80.h"\r
@@ -198,17 +198,31 @@ extern struct DrZ80 drZ80;
 #define z80_run(cycles)    Cz80_Exec(&CZ80, cycles)\r
 #define z80_run_nr(cycles) Cz80_Exec(&CZ80, cycles)\r
 #define z80_int()          Cz80_Set_IRQ(&CZ80, 0, HOLD_LINE)\r
-#define z80_resetCycles()\r
+\r
+#define z80_cyclesLeft     (CZ80.ICount - CZ80.ExtraCycles)\r
 \r
 #else\r
 \r
 #define z80_run(cycles)    (cycles)\r
 #define z80_run_nr(cycles)\r
 #define z80_int()\r
-#define z80_resetCycles()\r
 \r
 #endif\r
 \r
+extern int z80stopCycle;         /* in 68k cycles */\r
+extern int z80_cycle_cnt;        /* 'done' z80 cycles before z80_run() */\r
+extern int z80_cycle_aim;\r
+extern int z80_scanline;\r
+extern int z80_scanline_cycles;  /* cycles done until z80_scanline */\r
+\r
+#define z80_resetCycles() \\r
+  z80_cycle_cnt = z80_cycle_aim = z80_scanline = z80_scanline_cycles = 0;\r
+\r
+#define z80_cyclesDone() \\r
+  (z80_cycle_aim - z80_cyclesLeft)\r
+\r
+#define cycles_68k_to_z80(x) ((x)*957 >> 11)\r
+\r
 // ---------------------------------------------------------\r
 \r
 // main oscillator clock which controls timing\r
@@ -405,6 +419,7 @@ PICO_INTERNAL unsigned short z80_read16(unsigned short a);
 #else\r
 PICO_INTERNAL_ASM void z80_write(unsigned int a, unsigned char data);\r
 #endif\r
+PICO_INTERNAL int ym2612_write_local(unsigned int a, unsigned int d, int is_from_z80);\r
 extern unsigned int (*PicoRead16Hook)(unsigned int a, int realsize);\r
 extern void (*PicoWrite8Hook) (unsigned int a,unsigned int d,int realsize);\r
 extern void (*PicoWrite16Hook)(unsigned int a,unsigned int d,int realsize);\r
@@ -421,11 +436,11 @@ PICO_INTERNAL void PicoMemSetupPico(void);
 extern struct Pico Pico;\r
 extern struct PicoSRAM SRam;\r
 extern int emustatus;\r
-extern int z80startCycle, z80stopCycle; // in 68k cycles\r
 extern void (*PicoResetHook)(void);\r
 extern void (*PicoLineHook)(int count);\r
 PICO_INTERNAL int  CheckDMA(void);\r
 PICO_INTERNAL void PicoDetectRegion(void);\r
+PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done);\r
 \r
 // cd/Pico.c\r
 PICO_INTERNAL int  PicoInitMCD(void);\r
@@ -459,6 +474,13 @@ PICO_INTERNAL void cdda_start_play();
 extern short cdda_out_buffer[2*1152];\r
 extern int PsndLen_exc_cnt;\r
 extern int PsndLen_exc_add;\r
+extern int timer_a_next_oflow, timer_a_step; // in z80 cycles\r
+\r
+#define timers_cycle() \\r
+  if (timer_a_next_oflow > 0) timer_a_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256\r
+\r
+#define timers_reset() \\r
+  timer_a_next_oflow = 0x80000000\r
 \r
 // VideoPort.c\r
 PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d);\r
@@ -483,7 +505,7 @@ PICO_INTERNAL void PicoCDBufferRead(void *dest, int lba);
 \r
 // sound/sound.c\r
 PICO_INTERNAL void PsndReset(void);\r
-PICO_INTERNAL void Psnd_timers_and_dac(int raster);\r
+PICO_INTERNAL void PsndDoDAC(int line_to);\r
 PICO_INTERNAL int  PsndRender(int offset, int length);\r
 PICO_INTERNAL void PsndClear(void);\r
 // z80 functionality wrappers\r
@@ -492,7 +514,7 @@ PICO_INTERNAL void z80_pack(unsigned char *data);
 PICO_INTERNAL void z80_unpack(unsigned char *data);\r
 PICO_INTERNAL void z80_reset(void);\r
 PICO_INTERNAL void z80_exit(void);\r
-\r
+extern int PsndDacLine;\r
 \r
 #ifdef __cplusplus\r
 } // End of extern "C"\r