ym2612 full saves wip
[picodrive.git] / Pico / PicoInt.h
index 8525198..06f4c64 100644 (file)
@@ -1,7 +1,7 @@
 // Pico Library - Internal Header File\r
 \r
 // (c) Copyright 2004 Dave, All rights reserved.\r
-// (c) Copyright 2006,2007 Grazvydas "notaz" Ignotas, all rights reserved.\r
+// (c) Copyright 2006-2008 Grazvydas "notaz" Ignotas, all rights reserved.\r
 // Free for non-commercial use.\r
 \r
 // For commercial use, separate licencing terms must be obtained.\r
@@ -185,10 +185,7 @@ extern struct DrZ80 drZ80;
 \r
 #define z80_run(cycles)    ((cycles) - DrZ80Run(&drZ80, cycles))\r
 #define z80_run_nr(cycles) DrZ80Run(&drZ80, cycles)\r
-#define z80_int() { \\r
-  drZ80.z80irqvector = 0xFF; /* default IRQ vector RST opcode */ \\r
-  drZ80.Z80_IRQ = 1; \\r
-}\r
+#define z80_int()          drZ80.Z80_IRQ = 1\r
 \r
 #define z80_cyclesLeft     drZ80.cycles\r
 \r
@@ -431,6 +428,7 @@ PICO_INTERNAL_ASM void PicoMemResetCDdecode(int r3);
 \r
 // Pico/Memory.c\r
 PICO_INTERNAL void PicoMemSetupPico(void);\r
+PICO_INTERNAL unsigned int ym2612_read_local_68k(void);\r
 \r
 // Pico.c\r
 extern struct Pico Pico;\r
@@ -474,13 +472,25 @@ 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
+extern int timer_a_next_oflow, timer_a_step, timer_a_offset; // in z80 cycles\r
+extern int timer_b_next_oflow, timer_b_step, timer_b_offset;\r
+\r
+void ym2612_sync_timers(int z80_cycles, int mode_old, int mode_new);\r
+void ym2612_pack_state(void);\r
+void ym2612_unpack_state(void);\r
 \r
 #define timers_cycle() \\r
-  if (timer_a_next_oflow > 0) timer_a_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256\r
+  if (timer_a_next_oflow > 0 && timer_a_next_oflow < 0x70000000) \\r
+    timer_a_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \\r
+  if (timer_b_next_oflow > 0 && timer_b_next_oflow < 0x70000000) \\r
+    timer_b_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \\r
+  ym2612_sync_timers(0, ym2612.OPN.ST.mode, ym2612.OPN.ST.mode);\r
 \r
 #define timers_reset() \\r
-  timer_a_next_oflow = 0x80000000\r
+  timer_a_next_oflow = timer_b_next_oflow = 0x70000000; \\r
+  timer_a_step = timer_a_offset = 16495 * 1024; \\r
+  timer_b_step = timer_b_offset = 263912 * 256;\r
+\r
 \r
 // VideoPort.c\r
 PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d);\r
@@ -528,7 +538,7 @@ extern int PsndDacLine;
 #define EL_HVCNT   0x00000001 /* hv counter reads */\r
 #define EL_SR      0x00000002 /* SR reads */\r
 #define EL_INTS    0x00000004 /* ints and acks */\r
-#define EL_YM2612R 0x00000008 /* 68k ym2612 reads */\r
+#define EL_YMTIMER 0x00000008 /* ym2612 timer stuff */\r
 #define EL_INTSW   0x00000010 /* log irq switching on/off */\r
 #define EL_ASVDP   0x00000020 /* VDP accesses during active scan */\r
 #define EL_VDPDMA  0x00000040 /* VDP DMA transfers and their timing */\r