X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FPicoInt.h;h=bd10f19e46b17477ff021bd79b2da89d069d452e;hb=f8ef8ff7100baa0ac0ecfcacb47aea3a9e24bc38;hp=c086d7ad2e762b66cfc9ebf906e6fa8e134f1e04;hpb=03e4f2a349247334666c87abe3a908df72d23051;p=picodrive.git diff --git a/Pico/PicoInt.h b/Pico/PicoInt.h index c086d7a..bd10f19 100644 --- a/Pico/PicoInt.h +++ b/Pico/PicoInt.h @@ -13,6 +13,7 @@ #include #include #include "Pico.h" +#include "carthw/carthw.h" // #define USE_POLL_DETECT @@ -48,7 +49,11 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k; #define SekPcS68k (PicoCpuCS68k.pc-PicoCpuCS68k.membase) #define SekSetStop(x) { PicoCpuCM68k.state_flags&=~1; if (x) { PicoCpuCM68k.state_flags|=1; PicoCpuCM68k.cycles=0; } } #define SekSetStopS68k(x) { PicoCpuCS68k.state_flags&=~1; if (x) { PicoCpuCS68k.state_flags|=1; PicoCpuCS68k.cycles=0; } } +#define SekIsStoppedS68k() (PicoCpuCS68k.state_flags&1) #define SekShouldInterrupt (PicoCpuCM68k.irq > (PicoCpuCM68k.srh&7)) + +#define SekInterrupt(i) PicoCpuCM68k.irq=i + #ifdef EMU_M68K #define EMU_CORE_DEBUG #endif @@ -56,7 +61,7 @@ extern struct Cyclone PicoCpuCM68k, PicoCpuCS68k; #ifdef EMU_F68K #include "../cpu/fame/fame.h" -M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k; +extern M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k; #define SekCyclesLeftNoMCD PicoCpuFM68k.io_cycle_counter #define SekCyclesLeft \ (((PicoMCD&1) && (PicoOpt & 0x2000)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD) @@ -76,7 +81,11 @@ M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k; PicoCpuFS68k.execinfo &= ~FM68K_HALTED; \ if (x) { PicoCpuFS68k.execinfo |= FM68K_HALTED; PicoCpuFS68k.io_cycle_counter = 0; } \ } +#define SekIsStoppedS68k() (PicoCpuFS68k.execinfo&FM68K_HALTED) #define SekShouldInterrupt fm68k_would_interrupt() + +#define SekInterrupt(irq) PicoCpuFM68k.interrupts[0]=irq + #ifdef EMU_M68K #define EMU_CORE_DEBUG #endif @@ -105,7 +114,16 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k; if(x) { SET_CYCLES(0); PicoCpuMS68k.stopped=STOP_LEVEL_STOP; } \ else PicoCpuMS68k.stopped=0; \ } +#define SekIsStoppedS68k() (PicoCpuMS68k.stopped==STOP_LEVEL_STOP) #define SekShouldInterrupt (CPU_INT_LEVEL > FLAG_INT_MASK) + +#define SekInterrupt(irq) { \ + void *oldcontext = m68ki_cpu_p; \ + m68k_set_context(&PicoCpuMM68k); \ + m68k_set_irq(irq); \ + m68k_set_context(oldcontext); \ +} + #endif #endif @@ -148,6 +166,46 @@ extern int SekCycleAimS68k; #define SekEndRun(c) #endif +// ----------------------- Z80 CPU ----------------------- + +#if defined(_USE_MZ80) +#include "../../cpu/mz80/mz80.h" + +#define z80_run(cycles) mz80_run(cycles) +#define z80_run_nr(cycles) mz80_run(cycles) +#define z80_int() mz80int(0) +#define z80_resetCycles() mz80GetElapsedTicks(1) + +#elif defined(_USE_DRZ80) +#include "../../cpu/DrZ80/drz80.h" + +extern struct DrZ80 drZ80; + +#define z80_run(cycles) ((cycles) - DrZ80Run(&drZ80, cycles)) +#define z80_run_nr(cycles) DrZ80Run(&drZ80, cycles) +#define z80_int() { \ + drZ80.z80irqvector = 0xFF; /* default IRQ vector RST opcode */ \ + drZ80.Z80_IRQ = 1; \ +} +#define z80_resetCycles() + +#elif defined(_USE_CZ80) +#include "../../cpu/cz80/cz80.h" + +#define z80_run(cycles) Cz80_Exec(&CZ80, cycles) +#define z80_run_nr(cycles) Cz80_Exec(&CZ80, cycles) +#define z80_int() Cz80_Set_IRQ(&CZ80, 0, HOLD_LINE) +#define z80_resetCycles() + +#else + +#define z80_run(cycles) (cycles) +#define z80_run_nr(cycles) +#define z80_int() +#define z80_resetCycles() + +#endif + // --------------------------------------------------------- extern int PicoMCD; @@ -313,7 +371,7 @@ PICO_INTERNAL int PicoCdLoadState(void *file); PICO_INTERNAL void PicoCartDetect(void); // Debug.c -int CM_compareRun(int cyc); +int CM_compareRun(int cyc, int is_sub); // Draw.c PICO_INTERNAL int PicoLine(int scan); @@ -327,6 +385,7 @@ PICO_INTERNAL int PicoInitPc(unsigned int pc); PICO_INTERNAL_ASM unsigned int PicoRead32(unsigned int a); PICO_INTERNAL void PicoMemSetup(void); PICO_INTERNAL_ASM void PicoMemReset(void); +PICO_INTERNAL void PicoMemResetHooks(void); PICO_INTERNAL int PadRead(int i); PICO_INTERNAL unsigned char z80_read(unsigned short a); #ifndef _USE_CZ80 @@ -336,6 +395,9 @@ PICO_INTERNAL unsigned short z80_read16(unsigned short a); #else PICO_INTERNAL_ASM void z80_write(unsigned int a, unsigned char data); #endif +extern unsigned int (*PicoRead16Hook)(unsigned int a, int realsize); +extern void (*PicoWrite8Hook) (unsigned int a,unsigned int d,int realsize); +extern void (*PicoWrite16Hook)(unsigned int a,unsigned int d,int realsize); // cd/Memory.c PICO_INTERNAL void PicoMemSetupCD(void); @@ -347,6 +409,7 @@ extern struct Pico Pico; extern struct PicoSRAM SRam; extern int emustatus; extern int z80startCycle, z80stopCycle; // in 68k cycles +extern void (*PicoResetHook)(void); PICO_INTERNAL int CheckDMA(void); // cd/Pico.c @@ -358,7 +421,6 @@ PICO_INTERNAL int PicoFrameMCD(void); // Sek.c PICO_INTERNAL int SekInit(void); PICO_INTERNAL int SekReset(void); -PICO_INTERNAL int SekInterrupt(int irq); PICO_INTERNAL void SekState(int *data); PICO_INTERNAL void SekSetRealTAS(int use_real); @@ -374,6 +436,7 @@ extern int PsndLen_exc_add; // VideoPort.c PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d); PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a); +extern int (*PicoDmaHook)(unsigned int source, unsigned short **srcp, unsigned short **limitp); // Misc.c PICO_INTERNAL void SRAMWriteEEPROM(unsigned int d); @@ -392,15 +455,12 @@ PICO_INTERNAL_ASM void wram_1M_to_2M(unsigned char *m); PICO_INTERNAL void PicoCDBufferRead(void *dest, int lba); // sound/sound.c -PICO_INTERNAL void sound_reset(void); -PICO_INTERNAL void sound_timers_and_dac(int raster); -PICO_INTERNAL int sound_render(int offset, int length); -PICO_INTERNAL void sound_clear(void); +PICO_INTERNAL void PsndReset(void); +PICO_INTERNAL void Psnd_timers_and_dac(int raster); +PICO_INTERNAL int PsndRender(int offset, int length); +PICO_INTERNAL void PsndClear(void); // z80 functionality wrappers PICO_INTERNAL void z80_init(void); -PICO_INTERNAL void z80_resetCycles(void); -PICO_INTERNAL void z80_int(void); -PICO_INTERNAL int z80_run(int cycles); PICO_INTERNAL void z80_pack(unsigned char *data); PICO_INTERNAL void z80_unpack(unsigned char *data); PICO_INTERNAL void z80_reset(void); @@ -428,16 +488,18 @@ PICO_INTERNAL void z80_exit(void); #define EL_SRAMIO 0x0200 /* sram i/o */ #define EL_EEPROM 0x0400 /* eeprom debug */ #define EL_UIO 0x0800 /* unmapped i/o */ -#define EL_IO 0x1000 /* all i/o (TODO) */ +#define EL_IO 0x1000 /* all i/o */ +#define EL_CDPOLL 0x2000 /* MCD: log poll detection */ #define EL_STATUS 0x4000 /* status messages */ -#define EL_ANOMALY 0x8000 /* some unexpected conditions */ +#define EL_ANOMALY 0x8000 /* some unexpected conditions (during emulation) */ #if EL_LOGMASK +extern void lprintf(const char *fmt, ...); #define elprintf(w,f,...) \ { \ if ((w) & EL_LOGMASK) \ - printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__); \ + lprintf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__); \ } #else #define elprintf(w,f,...)