From 6a958704433a1f1d67935c150db6cb50e27c3e9b Mon Sep 17 00:00:00 2001 From: tmaul Date: Sat, 14 Apr 2012 15:27:06 +0000 Subject: [PATCH] Start cleaning this mess up. --- src/burn/drv/snes/snes.h | 16 +- src/burn/drv/snes/snes_main.cpp | 328 +++++++++++++++++++++++++++++++- src/burn/drv/snes/snes_mem.cpp | 298 ----------------------------- 3 files changed, 326 insertions(+), 316 deletions(-) delete mode 100644 src/burn/drv/snes/snes_mem.cpp diff --git a/src/burn/drv/snes/snes.h b/src/burn/drv/snes/snes.h index df8887117..5d55d5b6a 100644 --- a/src/burn/drv/snes/snes.h +++ b/src/burn/drv/snes/snes.h @@ -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 diff --git a/src/burn/drv/snes/snes_main.cpp b/src/burn/drv/snes/snes_main.cpp index 33ee895fc..60f70a2ff 100644 --- a/src/burn/drv/snes/snes_main.cpp +++ b/src/burn/drv/snes/snes_main.cpp @@ -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(); diff --git a/src/burn/drv/snes/snes_mem.cpp b/src/burn/drv/snes/snes_mem.cpp deleted file mode 100644 index 5d09d77e6..000000000 --- a/src/burn/drv/snes/snes_mem.cpp +++ /dev/null @@ -1,298 +0,0 @@ -#include -#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); -}