cd: better cd change handling, perhaps?
[picodrive.git] / pico / pico_int.h
index ef49295..08c7a20 100644 (file)
@@ -49,7 +49,10 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k;
 #define SekSetStopS68k(x) { PicoCpuCS68k.state_flags&=~1; if (x) { PicoCpuCS68k.state_flags|=1; PicoCpuCS68k.cycles=0; } }\r
 #define SekIsStoppedM68k() (PicoCpuCM68k.state_flags&1)\r
 #define SekIsStoppedS68k() (PicoCpuCS68k.state_flags&1)\r
-#define SekShouldInterrupt (PicoCpuCM68k.irq > (PicoCpuCM68k.srh&7))\r
+#define SekShouldInterrupt() (PicoCpuCM68k.irq > (PicoCpuCM68k.srh&7))\r
+\r
+#define SekNotPolling     PicoCpuCM68k.not_pol\r
+#define SekNotPollingS68k PicoCpuCS68k.not_pol\r
 \r
 #define SekInterrupt(i) PicoCpuCM68k.irq=i\r
 #define SekIrqLevel     PicoCpuCM68k.irq\r
@@ -77,7 +80,10 @@ 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()\r
+\r
+#define SekNotPolling     PicoCpuFM68k.not_polling\r
+#define SekNotPollingS68k PicoCpuFS68k.not_polling\r
 \r
 #define SekInterrupt(irq) PicoCpuFM68k.interrupts[0]=irq\r
 #define SekIrqLevel       PicoCpuFM68k.interrupts[0]\r
@@ -106,7 +112,10 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k;
 }\r
 #define SekIsStoppedM68k() (PicoCpuMM68k.stopped==STOP_LEVEL_STOP)\r
 #define SekIsStoppedS68k() (PicoCpuMS68k.stopped==STOP_LEVEL_STOP)\r
-#define SekShouldInterrupt (CPU_INT_LEVEL > FLAG_INT_MASK)\r
+#define SekShouldInterrupt() (CPU_INT_LEVEL > FLAG_INT_MASK)\r
+\r
+#define SekNotPolling     PicoCpuMM68k.not_polling\r
+#define SekNotPollingS68k PicoCpuMS68k.not_polling\r
 \r
 #define SekInterrupt(irq) { \\r
        void *oldcontext = m68ki_cpu_p; \\r
@@ -132,7 +141,9 @@ extern unsigned int SekCycleAim;
 \r
 // burn cycles while not in SekRun() and while in\r
 #define SekCyclesBurn(c)    SekCycleCnt += c\r
-#define SekCyclesBurnRun(c) SekCyclesLeft -= c\r
+#define SekCyclesBurnRun(c) { \\r
+  SekCyclesLeft -= c; \\r
+}\r
 \r
 // note: sometimes may extend timeslice to delay an irq\r
 #define SekEndRun(after) { \\r
@@ -170,6 +181,8 @@ extern struct DrZ80 drZ80;
 #define z80_run(cycles)    ((cycles) - DrZ80Run(&drZ80, cycles))\r
 #define z80_run_nr(cycles) DrZ80Run(&drZ80, cycles)\r
 #define z80_int()          drZ80.Z80_IRQ = 1\r
+#define z80_int()          drZ80.Z80_IRQ = 1\r
+#define z80_nmi()          drZ80.Z80IF |= 8\r
 \r
 #define z80_cyclesLeft     drZ80.cycles\r
 #define z80_pc()           (drZ80.Z80PC - drZ80.Z80PC_BASE)\r
@@ -180,6 +193,7 @@ 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_nmi()          Cz80_Set_IRQ(&CZ80, IRQ_LINE_NMI, 0)\r
 \r
 #define z80_cyclesLeft     (CZ80.ICount - CZ80.ExtraCycles)\r
 #define z80_pc()           Cz80_Get_Reg(&CZ80, CZ80_PC)\r
@@ -189,6 +203,7 @@ extern struct DrZ80 drZ80;
 #define z80_run(cycles)    (cycles)\r
 #define z80_run_nr(cycles)\r
 #define z80_int()\r
+#define z80_nmi()\r
 \r
 #endif\r
 \r
@@ -292,7 +307,7 @@ struct PicoMisc
   unsigned char sram_reg;      // 09 SRAM reg. See SRR_* below\r
   unsigned short z80_bank68k;  // 0a\r
   unsigned short pad0;\r
-  unsigned char  pad1;\r
+  unsigned char  ncart_in;     // 0e !cart_in\r
   unsigned char  z80_reset;    // 0f z80 reset held\r
   unsigned char  padDelay[2];  // 10 gamepad phase time outs, so we count a delay\r
   unsigned short eeprom_addr;  // EEPROM address register\r
@@ -309,7 +324,8 @@ struct PicoMS
 {\r
   unsigned char carthw[0x10];\r
   unsigned char io_ctl;\r
-  unsigned char pad[0x4f];\r
+  unsigned char nmi_state;\r
+  unsigned char pad[0x4e];\r
 };\r
 \r
 // some assembly stuff depend on these, do not touch!\r
@@ -378,16 +394,22 @@ struct mcd_pcm
        } ch[8];\r
 };\r
 \r
+#define PCD_ST_S68K_RST 1\r
+\r
 struct mcd_misc\r
 {\r
        unsigned short hint_vector;\r
-       unsigned char  busreq;\r
+       unsigned char  busreq;          // not s68k_regs[1]\r
        unsigned char  s68k_pend_ints;\r
-       unsigned int   state_flags;     // 04: emu state: reset_pending\r
+       unsigned int   state_flags;     // 04\r
        unsigned int   stopwatch_base_c;\r
-       unsigned int   pad[3];\r
+       unsigned short m68k_poll_a;\r
+       unsigned short m68k_poll_cnt;\r
+       unsigned short s68k_poll_a;\r
+       unsigned short s68k_poll_cnt;\r
+       unsigned int   s68k_poll_clk;\r
        unsigned char  bcram_reg;       // 18: battery-backed RAM cart register\r
-       unsigned char  pad2;\r
+       unsigned char  dmna_ret_2m;\r
        unsigned short pad3;\r
        int pad4[9];\r
 };\r
@@ -430,6 +452,7 @@ typedef struct
 \r
 // 32X\r
 #define P32XS_FM    (1<<15)\r
+#define P32XS_nCART (1<< 8)\r
 #define P32XS_REN   (1<< 7)\r
 #define P32XS_nRES  (1<< 1)\r
 #define P32XS_ADEN  (1<< 0)\r
@@ -585,6 +608,10 @@ PICO_INTERNAL void PicoMemSetupPico(void);
 \r
 // cd/memory.c\r
 PICO_INTERNAL void PicoMemSetupCD(void);\r
+unsigned int PicoRead8_mcd_io(unsigned int a);\r
+unsigned int PicoRead16_mcd_io(unsigned int a);\r
+void PicoWrite8_mcd_io(unsigned int a, unsigned int d);\r
+void PicoWrite16_mcd_io(unsigned int a, unsigned int d);\r
 void pcd_state_loaded_mem(void);\r
 \r
 // pico.c\r
@@ -599,7 +626,7 @@ PICO_INTERNAL int  CheckDMA(void);
 PICO_INTERNAL void PicoDetectRegion(void);\r
 PICO_INTERNAL void PicoSyncZ80(unsigned int m68k_cycles_done);\r
 \r
-// cd/pico.c\r
+// cd/mcd.c\r
 #define PCDS_IEN1     (1<<1)\r
 #define PCDS_IEN2     (1<<2)\r
 #define PCDS_IEN3     (1<<3)\r
@@ -624,6 +651,9 @@ extern unsigned int pcd_event_times[PCD_EVENT_COUNT];
 void pcd_event_schedule(unsigned int now, enum pcd_event event, int after);\r
 void pcd_event_schedule_s68k(enum pcd_event event, int after);\r
 unsigned int pcd_cycles_m68k_to_s68k(unsigned int c);\r
+int  pcd_sync_s68k(unsigned int m68k_target, int m68k_poll_sync);\r
+void pcd_run_cpus(int m68k_cycles);\r
+void pcd_soft_reset(void);\r
 void pcd_state_loaded(void);\r
 \r
 // pico/pico.c\r
@@ -688,6 +718,7 @@ void ym2612_unpack_state(void);
 \r
 \r
 // videoport.c\r
+extern int line_base_cycles;\r
 PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d);\r
 PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a);\r
 PICO_INTERNAL_ASM unsigned int PicoVideoRead8(unsigned int a);\r
@@ -819,9 +850,9 @@ void sh2_peripheral_reset(SH2 *sh2);
 unsigned int sh2_peripheral_read8(unsigned int a, SH2 *sh2);\r
 unsigned int sh2_peripheral_read16(unsigned int a, SH2 *sh2);\r
 unsigned int sh2_peripheral_read32(unsigned int a, SH2 *sh2);\r
-void sh2_peripheral_write8(unsigned int a, unsigned int d, SH2 *sh2);\r
-void sh2_peripheral_write16(unsigned int a, unsigned int d, SH2 *sh2);\r
-void sh2_peripheral_write32(unsigned int a, unsigned int d, SH2 *sh2);\r
+void REGPARM(3) sh2_peripheral_write8(unsigned int a, unsigned int d, SH2 *sh2);\r
+void REGPARM(3) sh2_peripheral_write16(unsigned int a, unsigned int d, SH2 *sh2);\r
+void REGPARM(3) sh2_peripheral_write32(unsigned int a, unsigned int d, SH2 *sh2);\r
 \r
 #else\r
 #define Pico32xInit()\r
@@ -927,9 +958,9 @@ void pevt_log(unsigned int cycles, enum evt_cpu c, enum evt e);
 void pevt_dump(void);\r
 \r
 #define pevt_log_m68k(e) \\r
-  pevt_log(SekCyclesDoneT(), EVT_M68K, e)\r
+  pevt_log(SekCyclesDone(), EVT_M68K, e)\r
 #define pevt_log_m68k_o(e) \\r
-  pevt_log(SekCyclesDoneT2(), EVT_M68K, e)\r
+  pevt_log(SekCyclesDone(), EVT_M68K, e)\r
 #define pevt_log_sh2(sh2, e) \\r
   pevt_log(sh2_cycles_done_m68k(sh2), EVT_MSH2 + (sh2)->is_slave, e)\r
 #define pevt_log_sh2_o(sh2, e) \\r
@@ -950,7 +981,7 @@ void pevt_dump(void);
 #define cdprintf(x...)\r
 #endif\r
 \r
-#ifdef __i386__\r
+#if defined(__GNUC__) && defined(__i386__)\r
 #define REGPARM(x) __attribute__((regparm(x)))\r
 #else\r
 #define REGPARM(x)\r