From: notaz Date: Sat, 25 Aug 2007 18:06:54 +0000 (+0000) Subject: amalgamation X-Git-Tag: v1.85~689 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eff55556cff77fd64cff4be32e449e0a58aed6fe;p=picodrive.git amalgamation git-svn-id: file:///home/notaz/opt/svn/PicoDrive@227 be3aeb3a-fb24-0410-a615-afba39da0efa --- diff --git a/Pico/Area.c b/Pico/Area.c index 3749ac32..e62274af 100644 --- a/Pico/Area.c +++ b/Pico/Area.c @@ -42,7 +42,7 @@ static int ScanVar(void *data,int len,char *name,void *PmovFile,int PmovAction) #define SCANP(x) ScanVar(&Pico.x,sizeof(Pico.x),#x,PmovFile,PmovAction); // Pack the cpu into a common format: -int PicoAreaPackCpu(unsigned char *cpu, int is_sub) +PICO_INTERNAL int PicoAreaPackCpu(unsigned char *cpu, int is_sub) { unsigned int pc=0; @@ -82,7 +82,7 @@ int PicoAreaPackCpu(unsigned char *cpu, int is_sub) return 0; } -int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub) +PICO_INTERNAL int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub) { #ifdef EMU_A68K memcpy(M68000_regs.d,cpu,0x40); diff --git a/Pico/Draw.c b/Pico/Draw.c index 582c8cbf..051b16d4 100644 --- a/Pico/Draw.c +++ b/Pico/Draw.c @@ -1242,7 +1242,7 @@ static int DrawDisplay(int sh) static int Skip=0; -void PicoFrameStart() +PICO_INTERNAL void PicoFrameStart(void) { // prepare to do this frame rendstatus = (PicoOpt&0x80)>>5; // accurate sprites @@ -1256,7 +1256,7 @@ void PicoFrameStart() Skip=0; } -int PicoLine(int scan) +PICO_INTERNAL int PicoLine(int scan) { int sh; if (Skip>0) { Skip--; return 0; } // Skip rendering lines diff --git a/Pico/Draw2.c b/Pico/Draw2.c index 2484164d..5037e2f9 100644 --- a/Pico/Draw2.c +++ b/Pico/Draw2.c @@ -10,10 +10,6 @@ #include "PicoInt.h" -#include -#ifndef __GNUC__ -#pragma warning (disable:4706) // Disable assignment within conditional -#endif // port_config.h include must define these 2 defines: // #define START_ROW 1 // which row of tiles to start rendering at? @@ -28,8 +24,8 @@ extern unsigned char *framebuff; // in format (8+320)x(8+224+8) (eights for borders) int currpri = 0; -static int HighCacheA[41*(TILE_ROWS+1)+1+1]; // caches for high layers -static int HighCacheB[41*(TILE_ROWS+1)+1+1]; +static int HighCache2A[41*(TILE_ROWS+1)+1+1]; // caches for high layers +static int HighCache2B[41*(TILE_ROWS+1)+1+1]; unsigned short *PicoCramHigh=Pico.cram; // pointer to CRAM buff (0x40 shorts), converted to native device color (works only with 16bit for now) void (*PicoPrepareCram)()=0; // prepares PicoCramHigh for renderer to use @@ -235,9 +231,9 @@ static void DrawLayerFull(int plane, int *hcache, int planestart, int planeend) height=(width>>4)&3; width&=3; xmask=(1<1) ymask =0x1f; + ymask=(height<<5)|0x1f; // Y Mask in tiles + if(width == 1) ymask&=0x3f; + else if(width>1) ymask =0x1f; // Find name table: if (plane==0) nametab=(pvid->reg[2]&0x38)<< 9; // A @@ -563,17 +559,17 @@ static void DrawDisplayFull() if(hvwin==1) { winend|=maxcolc<<16; planeend|=maxcolc<<16; } currpri = 0; - DrawLayerFull(1, HighCacheB, START_ROW, (maxcolc<<16)|END_ROW); + DrawLayerFull(1, HighCache2B, START_ROW, (maxcolc<<16)|END_ROW); switch(hvwin) { case 4: // fullscreen window DrawWindowFull(START_ROW, (maxcolc<<16)|END_ROW, 0); - HighCacheA[1] = 0; + HighCache2A[1] = 0; break; case 3: // we have plane A and both v and h windows - DrawLayerFull(0, HighCacheA, planestart, planeend); + DrawLayerFull(0, HighCache2A, planestart, planeend); DrawWindowFull( winstart&~0xff0000, (winend&~0xff0000)|(maxcolc<<16), 0); // h DrawWindowFull((winstart&~0xff)|START_ROW, (winend&~0xff)|END_ROW, 0); // v break; @@ -581,20 +577,20 @@ static void DrawDisplayFull() case 2: case 1: // both window and plane A visible, window is vertical XOR horizontal - DrawLayerFull(0, HighCacheA, planestart, planeend); + DrawLayerFull(0, HighCache2A, planestart, planeend); DrawWindowFull(winstart, winend, 0); break; default: // fullscreen plane A - DrawLayerFull(0, HighCacheA, START_ROW, (maxcolc<<16)|END_ROW); + DrawLayerFull(0, HighCache2A, START_ROW, (maxcolc<<16)|END_ROW); break; } DrawAllSpritesFull(0, maxw); #ifdef USE_CACHE - if(HighCacheB[1]) DrawTilesFromCacheF(HighCacheB); - if(HighCacheA[1]) DrawTilesFromCacheF(HighCacheA); + if(HighCache2B[1]) DrawTilesFromCacheF(HighCache2B); + if(HighCache2A[1]) DrawTilesFromCacheF(HighCache2A); switch(hvwin) { case 4: // fullscreen window @@ -621,7 +617,7 @@ static void DrawDisplayFull() } -void PicoFrameFull() +PICO_INTERNAL void PicoFrameFull() { // prepare cram? if(PicoPrepareCram) PicoPrepareCram(); diff --git a/Pico/Memory.c b/Pico/Memory.c index 2b253d80..01e92f4a 100644 --- a/Pico/Memory.c +++ b/Pico/Memory.c @@ -11,13 +11,15 @@ #include "PicoInt.h" -#include "sound/sound.h" #include "sound/ym2612.h" #include "sound/sn76496.h" +#ifndef UTYPES_DEFINED typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; +#define UTYPES_DEFINED +#endif extern unsigned int lastSSRamWrite; // used by serial SRAM code @@ -88,14 +90,14 @@ static u32 CPU_CALL PicoCheckPc(u32 pc) } -int PicoInitPc(u32 pc) +PICO_INTERNAL int PicoInitPc(u32 pc) { PicoCheckPc(pc); return 0; } #ifndef _ASM_MEMORY_C -void PicoMemReset() +PICO_INTERNAL_ASM void PicoMemReset(void) { } #endif @@ -266,7 +268,7 @@ static void OtherWrite8End(u32 a,u32 d,int realsize) // Read Rom and read Ram #ifndef _ASM_MEMORY_C -u32 CPU_CALL PicoRead8(u32 a) +PICO_INTERNAL_ASM u32 CPU_CALL PicoRead8(u32 a) { u32 d=0; @@ -317,7 +319,7 @@ u32 CPU_CALL PicoRead8(u32 a) return d; } -u32 CPU_CALL PicoRead16(u32 a) +PICO_INTERNAL_ASM u32 CPU_CALL PicoRead16(u32 a) { u32 d=0; @@ -353,7 +355,7 @@ u32 CPU_CALL PicoRead16(u32 a) return d; } -u32 CPU_CALL PicoRead32(u32 a) +PICO_INTERNAL_ASM u32 CPU_CALL PicoRead32(u32 a) { u32 d=0; @@ -446,7 +448,7 @@ static void CPU_CALL PicoWrite32(u32 a,u32 d) // ----------------------------------------------------------------- -void PicoMemSetup() +PICO_INTERNAL void PicoMemSetup(void) { #ifdef EMU_C68K // Setup memory callbacks: @@ -623,7 +625,7 @@ void m68k_write_memory_32(unsigned int address, unsigned int value) // ----------------------------------------------------------------- // z80 memhandlers -unsigned char z80_read(unsigned short a) +PICO_INTERNAL unsigned char z80_read(unsigned short a) { u8 ret = 0; @@ -651,14 +653,14 @@ end: return ret; } -unsigned short z80_read16(unsigned short a) +PICO_INTERNAL unsigned short z80_read16(unsigned short a) { //dprintf("z80_read16"); return (u16) ( (u16)z80_read(a) | ((u16)z80_read((u16)(a+1))<<8) ); } -void z80_write(unsigned char data, unsigned short a) +PICO_INTERNAL_ASM void z80_write(unsigned char data, unsigned short a) { //if (a<0x4000) // dprintf("z80 w8 : %06x, %02x @%04x", a, data, mz80GetRegisterValue(NULL, 0)); @@ -697,7 +699,7 @@ void z80_write(unsigned char data, unsigned short a) if (a<0x4000) { Pico.zram[a&0x1fff]=data; return; } } -void z80_write16(unsigned short data, unsigned short a) +PICO_INTERNAL void z80_write16(unsigned short data, unsigned short a) { //dprintf("z80_write16"); diff --git a/Pico/MemoryCmn.c b/Pico/MemoryCmn.c index ee75abca..09710beb 100644 --- a/Pico/MemoryCmn.c +++ b/Pico/MemoryCmn.c @@ -1,6 +1,20 @@ // common code for Memory.c and cd/Memory.c // (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas +#ifndef UTYPES_DEFINED +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +#define UTYPES_DEFINED +#endif + +#ifdef _ASM_MEMORY_C +u32 OtherRead16End(u32 a, int realsize); +#endif +#ifdef _ASM_CD_MEMORY_C +static void OtherWrite8End(u32 a,u32 d,int realsize); +#endif + static int PadRead(int i) { int pad=0,value=0,TH; diff --git a/Pico/Misc.c b/Pico/Misc.c index 5bb58145..2a0e5699 100644 --- a/Pico/Misc.c +++ b/Pico/Misc.c @@ -141,7 +141,7 @@ unsigned int lastSSRamWrite = 0xffff0000; // sram_reg: LAtd sela (L=pending SCL, A=pending SDA, t=type(1==uses 0x200000 for SCL and 2K bytes), // d=SRAM was detected (header or by access), s=started, e=save is EEPROM, l=old SCL, a=old SDA) -void SRAMWriteEEPROM(unsigned int d) // ???? ??la (l=SCL, a=SDA) +PICO_INTERNAL void SRAMWriteEEPROM(unsigned int d) // ???? ??la (l=SCL, a=SDA) { unsigned int sreg = Pico.m.sram_reg, saddr = Pico.m.sram_addr, scyc = Pico.m.sram_cycle, ssa = Pico.m.sram_slave; @@ -247,7 +247,7 @@ void SRAMWriteEEPROM(unsigned int d) // ???? ??la (l=SCL, a=SDA) Pico.m.sram_slave= (unsigned char) ssa; } -unsigned int SRAMReadEEPROM() +PICO_INTERNAL_ASM unsigned int SRAMReadEEPROM(void) { unsigned int shift, d=0; unsigned int sreg, saddr, scyc, ssa; @@ -282,7 +282,7 @@ unsigned int SRAMReadEEPROM() return d; } -void SRAMUpdPending(unsigned int a, unsigned int d) +PICO_INTERNAL void SRAMUpdPending(unsigned int a, unsigned int d) { unsigned int sreg = Pico.m.sram_reg; @@ -306,14 +306,14 @@ void SRAMUpdPending(unsigned int a, unsigned int d) #ifndef _ASM_MISC_C -void memcpy16(unsigned short *dest, unsigned short *src, int count) +PICO_INTERNAL_ASM void memcpy16(unsigned short *dest, unsigned short *src, int count) { while (count--) *dest++ = *src++; } -void memcpy16bswap(unsigned short *dest, void *src, int count) +PICO_INTERNAL_ASM void memcpy16bswap(unsigned short *dest, void *src, int count) { unsigned char *src_ = src; @@ -322,14 +322,14 @@ void memcpy16bswap(unsigned short *dest, void *src, int count) } -void memcpy32(int *dest, int *src, int count) +PICO_INTERNAL_ASM void memcpy32(int *dest, int *src, int count) { while (count--) *dest++ = *src++; } -void memset32(int *dest, int c, int count) +PICO_INTERNAL_ASM void memset32(int *dest, int c, int count) { while (count--) *dest++ = c; diff --git a/Pico/Patch.c b/Pico/Patch.c index 1b063ccb..e57d83f2 100644 --- a/Pico/Patch.c +++ b/Pico/Patch.c @@ -213,7 +213,7 @@ bad_code: -unsigned short PicoRead16(unsigned int a); +unsigned int PicoRead16(unsigned int a); void PicoWrite16(unsigned int a, unsigned short d); diff --git a/Pico/Pico.c b/Pico/Pico.c index e6a3b296..7b707972 100644 --- a/Pico/Pico.c +++ b/Pico/Pico.c @@ -8,7 +8,6 @@ #include "PicoInt.h" -#include "sound/sound.h" #include "sound/ym2612.h" int PicoVer=0x0110; @@ -218,8 +217,8 @@ static int dma_bsycles[] = { (488<<8)/9, (488<<8)/18, (488<<8)/17, (488<<8)/9 }; -//static -int CheckDMA(void) + +PICO_INTERNAL int CheckDMA(void) { int burn = 0, bytes_can = 0, dma_op = Pico.video.reg[0x17]>>6; // see gens for 00 and 01 modes int bytes = Pico.m.dma_bytes; diff --git a/Pico/Pico.h b/Pico/Pico.h index a646d5b0..0ec74a88 100644 --- a/Pico/Pico.h +++ b/Pico/Pico.h @@ -12,6 +12,8 @@ #ifndef PICO_H #define PICO_H +#include + // port-specific compile-time settings #include @@ -47,10 +49,8 @@ extern void (*PicoWriteSound)(int len); // called once per frame at the best tim extern void (*PicoMessage)(const char *msg); // callback to output text message from emu // cd/Pico.c -int PicoFrameMCD(void); extern void (*PicoMCDopenTray)(void); extern int (*PicoMCDcloseTray)(void); - extern int PicoCDBuffers; // Area.c @@ -67,10 +67,17 @@ extern areaseek *areaSeek; extern areaclose *areaClose; extern void (*PicoStateProgressCB)(const char *str); +// cd/Area.c +int PicoCdLoadStateGfx(void *file); + // cd/buffering.c void PicoCDBufferInit(void); void PicoCDBufferFree(void); +// cd/cd_sys.c +int Insert_CD(char *iso_name, int is_bin); +void Stop_CD(void); // releases all resources taken when CD game was started. + // Cart.c typedef enum { @@ -117,11 +124,7 @@ extern void (*PicoPrepareCram)(); // prepares PicoCramHigh for renderer to us // sound.c extern int PsndRate,PsndLen; extern short *PsndOut; -void sound_reset(); void sound_rerate(int preserve_state); -void z80_pack(unsigned char *data); -void z80_unpack(unsigned char *data); -void z80_reset(); // Utils.c extern int PicuAnd; diff --git a/Pico/PicoInt.h b/Pico/PicoInt.h index 58d37d09..f495bb65 100644 --- a/Pico/PicoInt.h +++ b/Pico/PicoInt.h @@ -1,4 +1,4 @@ -// Pico Library - Header File +// Pico Library - Internal Header File // (c) Copyright 2004 Dave, All rights reserved. // (c) Copyright 2006,2007 Grazvydas "notaz" Ignotas, all rights reserved. @@ -6,6 +6,8 @@ // For commercial use, separate licencing terms must be obtained. +#ifndef PICO_INTERNAL_INCLUDED +#define PICO_INTERNAL_INCLUDED #include #include @@ -15,6 +17,12 @@ // #define USE_POLL_DETECT +#ifndef PICO_INTERNAL +#define PICO_INTERNAL +#endif +#ifndef PICO_INTERNAL_ASM +#define PICO_INTERNAL_ASM +#endif // to select core, define EMU_C68K, EMU_M68K or EMU_A68K in your makefile or project @@ -270,89 +278,102 @@ typedef struct #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); +PICO_INTERNAL int PicoAreaPackCpu(unsigned char *cpu, int is_sub); +PICO_INTERNAL int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub); // cd/Area.c -int PicoCdSaveState(void *file); -int PicoCdLoadState(void *file); -int PicoCdLoadStateGfx(void *file); +PICO_INTERNAL int PicoCdSaveState(void *file); +PICO_INTERNAL int PicoCdLoadState(void *file); // Draw.c -int PicoLine(int scan); -void PicoFrameStart(); +PICO_INTERNAL int PicoLine(int scan); +PICO_INTERNAL void PicoFrameStart(void); // Draw2.c -void PicoFrameFull(); +PICO_INTERNAL void PicoFrameFull(); // Memory.c -int PicoInitPc(unsigned int pc); -unsigned int CPU_CALL PicoRead32(unsigned int a); -void PicoMemSetup(); -void PicoMemReset(); -//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); +PICO_INTERNAL int PicoInitPc(unsigned int pc); +PICO_INTERNAL_ASM unsigned int CPU_CALL PicoRead32(unsigned int a); +PICO_INTERNAL void PicoMemSetup(void); +PICO_INTERNAL_ASM void PicoMemReset(void); +PICO_INTERNAL unsigned char z80_read(unsigned short a); +PICO_INTERNAL unsigned short z80_read16(unsigned short a); +PICO_INTERNAL_ASM void z80_write(unsigned char data, unsigned short a); +PICO_INTERNAL 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); -void PicoWriteCD8 (unsigned int a, unsigned char d); -void PicoWriteCD16(unsigned int a, unsigned short d); -void PicoWriteCD32(unsigned int a, unsigned int d); +PICO_INTERNAL void PicoMemSetupCD(void); +PICO_INTERNAL_ASM void PicoMemResetCD(int r3); +PICO_INTERNAL_ASM void PicoMemResetCDdecode(int r3); // Pico.c extern struct Pico Pico; extern struct PicoSRAM SRam; extern int emustatus; extern int z80startCycle, z80stopCycle; // in 68k cycles -int CheckDMA(void); +PICO_INTERNAL int CheckDMA(void); // cd/Pico.c -int PicoInitMCD(void); -void PicoExitMCD(void); -int PicoResetMCD(int hard); +PICO_INTERNAL int PicoInitMCD(void); +PICO_INTERNAL int PicoResetMCD(int hard); +PICO_INTERNAL int PicoFrameMCD(void); // Sek.c -int SekInit(void); -int SekReset(void); -int SekInterrupt(int irq); -void SekState(unsigned char *data); -void SekSetRealTAS(int use_real); +PICO_INTERNAL int SekInit(void); +PICO_INTERNAL int SekReset(void); +PICO_INTERNAL int SekInterrupt(int irq); +PICO_INTERNAL void SekState(unsigned char *data); +PICO_INTERNAL void SekSetRealTAS(int use_real); // cd/Sek.c -int SekInitS68k(void); -int SekResetS68k(void); -int SekInterruptS68k(int irq); +PICO_INTERNAL int SekInitS68k(void); +PICO_INTERNAL int SekResetS68k(void); +PICO_INTERNAL 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); +PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d); +PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a); // Misc.c -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); // 32bit word count -void memset32(int *dest, int c, int count); +PICO_INTERNAL void SRAMWriteEEPROM(unsigned int d); +PICO_INTERNAL void SRAMUpdPending(unsigned int a, unsigned int d); +PICO_INTERNAL_ASM unsigned int SRAMReadEEPROM(void); +PICO_INTERNAL_ASM void memcpy16(unsigned short *dest, unsigned short *src, int count); +PICO_INTERNAL_ASM void memcpy16bswap(unsigned short *dest, void *src, int count); +PICO_INTERNAL_ASM void memcpy32(int *dest, int *src, int count); // 32bit word count +PICO_INTERNAL_ASM 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); +PICO_INTERNAL_ASM void wram_2M_to_1M(unsigned char *m); +PICO_INTERNAL_ASM void wram_1M_to_2M(unsigned char *m); + +// cd/buffering.c +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); +// 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); +PICO_INTERNAL void z80_exit(void); #ifdef __cplusplus } // End of extern "C" #endif + +#endif // PICO_INTERNAL_INCLUDED + diff --git a/Pico/Sek.c b/Pico/Sek.c index 24fda926..8ce0bd84 100644 --- a/Pico/Sek.c +++ b/Pico/Sek.c @@ -102,7 +102,7 @@ static int SekTasCallback(void) -int SekInit() +PICO_INTERNAL int SekInit() { #ifdef EMU_C68K CycloneInit(); @@ -134,7 +134,7 @@ int SekInit() } // Reset the 68000: -int SekReset() +PICO_INTERNAL int SekReset() { if (Pico.rom==NULL) return 1; @@ -166,7 +166,7 @@ int SekReset() } -int SekInterrupt(int irq) +PICO_INTERNAL int SekInterrupt(int irq) { #if defined(EMU_C68K) && defined(EMU_M68K) { @@ -196,7 +196,7 @@ int SekInterrupt(int irq) //int SekPc() { return M68000_regs.pc; } //int SekPc() { return m68k_get_reg(NULL, M68K_REG_PC); } -void SekState(unsigned char *data) +PICO_INTERNAL void SekState(unsigned char *data) { #ifdef EMU_C68K memcpy(data,PicoCpu.d,0x44); @@ -209,7 +209,7 @@ void SekState(unsigned char *data) #endif } -void SekSetRealTAS(int use_real) +PICO_INTERNAL void SekSetRealTAS(int use_real) { #ifdef EMU_C68K CycloneSetRealTAS(use_real); diff --git a/Pico/VideoPort.c b/Pico/VideoPort.c index d70bbb5b..a4fe3c88 100644 --- a/Pico/VideoPort.c +++ b/Pico/VideoPort.c @@ -15,8 +15,12 @@ extern const unsigned char hcounts_40[]; extern const unsigned short vcounts[]; extern int rendstatus; +#ifndef UTYPES_DEFINED typedef unsigned char u8; typedef unsigned short u16; +typedef unsigned int u32; +#define UTYPES_DEFINED +#endif static __inline void AutoIncrement() @@ -308,7 +312,7 @@ static void CommandChange() if (cmd&0x80) CommandDma(); } -void PicoVideoWrite(unsigned int a,unsigned short d) +PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d) { struct PicoVideo *pvid=&Pico.video; @@ -390,7 +394,7 @@ void PicoVideoWrite(unsigned int a,unsigned short d) } } -unsigned int PicoVideoRead(unsigned int a) +PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a) { unsigned int d=0; diff --git a/Pico/cd/Area.c b/Pico/cd/Area.c index 8100d366..ea4220e5 100644 --- a/Pico/cd/Area.c +++ b/Pico/cd/Area.c @@ -88,7 +88,7 @@ static int write_chunk(chunk_name_e name, int len, void *data, void *file) if (PicoStateProgressCB) PicoStateProgressCB(chunk_names[name]); \ if (!write_chunk(name, sizeof(buff), &buff, file)) return 1; -int PicoCdSaveState(void *file) +PICO_INTERNAL int PicoCdSaveState(void *file) { unsigned char buff[0x60]; void *ym2612_regs = YM2612GetRegs(); @@ -168,7 +168,7 @@ static int g_read_offs = 0; #define CHECKED_READ_BUFF(buff) CHECKED_READ2(sizeof(buff), &buff); -int PicoCdLoadState(void *file) +PICO_INTERNAL int PicoCdLoadState(void *file) { unsigned char buff[0x60]; int ver, len; diff --git a/Pico/cd/LC89510.c b/Pico/cd/LC89510.c index a78488bc..31c3f64c 100644 --- a/Pico/cd/LC89510.c +++ b/Pico/cd/LC89510.c @@ -56,7 +56,7 @@ static void CDC_Reset(void) } -void LC89510_Reset(void) +PICO_INTERNAL void LC89510_Reset(void) { CDD_Reset(); CDC_Reset(); @@ -66,7 +66,7 @@ void LC89510_Reset(void) } -void Update_CDC_TRansfer(int which) +PICO_INTERNAL void Update_CDC_TRansfer(int which) { unsigned int DMA_Adr, dep, length; unsigned short *dest; @@ -178,7 +178,7 @@ void Update_CDC_TRansfer(int which) } -unsigned short Read_CDC_Host(int is_sub) +PICO_INTERNAL_ASM unsigned short Read_CDC_Host(int is_sub) { int addr; @@ -230,7 +230,7 @@ unsigned short Read_CDC_Host(int is_sub) } -void CDC_Update_Header(void) +PICO_INTERNAL void CDC_Update_Header(void) { if (Pico_mcd->cdc.CTRL.B.B1 & 0x01) // Sub-Header wanted ? { @@ -253,7 +253,7 @@ void CDC_Update_Header(void) } -unsigned char CDC_Read_Reg(void) +PICO_INTERNAL unsigned char CDC_Read_Reg(void) { unsigned char ret; @@ -376,7 +376,7 @@ unsigned char CDC_Read_Reg(void) } -void CDC_Write_Reg(unsigned char Data) +PICO_INTERNAL void CDC_Write_Reg(unsigned char Data) { cdprintf("CDC write reg%02d = %.2X", Pico_mcd->s68k_regs[5] & 0xF, Data); @@ -494,7 +494,7 @@ static int bswapwrite(int a, unsigned short d) return d + (d >> 8); } -void CDD_Export_Status(void) +PICO_INTERNAL void CDD_Export_Status(void) { unsigned int csum; @@ -524,7 +524,7 @@ void CDD_Export_Status(void) } -void CDD_Import_Command(void) +PICO_INTERNAL void CDD_Import_Command(void) { // cdprintf("CDD importing command\n"); cdprintf("in: Command=%.4X, Minute=%.4X, Second=%.4X, Frame=%.4X Checksum=%.4X", diff --git a/Pico/cd/LC89510.h b/Pico/cd/LC89510.h index fb84d61d..df4987ea 100644 --- a/Pico/cd/LC89510.h +++ b/Pico/cd/LC89510.h @@ -115,16 +115,16 @@ typedef struct } CDD; -void LC89510_Reset(void); -unsigned short Read_CDC_Host(int is_sub); -void Update_CDC_TRansfer(int which); -void CDC_Update_Header(void); +PICO_INTERNAL_ASM unsigned short Read_CDC_Host(int is_sub); +PICO_INTERNAL void LC89510_Reset(void); +PICO_INTERNAL void Update_CDC_TRansfer(int which); +PICO_INTERNAL void CDC_Update_Header(void); -unsigned char CDC_Read_Reg(void); -void CDC_Write_Reg(unsigned char Data); +PICO_INTERNAL unsigned char CDC_Read_Reg(void); +PICO_INTERNAL void CDC_Write_Reg(unsigned char Data); -void CDD_Export_Status(void); -void CDD_Import_Command(void); +PICO_INTERNAL void CDD_Export_Status(void); +PICO_INTERNAL void CDD_Import_Command(void); #ifdef __cplusplus }; diff --git a/Pico/cd/Memory.c b/Pico/cd/Memory.c index e0b5d08e..71ec377b 100644 --- a/Pico/cd/Memory.c +++ b/Pico/cd/Memory.c @@ -8,16 +8,18 @@ #include "../PicoInt.h" -#include "../sound/sound.h" #include "../sound/ym2612.h" #include "../sound/sn76496.h" #include "gfx_cd.h" #include "pcm.h" +#ifndef UTYPES_DEFINED typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; +#define UTYPES_DEFINED +#endif //#define __debug_io //#define __debug_io2 @@ -1454,7 +1456,7 @@ static u32 PicoCheckPcS68k(u32 pc) #endif -void PicoMemSetupCD() +PICO_INTERNAL void PicoMemSetupCD(void) { dprintf("PicoMemSetupCD()"); #ifdef EMU_C68K diff --git a/Pico/cd/Misc.c b/Pico/cd/Misc.c index 8d36d634..d43c161f 100644 --- a/Pico/cd/Misc.c +++ b/Pico/cd/Misc.c @@ -24,7 +24,7 @@ unsigned char formatted_bram[4*0x10] = // 256K | unused | bank1 | #ifndef _ASM_MISC_C -void wram_2M_to_1M(unsigned char *m) +PICO_INTERNAL_ASM void wram_2M_to_1M(unsigned char *m) { unsigned short *m1M_b0, *m1M_b1; unsigned int i, tmp, *m2M; @@ -41,7 +41,7 @@ void wram_2M_to_1M(unsigned char *m) } } -void wram_1M_to_2M(unsigned char *m) +PICO_INTERNAL_ASM void wram_1M_to_2M(unsigned char *m) { unsigned short *m1M_b0, *m1M_b1; unsigned int i, tmp, *m2M; diff --git a/Pico/cd/Pico.c b/Pico/cd/Pico.c index a0f28808..5dcb39ca 100644 --- a/Pico/cd/Pico.c +++ b/Pico/cd/Pico.c @@ -2,7 +2,6 @@ #include "../PicoInt.h" -#include "../sound/sound.h" extern unsigned char formatted_bram[4*0x10]; @@ -32,7 +31,7 @@ int (*PicoMCDcloseTray)(void) = NULL; } -int PicoInitMCD(void) +PICO_INTERNAL int PicoInitMCD(void) { SekInitS68k(); Init_CD_Driver(); @@ -41,7 +40,7 @@ int PicoInitMCD(void) } -void PicoExitMCD(void) +PICO_INTERNAL void PicoExitMCD(void) { End_CD_Driver(); @@ -49,7 +48,7 @@ void PicoExitMCD(void) //dump_ram(Pico.ram, "ram.bin"); } -int PicoResetMCD(int hard) +PICO_INTERNAL int PicoResetMCD(int hard) { if (hard) { int fmt_size = sizeof(formatted_bram); @@ -84,7 +83,7 @@ int PicoResetMCD(int hard) return 0; } -static __inline void SekRun(int cyc) +static __inline void SekRunM68k(int cyc) { int cyc_do; SekCycleAim+=cyc; @@ -291,7 +290,7 @@ static int PicoFrameHintsMCD(void) { //dprintf("vint: @ %06x [%i|%i]", SekPc, y, SekCycleCnt); pv->status|=0x88; // V-Int happened, go into vblank - SekRun(128); SekCycleAim-=128; // there must be a gap between H and V ints, also after vblank bit set (Mazin Saga, Bram Stoker's Dracula) + SekRunM68k(128); SekCycleAim-=128; // there must be a gap between H and V ints, also after vblank bit set (Mazin Saga, Bram Stoker's Dracula) /*if(Pico.m.z80Run && (PicoOpt&4)) { z80CycleAim+=cycles_z80/2; total_z80+=z80_run(z80CycleAim-total_z80); @@ -329,7 +328,7 @@ static int PicoFrameHintsMCD(void) if ((PicoOpt & 0x2000) && (Pico_mcd->m.busreq&3) == 1) { SekRunPS(cycles_68k, cycles_s68k); // "better/perfect sync" } else { - SekRun(cycles_68k); + SekRunM68k(cycles_68k); if ((Pico_mcd->m.busreq&3) == 1) // no busreq/no reset SekRunS68k(cycles_s68k); } @@ -358,7 +357,7 @@ static int PicoFrameHintsMCD(void) } -int PicoFrameMCD(void) +PICO_INTERNAL int PicoFrameMCD(void) { if(!(PicoOpt&0x10)) PicoFrameStart(); diff --git a/Pico/cd/Sek.c b/Pico/cd/Sek.c index 3788fcb6..6295af5b 100644 --- a/Pico/cd/Sek.c +++ b/Pico/cd/Sek.c @@ -49,12 +49,12 @@ static int SekIntAckS68k(int level) return CYCLONE_INT_ACK_AUTOVECTOR; } -static void SekResetAck() +static void SekResetAckS68k(void) { dprintf("s68k: Reset encountered @ %06x", SekPcS68k); } -static int SekUnrecognizedOpcode() +static int SekUnrecognizedOpcodeS68k(void) { unsigned int pc, op; pc = SekPcS68k; @@ -67,14 +67,14 @@ static int SekUnrecognizedOpcode() -int SekInitS68k() +PICO_INTERNAL int SekInitS68k() { #ifdef EMU_C68K // CycloneInit(); memset(&PicoCpuS68k,0,sizeof(PicoCpuS68k)); PicoCpuS68k.IrqCallback=SekIntAckS68k; - PicoCpuS68k.ResetCallback=SekResetAck; - PicoCpuS68k.UnrecognizedCallback=SekUnrecognizedOpcode; + PicoCpuS68k.ResetCallback=SekResetAckS68k; + PicoCpuS68k.UnrecognizedCallback=SekUnrecognizedOpcodeS68k; #endif #ifdef EMU_M68K { @@ -93,7 +93,7 @@ int SekInitS68k() } // Reset the 68000: -int SekResetS68k() +PICO_INTERNAL int SekResetS68k() { if (Pico.rom==NULL) return 1; @@ -122,7 +122,7 @@ int SekResetS68k() return 0; } -int SekInterruptS68k(int irq) +PICO_INTERNAL int SekInterruptS68k(int irq) { int irqs, real_irq = 1; Pico_mcd->m.s68k_pend_ints |= 1 << irq; diff --git a/Pico/cd/buffering.c b/Pico/cd/buffering.c index f53db11e..15b3a86f 100644 --- a/Pico/cd/buffering.c +++ b/Pico/cd/buffering.c @@ -50,7 +50,7 @@ void PicoCDBufferFree(void) /* this is a try to fight slow SD access of GP2X */ -void PicoCDBufferRead(void *dest, int lba) +PICO_INTERNAL void PicoCDBufferRead(void *dest, int lba) { int is_bin, offs, read_len, moved = 0; reads++; diff --git a/Pico/cd/cd_file.c b/Pico/cd/cd_file.c index ee5ef620..97623616 100644 --- a/Pico/cd/cd_file.c +++ b/Pico/cd/cd_file.c @@ -8,22 +8,16 @@ ***********************************************************/ #include -#include "cd_file.h" #include "../PicoInt.h" +#include "cd_file.h" #define cdprintf dprintf //#define cdprintf(x...) #define DEBUG_CD -void FILE_End(void) -{ - Unload_ISO(); -} - - -int Load_ISO(const char *iso_name, int is_bin) +PICO_INTERNAL int Load_ISO(const char *iso_name, int is_bin) { int i, j, num_track, Cur_LBA, index, ret, iso_name_len; _scd_track *Tracks = Pico_mcd->TOC.Tracks; @@ -134,7 +128,7 @@ int Load_ISO(const char *iso_name, int is_bin) } -void Unload_ISO(void) +PICO_INTERNAL void Unload_ISO(void) { int i; @@ -150,10 +144,7 @@ void Unload_ISO(void) } -void PicoCDBufferRead(void *dest, int lba); - - -int FILE_Read_One_LBA_CDC(void) +PICO_INTERNAL int FILE_Read_One_LBA_CDC(void) { // static char cp_buf[2560]; @@ -281,7 +272,7 @@ int FILE_Read_One_LBA_CDC(void) } -int FILE_Play_CD_LBA(void) +PICO_INTERNAL int FILE_Play_CD_LBA(void) { int index = Pico_mcd->scd.Cur_Track - 1; Pico_mcd->m.audio_track = index; diff --git a/Pico/cd/cd_file.h b/Pico/cd/cd_file.h index fcf88cb2..6b5f2131 100644 --- a/Pico/cd/cd_file.h +++ b/Pico/cd/cd_file.h @@ -12,11 +12,10 @@ extern "C" { -void FILE_End(void); -int Load_ISO(const char *iso_name, int is_bin); -void Unload_ISO(void); -int FILE_Read_One_LBA_CDC(void); -int FILE_Play_CD_LBA(void); +PICO_INTERNAL int Load_ISO(const char *iso_name, int is_bin); +PICO_INTERNAL void Unload_ISO(void); +PICO_INTERNAL int FILE_Read_One_LBA_CDC(void); +PICO_INTERNAL int FILE_Play_CD_LBA(void); #ifdef __cplusplus diff --git a/Pico/cd/cd_sys.c b/Pico/cd/cd_sys.c index 390c3094..c0001d2d 100644 --- a/Pico/cd/cd_sys.c +++ b/Pico/cd/cd_sys.c @@ -8,10 +8,10 @@ ***********************************************************/ #include -#include "cd_sys.h" -#include "cd_file.h" #include "../PicoInt.h" +#include "cd_sys.h" +#include "cd_file.h" #define cdprintf dprintf //#define cdprintf(x...) @@ -68,7 +68,7 @@ static int MSF_to_LBA(_msf *MSF) } -void LBA_to_MSF(int lba, _msf *MSF) +PICO_INTERNAL void LBA_to_MSF(int lba, _msf *MSF) { if (lba < -150) lba = 0; else lba += 150; @@ -122,7 +122,7 @@ static void Track_to_MSF(int track, _msf *MSF) } -int Track_to_LBA(int track) +PICO_INTERNAL int Track_to_LBA(int track) { _msf MSF; @@ -131,7 +131,7 @@ int Track_to_LBA(int track) } -void Check_CD_Command(void) +PICO_INTERNAL void Check_CD_Command(void) { cdprintf("CHECK CD COMMAND"); @@ -175,19 +175,19 @@ void Check_CD_Command(void) } -int Init_CD_Driver(void) +PICO_INTERNAL int Init_CD_Driver(void) { return 0; } -void End_CD_Driver(void) +PICO_INTERNAL void End_CD_Driver(void) { - FILE_End(); + Unload_ISO(); } -void Reset_CD(void) +PICO_INTERNAL void Reset_CD(void) { Pico_mcd->scd.Cur_Track = 0; Pico_mcd->scd.Cur_LBA = -150; @@ -202,9 +202,6 @@ int Insert_CD(char *iso_name, int is_bin) { int ret = 0; -// memset(CD_Audio_Buffer_L, 0, 4096 * 4); -// memset(CD_Audio_Buffer_R, 0, 4096 * 4); - CD_Present = 0; Pico_mcd->scd.Status_CDD = NOCD; @@ -228,14 +225,15 @@ void Stop_CD(void) } -void Change_CD(void) +/* +PICO_INTERNAL void Change_CD(void) { if (Pico_mcd->scd.Status_CDD == TRAY_OPEN) Close_Tray_CDD_cC(); else Open_Tray_CDD_cD(); } +*/ - -int Get_Status_CDD_c0(void) +PICO_INTERNAL int Get_Status_CDD_c0(void) { cdprintf("Status command : Cur LBA = %d", Pico_mcd->scd.Cur_LBA); @@ -253,7 +251,7 @@ int Get_Status_CDD_c0(void) } -int Stop_CDD_c1(void) +PICO_INTERNAL int Stop_CDD_c1(void) { CHECK_TRAY_OPEN @@ -276,7 +274,7 @@ int Stop_CDD_c1(void) } -int Get_Pos_CDD_c20(void) +PICO_INTERNAL int Get_Pos_CDD_c20(void) { _msf MSF; @@ -308,7 +306,7 @@ int Get_Pos_CDD_c20(void) } -int Get_Track_Pos_CDD_c21(void) +PICO_INTERNAL int Get_Track_Pos_CDD_c21(void) { int elapsed_time; _msf MSF; @@ -342,7 +340,7 @@ int Get_Track_Pos_CDD_c21(void) } -int Get_Current_Track_CDD_c22(void) +PICO_INTERNAL int Get_Current_Track_CDD_c22(void) { cdprintf("Status CDD = %.4X Status = %.4X", Pico_mcd->scd.Status_CDD, Pico_mcd->cdd.Status); @@ -371,7 +369,7 @@ int Get_Current_Track_CDD_c22(void) } -int Get_Total_Lenght_CDD_c23(void) +PICO_INTERNAL int Get_Total_Lenght_CDD_c23(void) { CHECK_TRAY_OPEN @@ -395,7 +393,7 @@ int Get_Total_Lenght_CDD_c23(void) } -int Get_First_Last_Track_CDD_c24(void) +PICO_INTERNAL int Get_First_Last_Track_CDD_c24(void) { CHECK_TRAY_OPEN @@ -418,7 +416,7 @@ int Get_First_Last_Track_CDD_c24(void) } -int Get_Track_Adr_CDD_c25(void) +PICO_INTERNAL int Get_Track_Adr_CDD_c25(void) { int track_number; @@ -452,7 +450,7 @@ int Get_Track_Adr_CDD_c25(void) } -int Play_CDD_c3(void) +PICO_INTERNAL int Play_CDD_c3(void) { _msf MSF; int delay, new_lba; @@ -510,7 +508,7 @@ int Play_CDD_c3(void) } -int Seek_CDD_c4(void) +PICO_INTERNAL int Seek_CDD_c4(void) { _msf MSF; @@ -548,7 +546,7 @@ int Seek_CDD_c4(void) } -int Pause_CDD_c6(void) +PICO_INTERNAL int Pause_CDD_c6(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT @@ -571,7 +569,7 @@ int Pause_CDD_c6(void) } -int Resume_CDD_c7(void) +PICO_INTERNAL int Resume_CDD_c7(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT @@ -613,7 +611,7 @@ int Resume_CDD_c7(void) } -int Fast_Foward_CDD_c8(void) +PICO_INTERNAL int Fast_Foward_CDD_c8(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT @@ -634,7 +632,7 @@ int Fast_Foward_CDD_c8(void) } -int Fast_Rewind_CDD_c9(void) +PICO_INTERNAL int Fast_Rewind_CDD_c9(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT @@ -655,7 +653,7 @@ int Fast_Rewind_CDD_c9(void) } -int Close_Tray_CDD_cC(void) +PICO_INTERNAL int Close_Tray_CDD_cC(void) { CD_Present = 0; //Clear_Sound_Buffer(); @@ -681,7 +679,7 @@ int Close_Tray_CDD_cC(void) } -int Open_Tray_CDD_cD(void) +PICO_INTERNAL int Open_Tray_CDD_cD(void) { CHECK_TRAY_OPEN @@ -709,7 +707,7 @@ int Open_Tray_CDD_cD(void) } -int CDD_cA(void) +PICO_INTERNAL int CDD_cA(void) { CHECK_TRAY_OPEN CHECK_CD_PRESENT @@ -730,7 +728,7 @@ int CDD_cA(void) } -int CDD_Def(void) +PICO_INTERNAL int CDD_Def(void) { Pico_mcd->cdd.Status = Pico_mcd->scd.Status_CDD; diff --git a/Pico/cd/cd_sys.h b/Pico/cd/cd_sys.h index 64112a35..77a9f06c 100644 --- a/Pico/cd/cd_sys.h +++ b/Pico/cd/cd_sys.h @@ -68,38 +68,38 @@ typedef struct { } _scd; -void LBA_to_MSF(int lba, _msf *MSF); -int Track_to_LBA(int track); - - -void Check_CD_Command(void); - -int Init_CD_Driver(void); -void End_CD_Driver(void); -int Insert_CD(char *iso_name, int is_bin); -void Stop_CD(void); -void Change_CD(void); -void Reset_CD(void); - -int Get_Status_CDD_c0(void); -int Stop_CDD_c1(void); -int Get_Pos_CDD_c20(void); -int Get_Track_Pos_CDD_c21(void); -int Get_Current_Track_CDD_c22(void); -int Get_Total_Lenght_CDD_c23(void); -int Get_First_Last_Track_CDD_c24(void); -int Get_Track_Adr_CDD_c25(void); -int Play_CDD_c3(void); -int Seek_CDD_c4(void); -int Pause_CDD_c6(void); -int Resume_CDD_c7(void); -int Fast_Foward_CDD_c8(void); -int Fast_Rewind_CDD_c9(void); -int CDD_cA(void); -int Close_Tray_CDD_cC(void); -int Open_Tray_CDD_cD(void); - -int CDD_Def(void); +PICO_INTERNAL void LBA_to_MSF(int lba, _msf *MSF); +PICO_INTERNAL int Track_to_LBA(int track); + +// moved to Pico.h +// int Insert_CD(char *iso_name, int is_bin); +// void Stop_CD(void); + +PICO_INTERNAL void Check_CD_Command(void); + +PICO_INTERNAL int Init_CD_Driver(void); +PICO_INTERNAL void End_CD_Driver(void); +PICO_INTERNAL void Reset_CD(void); + +PICO_INTERNAL int Get_Status_CDD_c0(void); +PICO_INTERNAL int Stop_CDD_c1(void); +PICO_INTERNAL int Get_Pos_CDD_c20(void); +PICO_INTERNAL int Get_Track_Pos_CDD_c21(void); +PICO_INTERNAL int Get_Current_Track_CDD_c22(void); +PICO_INTERNAL int Get_Total_Lenght_CDD_c23(void); +PICO_INTERNAL int Get_First_Last_Track_CDD_c24(void); +PICO_INTERNAL int Get_Track_Adr_CDD_c25(void); +PICO_INTERNAL int Play_CDD_c3(void); +PICO_INTERNAL int Seek_CDD_c4(void); +PICO_INTERNAL int Pause_CDD_c6(void); +PICO_INTERNAL int Resume_CDD_c7(void); +PICO_INTERNAL int Fast_Foward_CDD_c8(void); +PICO_INTERNAL int Fast_Rewind_CDD_c9(void); +PICO_INTERNAL int CDD_cA(void); +PICO_INTERNAL int Close_Tray_CDD_cC(void); +PICO_INTERNAL int Open_Tray_CDD_cD(void); + +PICO_INTERNAL int CDD_Def(void); #ifdef __cplusplus diff --git a/Pico/cd/gfx_cd.c b/Pico/cd/gfx_cd.c index 42862b6f..630109c9 100644 --- a/Pico/cd/gfx_cd.c +++ b/Pico/cd/gfx_cd.c @@ -7,7 +7,7 @@ #include "../PicoInt.h" -#define rot_comp Pico_mcd->rot_comp +#define _rot_comp Pico_mcd->rot_comp static const int Table_Rot_Time[] = { @@ -37,35 +37,35 @@ static void gfx_cd_start(void) { int upd_len; - // rot_comp.XD_Mul = ((rot_comp.Reg_5C & 0x1f) + 1) * 4; // unused - rot_comp.Function = (rot_comp.Reg_58 & 7) | (Pico_mcd->s68k_regs[3] & 0x18); // Jmp_Adr - // rot_comp.Buffer_Adr = (rot_comp.Reg_5E & 0xfff8) << 2; // unused? - rot_comp.YD = (rot_comp.Reg_60 >> 3) & 7; - rot_comp.Vector_Adr = (rot_comp.Reg_66 & 0xfffe) << 2; + // _rot_comp.XD_Mul = ((_rot_comp.Reg_5C & 0x1f) + 1) * 4; // unused + _rot_comp.Function = (_rot_comp.Reg_58 & 7) | (Pico_mcd->s68k_regs[3] & 0x18); // Jmp_Adr + // _rot_comp.Buffer_Adr = (_rot_comp.Reg_5E & 0xfff8) << 2; // unused? + _rot_comp.YD = (_rot_comp.Reg_60 >> 3) & 7; + _rot_comp.Vector_Adr = (_rot_comp.Reg_66 & 0xfffe) << 2; - upd_len = (rot_comp.Reg_62 >> 3) & 0x3f; + upd_len = (_rot_comp.Reg_62 >> 3) & 0x3f; upd_len = Table_Rot_Time[upd_len]; - rot_comp.Draw_Speed = rot_comp.Float_Part = upd_len; + _rot_comp.Draw_Speed = _rot_comp.Float_Part = upd_len; - rot_comp.Reg_58 |= 0x8000; // Stamp_Size, we start a new GFX operation + _rot_comp.Reg_58 |= 0x8000; // Stamp_Size, we start a new GFX operation - switch (rot_comp.Reg_58 & 6) // Scr_16? + switch (_rot_comp.Reg_58 & 6) // Scr_16? { case 0: // ? - rot_comp.Stamp_Map_Adr = (rot_comp.Reg_5A & 0xff80) << 2; + _rot_comp.Stamp_Map_Adr = (_rot_comp.Reg_5A & 0xff80) << 2; break; case 2: // .Dot_32 - rot_comp.Stamp_Map_Adr = (rot_comp.Reg_5A & 0xffe0) << 2; + _rot_comp.Stamp_Map_Adr = (_rot_comp.Reg_5A & 0xffe0) << 2; break; case 4: // .Scr_16 - rot_comp.Stamp_Map_Adr = 0x20000; + _rot_comp.Stamp_Map_Adr = 0x20000; break; case 6: // .Scr_16_Dot_32 - rot_comp.Stamp_Map_Adr = (rot_comp.Reg_5A & 0xe000) << 2; + _rot_comp.Stamp_Map_Adr = (_rot_comp.Reg_5A & 0xe000) << 2; break; } - dprintf("gfx_cd_start, stamp_map_addr=%06x", rot_comp.Stamp_Map_Adr); + dprintf("gfx_cd_start, stamp_map_addr=%06x", _rot_comp.Stamp_Map_Adr); gfx_cd_update(); } @@ -73,8 +73,8 @@ static void gfx_cd_start(void) static void gfx_completed(void) { - rot_comp.Reg_58 &= 0x7fff; // Stamp_Size - rot_comp.Reg_64 = 0; + _rot_comp.Reg_58 &= 0x7fff; // Stamp_Size + _rot_comp.Reg_64 = 0; if (Pico_mcd->s68k_regs[0x33] & (1<<1)) { dprintf("gfx_cd irq 1"); @@ -89,14 +89,14 @@ static void gfx_do(unsigned int func, unsigned short *stamp_base, unsigned int H unsigned int XD, Buffer_Adr; int DYXS; - XD = rot_comp.Reg_60 & 7; - Buffer_Adr = ((rot_comp.Reg_5E & 0xfff8) + rot_comp.YD) << 2; - ecx = *(unsigned int *)(Pico_mcd->word_ram2M + rot_comp.Vector_Adr); + XD = _rot_comp.Reg_60 & 7; + Buffer_Adr = ((_rot_comp.Reg_5E & 0xfff8) + _rot_comp.YD) << 2; + ecx = *(unsigned int *)(Pico_mcd->word_ram2M + _rot_comp.Vector_Adr); edx = ecx >> 16; ecx = (ecx & 0xffff) << 8; edx <<= 8; - DYXS = *(int *)(Pico_mcd->word_ram2M + rot_comp.Vector_Adr + 4); - rot_comp.Vector_Adr += 8; + DYXS = *(int *)(Pico_mcd->word_ram2M + _rot_comp.Vector_Adr + 4); + _rot_comp.Vector_Adr += 8; // MAKE_IMAGE_LINE while (H_Dot) @@ -269,12 +269,12 @@ Pixel_Out: Next_Pixel: - ecx += (DYXS << 16) >> 16; // rot_comp.DXS; - edx += DYXS >> 16; // rot_comp.DYS; + ecx += (DYXS << 16) >> 16; // _rot_comp.DXS; + edx += DYXS >> 16; // _rot_comp.DYS; XD++; if (XD >= 8) { - Buffer_Adr += ((rot_comp.Reg_5C & 0x1f) + 1) << 5; + Buffer_Adr += ((_rot_comp.Reg_5C & 0x1f) + 1) << 5; XD = 0; } H_Dot--; @@ -283,17 +283,17 @@ Next_Pixel: // nothing_to_draw: - rot_comp.YD++; - // rot_comp.V_Dot--; // will be done by caller + _rot_comp.YD++; + // _rot_comp.V_Dot--; // will be done by caller } -void gfx_cd_update(void) +PICO_INTERNAL void gfx_cd_update(void) { - int V_Dot = rot_comp.Reg_64 & 0xff; + int V_Dot = _rot_comp.Reg_64 & 0xff; int jobs; - dprintf("gfx_cd_update, Reg_64 = %04x", rot_comp.Reg_64); + dprintf("gfx_cd_update, Reg_64 = %04x", _rot_comp.Reg_64); if (!V_Dot) { @@ -301,22 +301,22 @@ void gfx_cd_update(void) return; } - jobs = rot_comp.Float_Part >> 16; + jobs = _rot_comp.Float_Part >> 16; if (!jobs) { - rot_comp.Float_Part += rot_comp.Draw_Speed; + _rot_comp.Float_Part += _rot_comp.Draw_Speed; return; } - rot_comp.Float_Part &= 0xffff; - rot_comp.Float_Part += rot_comp.Draw_Speed; + _rot_comp.Float_Part &= 0xffff; + _rot_comp.Float_Part += _rot_comp.Draw_Speed; if (PicoOpt & 0x1000) // scale/rot enabled { - unsigned int func = rot_comp.Function; - unsigned int H_Dot = rot_comp.Reg_62 & 0x1ff; - unsigned short *stamp_base = (unsigned short *) (Pico_mcd->word_ram2M + rot_comp.Stamp_Map_Adr); + unsigned int func = _rot_comp.Function; + unsigned int H_Dot = _rot_comp.Reg_62 & 0x1ff; + unsigned short *stamp_base = (unsigned short *) (Pico_mcd->word_ram2M + _rot_comp.Stamp_Map_Adr); while (jobs--) { @@ -341,22 +341,22 @@ void gfx_cd_update(void) V_Dot -= jobs; } - rot_comp.Reg_64 = V_Dot; + _rot_comp.Reg_64 = V_Dot; } -unsigned int gfx_cd_read(unsigned int a) +PICO_INTERNAL_ASM unsigned int gfx_cd_read(unsigned int a) { unsigned int d = 0; switch (a) { - case 0x58: d = rot_comp.Reg_58; break; - case 0x5A: d = rot_comp.Reg_5A; break; - case 0x5C: d = rot_comp.Reg_5C; break; - case 0x5E: d = rot_comp.Reg_5E; break; - case 0x60: d = rot_comp.Reg_60; break; - case 0x62: d = rot_comp.Reg_62; break; - case 0x64: d = rot_comp.Reg_64; break; + case 0x58: d = _rot_comp.Reg_58; break; + case 0x5A: d = _rot_comp.Reg_5A; break; + case 0x5C: d = _rot_comp.Reg_5C; break; + case 0x5E: d = _rot_comp.Reg_5E; break; + case 0x60: d = _rot_comp.Reg_60; break; + case 0x62: d = _rot_comp.Reg_62; break; + case 0x64: d = _rot_comp.Reg_64; break; case 0x66: break; default: dprintf("gfx_cd_read FIXME: unexpected address: %02x", a); break; } @@ -366,41 +366,41 @@ unsigned int gfx_cd_read(unsigned int a) return d; } -void gfx_cd_write16(unsigned int a, unsigned int d) +PICO_INTERNAL_ASM void gfx_cd_write16(unsigned int a, unsigned int d) { dprintf("gfx_cd_write16(%x, %04x)", a, d); switch (a) { case 0x58: // .Reg_Stamp_Size - rot_comp.Reg_58 = d & 7; + _rot_comp.Reg_58 = d & 7; return; case 0x5A: // .Reg_Stamp_Adr - rot_comp.Reg_5A = d & 0xffe0; + _rot_comp.Reg_5A = d & 0xffe0; return; case 0x5C: // .Reg_IM_VCell_Size - rot_comp.Reg_5C = d & 0x1f; + _rot_comp.Reg_5C = d & 0x1f; return; case 0x5E: // .Reg_IM_Adr - rot_comp.Reg_5E = d & 0xFFF8; + _rot_comp.Reg_5E = d & 0xFFF8; return; case 0x60: // .Reg_IM_Offset - rot_comp.Reg_60 = d & 0x3f; + _rot_comp.Reg_60 = d & 0x3f; return; case 0x62: // .Reg_IM_HDot_Size - rot_comp.Reg_62 = d & 0x1ff; + _rot_comp.Reg_62 = d & 0x1ff; return; case 0x64: // .Reg_IM_VDot_Size - rot_comp.Reg_64 = d & 0xff; // V_Dot, must be 32bit? + _rot_comp.Reg_64 = d & 0xff; // V_Dot, must be 32bit? return; case 0x66: // .Reg_Vector_Adr - rot_comp.Reg_66 = d & 0xfffe; + _rot_comp.Reg_66 = d & 0xfffe; if (Pico_mcd->s68k_regs[3]&4) return; // can't do tanformations in 1M mode gfx_cd_start(); return; @@ -410,9 +410,9 @@ void gfx_cd_write16(unsigned int a, unsigned int d) } -void gfx_cd_reset(void) +PICO_INTERNAL void gfx_cd_reset(void) { - memset(&rot_comp.Reg_58, 0, sizeof(rot_comp)); + memset(&_rot_comp.Reg_58, 0, sizeof(_rot_comp)); } @@ -420,10 +420,12 @@ void gfx_cd_reset(void) #include "cell_map.c" +#ifndef UTYPES_DEFINED typedef unsigned short u16; +#endif // check: Heart of the alien, jaguar xj 220 -void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc) +PICO_INTERNAL void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc) { unsigned char *base; unsigned int asrc, a2; diff --git a/Pico/cd/gfx_cd.h b/Pico/cd/gfx_cd.h index 65d123e6..9a0c797e 100644 --- a/Pico/cd/gfx_cd.h +++ b/Pico/cd/gfx_cd.h @@ -24,14 +24,14 @@ typedef struct } Rot_Comp; -void gfx_cd_update(void); +PICO_INTERNAL void gfx_cd_update(void); -unsigned int gfx_cd_read(unsigned int a); -void gfx_cd_write16(unsigned int a, unsigned int d); +PICO_INTERNAL_ASM unsigned int gfx_cd_read(unsigned int a); +PICO_INTERNAL_ASM void gfx_cd_write16(unsigned int a, unsigned int d); -void gfx_cd_reset(void); +PICO_INTERNAL void gfx_cd_reset(void); -void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc); +PICO_INTERNAL void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc); #endif // _GFX_CD_H diff --git a/Pico/cd/pcm.c b/Pico/cd/pcm.c index 8f17a7e2..6ac493aa 100644 --- a/Pico/cd/pcm.c +++ b/Pico/cd/pcm.c @@ -7,7 +7,7 @@ static unsigned int g_rate = 0; // 18.14 fixed point -void pcm_write(unsigned int a, unsigned int d) +PICO_INTERNAL_ASM void pcm_write(unsigned int a, unsigned int d) { //printf("pcm_write(%i, %02x)\n", a, d); @@ -50,7 +50,7 @@ void pcm_write(unsigned int a, unsigned int d) } -void pcm_set_rate(int rate) +PICO_INTERNAL void pcm_set_rate(int rate) { float step = 31.8 * 1024.0 / (float) rate; // max <4 @ 8000Hz step *= 256*256/4; @@ -60,9 +60,7 @@ void pcm_set_rate(int rate) } -// TODO: make use of the fact that max_length == 3 - -void pcm_update(int *buffer, int length, int stereo) +PICO_INTERNAL void pcm_update(int *buffer, int length, int stereo) { struct pcm_chan *ch; unsigned int step, addr; diff --git a/Pico/cd/pcm.h b/Pico/cd/pcm.h index 8756bb0f..47e555cd 100644 --- a/Pico/cd/pcm.h +++ b/Pico/cd/pcm.h @@ -1,7 +1,7 @@ #define PCM_STEP_SHIFT 11 -void pcm_write(unsigned int a, unsigned int d); -void pcm_set_rate(int rate); -void pcm_update(int *buffer, int length, int stereo); +PICO_INTERNAL_ASM void pcm_write(unsigned int a, unsigned int d); +PICO_INTERNAL void pcm_set_rate(int rate); +PICO_INTERNAL void pcm_update(int *buffer, int length, int stereo); diff --git a/Pico/sound/sound.c b/Pico/sound/sound.c index c0b32523..6a450332 100644 --- a/Pico/sound/sound.c +++ b/Pico/sound/sound.c @@ -8,14 +8,9 @@ #include -#include "sound.h" #include "ym2612.h" #include "sn76496.h" -#ifndef __GNUC__ -#pragma warning (disable:4244) -#endif - #if defined(_USE_MZ80) #include "../../cpu/mz80/mz80.h" #elif defined(_USE_DRZ80) @@ -29,11 +24,8 @@ // master int buffer to mix to static int PsndBuffer[2*44100/50]; -//int z80CycleAim = 0; - // dac -short *dac_out; -unsigned short dac_info[312]; // pppppppp ppppllll, p - pos in buff, l - length to write for this sample +static unsigned short dac_info[312]; // pppppppp ppppllll, p - pos in buff, l - length to write for this sample // for Pico int PsndRate=0; @@ -51,7 +43,7 @@ void YM2612TimerHandler(int c,int cnt); extern int *sn76496_regs; -static void dac_recalculate() +static void dac_recalculate(void) { int i, dac_cnt, pos, len, lines = Pico.m.pal ? 312 : 262, mid = Pico.m.pal ? 68 : 93; @@ -107,7 +99,7 @@ static void dac_recalculate() } -void sound_reset() +PICO_INTERNAL void sound_reset(void) { void *ym2612_regs; @@ -169,7 +161,7 @@ void sound_rerate(int preserve_state) // This is called once per raster (aka line), but not necessarily for every line -void sound_timers_and_dac(int raster) +PICO_INTERNAL void sound_timers_and_dac(int raster) { int pos, len; int do_dac = PsndOut && (PicoOpt&1) && *ym2612_dacen; @@ -217,7 +209,7 @@ void sound_timers_and_dac(int raster) } -void sound_clear(void) +PICO_INTERNAL void sound_clear(void) { int len = PsndLen; if (PsndLen_exc_add) len++; @@ -226,7 +218,7 @@ void sound_clear(void) } -int sound_render(int offset, int length) +PICO_INTERNAL int sound_render(int offset, int length) { int buf32_updated = 0; int *buf32 = PsndBuffer+offset; @@ -333,7 +325,7 @@ static void DrZ80_irq_callback() #endif // z80 functionality wrappers -void z80_init() +PICO_INTERNAL void z80_init(void) { #if defined(_USE_MZ80) struct mz80context z80; @@ -367,7 +359,7 @@ void z80_init() #endif } -void z80_reset() +PICO_INTERNAL void z80_reset(void) { #if defined(_USE_MZ80) mz80reset(); @@ -384,14 +376,14 @@ void z80_reset() Pico.m.z80_fakeval = 0; // for faking when Z80 is disabled } -void z80_resetCycles() +PICO_INTERNAL void z80_resetCycles(void) { #if defined(_USE_MZ80) mz80GetElapsedTicks(1); #endif } -void z80_int() +PICO_INTERNAL void z80_int(void) { #if defined(_USE_MZ80) mz80int(0); @@ -402,7 +394,7 @@ void z80_int() } // returns number of cycles actually executed -int z80_run(int cycles) +PICO_INTERNAL int z80_run(int cycles) { #if defined(_USE_MZ80) int ticks_pre = mz80GetElapsedTicks(0); @@ -415,7 +407,7 @@ int z80_run(int cycles) #endif } -void z80_pack(unsigned char *data) +PICO_INTERNAL void z80_pack(unsigned char *data) { #if defined(_USE_MZ80) struct mz80context mz80; @@ -430,7 +422,7 @@ void z80_pack(unsigned char *data) #endif } -void z80_unpack(unsigned char *data) +PICO_INTERNAL void z80_unpack(unsigned char *data) { #if defined(_USE_MZ80) if(*(int *)data == 0x00005A6D) { // "mZ" save? @@ -456,7 +448,7 @@ void z80_unpack(unsigned char *data) #endif } -void z80_exit() +PICO_INTERNAL void z80_exit(void) { #if defined(_USE_MZ80) mz80shutdown(); @@ -464,7 +456,7 @@ void z80_exit() } #if defined(__DEBUG_PRINT) || defined(__GP2X__) -void z80_debug(char *dstr) +PICO_INTERNAL void z80_debug(char *dstr) { #if defined(_USE_DRZ80) sprintf(dstr, "Z80 state: PC: %04x SP: %04x\n", drZ80.Z80PC-drZ80.Z80PC_BASE, drZ80.Z80SP-drZ80.Z80SP_BASE); diff --git a/Pico/sound/sound.h b/Pico/sound/sound.h deleted file mode 100644 index ffdfcf5c..00000000 --- a/Pico/sound/sound.h +++ /dev/null @@ -1,29 +0,0 @@ -// This is part of Pico Library - -// (c) Copyright 2004 Dave, All rights reserved. -// (c) Copyright 2006 notaz, All rights reserved. -// Free for non-commercial use. - -// For commercial use, separate licencing terms must be obtained. - - -#ifdef __cplusplus -extern "C" { -#endif - -void sound_timers_and_dac(int raster); -int sound_render(int offset, int length); -void sound_clear(void); - -//int YM2612PicoTick(int n); - -// z80 functionality wrappers -void z80_init(); -void z80_resetCycles(); -void z80_int(); -int z80_run(int cycles); -void z80_exit(); - -#ifdef __cplusplus -} // End of extern "C" -#endif diff --git a/platform/gp2x/Makefile b/platform/gp2x/Makefile index 49e13871..f698a8f7 100644 --- a/platform/gp2x/Makefile +++ b/platform/gp2x/Makefile @@ -13,6 +13,7 @@ asm_ym2612 = 1 asm_misc = 1 asm_cdpico = 1 asm_cdmemory = 1 +amalgamate = 1 #profile = 1 #use_musashi = 1 #up = 1 @@ -50,14 +51,20 @@ OBJCOPY = $(CROSS)objcopy OBJS += main.o menu.o fonts.o gp2x.o usbjoy.o emu.o squidgehack.o asmutils.o cpuctrl.o readpng.o # 940 core control OBJS += 940ctl.o + # Pico -OBJS += ../../Pico/Area.o ../../Pico/Cart.o ../../Pico/Utils.o ../../Pico/Memory.o ../../Pico/Misc.o \ +ifeq "$(amalgamate)" "1" +OBJS += ../../PicoAll.o +else +OBJS += ../../Pico/Area.o ../../Pico/Cart.o ../../Pico/Memory.o ../../Pico/Misc.o \ ../../Pico/Pico.o ../../Pico/Sek.o ../../Pico/VideoPort.o ../../Pico/Draw2.o ../../Pico/Draw.o \ ../../Pico/Patch.o # Pico - CD OBJS += ../../Pico/cd/Pico.o ../../Pico/cd/Memory.o ../../Pico/cd/Sek.o ../../Pico/cd/LC89510.o \ ../../Pico/cd/cd_sys.o ../../Pico/cd/cd_file.o ../../Pico/cd/gfx_cd.o \ ../../Pico/cd/Area.o ../../Pico/cd/Misc.o ../../Pico/cd/pcm.o ../../Pico/cd/buffering.o +endif + # asm stuff ifeq "$(asm_render)" "1" DEFINC += -D_ASM_DRAW_C @@ -84,9 +91,13 @@ ifeq "$(asm_cdmemory)" "1" DEFINC += -D_ASM_CD_MEMORY_C OBJS += ../../Pico/cd/memory_asm.o endif + # Pico - sound +ifneq "$(amalgamate)" "1" +OBJS += ../../Pico/sound/sound.o +endif OBJS += ../../Pico/sound/mix_asm.o -OBJS += ../../Pico/sound/sound.o ../../Pico/sound/sn76496.o ../../Pico/sound/ym2612.o +OBJS += ../../Pico/sound/sn76496.o ../../Pico/sound/ym2612.o # zlib OBJS += ../../zlib/gzio.o ../../zlib/inffast.o ../../zlib/inflate.o ../../zlib/inftrees.o ../../zlib/trees.o \ ../../zlib/deflate.o ../../zlib/crc32.o ../../zlib/adler32.o ../../zlib/zutil.o ../../zlib/compress.o @@ -217,17 +228,3 @@ rel: PicoDrive.gpe code940/pico940.bin ../readme.txt config.txt PicoDrive.man.tx code940/code940.bin: make -C code940/ - -# test -#usbjoy.o : usbjoy.c -# @echo $< -# @$(GCC) $(COPT) $(DEFINC) -fno-profile-generate -c $< -o $@ -# -#../../Pico/Cart.o : ../../Pico/Cart.c -# @echo $< -# @$(GCC) $(COPT) $(DEFINC) -fno-profile-generate -c $< -o $@ -# -#../../zlib/trees.o : ../../zlib/trees.c -# @echo $< -# @$(GCC) $(COPT) $(DEFINC) -fno-profile-generate -c $< -o $@ - diff --git a/platform/gp2x/emu.c b/platform/gp2x/emu.c index 939ba93c..a9a931a6 100644 --- a/platform/gp2x/emu.c +++ b/platform/gp2x/emu.c @@ -278,7 +278,7 @@ int emu_ReloadRom(void) // bios_help() ? return 0; } else { - if (PicoMCD & 1) PicoExitMCD(); + if (PicoMCD & 1) Stop_CD(); PicoMCD &= ~1; } diff --git a/platform/linux/Makefile b/platform/linux/Makefile index 5c85c5ce..a85ef43b 100644 --- a/platform/linux/Makefile +++ b/platform/linux/Makefile @@ -27,7 +27,7 @@ LDFLAGS += `pkg-config --libs gthread-2.0` OBJS += ../gp2x/main.o ../gp2x/menu.o ../gp2x/fonts.o ../gp2x/emu.o ../gp2x/usbjoy.o blit.o \ gp2x.o 940ctl_ym2612.o ../gp2x/readpng.o # Pico -OBJS += ../../Pico/Area.o ../../Pico/Cart.o ../../Pico/Utils.o ../../Pico/Memory.o ../../Pico/Misc.o \ +OBJS += ../../Pico/Area.o ../../Pico/Cart.o ../../Pico/Memory.o ../../Pico/Misc.o \ ../../Pico/Pico.o ../../Pico/Sek.o ../../Pico/VideoPort.o ../../Pico/Draw2.o ../../Pico/Draw.o \ ../../Pico/Patch.o # Pico - CD diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 00000000..6582fbe9 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,10 @@ +CFLAGS = -Wall -ggdb + +TARGET = amalgamate +OBJS = amalgamate.o + +all: $(TARGET) + +clean: + $(RM) $(TARGET) $(OBJS) + diff --git a/tools/amalgamate.c b/tools/amalgamate.c new file mode 100644 index 00000000..14d7712c --- /dev/null +++ b/tools/amalgamate.c @@ -0,0 +1,246 @@ +#include +#include +#include +#include +#include + +#define OUT_FILE "PicoAll.c" + +// files to amalgamate, in order +static const char *files[] = +{ + "Pico/Pico.h", + // PicoInt.h includes some CD stuff, so start with them + "Pico/cd/cd_file.h", + "Pico/cd/cd_sys.h", + "Pico/cd/LC89510.h", + "Pico/cd/gfx_cd.h", + "Pico/cd/pcm.h", + "Pico/PicoInt.h", + "Pico/Patch.h", + "Pico/sound/mix.h", + // source + "Pico/Area.c", + "Pico/Cart.c", + "Pico/Draw2.c", + "Pico/Draw.c", + "Pico/VideoPort.c", + "Pico/sound/sound.c", + "Pico/MemoryCmn.c", + "Pico/Memory.c", + "Pico/Misc.c", + "Pico/Patch.c", + "Pico/Sek.c", + "Pico/cd/Area.c", + "Pico/cd/buffering.c", + "Pico/cd/cd_file.c", + "Pico/cd/cd_sys.c", + "Pico/cd/cell_map.c", + "Pico/cd/gfx_cd.c", + "Pico/cd/LC89510.c", + "Pico/cd/Memory.c", + "Pico/cd/Misc.c", + "Pico/cd/pcm.c", + "Pico/cd/Sek.c", + "Pico/cd/Pico.c", + "Pico/Pico.c", +}; + +static char *includes[128]; + +static void eprintf(const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); + + exit(1); +} + +static void emit_header(FILE *f, const char *fname) +{ + char tmp[128] = "/* */"; + memcpy(tmp + 3, fname, strlen(fname)); + fprintf(f, "\n\n"); + fprintf(f, "/**************************************************************/\n"); + fprintf(f, "/**************************************************************/\n"); + fprintf(f, "%s\n", tmp); + fprintf(f, "/**************************************************************/\n"); +} + +static const char *add_include(const char *include) +{ + int i; + char processed_inc[128+4]; + + // must first quote relative includes + snprintf(processed_inc, sizeof(processed_inc), (include[0] != '<') ? "\"%s\"" : "%s", include); + + // find in include list + for (i = 0; includes[i] && i < 128; i++) + { + if (strcmp(processed_inc, includes[i]) == 0) break; + } + if (i == 128) eprintf("add_include: includes overflowed\n"); + if (includes[i] != NULL) + { + printf("already have: %s\n", processed_inc); + return NULL; + } + else + { + printf("adding: %s\n", processed_inc); + includes[i] = strdup(processed_inc); + if (includes[i] == NULL) eprintf("add_include: OOM\n"); + return includes[i]; + } +} + +static const char *add_raw_include(const char *include, const char *base) +{ + const char *ps, *pe; + char processed_inc[128]; + + for (ps = include; *ps && isspace(*ps); ps++); + + if (*ps == '<') + { + int len = 1; + // system include, search for '>' + for (pe = ps; *pe && *pe != '>'; pe++, len++); + if (*pe == 0 || len > 127) eprintf("add_raw_include: failed sysinclude, len=%i\n", len); + strncpy(processed_inc, ps, len); + processed_inc[len] = 0; + } + else if (*ps == '\"') + { + int len, pos; + // relative include, make path absolute (or relative to base dir) + strcpy(processed_inc, base); + ps++; + while (*ps == '.') + { + if (strncmp(ps, "../", 3) == 0) + { + char *p; + if (processed_inc[0] == 0) + eprintf("add_raw_include: already in root, can't go down: %s | %s\n", ps, include); + p = strrchr(processed_inc, '/'); + if (p == NULL) eprintf("add_raw_include: can't happen\n"); + *p = 0; + p = strrchr(processed_inc, '/'); + if (p != NULL) p[1] = 0; + else processed_inc[0] = 0; + ps += 3; + } + else if (strncmp(ps, "./", 2) == 0) + { + ps += 2; // just skip + } + while (*ps == '/') ps++; + } + if (*ps == 0) eprintf("add_raw_include: failed with %s\n", include); + + len = pos = strlen(processed_inc); + for (pe = ps; *pe && *pe != '\"'; pe++, len++); + if (*pe == 0 || len > 127) eprintf("add_raw_include: failed with %s, len=%i\n", include, len); + strncpy(processed_inc + pos, ps, len - pos); + processed_inc[len] = 0; + } + else + eprintf("add_raw_include: unhandled include: %s\n", ps); + + return add_include(processed_inc); +} + +// returns pointer to location after part in string +static const char *substr_end(const char *string, const char *part) +{ + const char *p = string; + int len = strlen(part); + + while (*p && isspace(*p)) p++; + return (strncmp(p, part, len) == 0) ? (p + len) : NULL; +} + +static void strip_cr(char *str) +{ + int len = strlen(str); + char *p = str; + + while ((p = strchr(p, '\r'))) + { + memmove(p, p + 1, len - (p - str) + 1); + } + if (strlen(str) > 0) + { + p = str + strlen(str) - 1; + while (p >= str && isspace(*p)) { *p = 0; p--; } // strip spaces on line ends + } + strcat(str, "\n"); // re-add newline +} + +int main(void) +{ + char buff[512]; // tmp buffer + char path[128]; // path to file being included, with ending slash + int i, ifile; + FILE *fo; + + memset(includes, 0, sizeof(includes)); + + fo = fopen(OUT_FILE, "w"); + if (fo == NULL) return 1; + + // special header + fprintf(fo, "#define PICO_INTERNAL static\n"); + fprintf(fo, "#define PICO_INTERNAL_ASM\n"); + + for (ifile = 0; ifile < sizeof(files) / sizeof(files[0]); ifile++) + { + FILE *fi; + const char *file = files[ifile], *p; + p = strrchr(file, '/'); + if (p == NULL) eprintf("main: file in root? %s\n", file); + strncpy(path, file, p - file + 1); + path[p - file + 1] = 0; + + fi = fopen(file, "r"); + if (fi == NULL) eprintf("main: failed to open %s\n", file); + + // if (strcmp(file + strlen(file) - 2, ".h") == 0) + add_include(file); + emit_header(fo, file); + + while (!feof(fi)) + { + p = fgets(buff, sizeof(buff), fi); + if (p == NULL) break; + strip_cr(buff); + // include? + p = substr_end(buff, "#include"); + if (p != NULL) + { + p = add_raw_include(p, path); + if (p != NULL) fprintf(fo, "#include %s\n", p); + continue; + } + // passthrough + fputs(buff, fo); + } + } + + emit_header(fo, "EOF"); + + for (i = 0; includes[i] && i < 128; i++) + { + free(includes[i]); + } + + fclose(fo); + + return 0; +} +