Start cleaning this mess up.

This commit is contained in:
tmaul 2012-04-14 15:27:06 +00:00
parent d337fd792e
commit 6a95870443
3 changed files with 326 additions and 316 deletions

View File

@ -152,15 +152,15 @@ extern UINT8 global_opcode;
extern INT32 cycles;
/*Memory*/
extern UINT8 *ram;
extern UINT8 *rom;
extern UINT8 *SNES_ram;
extern UINT8 *SNES_rom;
extern UINT8 *memlookup[2048];
extern UINT8 memread[2048],memwrite[2048];
extern UINT8 accessspeed[2048];
extern UINT8 *memread;
extern UINT8 *memwrite;
extern UINT8 *accessspeed;
extern INT32 lorom;
UINT8 readmeml(unsigned long adress);
void writememl(unsigned long adress, unsigned char v);
unsigned char snes_readmem(unsigned long adress);
void snes_writemem(unsigned long ad, unsigned char v);
@ -240,10 +240,10 @@ void resetsnem();
void execframe();
void loadrom(char *fn);
void initmem();
void snes_mapmem();
void freemem();
extern unsigned short srammask;
extern unsigned char *sram;
extern unsigned char *SNES_sram;
extern INT32 spctotal;
// snes_main.cpp

View File

@ -8,14 +8,312 @@ INT32 oldnmi=0;
INT32 spcclck;
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,...)
{
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()
{
memset (AllRam, 0, RamEnd - AllRam);
resetppu();
resetspc();
reset65816();
@ -29,8 +327,18 @@ INT32 SnesInit()
char name[22];
INT32 len;
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();
initspc();
makeopcodetable();
@ -41,12 +349,12 @@ INT32 SnesInit()
spccycles=-10000;
rom=(UINT8*)BurnMalloc(4096*1024);
BurnLoadRom(rom,0,0);
BurnLoadRom(SNES_rom,0,0);
temp=rom[0x7FDC]|(rom[0x7FDD]<<8);
temp2=rom[0x7FDE]|(rom[0x7FDF]<<8);
temp=SNES_rom[0x7FDC]|(SNES_rom[0x7FDD]<<8);
temp2=SNES_rom[0x7FDE]|(SNES_rom[0x7FDF]<<8);
if ((temp|temp2)==0xFFFF)
{
lorom=1;
@ -56,12 +364,12 @@ INT32 SnesInit()
lorom=0;
}
initmem();
snes_mapmem();
if (((snes_readmem(0xFFFD)<<8)|snes_readmem(0xFFFC))==0xFFFF)
{
lorom^=1;
initmem();
snes_mapmem();
}
len=counter;//-0x10000;
@ -89,10 +397,10 @@ INT32 SnesInit()
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();

View File

@ -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);
}