X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FPicoInt.h;h=18e779b51e3e9fc67c14b4fe27c923f3b83b6160;hb=48e8482fc2d74c9b96e581241390bade986acb22;hp=7d91df7bae688928cc1a10d476c45f9dbd246c67;hpb=cc68a136aa179a5f32fe40208371eb9c2b0aadae;p=picodrive.git diff --git a/Pico/PicoInt.h b/Pico/PicoInt.h index 7d91df7..18e779b 100644 --- a/Pico/PicoInt.h +++ b/Pico/PicoInt.h @@ -13,7 +13,7 @@ #include "Pico.h" -// to select core, define EMU_C68K, EMU_M68K or EMU_A68K in your makefile +// to select core, define EMU_C68K, EMU_M68K or EMU_A68K in your makefile or project #ifdef __cplusplus extern "C" { @@ -23,10 +23,16 @@ extern "C" { // ----------------------- 68000 CPU ----------------------- #ifdef EMU_C68K #include "../cpu/Cyclone/Cyclone.h" -extern struct Cyclone PicoCpu; -#define SekCyclesLeft PicoCpu.cycles // cycles left for this run -#define SekSetCyclesLeft(c) PicoCpu.cycles=c +extern struct Cyclone PicoCpu, PicoCpuS68k; +#define SekCyclesLeftNoMCD PicoCpu.cycles // cycles left for this run +#define SekCyclesLeft \ + (((PicoMCD&1) && (PicoOpt & 0x2000)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD) +#define SekSetCyclesLeftNoMCD(c) PicoCpu.cycles=c +#define SekSetCyclesLeft(c) { \ + if ((PicoMCD&1) && (PicoOpt & 0x2000)) SekCycleCnt=SekCycleAim-(c); else SekSetCyclesLeftNoMCD(c); \ +} #define SekPc (PicoCpu.pc-PicoCpu.membase) +#define SekPcS68k (PicoCpuS68k.pc-PicoCpuS68k.membase) #endif #ifdef EMU_A68K @@ -54,8 +60,13 @@ extern int m68k_ICount; extern m68ki_cpu_core PicoM68kCPU; // MD's CPU extern m68ki_cpu_core PicoS68kCPU; // Mega CD's CPU #ifndef SekCyclesLeft -#define SekCyclesLeft m68k_cycles_remaining() -#define SekSetCyclesLeft(c) SET_CYCLES(c) +#define SekCyclesLeftNoMCD m68k_cycles_remaining() +#define SekCyclesLeft \ + (((PicoMCD&1) && (PicoOpt & 0x2000)) ? (SekCycleAim-SekCycleCnt) : SekCyclesLeftNoMCD) +#define SekSetCyclesLeftNoMCD(c) SET_CYCLES(c) +#define SekSetCyclesLeft(c) { \ + if ((PicoMCD&1) && (PicoOpt & 0x2000)) SekCycleCnt=SekCycleAim-(c); else SET_CYCLES(c); \ +} #define SekPc m68k_get_reg(&PicoM68kCPU, M68K_REG_PC) #define SekPcS68k m68k_get_reg(&PicoS68kCPU, M68K_REG_PC) #endif @@ -123,7 +134,9 @@ struct PicoMisc unsigned char sram_cycle; // EEPROM SRAM cycle number unsigned char sram_slave; // EEPROM slave word for X24C02 and better SRAMs unsigned char prot_bytes[2]; // simple protection fakeing - unsigned char pad1[8]; + unsigned short dma_bytes; // + unsigned char pad[2]; + unsigned int frame_count; // mainly for movies }; // some assembly stuff depend on these, do not touch! @@ -147,11 +160,11 @@ struct Pico // sram struct PicoSRAM { - unsigned char *data; // actual data - unsigned int start; // start address in 68k address space + unsigned char *data; // actual data + unsigned int start; // start address in 68k address space unsigned int end; - unsigned char resize; // 1=SRAM size changed and needs to be reallocated on PicoReset - unsigned char reg_back; // copy of Pico.m.sram_reg to set after reset + unsigned char resize; // 0c: 1=SRAM size changed and needs to be reallocated on PicoReset + unsigned char reg_back; // copy of Pico.m.sram_reg to set after reset unsigned char changed; unsigned char pad; }; @@ -159,24 +172,81 @@ struct PicoSRAM // MCD #include "cd/cd_sys.h" #include "cd/LC89510.h" +#include "cd/gfx_cd.h" + +struct mcd_pcm +{ + unsigned char control; // reg7 + unsigned char enabled; // reg8 + unsigned char cur_ch; + unsigned char bank; + int pad1; + + struct pcm_chan // 08, size 0x10 + { + unsigned char regs[8]; + unsigned int addr; // .08: played sample address + int pad; + } ch[8]; +}; + +struct mcd_misc +{ + unsigned short hint_vector; + unsigned char busreq; + unsigned char s68k_pend_ints; + unsigned int state_flags; // 04: emu state: reset_pending, + unsigned int counter75hz; + unsigned short audio_offset; // 0c: for savestates: play pointer offset (0-1023) + unsigned char audio_track; // playing audio track # (zero based) + char pad1; + int timer_int3; // 10 + unsigned int timer_stopwatch; + int pad[10]; +}; typedef struct { - unsigned char bios[0x20000]; - union { + unsigned char bios[0x20000]; // 000000: 128K + union { // 020000: 512K unsigned char prg_ram[0x80000]; unsigned char prg_ram_b[4][0x20000]; }; - unsigned char word_ram[0x40000]; - unsigned char s68k_regs[0x200]; - unsigned char m68k_regs[0x10]; + union { // 0a0000: 256K + struct { + unsigned char word_ram2M[0x40000]; + unsigned char unused[0x20000]; + }; + struct { + unsigned char unused[0x20000]; + unsigned char word_ram1M[2][0x20000]; + }; + }; + union { // 100000: 64K + unsigned char pcm_ram[0x10000]; + unsigned char pcm_ram_b[0x10][0x1000]; + }; + unsigned char s68k_regs[0x200]; // 110000: GA, not CPU regs + unsigned char bram[0x2000]; // 110200: 8K + struct mcd_misc m; // 112200: misc + struct mcd_pcm pcm; // 112240: + _scd_toc TOC; // not to be saved CDD cdd; CDC cdc; _scd scd; + Rot_Comp rot_comp; } mcd_state; #define Pico_mcd ((mcd_state *)Pico.rom) +// Area.c +int PicoAreaPackCpu(unsigned char *cpu, int is_sub); +int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub); + +// cd/Area.c +int PicoCdSaveState(void *file); +int PicoCdLoadState(void *file); +int PicoCdLoadStateGfx(void *file); // Draw.c int PicoLine(int scan); @@ -188,15 +258,18 @@ void PicoFrameFull(); // Memory.c int PicoInitPc(unsigned int pc); unsigned int CPU_CALL PicoRead32(unsigned int a); -int PicoMemInit(); +void PicoMemSetup(); void PicoMemReset(); -void PicoDasm(int start,int len); +//void PicoDasm(int start,int len); unsigned char z80_read(unsigned short a); unsigned short z80_read16(unsigned short a); void z80_write(unsigned char data, unsigned short a); void z80_write16(unsigned short data, unsigned short a); // cd/Memory.c +void PicoMemSetupCD(void); +void PicoMemResetCD(int r3); +void PicoMemResetCDdecode(int r3); unsigned char PicoReadCD8 (unsigned int a); unsigned short PicoReadCD16(unsigned int a); unsigned int PicoReadCD32(unsigned int a); @@ -208,6 +281,7 @@ void PicoWriteCD32(unsigned int a, unsigned int d); extern struct Pico Pico; extern struct PicoSRAM SRam; extern int emustatus; +int CheckDMA(void); // cd/Pico.c int PicoInitMCD(void); @@ -225,6 +299,10 @@ int SekInitS68k(void); int SekResetS68k(void); int SekInterruptS68k(int irq); +// sound/sound.c +extern int PsndLen_exc_cnt; +extern int PsndLen_exc_add; + // VideoPort.c void PicoVideoWrite(unsigned int a,unsigned short d); unsigned int PicoVideoRead(unsigned int a); @@ -233,6 +311,14 @@ unsigned int PicoVideoRead(unsigned int a); void SRAMWriteEEPROM(unsigned int d); unsigned int SRAMReadEEPROM(); void SRAMUpdPending(unsigned int a, unsigned int d); +void memcpy16(unsigned short *dest, unsigned short *src, int count); +void memcpy16bswap(unsigned short *dest, void *src, int count); +void memcpy32(int *dest, int *src, int count); +void memset32(int *dest, int c, int count); + +// cd/Misc.c +void wram_2M_to_1M(unsigned char *m); +void wram_1M_to_2M(unsigned char *m); #ifdef __cplusplus