?? rom.cpp
字號:
}
sndRegChange=1;
}
else if ((addr>=0xff10)&&(addr<0xff30))
{
sndRegChange=1;
hiRam[addr&0xff]=v;
}
else if ((addr>=0xff30)&&(addr<0xff40))
{
// if ((!(hiRam[0x26]&0x80))||(!(hiRam[0x1a]&0x80)))
hiRam[addr&0xff]=v;
}
else if (addr==0xff40)
{
if (!(v&0x80))
displayEnabled=0;
if ((!(hiRam[0x40]&0x80))&&(v&0x80))
{
lcdY=0;
lcdMode=0;
}
hiRam[0x40]=v;
}
else if (addr==0xff44)
{
lcdY=0; lcdMode=0;
hiRam[0x44]=0;
#ifndef EXECTRACK
if ((hiRam[0x41]&0x40)&&(lcdY==hiRam[0x45]))
intReq|=INT_LCDC;
#endif
#ifndef C_CORE
minTime=0;
#endif
}
else if (addr==0xff45)
{
hiRam[0x45]=v;
#ifndef EXECTRACK
if ((v==lcdY)&&(hiRam[0x41]&0x40))
intReq|=INT_LCDC;
#endif
#ifndef C_CORE
minTime=0;
#endif
}
else if (addr==0xff46)
{
// if ((R.PC.D<0xff80)&&(debugWarn[DBW_DMA]))
if ((regPC<0xff80)&&(debugWarn[DBW_DMA]))
DebugWarn(DBW_DMA);
dmaClk=640;
#ifndef C_CORE
minTime=0;
#endif
if (v>0xf1) return;
if (v<0x80)
{
dmaType=0;
if (!mem[v>>4]) return;
memcpy(oam,&mem[v>>4][(v&0xf)<<8],0xa0);
}
else if (v<0xa0)
{
dmaType=1;
memcpy(oam,&vidRam[(vidPage<<13)|(v&0x1f)<<8],0xa0);
}
else if (v<0xf0)
{
dmaType=2;
if (!mem[v>>4]) return;
memcpy(oam,&mem[v>>4][(v&0xf)<<8],0xa0);
}
else
{
dmaType=2;
memcpy(oam,&intRam[(hiRam[0x70]<<12)|(v&0x1f)<<8],0xa0);
}
}
else if (addr==0xff47)
{
hiRam[0x47]=v;
if (!cgb)
{
bgPal[0]=bgPalGB[0]=grayVal[v&3];
bgPal[1]=bgPalGB[1]=grayVal[(v>>2)&3];
bgPal[2]=bgPalGB[2]=grayVal[(v>>4)&3];
bgPal[3]=bgPalGB[3]=grayVal[(v>>6)&3];
}
}
else if (addr==0xff48)
{
hiRam[0x48]=v;
if (!cgb)
{
objPal[0]=objPalGB[0]=grayVal[v&3];
objPal[1]=objPalGB[1]=grayVal[(v>>2)&3];
objPal[2]=objPalGB[2]=grayVal[(v>>4)&3];
objPal[3]=objPalGB[3]=grayVal[(v>>6)&3];
}
}
else if (addr==0xff49)
{
hiRam[0x49]=v;
if (!cgb)
{
objPal[4]=objPalGB[4]=grayVal[v&3];
objPal[5]=objPalGB[5]=grayVal[(v>>2)&3];
objPal[6]=objPalGB[6]=grayVal[(v>>4)&3];
objPal[7]=objPalGB[7]=grayVal[(v>>6)&3];
}
}
else if (addr==0xff4d)
hiRam[0x4d]=(hiRam[0x4d]&0xfe)|(v&1);
else if (addr==0xff4f)
{
hiRam[0x4f]=v;
vidPage=v&1;
mem[8]=&vidRam[vidPage<<13];
mem[9]=&vidRam[(vidPage<<13)+0x1000];
}
else if (addr==0xff55)
{
hiRam[0x55]=v;
// if (((v&0x80))&&(lcdMode!=1))
// {
// if (debugWarn[DBW_GDMA])
// DebugWarn(DBW_GDMA);
// }
// else
{
int src=((hiRam[0x51]<<4)|(hiRam[0x52]>>4))<<4;
int dest=((((hiRam[0x53]&31)|0x80)<<4)|(hiRam[0x54]>>4))<<4;
if ((dest>=0x8000)&&(dest<=0x9fff)&&(mem[src>>12]))
{
int len=((v&127)+1)<<4;
for (int i=0;i<len;i++,dest++,src++)
vidRam[(vidPage<<13)+(dest&0x1fff)]=mem[src>>12][src&0xfff];
}
// hiRam[0x55]&=0x7f;
// hiRam[0x55]|=0x80;
if (!(v&0x80))
gdmaClk=(210+((727*(v&0x7f))/100)*clkMult)*4;
hiRam[0x55]=0xff;
}
}
else if (addr==0xff69)
{
cgb=1;
if (hiRam[0x68]&1)
{
bgPalGB[(hiRam[0x68]>>1)&31]=(bgPalGB[(hiRam[0x68]>>1)&31]&0xff)|(v<<8);
bgPal[(hiRam[0x68]>>1)&31]=Filter[bgPalGB[(hiRam[0x68]>>1)&31]&0x7fff];
}
else
{
bgPalGB[(hiRam[0x68]>>1)&31]=(bgPalGB[(hiRam[0x68]>>1)&31]&0xff00)|v;
bgPal[(hiRam[0x68]>>1)&31]=Filter[bgPalGB[(hiRam[0x68]>>1)&31]&0x7fff];
}
if (hiRam[0x68]&0x80)
hiRam[0x68]=((hiRam[0x68]+1)&63)|0x80;
}
else if (addr==0xff6b)
{
cgb=1;
if (hiRam[0x6a]&1)
{
objPalGB[(hiRam[0x6a]>>1)&31]=(objPalGB[(hiRam[0x6a]>>1)&31]&0xff)|(v<<8);
objPal[(hiRam[0x6a]>>1)&31]=Filter[objPalGB[(hiRam[0x6a]>>1)&31]&0x7fff];
}
else
{
objPalGB[(hiRam[0x6a]>>1)&31]=(objPalGB[(hiRam[0x6a]>>1)&31]&0xff00)|v;
objPal[(hiRam[0x6a]>>1)&31]=Filter[objPalGB[(hiRam[0x6a]>>1)&31]&0x7fff];
}
if (hiRam[0x6a]&0x80)
hiRam[0x6a]=((hiRam[0x6a]+1)&63)|0x80;
}
else if (addr==0xff70)
{
hiRam[0x70]=((v&7)==0)?1:(v&7);
mem[0xd]=&intRam[hiRam[0x70]<<12];
}
else
hiRam[addr&0xff]=v;
}
void putmem_word(unsigned short addr,unsigned short v)
{
putmem(addr,v&0xff);
putmem(addr+1,(v>>8)&0xff);
}
void putmem_dword(unsigned short addr,unsigned long v)
{
putmem(addr,v&0xff);
putmem(addr+1,(v>>8)&0xff);
putmem(addr+2,(v>>16)&0xff);
putmem(addr+3,(v>>24)&0xff);
}
#ifndef C_CORE
extern "C" int AsmZ80_Execute(int cycles);
#endif
void OneInstruction()
{
if (!romLoaded) return;
UpdateDebugCheckEnable();
#ifdef C_CORE
Z80_Execute(1);
#else
AsmZ80_Execute(1);
#endif
}
void Execute()
{
if (!romLoaded) return;
if (!run) return;
#ifdef EXECTRACK
#ifdef C_CORE
int cycles=Z80_Execute(1);
SoundUpdate(cycles*(3-clkMult));
fwrite(®AF,2,1,execTrack);
fwrite(®BC,2,1,execTrack);
fwrite(®DE,2,1,execTrack);
fwrite(®HL,2,1,execTrack);
fwrite(®SP,2,1,execTrack);
fwrite(®PC,2,1,execTrack);
hiRam[0x44]=lcdY;
fwrite(hiRam,0xff,1,execTrack);
fwrite(&intReq,4,1,execTrack);
fwrite(&lcdMode,4,1,execTrack);
#else
WORD prevPC=regPC;
int cycles=AsmZ80_Execute(1);
SoundUpdate(cycles*(3-clkMult));
WORD cAF,cBC,cDE,cHL,cSP,cPC;
fread(&cAF,2,1,execTrack);
fread(&cBC,2,1,execTrack);
fread(&cDE,2,1,execTrack);
fread(&cHL,2,1,execTrack);
fread(&cSP,2,1,execTrack);
fread(&cPC,2,1,execTrack);
fread(hiRam,0x80,1,execTrack);
unsigned char wantHiRam[0x80];
fread(wantHiRam,0x7f,1,execTrack);
lcdY=hiRam[0x44];
fread(&intReq,4,1,execTrack);
fread(&lcdMode,4,1,execTrack);
int oldCAF=cAF;
int z=cAF&0x40?0x80:0;
int n=cAF&0x2?0x40:0;
int h=cAF&0x10?0x20:0;
int c=cAF&1?0x10:0;
cAF&=0xff00;
cAF|=z|n|h|c;
if (((regPC-prevPC)==1)&&(((getmem(prevPC)&(~0x30))==9)||
((getmem(prevPC)&(~0x18))==7)))
{
regAF=(regAF&0xff00)|(z?0x40:0)|(h?0x10:0)|(c?1:0);
nFlag=n?1:0;
}
z=regAF&0x40?0x80:0;
n=nFlag?0x40:0;
h=regAF&0x10?0x20:0;
c=regAF&1?0x10:0;
int badAddr=-1;
for (int i=0;i<0x7f;i++)
{
if (hiRam[i+0x80]!=wantHiRam[i])
{
if ((((0xff80+i)==regSP)||((0xff80+i)==(regSP+1)))&&(getmem(prevPC)==0xf5))
{
hiRam[i+0x80]=wantHiRam[i];
continue;
}
badAddr=0xff80+i;
break;
}
}
if (((cAF&0xfff0)!=(regAF&0xff00|z|n|h|c))||(cBC!=regBC)||(cDE!=regDE)||(cHL!=regHL)||
(cSP!=regSP)||(cPC!=regPC)||(badAddr!=-1))
{
debug=1;
run=0;
debugStartPC=regPC;
DebugWnd->Show();
DebugWnd->Update();
char str[256];
if (badAddr!=-1)
sprintf(str,"Should be:\nAF=%4.4X BC=%4.4X DE=%4.4X HL=%4.4X SP=%4.4X PC=%4.4X\n"
"Bad addr=%4.4X, should be=%2.2X Prev PC=%4.4X",cAF,cBC,cDE,cHL,cSP,cPC,(badAddr!=-1)?badAddr:0,wantHiRam[badAddr-0xff80],prevPC);
else
sprintf(str,"Should be:\nAF=%4.4X BC=%4.4X DE=%4.4X HL=%4.4X SP=%4.4X PC=%4.4X\nPrev PC=%4.4X",
cAF,cBC,cDE,cHL,cSP,cPC,prevPC);
MessageBox(NULL,str,"",MB_OK);
}
#endif
return;
#endif
UpdateDebugCheckEnable();
static int leftOver=0;
if (soundEnable)
{
for (int i=0;i<(sndQuality*16);i++)
{
#ifdef C_CORE
int cycles=Z80_Execute(((256/sndQuality)*clkMult)-leftOver);
#else
int cycles=AsmZ80_Execute(((256/sndQuality)*clkMult)-leftOver);
#endif
SoundUpdate(cycles*(3-clkMult));
leftOver=cycles-(((256/sndQuality)*clkMult)-leftOver);
}
}
else
{
#ifdef C_CORE
int cycles=Z80_Execute((4096*clkMult)-leftOver);
#else
int cycles=AsmZ80_Execute((4096*clkMult)-leftOver);
#endif
leftOver=cycles-((4096*clkMult)-leftOver);
}
}
void Reset()
{
if (!romLoaded) return;
#ifdef C_CORE
Z80_Reset();
#endif
regPC=0x100;
regBC=0x13;
regDE=0xd8;
regHL=0x14d;
regSP=0xfffe;
#ifdef C_CORE
regAF=0x11b0;
#ifdef EXECTRACK
execTrack=fopen("ExecTrack.dat","wb");
#endif
#else
regAF=0x1110;//0x11b0;
#ifdef EXECTRACK
execTrack=fopen("ExecTrack.dat","rb");
#endif
#endif
hiRam[5]=0; hiRam[6]=0; hiRam[7]=0; hiRam[0xf]=0; hiRam[0x10]=0x80;
hiRam[0x11]=0xbf; hiRam[0x12]=0xf3; hiRam[0x14]=0x3f;
hiRam[0x16]=0x3f; hiRam[0x17]=0; hiRam[0x19]=0x3f;
hiRam[0x1a]=0x7f; hiRam[0x1b]=0xff; hiRam[0x1c]=0x9f;
hiRam[0x1e]=0xbf; hiRam[0x20]=0xff; hiRam[0x21]=0;
hiRam[0x22]=0; hiRam[0x23]=0x3f; hiRam[0x24]=0x77;
hiRam[0x25]=0; hiRam[0x26]=0xf1; hiRam[0x40]=0x91;
hiRam[0x42]=0; hiRam[0x43]=0; hiRam[0x45]=0;
hiRam[0x47]=0xfc; hiRam[0x48]=0xff; hiRam[0x49]=0xff;
hiRam[0x4a]=0; hiRam[0x4b]=0; hiRam[0xff]=0;
hiRam[0x4d]=0; hiRam[0x4f]=0; hiRam[0x68]=0;
hiRam[0x70]=1;
mbc1Mode=0; romPage=1; ramPage=0; ramEnable=0;
mem[0]=rom; mem[1]=&rom[0x1000];
mem[2]=&rom[0x2000]; mem[3]=&rom[0x3000];
mem[4]=&rom[0x4000]; mem[5]=&rom[0x5000];
mem[6]=&rom[0x6000]; mem[7]=&rom[0x7000];
mem[8]=vidRam; mem[9]=&vidRam[0x1000];
mem[0xa]=NULL; mem[0xb]=NULL;
mem[0xc]=intRam; mem[0xd]=&intRam[0x1000];
mem[0xe]=intRam; mem[0xf]=NULL;
intReq=0; intReq2=0; intReq3=0; timerClkCount=0;
lcdMode=1; lcdY=144;
clkMult=1; vidPage=0;
memset(vidRam,0,0x4000);
for (int i=0;i<8;i++)
{
bgPal[i<<2]=bgPalGB[i<<2]=(31<<10)|(31<<5)|31;
bgPal[(i<<2)+1]=bgPalGB[(i<<2)+1]=(21<<10)|(21<<5)|21;
bgPal[(i<<2)+2]=bgPalGB[(i<<2)+2]=(10<<10)|(10<<5)|10;
bgPal[(i<<2)+3]=bgPalGB[(i<<2)+3]=0;
objPal[i<<2]=objPalGB[i<<2]=(31<<10)|(31<<5)|31;
objPal[(i<<2)+1]=objPalGB[(i<<2)+1]=(21<<10)|(21<<5)|21;
objPal[(i<<2)+2]=objPalGB[(i<<2)+2]=(10<<10)|(10<<5)|10;
objPal[(i<<2)+3]=objPalGB[(i<<2)+3]=0;
}
hiRam[0x68]=0x80; hiRam[0x6a]=0x80;
hiRam[0x69]=bgPal[0]&0xff;
hiRam[0x6b]=objPal[0]&0xff;
snd1Enable=snd2Enable=snd3Enable=snd4Enable=0;
sndRegChange=1;
displayEnabled=1;
cgb=0;
memset(vidRam,0,0x4000);
memset(oam,0,0xa0);
}
/*int _USERENTRY sprcmp(const void *a,const void *b)
{
asm mov eax,a
asm mov ebx,b
asm mov cl,[eax+4]
asm cmp cl,[ebx+4]
asm jne sprcmp_notEqu
asm mov cl,[eax+1]
asm cmp cl,[ebx+1]
asm jl sprcmp_less
asm jg sprcmp_greater
asm xor eax,eax
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -