32x: implement standard/ssf2 mapper
[picodrive.git] / pico / pico_int.h
index 848da5d..cb1c21d 100644 (file)
@@ -11,8 +11,8 @@
 #define PICO_INTERNAL_INCLUDED\r
 \r
 #include <stdio.h>\r
-#include <stdlib.h>\r
 #include <string.h>\r
+#include "pico_port.h"\r
 #include "pico.h"\r
 #include "carthw/carthw.h"\r
 \r
@@ -80,7 +80,7 @@ extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;
 }\r
 #define SekIsStoppedM68k() (PicoCpuFM68k.execinfo&FM68K_HALTED)\r
 #define SekIsStoppedS68k() (PicoCpuFS68k.execinfo&FM68K_HALTED)\r
-#define SekShouldInterrupt() fm68k_would_interrupt()\r
+#define SekShouldInterrupt() fm68k_would_interrupt(&PicoCpuFM68k)\r
 \r
 #define SekNotPolling     PicoCpuFM68k.not_polling\r
 #define SekNotPollingS68k PicoCpuFS68k.not_polling\r
@@ -326,7 +326,7 @@ struct PicoMisc
   unsigned char  eeprom_cycle; // EEPROM cycle number\r
   unsigned char  eeprom_slave; // EEPROM slave word for X24C02 and better SRAMs\r
   unsigned char  eeprom_status;\r
-  unsigned char  pad2;\r
+  unsigned char  status;       // rapid_ym2612, multi_ym_updates\r
   unsigned short dma_xfers;    // 18\r
   unsigned char  eeprom_wb[2]; // EEPROM latch/write buffer\r
   unsigned int  frame_count;   // 1c for movies and idle det\r
@@ -351,12 +351,11 @@ struct PicoEState
   struct Pico *Pico;\r
   void *PicoMem_vram;\r
   void *PicoMem_cram;\r
-  int  *PicoOpt;\r
+  unsigned int  *PicoOpt;\r
   unsigned char *Draw2FB;\r
   unsigned short HighPal[0x100];\r
 };\r
 \r
-// some assembly stuff still depends on these, do not touch!\r
 struct PicoMem\r
 {\r
   unsigned char ram[0x10000];  // 0x00000 scratch ram\r
@@ -366,9 +365,9 @@ struct PicoMem
   };\r
   unsigned char zram[0x2000];  // 0x20000 Z80 ram\r
   unsigned char ioports[0x10]; // XXX: fix asm and mv\r
-  unsigned char pad[0xf0];     // unused\r
-  unsigned short cram[0x40];   // 0x22100\r
-  unsigned short vsram[0x40];  // 0x22180\r
+  unsigned short cram[0x40];   // 0x22010\r
+  unsigned char pad[0x70];     // 0x22050 DrawStripVSRam reads 0 from here\r
+  unsigned short vsram[0x40];  // 0x22100\r
 };\r
 \r
 // sram\r
@@ -409,6 +408,19 @@ struct PicoTiming
   unsigned int z80c_cnt;                // z80 cycles done (this frame)\r
   unsigned int z80c_aim;\r
   int z80_scanline;\r
+\r
+  int timer_a_next_oflow, timer_a_step; // in z80 cycles\r
+  int timer_b_next_oflow, timer_b_step;\r
+};\r
+\r
+struct PicoSound\r
+{\r
+  short len;                            // number of mono samples\r
+  short len_use;                        // adjusted\r
+  int len_e_add;                        // for non-int samples/frame\r
+  int len_e_cnt;\r
+  short dac_line;\r
+  short psg_line;\r
 };\r
 \r
 // run tools/mkoffsets pico/pico_int_o32.h if you change these\r
@@ -419,6 +431,7 @@ struct Pico
   struct PicoMisc m;\r
   struct PicoTiming t;\r
   struct PicoCartSave sv;\r
+  struct PicoSound snd;\r
   struct PicoEState est;\r
   struct PicoMS ms;\r
 \r
@@ -533,6 +546,7 @@ typedef struct
 #define P32XF_68KCPOLL   (1 << 0)\r
 #define P32XF_68KVPOLL   (1 << 1)\r
 #define P32XF_Z80_32X_IO (1 << 7) // z80 does 32x io\r
+#define P32XF_DRC_ROM_C  (1 << 8) // cached code from ROM\r
 \r
 #define P32XI_VRES (1 << 14/2) // IRL/2\r
 #define P32XI_VINT (1 << 12/2)\r
@@ -568,8 +582,8 @@ struct Pico32x
   unsigned int dmac0_fifo_ptr;\r
   unsigned short vdp_fbcr_fake;\r
   unsigned short pad2;\r
-  unsigned char comm_dirty_68k;\r
-  unsigned char comm_dirty_sh2;\r
+  unsigned char comm_dirty;\r
+  unsigned char pad3;            // was comm_dirty_sh2\r
   unsigned char pwm_irq_cnt;\r
   unsigned char pad1;\r
   unsigned short pwm_p[2];       // pwm pos in fifo\r
@@ -705,8 +719,6 @@ void pcd_state_loaded_mem(void);
 // pico.c\r
 extern struct Pico Pico;\r
 extern struct PicoMem PicoMem;\r
-extern int PicoPadInt[2];\r
-extern int emustatus;\r
 extern void (*PicoResetHook)(void);\r
 extern void (*PicoLineHook)(void);\r
 PICO_INTERNAL int  CheckDMA(void);\r
@@ -783,10 +795,6 @@ void SekInterruptClearS68k(int irq);
 \r
 // sound/sound.c\r
 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_b_next_oflow, timer_b_step;\r
 \r
 void cdda_start_play(int lba_base, int lba_offset, int lb_len);\r
 \r
@@ -801,16 +809,16 @@ void ym2612_unpack_state(void);
 #define TIMER_B_TICK_ZCYCLES 262800 // 275251 broken, see Dai Makaimura\r
 \r
 #define timers_cycle() \\r
-  if (timer_a_next_oflow > 0 && timer_a_next_oflow < TIMER_NO_OFLOW) \\r
-    timer_a_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \\r
-  if (timer_b_next_oflow > 0 && timer_b_next_oflow < TIMER_NO_OFLOW) \\r
-    timer_b_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \\r
+  if (Pico.t.timer_a_next_oflow > 0 && Pico.t.timer_a_next_oflow < TIMER_NO_OFLOW) \\r
+    Pico.t.timer_a_next_oflow -= Pico.m.pal ? 70938*256 : 59659*256; \\r
+  if (Pico.t.timer_b_next_oflow > 0 && Pico.t.timer_b_next_oflow < TIMER_NO_OFLOW) \\r
+    Pico.t.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 = timer_b_next_oflow = TIMER_NO_OFLOW; \\r
-  timer_a_step = TIMER_A_TICK_ZCYCLES * 1024; \\r
-  timer_b_step = TIMER_B_TICK_ZCYCLES * 256;\r
+  Pico.t.timer_a_next_oflow = Pico.t.timer_b_next_oflow = TIMER_NO_OFLOW; \\r
+  Pico.t.timer_a_step = TIMER_A_TICK_ZCYCLES * 1024; \\r
+  Pico.t.timer_b_step = TIMER_B_TICK_ZCYCLES * 256;\r
 \r
 \r
 // videoport.c\r
@@ -825,9 +833,7 @@ unsigned char PicoVideoRead8HV_L(void);
 extern int (*PicoDmaHook)(unsigned int source, int len, unsigned short **base, unsigned int *mask);\r
 \r
 // misc.c\r
-PICO_INTERNAL_ASM void memcpy16(unsigned short *dest, unsigned short *src, int count);\r
 PICO_INTERNAL_ASM void memcpy16bswap(unsigned short *dest, void *src, int count);\r
-PICO_INTERNAL_ASM void memcpy32(void *dest, const void *src, int count); // 32bit word count\r
 PICO_INTERNAL_ASM void memset32(void *dest, int c, int count);\r
 \r
 // eeprom.c\r
@@ -854,7 +860,6 @@ PICO_INTERNAL void PsndDoPSG(int line_to);
 PICO_INTERNAL void PsndClear(void);\r
 PICO_INTERNAL void PsndGetSamples(int y);\r
 PICO_INTERNAL void PsndGetSamplesMS(void);\r
-extern int PsndDacLine, PsndPsgLine;\r
 \r
 // sms.c\r
 #ifndef NO_SMS\r
@@ -910,6 +915,7 @@ void PicoWrite16_32x(unsigned int a, unsigned int d);
 void PicoMemSetup32x(void);\r
 void Pico32xSwapDRAM(int b);\r
 void Pico32xMemStateLoaded(void);\r
+void p32x_update_banks(void);\r
 void p32x_m68k_poll_event(unsigned int flags);\r
 void p32x_sh2_poll_event(SH2 *sh2, unsigned int flags, unsigned int m68k_cycles);\r
 \r
@@ -978,7 +984,7 @@ static __inline int isspace_(int c)
 // emulation event logging\r
 #ifndef EL_LOGMASK\r
 # ifdef __x86_64__ // HACK\r
-#  define EL_LOGMASK (EL_STATUS|EL_IDLE|EL_ANOMALY)\r
+#  define EL_LOGMASK (EL_STATUS|EL_ANOMALY)\r
 # else\r
 #  define EL_LOGMASK (EL_STATUS)\r
 # endif\r
@@ -1073,25 +1079,6 @@ void pevt_dump(void);
 #define pevt_dump()\r
 #endif\r
 \r
-// misc\r
-#ifdef _MSC_VER\r
-#define cdprintf\r
-#else\r
-#define cdprintf(x...)\r
-#endif\r
-\r
-#if defined(__GNUC__) && defined(__i386__)\r
-#define REGPARM(x) __attribute__((regparm(x)))\r
-#else\r
-#define REGPARM(x)\r
-#endif\r
-\r
-#ifdef __GNUC__\r
-#define NOINLINE __attribute__((noinline))\r
-#else\r
-#define NOINLINE\r
-#endif\r
-\r
 #ifdef __cplusplus\r
 } // End of extern "C"\r
 #endif\r