Memmapping port step 1 - easier to read, still a lot to do. Power on w/ clear SRAM now works with SA-1 games. Reverted chips/sa1proc.asm to rev 1.42 because all recent work only breaks HnK3 (the SMRPG fix is due to pagefault's subscreen/windowing logic fixes).

This commit is contained in:
grinvader
2005-04-02 09:18:53 +00:00
parent 18ee239d33
commit a102f11b41
14 changed files with 863 additions and 1202 deletions

432
zsnes/src/cpu/memtable.c Normal file
View File

@@ -0,0 +1,432 @@
/*
Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
http://www.zsnes.com
http://sourceforge.net/projects/zsnes
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifdef __LINUX__
#include "gblhdr.h"
#define DIR_SLASH "/"
#else
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#define DIR_SLASH "\\"
#endif
#include "gblvars.h"
extern unsigned int Curtableaddr, tableA[256];
void PrepareOffset()
{
Curtableaddr -= (unsigned int)tableA;
}
void ResetOffset()
{
Curtableaddr += (unsigned int)tableA;
}
extern unsigned int snesmmap[256], snesmap2[256];
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 void (*Bank0datr8[256])(), (*Bank0datr16[256])(), (*Bank0datw8[256])();
extern void (*Bank0datw16[256])(), *DPageR8, *DPageR16, *DPageW8, *DPageW16;
extern unsigned int xdb, xpb, xs, xx, xy, xd;
extern unsigned short oamaddrt, xat, xst, xdt, xxt, xyt;
extern unsigned char xdbt, xpbt;
void UpdateDPageC()
{
DPageR8 = Bank0datr8[(xd >> 8) & 0xFF];
DPageR16 = Bank0datr16[(xd >> 8) & 0xFF];
DPageW8 = Bank0datw8[(xd >> 8) & 0xFF];
DPageW16 = Bank0datw16[(xd >> 8) & 0xFF];
}
extern unsigned int SA1xd;
extern void *SA1DPageR8, *SA1DPageR16, *SA1DPageW8, *SA1DPageW16;
void SA1UpdateDPageC()
{
SA1DPageR8 = Bank0datr8[(SA1xd >> 8) & 0xFF];
SA1DPageR16 = Bank0datr16[(SA1xd >> 8) & 0xFF];
SA1DPageW8 = Bank0datw8[(SA1xd >> 8) & 0xFF];
SA1DPageW16 = Bank0datw16[(SA1xd >> 8) & 0xFF];
}
void unpackfunct()
{
oamaddrt = (oamaddr & 0xFFFF);
xat = (xa & 0xFFFF);
xdbt = (xdb & 0xFF);
xpbt = (xpb & 0xFF);
xst = (xs & 0xFFFF);
xdt = (xd & 0xFFFF);
xxt = (xx & 0xFFFF);
xyt = (xy & 0xFFFF);
}
#define bit_test(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, 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)();
void reg2118();
void reg2118inc();
void reg2118inc8();
void reg2118inc8inc();
void reg2119();
void reg2119inc();
void reg2119inc8();
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 && 0xC0)
{
Voice0Status = Voice1Status = Voice2Status = Voice3Status = 0;
Voice4Status = Voice5Status = Voice6Status = Voice7Status = 0;
}
NoiseInc = (((NoiseSpeeds[(block & 0x1F)] * dspPAdj) >> 17) & 0xFFFFFFFF);
Voice0Noise = bit_test(DSPMem[0x3D], 0);
Voice1Noise = bit_test(DSPMem[0x3D], 1);
Voice2Noise = bit_test(DSPMem[0x3D], 2);
Voice3Noise = bit_test(DSPMem[0x3D], 3);
Voice4Noise = bit_test(DSPMem[0x3D], 4);
Voice5Noise = bit_test(DSPMem[0x3D], 5);
Voice6Noise = bit_test(DSPMem[0x3D], 6);
Voice7Noise = bit_test(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 = bit_test(bgtilesz, 0);
BG216x16t = bit_test(bgtilesz, 1);
BG316x16t = bit_test(bgtilesz, 2);
BG416x16t = bit_test(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 void (*memtabler8[256])();
extern void (*memtablew8[256])();
extern void (*memtabler16[256])();
extern void (*memtablew16[256])();
void regaccessbankr8(), regaccessbankr8SA1();
void memaccessbankr8();
void sramaccessbankr8(), SA1RAMaccessbankr8(), SA1RAMaccessbankr8b();
void wramaccessbankr8(), eramaccessbankr8();
void regaccessbankw8(), regaccessbankw8SA1();
void memaccessbankw8();
void sramaccessbankw8(), SA1RAMaccessbankw8(), SA1RAMaccessbankw8b();
void wramaccessbankw8(), eramaccessbankw8();
void regaccessbankr16(), regaccessbankr16SA1();
void memaccessbankr16();
void sramaccessbankr16(), SA1RAMaccessbankr16(), SA1RAMaccessbankr16b();
void wramaccessbankr16(), eramaccessbankr16();
void regaccessbankw16(), regaccessbankw16SA1();
void memaccessbankw16();
void sramaccessbankw16(), SA1RAMaccessbankw16(), SA1RAMaccessbankw16b();
void wramaccessbankw16(), eramaccessbankw16();
/*
rep_stosd is my name for a 'copy <num> times a function pointer <func_ptr> into
a function pointer array <dest>' function, in honour of the almighty asm
instruction rep stosd, which is able to do that (and much more).
Since ZSNES is just full of func pointer arrays, it'll probably come in handy.
*/
void rep_stosd(void (**dest)(), void (*func_ptr), unsigned int num)
{
while (num--) { dest[num] = func_ptr; }
}
void SetAddressingModes()
{
// set 8-bit read memory tables banks
rep_stosd(memtabler8+0x00, regaccessbankr8, 0x40); // 00 - 3F
rep_stosd(memtabler8+0x40, memaccessbankr8, 0x30); // 40 - 6F
rep_stosd(memtabler8+0x70, sramaccessbankr8, 0x08); // 70 - 77
rep_stosd(memtabler8+0x78, memaccessbankr8, 0x06); // 78 - 7D
memtabler8[0x7E] = wramaccessbankr8; // 7E
memtabler8[0x7F] = eramaccessbankr8; // 7F
rep_stosd(memtabler8+0x80, regaccessbankr8, 0x40); // 80 - BF
rep_stosd(memtabler8+0xC0, memaccessbankr8, 0x40); // C0 - FF
// set 8-bit write memory tables banks
rep_stosd(memtablew8+0x00, regaccessbankw8, 0x40); // 00 - 3F
rep_stosd(memtablew8+0x40, memaccessbankw8, 0x30); // 40 - 6F
rep_stosd(memtablew8+0x70, sramaccessbankw8, 0x08); // 70 - 77
rep_stosd(memtablew8+0x78, memaccessbankw8, 0x06); // 78 - 7D
memtablew8[0x7E] = wramaccessbankw8; // 7E
memtablew8[0x7F] = eramaccessbankw8; // 7F
rep_stosd(memtablew8+0x80, regaccessbankw8, 0x40); // 80 - BF
rep_stosd(memtablew8+0xC0, memaccessbankw8, 0x40); // C0 - FF
// set 16-bit read memory tables banks
rep_stosd(memtabler16+0x00, regaccessbankr16, 0x40); // 00 - 3F
rep_stosd(memtabler16+0x40, memaccessbankr16, 0x30); // 40 - 6F
rep_stosd(memtabler16+0x70, sramaccessbankr16, 0x08); // 70 - 77
rep_stosd(memtabler16+0x78, memaccessbankr16, 0x06); // 78 - 7D
memtabler16[0x7E] = wramaccessbankr16; // 7E
memtabler16[0x7F] = eramaccessbankr16; // 7F
rep_stosd(memtabler16+0x80, regaccessbankr16, 0x40); // 80 - BF
rep_stosd(memtabler16+0xC0, memaccessbankr16, 0x40); // C0 - FF
// set 16-bit write memory tables banks
rep_stosd(memtablew16+0x00, regaccessbankw16, 0x40); // 00 - 3F
rep_stosd(memtablew16+0x40, memaccessbankw16, 0x30); // 40 - 6F
rep_stosd(memtablew16+0x70, sramaccessbankw16, 0x08); // 70 - 77
rep_stosd(memtablew16+0x78, memaccessbankw16, 0x06); // 78 - 7D
memtablew16[0x7E] = wramaccessbankw16; // 7E
memtablew16[0x7F] = eramaccessbankw16; // 7F
rep_stosd(memtablew16+0x80, regaccessbankw16, 0x40); // 80 - BF
rep_stosd(memtablew16+0xC0, memaccessbankw16, 0x40); // C0 - FF
}
void SetAddressingModesSA1()
{
// set 8-bit read memory tables banks
rep_stosd(memtabler8+0x00, regaccessbankr8SA1, 0x40); // 00 - 3F
rep_stosd(memtabler8+0x40, SA1RAMaccessbankr8, 0x20); // 40 - 5F
rep_stosd(memtabler8+0x60, SA1RAMaccessbankr8b, 0x10); // 60 - 6F
rep_stosd(memtabler8+0x70, sramaccessbankr8, 0x08); // 70 - 77
rep_stosd(memtabler8+0x78, memaccessbankr8, 0x06); // 78 - 7D
memtabler8[0x7E] = wramaccessbankr8; // 7E
memtabler8[0x7F] = eramaccessbankr8; // 7F
rep_stosd(memtabler8+0x80, regaccessbankr8SA1, 0x40); // 80 - BF
rep_stosd(memtabler8+0xC0, memaccessbankr8, 0x40); // C0 - FF
// set 8-bit write memory tables banks
rep_stosd(memtablew8+0x00, regaccessbankw8SA1, 0x40); // 00 - 3F
rep_stosd(memtablew8+0x40, SA1RAMaccessbankw8, 0x20); // 40 - 5F
rep_stosd(memtablew8+0x60, SA1RAMaccessbankw8b, 0x10); // 60 - 6F
rep_stosd(memtablew8+0x70, sramaccessbankw8, 0x08); // 70 - 77
rep_stosd(memtablew8+0x78, memaccessbankw8, 0x06); // 78 - 7D
memtablew8[0x7E] = wramaccessbankw8; // 7E
memtablew8[0x7F] = eramaccessbankw8; // 7F
rep_stosd(memtablew8+0x80, regaccessbankw8SA1, 0x40); // 80 - BF
rep_stosd(memtablew8+0xC0, memaccessbankw8, 0x40); // C0 - FF
// set 16-bit read memory tables banks
rep_stosd(memtabler16+0x00, regaccessbankr16SA1, 0x40); // 00 - 3F
rep_stosd(memtabler16+0x40, SA1RAMaccessbankr16, 0x20); // 40 - 5F
rep_stosd(memtabler16+0x60, SA1RAMaccessbankr16b, 0x10); // 60 - 6F
rep_stosd(memtabler16+0x70, sramaccessbankr16, 0x08); // 70 - 77
rep_stosd(memtabler16+0x78, memaccessbankr16, 0x06); // 78 - 7D
memtabler16[0x7E] = wramaccessbankr16; // 7E
memtabler16[0x7F] = eramaccessbankr16; // 7F
rep_stosd(memtabler16+0x80, regaccessbankr16SA1, 0x40); // 80 - BF
rep_stosd(memtabler16+0xC0, memaccessbankr16, 0x40); // C0 - FF
// set 16-bit write memory tables banks
rep_stosd(memtablew16+0x00, regaccessbankw16SA1, 0x40); // 00 - 3F
rep_stosd(memtablew16+0x40, SA1RAMaccessbankw16, 0x20); // 40 - 5F
rep_stosd(memtablew16+0x60, SA1RAMaccessbankw16b, 0x10); // 60 - 6F
rep_stosd(memtablew16+0x70, sramaccessbankw16, 0x08); // 70 - 77
rep_stosd(memtablew16+0x78, memaccessbankw16, 0x06); // 78 - 7D
memtablew16[0x7E] = wramaccessbankw16; // 7E
memtablew16[0x7F] = eramaccessbankw16; // 7F
rep_stosd(memtablew16+0x80, regaccessbankw16SA1, 0x40); // 80 - BF
rep_stosd(memtablew16+0xC0, memaccessbankw16, 0x40); // C0 - FF
}
void membank0r8ram(), membank0r8ramSA1();
void membank0r8reg(), membank0r8inv(), membank0r8chip();
void membank0r8rom(), membank0r8romram();
void membank0w8ram(), membank0w8ramSA1();
void membank0w8reg(), membank0w8inv(), membank0w8chip();
void membank0w8rom(), membank0w8romram();
void membank0r16ram(), membank0r16ramSA1();
void membank0r16reg(), membank0r16inv(), membank0r16chip();
void membank0r16rom(), membank0r16romram();
void membank0w16ram(), membank0w16ramSA1();
void membank0w16reg(), membank0w16inv(), membank0w16chip();
void membank0w16rom(), membank0w16romram();
void GenerateBank0Table()
{
rep_stosd(Bank0datr8+0x00, membank0r8ram, 0x20); // 00 - 1F
rep_stosd(Bank0datr8+0x20, membank0r8reg, 0x28); // 20 - 47
rep_stosd(Bank0datr8+0x48, membank0r8inv, 0x17); // 48 - 5E
rep_stosd(Bank0datr8+0x5F, membank0r8chip, 0x1F); // 5F - 7D
rep_stosd(Bank0datr8+0x7E, membank0r8rom, 0x81); // 7E - FE
Bank0datr8[0xFF] = membank0r8romram; // FF
rep_stosd(Bank0datw8+0x00, membank0w8ram, 0x20); // 00 - 1F
rep_stosd(Bank0datw8+0x20, membank0w8reg, 0x28); // 20 - 47
rep_stosd(Bank0datw8+0x48, membank0w8inv, 0x17); // 48 - 5E
rep_stosd(Bank0datw8+0x5F, membank0w8chip, 0x1F); // 5F - 7D
rep_stosd(Bank0datw8+0x7E, membank0w8rom, 0x81); // 7E - FE
Bank0datw8[0xFF] = membank0w8romram; // FF
rep_stosd(Bank0datr16+0x00, membank0r16ram, 0x20); // 00 - 1F
rep_stosd(Bank0datr16+0x20, membank0r16reg, 0x28); // 20 - 47
rep_stosd(Bank0datr16+0x48, membank0r16inv, 0x17); // 48 - 5E
rep_stosd(Bank0datr16+0x5F, membank0r16chip, 0x1F); // 5F - 7D
rep_stosd(Bank0datr16+0x7E, membank0r16rom, 0x81); // 7E - FE
Bank0datr16[0xFF] = membank0r16romram; // FF
rep_stosd(Bank0datw16+0x00, membank0w16ram, 0x20); // 00 - 1F
rep_stosd(Bank0datw16+0x20, membank0w16reg, 0x28); // 20 - 47
rep_stosd(Bank0datw16+0x48, membank0w16inv, 0x17); // 48 - 5E
rep_stosd(Bank0datw16+0x5F, membank0w16chip, 0x1F); // 5F - 7D
rep_stosd(Bank0datw16+0x7E, membank0w16rom, 0x81); // 7E - FE
Bank0datw16[0xFF] = membank0w16romram; // FF
}
void GenerateBank0TableSA1()
{
rep_stosd(Bank0datr8, membank0r8ramSA1, 0x20); // 00 - 1F
rep_stosd(Bank0datw8, membank0w8ramSA1, 0x20); // 00 - 1F
rep_stosd(Bank0datr16, membank0r16ramSA1, 0x20); // 00 - 1F
rep_stosd(Bank0datw16, membank0w16ramSA1, 0x20); // 00 - 1F
}