📄 rom.cpp
字号:
return v;
}
else
return hiRam[addr&0xff];
}
unsigned short getmem_word(unsigned short addr)
{
return getmem(addr)+(getmem(addr+1)<<8);
}
unsigned long getmem_dword(unsigned short addr)
{
return getmem(addr)+(getmem(addr+1)<<8)+
(getmem(addr+2)<<16)+(getmem(addr+3)<<24);
}
void putmem_direct(unsigned short addr,unsigned char v)
{
if (addr<0x8000)
putmem(addr,v);
else if (addr<0xf000)
{
if (!mem[addr>>12])
return;
mem[addr>>12][addr&0xfff]=v;
}
else if (addr<0xfe00)
intRam[(hiRam[0x70]<<12)+(addr&0xfff)]=v;
else if (addr<0xfea0)
oam[addr&0xff]=v;
else if (addr<0xff00)
return;
else if ((addr>=0xff00)&&(addr<0xff80))
putmem(addr,v);
else
hiRam[addr&0xff]=v;
}
void putmem(unsigned short addr,unsigned char v)
{
if ((dmaClk)&&(addr<0xff00))
{
if (addr<0x8000)
{
if (dmaType==0)
{
if (debugWarn[DBW_DMA])
DebugWarn(DBW_DMA);
return;
}
}
else if (addr<0xa000)
{
if (dmaType==1)
{
if (debugWarn[DBW_DMA])
DebugWarn(DBW_DMA);
return;
}
}
else
{
if (dmaType==2)
{
if (debugWarn[DBW_DMA])
DebugWarn(DBW_DMA);
return;
}
}
}
if (addr<0x8000)
{
switch(mbc)
{
case 0: return;
case 1:
if (addr<=0x1fff)
{
if (((v&0xf)==0xa)&&(ram))
{
ramEnable=1;
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
else
{
ramEnable=0;
mem[0xa]=NULL; mem[0xb]=NULL;
}
}
else if ((addr>=0x2000)&&(addr<=0x3fff))
{
romPage=(mbc1Mode)?(v&0x1f):(v&0x7f);
if (romPage==0) romPage=1;
while ((romPage<<14)>=romSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
romPage-=romSize>>14;
}
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
else if ((addr>=0x4000)&&(addr<=0x5fff))
{
if (mbc1Mode==0)
{
romPage=(romPage&0x1f)|((v&3)<<5);
if (romPage==0) romPage=1;
while ((romPage<<14)>=romSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
romPage-=romSize>>14;
}
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
else if (ramSize)
{
ramPage=v&3;
while ((ramPage<<13)>=ramSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
ramPage-=ramSize>>13;
}
if (ramEnable)
{
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
}
}
else if ((addr>=0x6000)&&(addr<=0x7fff))
{
mbc1Mode=v&1;
if (mbc1Mode==1) romPage&=0x1f;
}
break;
case 2:
if ((addr<=0x1fff)/*&&(!(addr&0x100))*/)
{
if (((v&0xf)==0xa)&&(ram))
{
ramEnable=1;
mem[0xa]=ram;
mem[0xb]=&ram[0x1000];
}
else
{
ramEnable=0;
mem[0xa]=NULL; mem[0xb]=NULL;
}
}
else if ((addr>=0x2000)&&(addr<=0x3fff)/*&&(addr&0x100)*/)
{
romPage=v&0xf;
if (romPage==0) romPage=1;
while ((romPage<<14)>=romSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
romPage-=romSize>>14;
}
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
break;
case 3:
if (addr<=0x1fff)
{
if (((v&0xf)==0xa)&&(ram))
{
ramEnable=1;
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
else
{
ramEnable=0;
mem[0xa]=NULL; mem[0xb]=NULL;
}
}
else if ((addr>=0x2000)&&(addr<=0x3fff))
{
romPage=v&0x7f;
if (romPage==0) romPage=1;
while ((romPage<<14)>=romSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
romPage-=romSize>>14;
}
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
else if ((addr>=0x4000)&&(addr<=0x5fff)&&(ramSize))
{
ramPage=v&3;
while ((ramPage<<13)>=ramSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
ramPage-=ramSize>>13;
}
if (ramEnable)
{
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
}
break;
case 5:
if (addr<=0x1fff)
{
if (((v&0xf)==0xa)&&(ram))
{
ramEnable=1;
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
else
{
ramEnable=0;
mem[0xa]=NULL; mem[0xb]=NULL;
}
}
else if ((addr>=0x2000)&&(addr<=0x2fff))
{
romPage=(romPage&0x100)|(int)(v&0xff);
while ((romPage<<14)>=romSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
romPage-=romSize>>14;
}
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
else if ((addr>=0x3000)&&(addr<=0x3fff))
{
romPage=(romPage&0xff)|(((int)(v&1))<<8);
while ((romPage<<14)>=romSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
romPage-=romSize>>14;
}
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
else if ((addr>=0x4000)&&(addr<=0x5fff)&&(ramSize))
{
ramPage=v&0xf;
while ((ramPage<<13)>=ramSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
ramPage-=ramSize>>13;
}
if (ramEnable)
{
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
}
break;
case 6:
if (addr<=0x1fff)
{
if (((v&0xf)==0xa)&&(ram))
{
ramEnable=1;
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
else
{
ramEnable=0;
mem[0xa]=NULL; mem[0xb]=NULL;
}
}
else if ((addr>=0x2000)&&(addr<=0x2fff))
{
romPage=(romPage&0x100)|(int)(v&0xff);
while ((romPage<<14)>=romSize)
romPage-=romSize>>14;
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
else if ((addr>=0x3000)&&(addr<=0x3fff))
{
romPage=(romPage&0xff)|(((int)(v&1))<<8);
while ((romPage<<14)>=romSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
romPage-=romSize>>14;
}
mem[4]=&rom[romPage<<14];
mem[5]=&rom[(romPage<<14)+0x1000];
mem[6]=&rom[(romPage<<14)+0x2000];
mem[7]=&rom[(romPage<<14)+0x3000];
}
else if ((addr>=0x4000)&&(addr<=0x5fff)&&(ramSize))
{
ramPage=v&0x7;
while ((ramPage<<13)>=ramSize)
{
if (debugWarn[DBW_PAGERANGE])
DebugWarn(DBW_PAGERANGE);
ramPage-=ramSize>>13;
}
if (ramEnable)
{
mem[0xa]=&ram[ramPage<<13];
mem[0xb]=&ram[(ramPage<<13)+0x1000];
}
}
break;
}
}
else if (addr<0xa000)
{
if ((lcdMode==3)&&(hiRam[0x40]&0x80))
{
if (debugWarn[DBW_VIDMEM])
DebugWarn(DBW_VIDMEM);
return;
}
vidRam[(vidPage<<13)+(addr&0x1fff)]=v;
}
else if (addr<0xf000)
{
if (!mem[addr>>12])
{
if ((addr<0xc000)&&(!ramEnable)&&
(debugWarn[DBW_RAMDISABLED]))
DebugWarn(DBW_RAMDISABLED);
else if (debugWarn[DBW_INVALIDMEM])
DebugWarn(DBW_INVALIDMEM);
return;
}
mem[addr>>12][addr&0xfff]=v;
}
else if (addr<0xfe00)
intRam[(hiRam[0x70]<<12)+(addr&0xfff)]=v;
else if (addr<0xfea0)
{
if ((lcdMode>=2)&&(hiRam[0x40]&2)&&(hiRam[0x40]&0x80))
{
if (debugWarn[DBW_VIDMEM])
DebugWarn(DBW_VIDMEM);
return;
}
oam[addr&0xff]=v;
}
else if (addr<0xff00)
return;
else if (addr==0xff04)
hiRam[4]=0;
else if (addr==0xff07)
{
hiRam[7]=v;
if (v&4)
{
switch(v&3)
{
case 0: timerClkCount=1024; break;
case 1: timerClkCount=16; break;
case 2: timerClkCount=64; break;
case 3: timerClkCount=256; break;
}
}
else
timerClkCount=0;
#ifndef C_CORE
minTime=0;
#endif
}
#ifndef EXECTRACK
else if (addr==0xff0f)
intReq=hiRam[0xf]=v;
#endif
else if (addr==0xff26)
{
hiRam[0x26]=v;
if (!(v&0x80))
{
snd1Enable=0;
snd2Enable=0;
snd3Enable=0;
snd4Enable=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -