Pico PCM, only one hardcoded mode for now
[picodrive.git] / Pico / PicoInt.h
index c867c19..eb78f8c 100644 (file)
@@ -38,12 +38,12 @@ extern "C" {
 extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k;\r
 #define SekCyclesLeftNoMCD PicoCpuCM68k.cycles // cycles left for this run\r
 #define SekCyclesLeft \\r
-       (((PicoMCD&1) && (PicoOpt & 0x2000)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
+       (((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
 #define SekCyclesLeftS68k \\r
-       ((PicoOpt & 0x2000) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuCS68k.cycles)\r
+       ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuCS68k.cycles)\r
 #define SekSetCyclesLeftNoMCD(c) PicoCpuCM68k.cycles=c\r
 #define SekSetCyclesLeft(c) { \\r
-       if ((PicoMCD&1) && (PicoOpt & 0x2000)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \\r
+       if ((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \\r
 }\r
 #define SekPc (PicoCpuCM68k.pc-PicoCpuCM68k.membase)\r
 #define SekPcS68k (PicoCpuCS68k.pc-PicoCpuCS68k.membase)\r
@@ -64,12 +64,12 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k;
 extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k;\r
 #define SekCyclesLeftNoMCD PicoCpuFM68k.io_cycle_counter\r
 #define SekCyclesLeft \\r
-       (((PicoMCD&1) && (PicoOpt & 0x2000)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
+       (((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
 #define SekCyclesLeftS68k \\r
-       ((PicoOpt & 0x2000) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuFS68k.io_cycle_counter)\r
+       ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuFS68k.io_cycle_counter)\r
 #define SekSetCyclesLeftNoMCD(c) PicoCpuFM68k.io_cycle_counter=c\r
 #define SekSetCyclesLeft(c) { \\r
-       if ((PicoMCD&1) && (PicoOpt & 0x2000)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \\r
+       if ((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \\r
 }\r
 #define SekPc     fm68k_get_pc(&PicoCpuFM68k)\r
 #define SekPcS68k fm68k_get_pc(&PicoCpuFS68k)\r
@@ -97,12 +97,12 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k;
 #ifndef SekCyclesLeft\r
 #define SekCyclesLeftNoMCD PicoCpuMM68k.cyc_remaining_cycles\r
 #define SekCyclesLeft \\r
-       (((PicoMCD&1) && (PicoOpt & 0x2000)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
+       (((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD)\r
 #define SekCyclesLeftS68k \\r
-       ((PicoOpt & 0x2000) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuMS68k.cyc_remaining_cycles)\r
+       ((PicoOpt & POPT_EN_MCD_PSYNC) ? (SekCycleAimS68k-SekCycleCntS68k) : PicoCpuMS68k.cyc_remaining_cycles)\r
 #define SekSetCyclesLeftNoMCD(c) SET_CYCLES(c)\r
 #define SekSetCyclesLeft(c) { \\r
-       if ((PicoMCD&1) && (PicoOpt & 0x2000)) SekCycleCnt=SekCycleAim-(c); else SET_CYCLES(c); \\r
+       if ((PicoAHW&1) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCycleCnt=SekCycleAim-(c); else SET_CYCLES(c); \\r
 }\r
 #define SekPc m68k_get_reg(&PicoCpuMM68k, M68K_REG_PC)\r
 #define SekPcS68k m68k_get_reg(&PicoCpuMS68k, M68K_REG_PC)\r
@@ -156,14 +156,17 @@ extern int SekCycleAimS68k;
 #define SekCyclesDoneS68k()  (SekCycleAimS68k-SekCyclesLeftS68k)\r
 \r
 #ifdef EMU_CORE_DEBUG\r
+extern int dbg_irq_level;\r
 #undef SekSetCyclesLeftNoMCD\r
 #undef SekSetCyclesLeft\r
 #undef SekCyclesBurn\r
 #undef SekEndRun\r
+#undef SekInterrupt\r
 #define SekSetCyclesLeftNoMCD(c)\r
 #define SekSetCyclesLeft(c)\r
 #define SekCyclesBurn(c) c\r
 #define SekEndRun(c)\r
+#define SekInterrupt(irq) dbg_irq_level=irq\r
 #endif\r
 \r
 // ----------------------- Z80 CPU -----------------------\r
@@ -208,7 +211,12 @@ extern struct DrZ80 drZ80;
 \r
 // ---------------------------------------------------------\r
 \r
-extern int PicoMCD;\r
+// Pico active hw\r
+#define PAHW_MCD  (1<<0)\r
+#define PAHW_32X  (1<<1)\r
+#define PAHW_SVP  (1<<2)\r
+#define PAHW_PICO (1<<3)\r
+extern int PicoAHW;\r
 \r
 // main oscillator clock which controls timing\r
 #define OSC_NTSC 53693100\r
@@ -241,7 +249,7 @@ struct PicoMisc
   unsigned short z80_bank68k;  // 0a\r
   unsigned short z80_lastaddr; // this is for Z80 faking\r
   unsigned char  z80_fakeval;\r
-  unsigned char  pad0;\r
+  unsigned char  z80_reset;    // 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
   unsigned char  eeprom_cycle; // EEPROM SRAM cycle number\r
@@ -314,9 +322,7 @@ struct mcd_misc
        unsigned char  s68k_pend_ints;\r
        unsigned int   state_flags;     // 04: emu state: reset_pending, dmna_pending\r
        unsigned int   counter75hz;\r
-       unsigned short audio_offset;    // 0c: for savestates: play pointer offset (0-1023)\r
-       unsigned char  audio_track;     // playing audio track # (zero based)\r
-       char           pad1;\r
+       unsigned int   pad0;\r
        int            timer_int3;      // 10\r
        unsigned int   timer_stopwatch;\r
        unsigned char  bcram_reg;       // 18: battery-backed RAM cart register\r
@@ -359,6 +365,7 @@ typedef struct
 \r
 #define Pico_mcd ((mcd_state *)Pico.rom)\r
 \r
+\r
 // Area.c\r
 PICO_INTERNAL int PicoAreaPackCpu(unsigned char *cpu, int is_sub);\r
 PICO_INTERNAL int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub);\r
@@ -377,7 +384,6 @@ extern carthw_state_chunk *carthw_chunks;
 #define CHUNK_CARTHW 64\r
 \r
 // Cart.c\r
-PICO_INTERNAL void PicoCartDetect(void);\r
 extern void (*PicoCartUnloadHook)(void);\r
 \r
 // Debug.c\r
@@ -392,6 +398,7 @@ PICO_INTERNAL void PicoFrameFull();
 \r
 // Memory.c\r
 PICO_INTERNAL int PicoInitPc(unsigned int pc);\r
+PICO_INTERNAL unsigned int PicoCheckPc(unsigned int pc);\r
 PICO_INTERNAL_ASM unsigned int PicoRead32(unsigned int a);\r
 PICO_INTERNAL void PicoMemSetup(void);\r
 PICO_INTERNAL_ASM void PicoMemReset(void);\r
@@ -414,6 +421,9 @@ PICO_INTERNAL void PicoMemSetupCD(void);
 PICO_INTERNAL_ASM void PicoMemResetCD(int r3);\r
 PICO_INTERNAL_ASM void PicoMemResetCDdecode(int r3);\r
 \r
+// Pico/Memory.c\r
+PICO_INTERNAL void PicoMemSetupPico(void);\r
+\r
 // Pico.c\r
 extern struct Pico Pico;\r
 extern struct PicoSRAM SRam;\r
@@ -421,14 +431,23 @@ extern int emustatus;
 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 int  CheckDMA(void);\r
+PICO_INTERNAL void PicoDetectRegion(void);\r
 \r
 // cd/Pico.c\r
 PICO_INTERNAL int  PicoInitMCD(void);\r
 PICO_INTERNAL void PicoExitMCD(void);\r
-PICO_INTERNAL int PicoResetMCD(int hard);\r
+PICO_INTERNAL void PicoPowerMCD(void);\r
+PICO_INTERNAL int PicoResetMCD(void);\r
 PICO_INTERNAL int PicoFrameMCD(void);\r
 \r
+// Pico/Pico.c\r
+PICO_INTERNAL int PicoInitPico(void);\r
+\r
+// Pico/xpcm.c\r
+PICO_INTERNAL void PicoPicoPCMUpdate(short *buffer, int length, int stereo);\r
+PICO_INTERNAL void PicoPicoPCMReset(void);\r
+\r
 // Sek.c\r
 PICO_INTERNAL int SekInit(void);\r
 PICO_INTERNAL int SekReset(void);\r
@@ -441,6 +460,8 @@ PICO_INTERNAL int SekResetS68k(void);
 PICO_INTERNAL int SekInterruptS68k(int irq);\r
 \r
 // sound/sound.c\r
+PICO_INTERNAL void cdda_start_play();\r
+extern short cdda_out_buffer[2*1152];\r
 extern int PsndLen_exc_cnt;\r
 extern int PsndLen_exc_add;\r
 \r