Start cleaning this mess up.
This commit is contained in:
parent
d337fd792e
commit
6a95870443
|
@ -152,15 +152,15 @@ extern UINT8 global_opcode;
|
||||||
extern INT32 cycles;
|
extern INT32 cycles;
|
||||||
|
|
||||||
/*Memory*/
|
/*Memory*/
|
||||||
extern UINT8 *ram;
|
extern UINT8 *SNES_ram;
|
||||||
extern UINT8 *rom;
|
extern UINT8 *SNES_rom;
|
||||||
extern UINT8 *memlookup[2048];
|
extern UINT8 *memlookup[2048];
|
||||||
extern UINT8 memread[2048],memwrite[2048];
|
extern UINT8 *memread;
|
||||||
extern UINT8 accessspeed[2048];
|
extern UINT8 *memwrite;
|
||||||
|
extern UINT8 *accessspeed;
|
||||||
|
|
||||||
extern INT32 lorom;
|
extern INT32 lorom;
|
||||||
UINT8 readmeml(unsigned long adress);
|
|
||||||
void writememl(unsigned long adress, unsigned char v);
|
|
||||||
|
|
||||||
unsigned char snes_readmem(unsigned long adress);
|
unsigned char snes_readmem(unsigned long adress);
|
||||||
void snes_writemem(unsigned long ad, unsigned char v);
|
void snes_writemem(unsigned long ad, unsigned char v);
|
||||||
|
@ -240,10 +240,10 @@ void resetsnem();
|
||||||
void execframe();
|
void execframe();
|
||||||
void loadrom(char *fn);
|
void loadrom(char *fn);
|
||||||
|
|
||||||
void initmem();
|
void snes_mapmem();
|
||||||
void freemem();
|
void freemem();
|
||||||
extern unsigned short srammask;
|
extern unsigned short srammask;
|
||||||
extern unsigned char *sram;
|
extern unsigned char *SNES_sram;
|
||||||
extern INT32 spctotal;
|
extern INT32 spctotal;
|
||||||
|
|
||||||
// snes_main.cpp
|
// snes_main.cpp
|
||||||
|
|
|
@ -8,14 +8,312 @@ INT32 oldnmi=0;
|
||||||
INT32 spcclck;
|
INT32 spcclck;
|
||||||
double spcclck2,spcclck3;
|
double spcclck2,spcclck3;
|
||||||
|
|
||||||
|
extern int pal;
|
||||||
|
UINT16 srammask=0;
|
||||||
|
|
||||||
|
|
||||||
|
static UINT8 *AllMem;
|
||||||
|
static UINT8 *MemEnd;
|
||||||
|
static UINT8 *AllRam;
|
||||||
|
static UINT8 *RamEnd;
|
||||||
|
|
||||||
|
UINT8 *SNES_sram;
|
||||||
|
UINT8 *SNES_ram;
|
||||||
|
UINT8 *SNES_rom;
|
||||||
|
UINT8 *memlookup[2048];
|
||||||
|
UINT8 *memread;
|
||||||
|
UINT8 *memwrite;
|
||||||
|
UINT8 *accessspeed;
|
||||||
|
INT32 lorom;
|
||||||
|
|
||||||
|
|
||||||
|
static INT32 MemIndex(UINT32 cart_size)
|
||||||
|
{
|
||||||
|
UINT8 *Next; Next = AllMem;
|
||||||
|
|
||||||
|
SNES_rom = Next; Next += cart_size;
|
||||||
|
// Technically these are not ram but need to be saved with machine state but not reset with machine
|
||||||
|
memread = Next; Next += 0x800;
|
||||||
|
memwrite = Next; Next += 0x800;
|
||||||
|
accessspeed = Next; Next += 0x800;
|
||||||
|
AllRam = Next;
|
||||||
|
// but these really are ram
|
||||||
|
SNES_ram = Next; Next += 0x20000;
|
||||||
|
SNES_sram = Next; Next += 0x2000;
|
||||||
|
RamEnd = Next;
|
||||||
|
MemEnd = Next;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void freemem()
|
||||||
|
{
|
||||||
|
for (int i=0;i<2048;i++)
|
||||||
|
{
|
||||||
|
memlookup[i]=NULL;
|
||||||
|
}
|
||||||
|
BurnFree (AllMem);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void __cdecl snemlog(TCHAR *format,...)
|
void __cdecl snemlog(TCHAR *format,...)
|
||||||
{
|
{
|
||||||
bprintf(0,format);
|
bprintf(0,format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void snes_mapmem()
|
||||||
|
{
|
||||||
|
|
||||||
|
int c,d;
|
||||||
|
for (c=0;c<0x800;c++)
|
||||||
|
{
|
||||||
|
memread[c]=0;
|
||||||
|
memwrite[c]=0;
|
||||||
|
}
|
||||||
|
if (lorom)
|
||||||
|
{
|
||||||
|
for (c=0;c<96;c++)
|
||||||
|
{
|
||||||
|
for (d=0;d<4;d++)
|
||||||
|
{
|
||||||
|
memread[(c<<3)|(d+4)]=1;
|
||||||
|
memlookup[(c<<3)|(d+4)]=&SNES_rom[((d*0x2000)+(c*0x8000))&0x3FFFFF];
|
||||||
|
memread[(c<<3)|(d+4)|0x400]=1;
|
||||||
|
memlookup[(c<<3)|(d+4)|0x400]=&SNES_rom[((d*0x2000)+(c*0x8000))&0x3FFFFF];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (c=0;c<64;c++)
|
||||||
|
{
|
||||||
|
memread[(c<<3)|0]=memwrite[(c<<3)|0]=1;
|
||||||
|
memlookup[(c<<3)|0]=SNES_ram;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (c=0;c<64;c++)
|
||||||
|
{
|
||||||
|
memread[(c<<3)|0x400]=memwrite[(c<<3)|0x400]=1;
|
||||||
|
memlookup[(c<<3)|0x400]=SNES_ram;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (c=0;c<8;c++)
|
||||||
|
{
|
||||||
|
memread[(0x7E<<3)|c]=memwrite[(0x7E<<3)|c]=1;
|
||||||
|
memlookup[(0x7E<<3)|c]=&SNES_ram[c*0x2000];
|
||||||
|
memread[(0x7F<<3)|c]=memwrite[(0x7F<<3)|c]=1;
|
||||||
|
memlookup[(0x7F<<3)|c]=&SNES_ram[(c*0x2000)+0x10000];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (c=0;c<2048;c++)
|
||||||
|
{
|
||||||
|
memread[c]=1;
|
||||||
|
memwrite[c]=0;
|
||||||
|
memlookup[c]=&SNES_rom[(c*0x2000)&0x3FFFFF];
|
||||||
|
}
|
||||||
|
for (c=0;c<64;c++)
|
||||||
|
{
|
||||||
|
for (d=1;d<4;d++)
|
||||||
|
{
|
||||||
|
memread[(c<<3)+d]=memwrite[(c<<3)+d]=0;
|
||||||
|
memread[(c<<3)+d+1024]=memwrite[(c<<3)+d+1024]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (c=0;c<64;c++)
|
||||||
|
{
|
||||||
|
memread[(c<<3)|0]=memwrite[(c<<3)|0]=1;
|
||||||
|
memlookup[(c<<3)|0]=SNES_ram;
|
||||||
|
memread[(c<<3)|1024]=memwrite[(c<<3)|1024]=1;
|
||||||
|
memlookup[(c<<3)|1024]=SNES_ram;
|
||||||
|
}
|
||||||
|
for (c=0;c<8;c++)
|
||||||
|
{
|
||||||
|
memread[(0x7E<<3)|c]=memwrite[(0x7E<<3)|c]=1;
|
||||||
|
memlookup[(0x7E<<3)|c]=&SNES_ram[c*0x2000];
|
||||||
|
memread[(0x7F<<3)|c]=memwrite[(0x7F<<3)|c]=1;
|
||||||
|
memlookup[(0x7F<<3)|c]=&SNES_ram[(c*0x2000)+0x10000];
|
||||||
|
}
|
||||||
|
for (c=0;c<16;c++)
|
||||||
|
{
|
||||||
|
memread[(0x70<<3)+c]=memwrite[(0x70<<3)+c]=1;
|
||||||
|
memlookup[(0x70<<3)+c]=SNES_sram;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*Set up access speed table*/
|
||||||
|
for (c=0;c<64;c++)
|
||||||
|
{
|
||||||
|
accessspeed[(c<<3)|0]=8;
|
||||||
|
accessspeed[(c<<3)|1]=6;
|
||||||
|
accessspeed[(c<<3)|2]=6;
|
||||||
|
accessspeed[(c<<3)|3]=6;
|
||||||
|
accessspeed[(c<<3)|4]=accessspeed[(c<<3)|5]=8;
|
||||||
|
accessspeed[(c<<3)|6]=accessspeed[(c<<3)|7]=8;
|
||||||
|
}
|
||||||
|
for (c=64;c<128;c++)
|
||||||
|
{
|
||||||
|
for (d=0;d<8;d++)
|
||||||
|
{
|
||||||
|
accessspeed[(c<<3)|d]=8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (c=128;c<192;c++)
|
||||||
|
{
|
||||||
|
accessspeed[(c<<3)|0]=8;
|
||||||
|
accessspeed[(c<<3)|1]=6;
|
||||||
|
accessspeed[(c<<3)|2]=6;
|
||||||
|
accessspeed[(c<<3)|3]=6;
|
||||||
|
accessspeed[(c<<3)|4]=accessspeed[(c<<3)|5]=8;
|
||||||
|
accessspeed[(c<<3)|6]=accessspeed[(c<<3)|7]=8;
|
||||||
|
}
|
||||||
|
for (c=192;c<256;c++)
|
||||||
|
{
|
||||||
|
for (d=0;d<8;d++)
|
||||||
|
{
|
||||||
|
accessspeed[(c<<3)|d]=8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char snes_readmem(unsigned long addr)
|
||||||
|
{
|
||||||
|
cycles-=accessspeed[(addr>>13)&0x7FF];
|
||||||
|
clockspc(accessspeed[(addr>>13)&0x7FF]);
|
||||||
|
if (memread[(addr>>13)&0x7FF])
|
||||||
|
{
|
||||||
|
return memlookup[(addr>>13)&0x7FF][addr&0x1FFF];
|
||||||
|
}
|
||||||
|
|
||||||
|
addr&=~0xFF000000;
|
||||||
|
|
||||||
|
if (((addr>>16)&0x7F)<0x40)
|
||||||
|
{
|
||||||
|
switch (addr&0xF000)
|
||||||
|
{
|
||||||
|
case 0x2000:
|
||||||
|
return readppu(addr);
|
||||||
|
case 0x4000:
|
||||||
|
if ((addr&0xE00)==0x200)
|
||||||
|
{
|
||||||
|
return readio(addr);
|
||||||
|
}
|
||||||
|
if ((addr&0xFFFE)==0x4016)
|
||||||
|
{
|
||||||
|
return readjoyold(addr);
|
||||||
|
}
|
||||||
|
//snemlog(L"Bad Read %06X\n",addr);
|
||||||
|
return 0;
|
||||||
|
case 0x6000:
|
||||||
|
case 0x7000:
|
||||||
|
if (!lorom)
|
||||||
|
{
|
||||||
|
return SNES_sram[addr&srammask];
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
//snemlog(L"Bad read %06X\n",addr);
|
||||||
|
return 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((addr>>16)>=0xD0 && (addr>>16)<=0xFE)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((addr>>16)==0x70)
|
||||||
|
{
|
||||||
|
if (srammask)
|
||||||
|
{
|
||||||
|
return SNES_sram[addr&srammask];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((addr>>16)==0x60)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//snemlog(L"Bad read %06X\n",addr);
|
||||||
|
|
||||||
|
return 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
void snes_writemem(unsigned long addr, unsigned char val)
|
||||||
|
{
|
||||||
|
cycles-=accessspeed[(addr>>13)&0x7FF];
|
||||||
|
clockspc(accessspeed[(addr>>13)&0x7FF]);
|
||||||
|
if (memwrite[(addr>>13)&0x7FF])
|
||||||
|
{
|
||||||
|
memlookup[(addr>>13)&0x7FF][(addr)&0x1FFF]=val;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addr&=~0xFF000000;
|
||||||
|
if (((addr>>16)&0x7F)<0x40)
|
||||||
|
{
|
||||||
|
switch (addr&0xF000)
|
||||||
|
{
|
||||||
|
|
||||||
|
case 0x2000:
|
||||||
|
writeppu(addr,val);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 0x3000:
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 0x4000:
|
||||||
|
if ((addr&0xE00)==0x200)
|
||||||
|
writeio(addr,val);
|
||||||
|
if ((addr&0xFFFE)==0x4016)
|
||||||
|
writejoyold(addr,val);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 0x5000:
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 0x6000:
|
||||||
|
case 0x7000:
|
||||||
|
if (!lorom)
|
||||||
|
{
|
||||||
|
SNES_sram[addr&srammask]=val;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
case 0x8000:
|
||||||
|
case 0x9000:
|
||||||
|
case 0xA000:
|
||||||
|
case 0xB000:
|
||||||
|
case 0xC000:
|
||||||
|
case 0xD000:
|
||||||
|
case 0xE000:
|
||||||
|
case 0xF000:
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
//snemlog(L"Bad write %06X %02X\n",addr,val);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((addr>>16)>=0xD0 && (addr>>16)<=0xFE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((addr>>16)==0x70)
|
||||||
|
{
|
||||||
|
SNES_sram[addr&srammask]=val;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SnesReset()
|
void SnesReset()
|
||||||
{
|
{
|
||||||
|
memset (AllRam, 0, RamEnd - AllRam);
|
||||||
resetppu();
|
resetppu();
|
||||||
resetspc();
|
resetspc();
|
||||||
reset65816();
|
reset65816();
|
||||||
|
@ -30,7 +328,17 @@ INT32 SnesInit()
|
||||||
INT32 len;
|
INT32 len;
|
||||||
UINT16 temp,temp2;
|
UINT16 temp,temp2;
|
||||||
|
|
||||||
allocmem();
|
struct BurnRomInfo ri;
|
||||||
|
BurnDrvGetRomInfo(&ri, 0);
|
||||||
|
UINT32 length = ri.nLen;
|
||||||
|
|
||||||
|
AllMem = NULL;
|
||||||
|
MemIndex(length);
|
||||||
|
INT32 nLen = MemEnd - (UINT8 *)0;
|
||||||
|
if ((AllMem = (UINT8 *)BurnMalloc(nLen)) == NULL) return 1;
|
||||||
|
memset(AllMem, 0, nLen);
|
||||||
|
MemIndex(length);
|
||||||
|
|
||||||
initppu();
|
initppu();
|
||||||
initspc();
|
initspc();
|
||||||
makeopcodetable();
|
makeopcodetable();
|
||||||
|
@ -41,12 +349,12 @@ INT32 SnesInit()
|
||||||
|
|
||||||
spccycles=-10000;
|
spccycles=-10000;
|
||||||
|
|
||||||
rom=(UINT8*)BurnMalloc(4096*1024);
|
|
||||||
BurnLoadRom(rom,0,0);
|
BurnLoadRom(SNES_rom,0,0);
|
||||||
|
|
||||||
|
|
||||||
temp=rom[0x7FDC]|(rom[0x7FDD]<<8);
|
temp=SNES_rom[0x7FDC]|(SNES_rom[0x7FDD]<<8);
|
||||||
temp2=rom[0x7FDE]|(rom[0x7FDF]<<8);
|
temp2=SNES_rom[0x7FDE]|(SNES_rom[0x7FDF]<<8);
|
||||||
if ((temp|temp2)==0xFFFF)
|
if ((temp|temp2)==0xFFFF)
|
||||||
{
|
{
|
||||||
lorom=1;
|
lorom=1;
|
||||||
|
@ -56,12 +364,12 @@ INT32 SnesInit()
|
||||||
lorom=0;
|
lorom=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
initmem();
|
snes_mapmem();
|
||||||
|
|
||||||
if (((snes_readmem(0xFFFD)<<8)|snes_readmem(0xFFFC))==0xFFFF)
|
if (((snes_readmem(0xFFFD)<<8)|snes_readmem(0xFFFC))==0xFFFF)
|
||||||
{
|
{
|
||||||
lorom^=1;
|
lorom^=1;
|
||||||
initmem();
|
snes_mapmem();
|
||||||
}
|
}
|
||||||
|
|
||||||
len=counter;//-0x10000;
|
len=counter;//-0x10000;
|
||||||
|
@ -89,10 +397,10 @@ INT32 SnesInit()
|
||||||
|
|
||||||
if (srammask)
|
if (srammask)
|
||||||
{
|
{
|
||||||
memset(sram,0,srammask+1);
|
memset(SNES_sram,0,srammask+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(ram,0x55,128*1024);
|
memset(SNES_ram,0x55,128*1024);
|
||||||
|
|
||||||
SnesReset();
|
SnesReset();
|
||||||
|
|
||||||
|
|
|
@ -1,298 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include "snes.h"
|
|
||||||
|
|
||||||
extern int pal;
|
|
||||||
UINT16 srammask=0;
|
|
||||||
|
|
||||||
UINT8 *sram;
|
|
||||||
UINT8 *ram;
|
|
||||||
UINT8 *rom;
|
|
||||||
UINT8 *memlookup[2048];
|
|
||||||
UINT8 memread[2048];
|
|
||||||
UINT8 memwrite[2048];
|
|
||||||
UINT8 accessspeed[2048];
|
|
||||||
INT32 lorom;
|
|
||||||
|
|
||||||
void allocmem()
|
|
||||||
{
|
|
||||||
ram=(UINT8*)BurnMalloc(128*1024);
|
|
||||||
memset(ram,0x55,128*1024);
|
|
||||||
sram=(UINT8*)BurnMalloc(8192);
|
|
||||||
memset(sram,0,8192);
|
|
||||||
}
|
|
||||||
|
|
||||||
void freemem()
|
|
||||||
{
|
|
||||||
for (int i=0;i<2048;i++)
|
|
||||||
{
|
|
||||||
memlookup[i]=NULL;
|
|
||||||
memread[i]=0;
|
|
||||||
memwrite[i]=0;
|
|
||||||
accessspeed[i]=0;
|
|
||||||
|
|
||||||
}
|
|
||||||
if (ram !=NULL)
|
|
||||||
{
|
|
||||||
BurnFree(ram);
|
|
||||||
}
|
|
||||||
if (sram!=NULL)
|
|
||||||
{
|
|
||||||
BurnFree(sram);
|
|
||||||
}
|
|
||||||
if (rom!=NULL)
|
|
||||||
{
|
|
||||||
BurnFree(rom);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void initmem()
|
|
||||||
{
|
|
||||||
|
|
||||||
int c,d;
|
|
||||||
for (c=0;c<256;c++)
|
|
||||||
{
|
|
||||||
for (d=0;d<8;d++)
|
|
||||||
{
|
|
||||||
memread[(c<<3)|d]=memwrite[(c<<3)|d]=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (lorom)
|
|
||||||
{
|
|
||||||
for (c=0;c<96;c++)
|
|
||||||
{
|
|
||||||
for (d=0;d<4;d++)
|
|
||||||
{
|
|
||||||
memread[(c<<3)|(d+4)]=1;
|
|
||||||
memlookup[(c<<3)|(d+4)]=&rom[((d*0x2000)+(c*0x8000))&0x3FFFFF];
|
|
||||||
memread[(c<<3)|(d+4)|0x400]=1;
|
|
||||||
memlookup[(c<<3)|(d+4)|0x400]=&rom[((d*0x2000)+(c*0x8000))&0x3FFFFF];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (c=0;c<64;c++)
|
|
||||||
{
|
|
||||||
memread[(c<<3)|0]=memwrite[(c<<3)|0]=1;
|
|
||||||
memlookup[(c<<3)|0]=ram;
|
|
||||||
}
|
|
||||||
for (c=0;c<64;c++)
|
|
||||||
{
|
|
||||||
memread[(c<<3)|0x400]=memwrite[(c<<3)|0x400]=1;
|
|
||||||
memlookup[(c<<3)|0x400]=ram;
|
|
||||||
}
|
|
||||||
for (c=0;c<8;c++)
|
|
||||||
{
|
|
||||||
memread[(0x7E<<3)|c]=memwrite[(0x7E<<3)|c]=1;
|
|
||||||
memlookup[(0x7E<<3)|c]=&ram[c*0x2000];
|
|
||||||
memread[(0x7F<<3)|c]=memwrite[(0x7F<<3)|c]=1;
|
|
||||||
memlookup[(0x7F<<3)|c]=&ram[(c*0x2000)+0x10000];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (c=0;c<2048;c++)
|
|
||||||
{
|
|
||||||
memread[c]=1;
|
|
||||||
memwrite[c]=0;
|
|
||||||
memlookup[c]=&rom[(c*0x2000)&0x3FFFFF];
|
|
||||||
}
|
|
||||||
for (c=0;c<64;c++)
|
|
||||||
{
|
|
||||||
for (d=1;d<4;d++)
|
|
||||||
{
|
|
||||||
memread[(c<<3)+d]=memwrite[(c<<3)+d]=0;
|
|
||||||
memread[(c<<3)+d+1024]=memwrite[(c<<3)+d+1024]=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (c=0;c<64;c++)
|
|
||||||
{
|
|
||||||
memread[(c<<3)|0]=memwrite[(c<<3)|0]=1;
|
|
||||||
memlookup[(c<<3)|0]=ram;
|
|
||||||
memread[(c<<3)|1024]=memwrite[(c<<3)|1024]=1;
|
|
||||||
memlookup[(c<<3)|1024]=ram;
|
|
||||||
}
|
|
||||||
for (c=0;c<8;c++)
|
|
||||||
{
|
|
||||||
memread[(0x7E<<3)|c]=memwrite[(0x7E<<3)|c]=1;
|
|
||||||
memlookup[(0x7E<<3)|c]=&ram[c*0x2000];
|
|
||||||
memread[(0x7F<<3)|c]=memwrite[(0x7F<<3)|c]=1;
|
|
||||||
memlookup[(0x7F<<3)|c]=&ram[(c*0x2000)+0x10000];
|
|
||||||
}
|
|
||||||
for (c=0;c<16;c++)
|
|
||||||
{
|
|
||||||
memread[(0x70<<3)+c]=memwrite[(0x70<<3)+c]=1;
|
|
||||||
memlookup[(0x70<<3)+c]=sram;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*Set up access speed table*/
|
|
||||||
for (c=0;c<64;c++)
|
|
||||||
{
|
|
||||||
accessspeed[(c<<3)|0]=8;
|
|
||||||
accessspeed[(c<<3)|1]=6;
|
|
||||||
accessspeed[(c<<3)|2]=6;
|
|
||||||
accessspeed[(c<<3)|3]=6;
|
|
||||||
accessspeed[(c<<3)|4]=accessspeed[(c<<3)|5]=8;
|
|
||||||
accessspeed[(c<<3)|6]=accessspeed[(c<<3)|7]=8;
|
|
||||||
}
|
|
||||||
for (c=64;c<128;c++)
|
|
||||||
{
|
|
||||||
for (d=0;d<8;d++)
|
|
||||||
{
|
|
||||||
accessspeed[(c<<3)|d]=8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (c=128;c<192;c++)
|
|
||||||
{
|
|
||||||
accessspeed[(c<<3)|0]=8;
|
|
||||||
accessspeed[(c<<3)|1]=6;
|
|
||||||
accessspeed[(c<<3)|2]=6;
|
|
||||||
accessspeed[(c<<3)|3]=6;
|
|
||||||
accessspeed[(c<<3)|4]=accessspeed[(c<<3)|5]=8;
|
|
||||||
accessspeed[(c<<3)|6]=accessspeed[(c<<3)|7]=8;
|
|
||||||
}
|
|
||||||
for (c=192;c<256;c++)
|
|
||||||
{
|
|
||||||
for (d=0;d<8;d++)
|
|
||||||
{
|
|
||||||
accessspeed[(c<<3)|d]=8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char readmeml(unsigned long addr)
|
|
||||||
{
|
|
||||||
addr&=~0xFF000000;
|
|
||||||
|
|
||||||
if (((addr>>16)&0x7F)<0x40)
|
|
||||||
{
|
|
||||||
switch (addr&0xF000)
|
|
||||||
{
|
|
||||||
case 0x2000:
|
|
||||||
return readppu(addr);
|
|
||||||
case 0x4000:
|
|
||||||
if ((addr&0xE00)==0x200)
|
|
||||||
{
|
|
||||||
return readio(addr);
|
|
||||||
}
|
|
||||||
if ((addr&0xFFFE)==0x4016)
|
|
||||||
{
|
|
||||||
return readjoyold(addr);
|
|
||||||
}
|
|
||||||
//snemlog(L"Bad Read %06X\n",addr);
|
|
||||||
return 0;
|
|
||||||
case 0x6000:
|
|
||||||
case 0x7000:
|
|
||||||
if (!lorom)
|
|
||||||
{
|
|
||||||
return sram[addr&srammask];
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
//snemlog(L"Bad read %06X\n",addr);
|
|
||||||
return 0xFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((addr>>16)>=0xD0 && (addr>>16)<=0xFE)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((addr>>16)==0x70)
|
|
||||||
{
|
|
||||||
if (srammask)
|
|
||||||
{
|
|
||||||
return sram[addr&srammask];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((addr>>16)==0x60)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//snemlog(L"Bad read %06X\n",addr);
|
|
||||||
|
|
||||||
return 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
void writememl(unsigned long addr, unsigned char val)
|
|
||||||
{
|
|
||||||
addr&=~0xFF000000;
|
|
||||||
if (((addr>>16)&0x7F)<0x40)
|
|
||||||
{
|
|
||||||
switch (addr&0xF000)
|
|
||||||
{
|
|
||||||
|
|
||||||
case 0x2000:
|
|
||||||
writeppu(addr,val);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x3000:
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x4000:
|
|
||||||
if ((addr&0xE00)==0x200)
|
|
||||||
writeio(addr,val);
|
|
||||||
if ((addr&0xFFFE)==0x4016)
|
|
||||||
writejoyold(addr,val);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x5000:
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x6000:
|
|
||||||
case 0x7000:
|
|
||||||
if (!lorom) sram[addr&srammask]=val;
|
|
||||||
return;
|
|
||||||
case 0x8000:
|
|
||||||
case 0x9000:
|
|
||||||
case 0xA000:
|
|
||||||
case 0xB000:
|
|
||||||
case 0xC000:
|
|
||||||
case 0xD000:
|
|
||||||
case 0xE000:
|
|
||||||
case 0xF000:
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
//snemlog(L"Bad write %06X %02X\n",addr,val);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((addr>>16)>=0xD0 && (addr>>16)<=0xFE)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((addr>>16)==0x70)
|
|
||||||
{
|
|
||||||
sram[addr&srammask]=val;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//snemlog(L"Bad write %06X %02X\n",addr,val);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char snes_readmem(unsigned long adress)
|
|
||||||
{
|
|
||||||
cycles-=accessspeed[(adress>>13)&0x7FF];
|
|
||||||
clockspc(accessspeed[(adress>>13)&0x7FF]);
|
|
||||||
if (memread[(adress>>13)&0x7FF])
|
|
||||||
{
|
|
||||||
return memlookup[(adress>>13)&0x7FF][adress&0x1FFF];
|
|
||||||
}
|
|
||||||
return readmeml(adress);
|
|
||||||
}
|
|
||||||
|
|
||||||
void snes_writemem(unsigned long ad, unsigned char v)
|
|
||||||
{
|
|
||||||
cycles-=accessspeed[(ad>>13)&0x7FF];
|
|
||||||
clockspc(accessspeed[(ad>>13)&0x7FF]);
|
|
||||||
if (memwrite[(ad>>13)&0x7FF])
|
|
||||||
memlookup[(ad>>13)&0x7FF][(ad)&0x1FFF]=v;
|
|
||||||
else
|
|
||||||
writememl(ad,v);
|
|
||||||
}
|
|
Loading…
Reference in New Issue