Some code cleanup, port of StateLoader to C, some statesaver + rewind fixes.

This commit is contained in:
grinvader
2005-01-28 22:47:14 +00:00
parent 6d0c52c102
commit 34ba464d8b
16 changed files with 522 additions and 623 deletions

View File

@@ -49,9 +49,9 @@ Big thanks to Nach, TRAC and anomie for helping me out on porting !!*/
extern unsigned int CBackupPos, PHnum2writecpureg, cycpbl;
extern unsigned int *wramdata, *vram, PHspcsave, PHdspsave, *C4Ram, *sfxramdata;
extern unsigned int PHnum2writesa1reg, SA1Mode, prevedi, SA1xpc, sa1dmaptr;
extern unsigned int soundcycleft, spc700read, timer2upd, xa;
extern unsigned int soundcycleft, spc700read, timer2upd, xa, PHnum2writesfxreg;
extern unsigned int spcnumread, spchalted, opcd, HIRQCycNext, oamaddr;
extern unsigned int ReadHead, *setaramdata, ramsize, *sram;
extern unsigned int SfxR0, ReadHead, *setaramdata, ramsize, *sram;
extern unsigned int tempesi, tempedi, tempedx, tempebp;
extern unsigned char *StateBackup, zsmesg[26], sndrot, spcon, spcRam[65472];
@@ -84,7 +84,11 @@ void BackupCVFrame()
if (C4Enable) { memcpyinc (curpos, C4Ram, 2048*4); }
if (SFXEnable) { memcpyinc (curpos, sfxramdata, 8192*16); }
if (SFXEnable)
{
memcpyinc (curpos, sfxramdata, 8192*16);
memcpyinc (curpos, &SfxR0, PHnum2writesfxreg);
}
if (SA1Enable)
{
@@ -184,7 +188,11 @@ void RestoreCVFrame()
if (C4Enable) { memcpyrinc (curpos, C4Ram, 2048*4); }
if (SFXEnable) { memcpyrinc (curpos, sfxramdata, 8192*16); }
if (SFXEnable)
{
memcpyrinc (curpos, sfxramdata, 8192*16);
memcpyrinc (curpos, &SfxR0, PHnum2writesfxreg);
}
if (SA1Enable)
{
@@ -275,16 +283,153 @@ void unpackfunct()
xyt = (xy & 0xFFFF);
}
#define byteset(byte, checkbit) (byte & (1 << checkbit)) ? 1 : 0
extern unsigned int GlobalVL, GlobalVR, EchoVL, EchoVR, EchoRate[16], MaxEcho;
extern unsigned int EchoFB, NoiseSpeeds[32], dspPAdj, NoiseInc, bg1ptrx;
extern unsigned int bg1ptry, bg2ptrx, bg2ptry, bg3ptrx, bg3ptry, bg4ptrx;
extern unsigned int bg4ptry;
extern signed int FIRTAPVal0, FIRTAPVal1, FIRTAPVal2, FIRTAPVal3, FIRTAPVal4;
extern signed int FIRTAPVal5, FIRTAPVal6, FIRTAPVal7;
extern unsigned short VolumeConvTable[32768], bg1ptr, bg1ptrb, bg1ptrc;
extern unsigned short bg2ptr, bg2ptrb, bg2ptrc, bg3ptr, bg3ptrb, bg3ptrc;
extern unsigned short bg4ptr, bg4ptrb, bg4ptrc;
extern unsigned char VolumeTableb[256], MusicVol, spcres, Voice0Status;
extern unsigned char Voice1Status, Voice2Status, Voice3Status, Voice4Status;
extern unsigned char Voice5Status, Voice6Status, Voice7Status, Voice0Noise;
extern unsigned char Voice1Noise, Voice2Noise, Voice3Noise, Voice4Noise;
extern unsigned char Voice5Noise, Voice6Noise, Voice7Noise, bgtilesz;
extern unsigned char BG116x16t, BG216x16t, BG316x16t, BG416x16t, vramincby8on;
extern unsigned char vramincr;
extern void (**regptw)();
extern void reg2118();
extern void reg2118inc();
extern void reg2118inc8();
extern void reg2118inc8inc();
extern void reg2119();
extern void reg2119inc();
extern void reg2119inc8();
extern void reg2119inc8inc();
void repackfunct()
{
signed char val;
unsigned char block;
// Global/Echo Volumes
GlobalVL = (VolumeConvTable[(MusicVol << 8) + VolumeTableb[DSPMem[0x0C]]] & 0xFF);
GlobalVR = (VolumeConvTable[(MusicVol << 8) + VolumeTableb[DSPMem[0x1C]]] & 0xFF);
EchoVL = (VolumeConvTable[(MusicVol << 8) + VolumeTableb[DSPMem[0x2C]]] & 0xFF);
EchoVR = (VolumeConvTable[(MusicVol << 8) + VolumeTableb[DSPMem[0x3C]]] & 0xFF);
// Echo Values
MaxEcho = EchoRate[(DSPMem[0x7D] & 0xF)];
EchoFB = VolumeTableb[DSPMem[0x0D]];
// FIR Filter Values
val = DSPMem[0x0F];
FIRTAPVal0 = (signed int)val;
val = DSPMem[0x1F];
FIRTAPVal1 = (signed int)val;
val = DSPMem[0x2F];
FIRTAPVal2 = (signed int)val;
val = DSPMem[0x3F];
FIRTAPVal3 = (signed int)val;
val = DSPMem[0x4F];
FIRTAPVal4 = (signed int)val;
val = DSPMem[0x5F];
FIRTAPVal5 = (signed int)val;
val = DSPMem[0x6F];
FIRTAPVal6 = (signed int)val;
val = DSPMem[0x7F];
FIRTAPVal7 = (signed int)val;
// Noise
block = DSPMem[0x6C];
DSPMem[0x6C] &= 0x7F;
if (block && 0x80) { spcres++; }
if (block && 0xC0)
{
Voice0Status = Voice1Status = Voice2Status = Voice3Status = 0;
Voice4Status = Voice5Status = Voice6Status = Voice7Status = 0;
}
NoiseInc = (((NoiseSpeeds[(block & 0x1F)] * dspPAdj) >> 17) & 0xFFFFFFFF);
Voice0Noise = byteset (DSPMem[0x3D], 0);
Voice1Noise = byteset (DSPMem[0x3D], 1);
Voice2Noise = byteset (DSPMem[0x3D], 2);
Voice3Noise = byteset (DSPMem[0x3D], 3);
Voice4Noise = byteset (DSPMem[0x3D], 4);
Voice5Noise = byteset (DSPMem[0x3D], 5);
Voice6Noise = byteset (DSPMem[0x3D], 6);
Voice7Noise = byteset (DSPMem[0x3D], 7);
bg1ptrx = bg1ptrb - bg1ptr;
bg1ptry = bg1ptrc - bg1ptr;
bg2ptrx = bg2ptrb - bg2ptr;
bg2ptry = bg2ptrc - bg2ptr;
bg3ptrx = bg3ptrb - bg3ptr;
bg3ptry = bg3ptrc - bg3ptr;
bg4ptrx = bg4ptrb - bg4ptr;
bg4ptry = bg4ptrc - bg4ptr;
// 16x16 tiles
BG116x16t = byteset (bgtilesz, 0);
BG216x16t = byteset (bgtilesz, 1);
BG316x16t = byteset (bgtilesz, 2);
BG416x16t = byteset (bgtilesz, 3);
oamaddr = oamaddrt;
xa = xat;
xdb = xdbt;
xpb = xpbt;
xs = xst;
xd = xdt;
xx = xxt;
xy = xyt;
if (vramincby8on == 1)
{
if (vramincr == 1)
{
regptw[0x2118] = reg2118inc8inc;
regptw[0x2119] = reg2119inc8;
}
else
{
regptw[0x2118] = reg2118inc8;
regptw[0x2119] = reg2119inc8inc;
}
}
else
{
if (vramincr == 1)
{
regptw[0x2118] = reg2118inc;
regptw[0x2119] = reg2119;
}
else
{
regptw[0x2118] = reg2118;
regptw[0x2119] = reg2119inc;
}
}
}
extern unsigned int SA1Stat;
extern unsigned char IRAM[2049], *SA1Ptr, *SA1RegPCS, *CurBWPtr, *SA1BWPtr;
extern unsigned char *SNSBWPtr, *romdata;
void SaveSA1()
{
unsigned int off1=(unsigned int)SA1RegPCS, off2=(unsigned int)romdata;
unsigned int offst=(unsigned int)SA1RegPCS;
SA1Stat &= 0xFFFFFF00;
SA1Ptr -= off1;
SA1Ptr -= offst;
if (SA1RegPCS == IRAM)
{
@@ -296,70 +441,21 @@ void SaveSA1()
SA1Stat = (SA1Stat & 0xFFFFFF00) + 2;
}
SA1RegPCS -= off2;
CurBWPtr -= off2;
SA1BWPtr -= off2;
SNSBWPtr -= off2;
}
extern unsigned int NumofBanks, snesmmap[256], snesmap2[256];
extern unsigned char SA1BankVal[4];
void BankSwitchC (unsigned char bank, unsigned short offset1, unsigned int offset2, unsigned int pointer)
{
unsigned int curbankval=SA1BankVal[bank], membankval, i;
if ((NumofBanks & 0xFF) == 64) { curbankval &= 1 ; }
curbankval &= 7;
curbankval <<= 20;
if (SA1BankVal[bank] & 0x80)
{
membankval = (pointer + (unsigned int)romdata - 0x8000);
}
else
{
membankval = (curbankval + (unsigned int)romdata - 0x8000);
}
for (i=0 ; i<32 ; i++)
{
snesmmap[offset1+i] = membankval;
membankval += 0x8000;
}
membankval = curbankval + (unsigned int)romdata;
for (i=0 ; i<16 ; i++)
{
snesmap2[offset2+i] = membankval;
snesmmap[offset2+i] = membankval;
membankval += 0x10000;
}
}
extern unsigned int SA1BankSw;
void UpdateBanks()
{
if ((SA1BankSw & 0xFF) == 1)
{
BankSwitchC (0, 0x000, 0x0C0, 0x000000) ;
BankSwitchC (1, 0x020, 0x0D0, 0x100000) ;
BankSwitchC (2, 0x080, 0x0E0, 0x200000) ;
BankSwitchC (3, 0x0A0, 0x0F0, 0x300000) ;
}
offst = (unsigned int)romdata;
SA1RegPCS -= offst;
CurBWPtr -= offst;
SA1BWPtr -= offst;
SNSBWPtr -= offst;
}
void RestoreSA1()
{
unsigned int off1, off2=(unsigned int)romdata;
unsigned int offst=(unsigned int)romdata;
SA1RegPCS += off2;
CurBWPtr += off2;
SA1BWPtr += off2;
SNSBWPtr += off2;
SA1RegPCS += offst;
CurBWPtr += offst;
SA1BWPtr += offst;
SNSBWPtr += offst;
if ((SA1Stat & 0xFF) == 1)
{
@@ -371,11 +467,9 @@ void RestoreSA1()
SA1RegPCS = IRAM-0x3000;
}
off1 = (unsigned int)SA1RegPCS;
SA1Ptr += off1;
offst = (unsigned int)SA1RegPCS;
SA1Ptr += offst;
SA1RAMArea = romdata + 4096*1024;
UpdateBanks();
}
#define ResState(Voice_BufPtr) \
@@ -399,19 +493,19 @@ void ResetState()
extern unsigned int Curtableaddr, tableA[256], spcPCRam, spcRamDP;
extern unsigned int statefileloc, CurrentHandle, SfxRomBuffer;
extern unsigned int SfxCROM, SfxLastRamAdr, SfxRAMMem, PHnum2writesfxreg;
extern unsigned int *SfxR0, SPCMultA, PHnum2writespc7110reg;
extern unsigned int SfxCROM, SfxLastRamAdr, SfxRAMMem;
extern unsigned int SPCMultA, PHnum2writespc7110reg;
extern unsigned int MsgCount, MessageOn;
extern unsigned char AutoIncSaveSlot, firstsaveinc, fnamest[512];
extern unsigned char SPC7110Enable, cbitmode, NoPictureSave, txtsavemsg[15];
extern unsigned char *Msgptr, txtsavemsgfail[16];
extern unsigned char SPC7110Enable, cbitmode, NoPictureSave, txtsavemsg[14];
extern unsigned char *Msgptr, txtsavemsgfail[15];
extern unsigned short PrevPicture[64*56];
FILE *fhandle;
void SRAMChdir();
void CapturePicture();
extern void SRAMChdir();
extern void CapturePicture();
void statesaver()
{
@@ -455,12 +549,12 @@ void statesaver()
// Save State code
#ifdef __LINUX__
SRAMChdir() ;
SRAMChdir();
#endif
if ((fhandle = fopen(fnamest+1,"wb")) != NULL)
{
// Save 65816 status, etc.
// Save 65816 status, etc.
fwrite (zsmesg, 1, PHnum2writecpureg, fhandle);
fwrite (&cycpbl, 1, 2*4, fhandle);
@@ -482,12 +576,14 @@ void statesaver()
SfxRomBuffer -= SfxCROM;
SfxLastRamAdr -= SfxRAMMem;
fwrite (sfxramdata, 1, 8192*16, fhandle);
fwrite (SfxR0, 1, PHnum2writesfxreg, fhandle);
fwrite (&SfxR0, 1, PHnum2writesfxreg, fhandle);
SfxRomBuffer += SfxCROM;
SfxLastRamAdr += SfxRAMMem;
}
if (SETAEnable) { fwrite (setaramdata, 1, 256*16, fhandle); }
// TODO: save the SetaCmdEnable? For completeness we should do it
// but currently we ignore it anyway.
if (SPC7110Enable)
{
@@ -541,3 +637,287 @@ void statesaver()
ResetState();
stim();
}
extern unsigned int snesmmap[256], snesmap2[256];
/*extern unsigned int NumofBanks;
extern unsigned char SA1BankVal[4];
void BankSwitchC (unsigned char bank, unsigned int offset1, unsigned int offset2, unsigned int pointer)
{
unsigned int curbankval=SA1BankVal[bank], membankval, i;
if ((NumofBanks & 0xFF) == 64) { curbankval &= 1 ; }
curbankval &= 7;
curbankval <<= 20;
if (SA1BankVal[bank] & 0x80)
{
membankval = (pointer + (unsigned int)romdata - 0x8000);
}
else
{
membankval = (curbankval + (unsigned int)romdata - 0x8000);
}
for (i=0 ; i<32 ; i++)
{
snesmmap[offset1+i] = membankval;
membankval += 0x8000;
}
membankval = curbankval + (unsigned int)romdata;
for (i=0 ; i<16 ; i++)
{
snesmap2[offset2+i] = membankval;
snesmmap[offset2+i] = membankval;
membankval += 0x10000;
}
}
extern unsigned int SA1BankSw;
void UpdateBanks()
{
if ((SA1BankSw & 0xFF) == 1)
{
BankSwitchC (0, 0x000, 0x0C0, 0x000000) ;
BankSwitchC (1, 0x020, 0x0D0, 0x100000) ;
BankSwitchC (2, 0x080, 0x0E0, 0x200000) ;
BankSwitchC (3, 0x0A0, 0x0F0, 0x300000) ;
}
}*/
void BankSwitchSDD1C (unsigned char bankval, unsigned int offset)
{
unsigned int curbankval = bankval, i;
curbankval &= 7;
curbankval <<= 20;
curbankval += (unsigned int)romdata;
for (i=0 ; i<16 ; i++)
{
snesmap2[offset+i] = curbankval;
snesmmap[offset+i] = curbankval;
curbankval += 0x10000;
}
}
extern unsigned char SDD1BankA, SDD1BankB, SDD1BankC, SDD1BankD;
void UpdateBanksSDD1()
{
if (SDD1BankA)
{
BankSwitchSDD1C (SDD1BankA, 0x0C0);
BankSwitchSDD1C (SDD1BankB, 0x0D0);
BankSwitchSDD1C (SDD1BankC, 0x0E0);
BankSwitchSDD1C (SDD1BankD, 0x0F0);
}
}
extern unsigned int Voice0Freq, Voice1Freq, Voice2Freq, Voice3Freq;
extern unsigned int Voice4Freq, Voice5Freq, Voice6Freq, Voice7Freq;
extern unsigned short Voice0Pitch, Voice1Pitch, Voice2Pitch, Voice3Pitch;
extern unsigned short Voice4Pitch, Voice5Pitch, Voice6Pitch, Voice7Pitch;
void initpitch()
{
Voice0Pitch = DSPMem[2+0*0x10];
Voice0Freq = ((((Voice0Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
Voice1Pitch = DSPMem[2+1*0x10];
Voice1Freq = ((((Voice1Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
Voice2Pitch = DSPMem[2+2*0x10];
Voice2Freq = ((((Voice2Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
Voice3Pitch = DSPMem[2+3*0x10];
Voice3Freq = ((((Voice3Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
Voice4Pitch = DSPMem[2+4*0x10];
Voice4Freq = ((((Voice4Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
Voice5Pitch = DSPMem[2+5*0x10];
Voice5Freq = ((((Voice5Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
Voice6Pitch = DSPMem[2+6*0x10];
Voice6Freq = ((((Voice6Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
Voice7Pitch = DSPMem[2+7*0x10];
Voice7Freq = ((((Voice7Pitch & 0x3FFF) * dspPAdj) >> 8) & 0xFFFFFFFF);
}
extern unsigned int KeyLoadState, Totalbyteloaded, SfxMemTable[256], SfxCPB;
extern unsigned int SfxPBR, SfxROMBR, SfxRAMBR;
extern unsigned char pressed[256+128+64], multchange, txtloadmsg[15];
extern unsigned char txtconvmsg[16], txtnfndmsg[23], vidmemch2[4096];
extern unsigned char vidmemch4[4096], vidmemch8[4096], versn, MovieProcessing;
extern unsigned char ioportval, SDD1Enable, nexthdma;
extern void procexecloop();
void stateloader (unsigned char *statename, unsigned char keycheck, unsigned char xfercheck)
{
unsigned int offst;
unsigned char statevalue;
if (keycheck)
{
pressed[1] = 0;
pressed[KeyLoadState] = 2;
multchange = 1;
clim();
#ifdef __LINUX__
SRAMChdir();
#endif
// Get the state number
if (fnamest[statefileloc] == 't')
{
statevalue = '0';
}
else
{
statevalue = fnamest[statefileloc];
}
txtloadmsg[6] = statevalue;
txtconvmsg[6] = statevalue;
txtnfndmsg[21] = statevalue;
}
// Actual state loading code
if ((fhandle = fopen(statename,"rb")) != NULL)
{
if (xfercheck) { Totalbyteloaded = 0; }
MovieProcessing = 0;
prevoamptr = 0xFF;
// Load 65816 status, etc.
Totalbyteloaded += fread (zsmesg, 1, PHnum2writecpureg, fhandle);
if (zsmesg[25] >= '6') // just drop older states
{
// Load SPC timers
Totalbyteloaded += fread (&cycpbl, 1, 2*4, fhandle);
// Load SNES PPU Register status
Totalbyteloaded += fread (&sndrot, 1, 3019, fhandle);
ioportval = 0xFF;
// Load WRAM (128k), VRAM (64k)
Totalbyteloaded += fread (wramdata, 1, 8192*16, fhandle);
Totalbyteloaded += fread (vram, 1, 4096*16, fhandle);
if (spcon) // SPC stuff, DSP stuff
{
Totalbyteloaded += fread (spcRam, 1, PHspcsave, fhandle);
Totalbyteloaded += fread (BRRBuffer, 1, PHdspsave, fhandle);
Totalbyteloaded += fread (DSPMem, 1, 16*16, fhandle);
}
if (C4Enable) { Totalbyteloaded += fread (C4Ram, 1, 2048*4, fhandle); }
if (SFXEnable)
{
Totalbyteloaded += fread (sfxramdata, 1, 8192*16, fhandle);
Totalbyteloaded += fread (&SfxR0, 1, PHnum2writesfxreg, fhandle);
SfxCPB = SfxMemTable[(SfxPBR & 0xFF)];
SfxCROM = SfxMemTable[(SfxROMBR & 0xFF)];
SfxRAMMem = (unsigned int)sfxramdata + ((SfxRAMBR & 0xFF) << 16);
SfxRomBuffer += SfxCROM;
SfxLastRamAdr += SfxRAMMem;
}
if (SETAEnable) { Totalbyteloaded += fread (setaramdata, 1, 256*16, fhandle); }
// TODO: load the SetaCmdEnable? For completeness we should do it
// but currently we ignore it anyway.
if (SPC7110Enable)
{
Totalbyteloaded += fread (romdata+0x510000, 1, 65536, fhandle);
Totalbyteloaded += fread (&SPCMultA, 1, PHnum2writespc7110reg, fhandle);
}
if (SA1Enable)
{
Totalbyteloaded += fread (&SA1Mode, 1, PHnum2writesa1reg, fhandle);
Totalbyteloaded += fread (SA1RAMArea, 1, 8192*16, fhandle);
RestoreSA1(); // Convert back SA-1 stuff
// UpdateBanks();
// It was in the asm, but the only thing it does is break Oshaberi Parodius...
// The C port is still present, just commented out.
SA1UpdateDPageC();
}
if (SDD1Enable)
{
UpdateBanksSDD1();
}
fclose (fhandle);
repackfunct();
spcnumread = 0;
spchalted = 0xFFFFFFFF;
nexthdma = 0;
// ;call headerhack ; ASM ONLY ! I'm not porting hacks ever.
initpitch();
// Clear cache check if state loaded
memset (vidmemch2, 1, 4096);
memset (vidmemch4, 1, 4096);
memset (vidmemch8, 1, 4096);
offst = (unsigned int)tableA;
Curtableaddr += offst;
offst = (unsigned int)spcRam;
spcPCRam += offst;
spcRamDP += offst;
ResetState();
procexecloop();
if (keycheck) { stim(); }
}
if (keycheck)
{
if (!xfercheck)
{
if (zsmesg[25] < '6') { Msgptr = txtconvmsg; }
else { Msgptr = txtloadmsg; }
}
MessageOn = MsgCount;
}
}
else
{
if (keycheck)
{
Msgptr = txtnfndmsg;
MessageOn = MsgCount;
stim();
}
}
}
void debugloadstate()
{
stateloader (fnamest+1, 0, 0);
}
void loadstate()
{
stateloader (fnamest+1, 1, 0);
}
void loadstate2()
{
stateloader (fnamest+1, 0, 1);
}
extern unsigned char Netfname[11];
void loadstate3()
{
stateloader (Netfname, 0, 1);
}