X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FPicoInt.h;h=0c3e687a506d060d89ff5fd9d5db81590ff84ae9;hb=71de3cd9bb3cad7630df5b1d2a0e56475995b025;hp=a9720c86037b130eac6bd1f1b296e927f0af33ca;hpb=3aa1e148a28da9b4e10e824984f7b3a4908b1ace;p=picodrive.git diff --git a/Pico/PicoInt.h b/Pico/PicoInt.h index a9720c8..0c3e687 100644 --- a/Pico/PicoInt.h +++ b/Pico/PicoInt.h @@ -48,11 +48,18 @@ 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 SekShouldInterrupt (PicoCpuCM68k.irq > (PicoCpuCM68k.srh&7)) + +#define SekInterrupt(i) PicoCpuCM68k.irq=i + +#ifdef EMU_M68K +#define EMU_CORE_DEBUG +#endif #endif #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) @@ -62,16 +69,23 @@ M68K_CONTEXT PicoCpuFM68k, PicoCpuFS68k; #define SekSetCyclesLeft(c) { \ if ((PicoMCD&1) && (PicoOpt & 0x2000)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \ } -#define SekPc m68k_get_pc(&PicoCpuFM68k) -#define SekPcS68k m68k_get_pc(&PicoCpuFS68k) +#define SekPc fm68k_get_pc(&PicoCpuFM68k) +#define SekPcS68k fm68k_get_pc(&PicoCpuFS68k) #define SekSetStop(x) { \ - PicoCpuFM68k.execinfo &= ~M68K_HALTED; \ - if (x) { PicoCpuFM68k.execinfo |= M68K_HALTED; PicoCpuFM68k.io_cycle_counter = 0; } \ + PicoCpuFM68k.execinfo &= ~FM68K_HALTED; \ + if (x) { PicoCpuFM68k.execinfo |= FM68K_HALTED; PicoCpuFM68k.io_cycle_counter = 0; } \ } #define SekSetStopS68k(x) { \ - PicoCpuFS68k.execinfo &= ~M68K_HALTED; \ - if (x) { PicoCpuFS68k.execinfo |= M68K_HALTED; PicoCpuFS68k.io_cycle_counter = 0; } \ + PicoCpuFS68k.execinfo &= ~FM68K_HALTED; \ + if (x) { PicoCpuFS68k.execinfo |= FM68K_HALTED; PicoCpuFS68k.io_cycle_counter = 0; } \ } +#define SekShouldInterrupt fm68k_would_interrupt() + +#define SekInterrupt(irq) PicoCpuFM68k.interrupts[0]=irq + +#ifdef EMU_M68K +#define EMU_CORE_DEBUG +#endif #endif #ifdef EMU_M68K @@ -97,6 +111,15 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k; if(x) { SET_CYCLES(0); PicoCpuMS68k.stopped=STOP_LEVEL_STOP; } \ else PicoCpuMS68k.stopped=0; \ } +#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 @@ -128,8 +151,7 @@ extern int SekCycleAimS68k; } #define SekCyclesDoneS68k() (SekCycleAimS68k-SekCyclesLeftS68k) -// debug cyclone -#if defined(EMU_C68K) && defined(EMU_M68K) +#ifdef EMU_CORE_DEBUG #undef SekSetCyclesLeftNoMCD #undef SekSetCyclesLeft #undef SekCyclesBurn @@ -140,6 +162,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; @@ -304,6 +366,9 @@ PICO_INTERNAL int PicoCdLoadState(void *file); // Cart.c PICO_INTERNAL void PicoCartDetect(void); +// Debug.c +int CM_compareRun(int cyc, int is_sub); + // Draw.c PICO_INTERNAL int PicoLine(int scan); PICO_INTERNAL void PicoFrameStart(void); @@ -313,14 +378,18 @@ PICO_INTERNAL void PicoFrameFull(); // Memory.c PICO_INTERNAL int PicoInitPc(unsigned int pc); -PICO_INTERNAL_ASM unsigned int CPU_CALL PicoRead32(unsigned int a); +PICO_INTERNAL_ASM unsigned int PicoRead32(unsigned int a); PICO_INTERNAL void PicoMemSetup(void); PICO_INTERNAL_ASM void PicoMemReset(void); PICO_INTERNAL int PadRead(int i); PICO_INTERNAL unsigned char z80_read(unsigned short a); -PICO_INTERNAL unsigned short z80_read16(unsigned short a); +#ifndef _USE_CZ80 PICO_INTERNAL_ASM void z80_write(unsigned char data, unsigned short a); PICO_INTERNAL void z80_write16(unsigned short data, unsigned short a); +PICO_INTERNAL unsigned short z80_read16(unsigned short a); +#else +PICO_INTERNAL_ASM void z80_write(unsigned int a, unsigned char data); +#endif // cd/Memory.c PICO_INTERNAL void PicoMemSetupCD(void); @@ -343,7 +412,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); @@ -377,15 +445,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); @@ -416,7 +481,7 @@ PICO_INTERNAL void z80_exit(void); #define EL_IO 0x1000 /* all i/o (TODO) */ #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 #define elprintf(w,f,...) \