#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
}\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
#define SR_EMPT (1 << 9)\r
// not part of real SR\r
#define PVS_ACTIVE (1 << 16)\r
+#define PVS_VB2 (1 << 17) // ignores forced blanking\r
\r
struct PicoVideo\r
{\r
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
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
};\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
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
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
#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
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
// 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
\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
#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
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
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
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
// 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
#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