?? rom.cpp
字號:
#include <vcl\vcl.h>
#include <vcl\registry.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dir.h>
#include <io.h>
#include <dos.h>
#include "rom.h"
#include "Debug.h"
#include "Z80.h"
#include "sound.h"
#define PALCNVT(x) ((((x)&31)<<10)|((x)&0x3e0)|(((x)>>10)&31))
FILE *execTrack;
//extern Z80_Regs R;
//extern unsigned short regPC,regAF,regBC,regDE,regHL,regSP;
UBYTE *ram,*rom;
UBYTE vidRam[16384];
UBYTE oam[0xa0];
UBYTE hiRam[0x100];
UBYTE intRam[0x8000];
UBYTE* mem[16];
int romLoaded=0;
int clkMult=1;
int romType,romSize,ramSize,mbc,batt,mbc1Mode;
int romPage,ramPage,ramEnable,vidPage;
int bgPal[32],objPal[32];
int bgPalGB[32],objPalGB[32];
int keys=0xff;
int timerClkCount=0;
int intReq=0;
extern int intReq2,intReq3;
int initialPC;
int lcdMode=0;
int lcdY=0;
int lcdRefresh;
int lcdUpdateFreq=0;
int lcdUpdateNeeded=0;
char *ScreenLine[288];
int scaleFact=2;
int soundEnable=0,sndQuality=2;
int cgb=0,debugWarn[DBW_COUNT],debugWarnMsg=-1;
int restrictSpeed=1;
char romFileName[256];
int previouspc,dmaClk=0,dmaType,gdmaClk=0;
extern int debug,run,debugStartPC;
#ifndef C_CORE
extern short minTime;
#endif
int sndRegChange=1;
int displayEnabled=1;
extern int emuMode;
unsigned char (*getmemfunc)(unsigned short addr)=getmem;
void (*putmemfunc)(unsigned short addr,unsigned char v)=putmem;
SkinDesc skin[64];
int skinCount=0;
int currentSkin=-1;
Graphics::TBitmap *skinImageLg=NULL;
Graphics::TBitmap *skinImageSm=NULL;
RECT skinLcd;
RECT skinKey[8];
int irvC[2]={0,255};
int igvC[2]={0,255};
int ibvC[2]={0,255};
int grayVal[4]={(31<<10)+(31<<5)+31,(21<<10)+(21<<5)+21,(10<<10)+(10<<5)+10,0};
unsigned short Filter[32768];
extern TCanvas *LCDCanvas;
extern Graphics::TBitmap *bmp;
int GetValue(int min,int max,int v)
{
return min+(float)(max-min)*(2.0*(v/31.0)-(v/31.0)*(v/31.0));
}
void GenFilter()
{
for (int r=0;r<32;r++)
{
for (int g=0;g<32;g++)
{
for (int b=0;b<32;b++)
{
int nr=GetValue(GetValue(4,14,g),GetValue(24,29,g),r)-4;
int ng=GetValue(GetValue(4+GetValue(0,5,r),14+GetValue(0,3,r),b),
GetValue(24+GetValue(0,3,r),29+GetValue(0,1,r),b),g)-4;
int nb=GetValue(GetValue(4+GetValue(0,5,r),14+GetValue(0,3,r),g),
GetValue(24+GetValue(0,3,r),29+GetValue(0,1,r),g),b)-4;
Filter[(b<<10)|(g<<5)|r]=(nr<<10)|(ng<<5)|nb;
}
}
}
}
void InitEmu(char *name)
{
strcpy(romFileName,name);
FILE *fp=fopen(name,"rb");
fseek(fp,0x147,SEEK_SET);
romType=fgetc(fp);
switch(fgetc(fp))
{
case 0: romSize=32*1024; break;
case 1: romSize=64*1024; break;
case 2: romSize=128*1024; break;
case 3: romSize=256*1024; break;
case 4: romSize=512*1024; break;
case 5: romSize=1024*1024; break;
case 6: romSize=2048*1024; break;
case 7: romSize=4096*1024; break;
case 8: romSize=8192*1024; break;
case 0x52: romSize=(1024+128)*1024; break;
case 0x53: romSize=(1024+256)*1024; break;
case 0x54: romSize=(1024+512)*1024; break;
default:
MessageBox(NULL,"Unsupported ROM size",
"Error",MB_OK|MB_ICONSTOP);
return;
}
fseek(fp,0,SEEK_SET);
rom=new UBYTE[romSize];
fread(rom,1,romSize,fp);
fclose(fp);
for (int i=0;i<0x8000;i++)
intRam[i]=rand()&0xff;
switch (rom[0x149])
{
case 0: ramSize=0; break;
case 1: ramSize=2*1024; break;
case 2: ramSize=8*1024; break;
case 3: ramSize=32*1024; break;
case 4: ramSize=128*1024; break;
case 5: ramSize=256*1024; break;
case 6: ramSize=512*1024; break;
case 7: ramSize=1024*1024; break;
default:
MessageBox(NULL,"Unsupported RAM size",
"Error",MB_OK|MB_ICONSTOP);
return;
}
if (ramSize)
{
ram=new UBYTE[ramSize];
for (int i=0;i<ramSize;i++)
ram[i]=rand()&0xff;
}
else
ram=NULL;
switch (romType)
{
case 0: mbc=0; batt=0; break;
case 1: mbc=1; batt=0; break;
case 2: mbc=1; batt=0; break;
case 3: mbc=1; batt=1; break;
case 5: mbc=2; batt=0; break;
case 6: mbc=2; batt=1; break;
case 8: mbc=0; batt=0; break;
case 9: mbc=0; batt=1; break;
case 0xb: case 0xc: case 0xd:
MessageBox(NULL,"MMM01 cartridges are not supported",
"Error",MB_OK|MB_ICONSTOP);
return;
case 0xf: mbc=3; batt=1; break;
case 0x10: mbc=3; batt=1; break;
case 0x11: mbc=3; batt=0; break;
case 0x12: mbc=3; batt=0; break;
case 0x13: mbc=3; batt=1; break;
case 0x19: mbc=5; batt=0; break;
case 0x1a: mbc=5; batt=0; break;
case 0x1b: mbc=5; batt=1; break;
case 0x1c: mbc=6; batt=0; break;
case 0x1d: mbc=6; batt=0; break;
case 0x1e: mbc=6; batt=1; break;
case 0x1f:
MessageBox(NULL,"Pocket Camera is not supported",
"Error",MB_OK|MB_ICONSTOP);
return;
case 0xfd:
MessageBox(NULL,"Bandai TAMA5 cartridges are not supported",
"Error",MB_OK|MB_ICONSTOP);
return;
case 0xfe: case 0xff:
MessageBox(NULL,"Hudson HuC cartridges are not supported",
"Error",MB_OK|MB_ICONSTOP);
return;
default:
MessageBox(NULL,"Unsupported cartridge type",
"Error",MB_OK|MB_ICONSTOP);
return;
}
romLoaded=1;
Reset();
if (batt)
{
char str[256],drive[3],dir[256],name[256];
fnsplit(romFileName,drive,dir,name,NULL);
fnmerge(str,drive,dir,name,".sav");
FILE *fp=fopen(str,"rb");
if (fp)
{
fread(ram,1,ramSize,fp);
fclose(fp);
}
}
}
void CloseEmu()
{
if (!romLoaded) return;
if (batt)
{
char str[256],drive[3],dir[256],name[256];
fnsplit(romFileName,drive,dir,name,NULL);
fnmerge(str,drive,dir,name,".sav");
FILE *fp=fopen(str,"wb");
if (fp)
{
fwrite(ram,1,ramSize,fp);
fclose(fp);
}
}
romLoaded=0;
delete[] rom; rom=NULL;
if (ram) { delete[] ram; ram=NULL; }
}
void SaveState(char *name)
{
}
void LoadState(char *name)
{
}
Graphics::TBitmap* GetLCD_BW()
{
/* int x,y,i,j,b,v0,v1,v2,v3,v4,v5,v,ofs,lofs;
unsigned long *sptr,*sptr1,*sptr2;
unsigned long rgbv[7];
unsigned long* ScreenLine[256];
int cl,w,h;
Graphics::TBitmap *bmp;
for (x=0;x<7;x++)
{
y=(255*x)/6;
rgbv[x]=(y<<16)|(y<<8)|y;
}
{
bmp=new Graphics::TBitmap;
bmp->Width=lcdWidth;
bmp->Height=lcdHeight;
bmp->PixelFormat=pf32bit;
for (int i=0;i<lcdHeight;i++)
ScreenLine[i]=(unsigned long *)bmp->ScanLine[i];
for (y=0,lofs=0;y<lcdHeight;y++,lofs+=lcdLineBytes)
{
ofs=lofs;
for (x=0,sptr=(unsigned long*)ScreenLine[y];x<lcdWidth;x+=8,ofs++)
{
v0=oldScreen[0][ofs];
v1=oldScreen[1][ofs];
v2=oldScreen[2][ofs];
v3=oldScreen[3][ofs];
v4=oldScreen[4][ofs];
v5=oldScreen[5][ofs];
for (i=7,b=0x80;i>=0;i--,b>>=1)
{
j=6-(((v0&b)+(v1&b)+(v2&b)+(v3&b)+(v4&b)+(v5&b))>>i);
*(sptr++)=rgbv[j];
}
}
}
}
return bmp;*/
return NULL;
}
Graphics::TBitmap* GetLCD_True()
{
/* int x,y,i,j,b,v0,v1,v2,v3,v4,v5,v,ofs,lofs;
unsigned long *sptr,*sptr1,*sptr2;
int rv[7],gv[7],bv[7];
unsigned long rgbv[7];
unsigned long* ScreenLine[256];
int cl,w,h;
Graphics::TBitmap *bmp;
irv[0]=irvC[0]; igv[0]=igvC[0]; ibv[0]=ibvC[0];
irv[6]=irvC[1]; igv[6]=igvC[1]; ibv[6]=ibvC[1];
if (calc==89)
cl=contrast;
else if (calc>=92)
cl=31-contrast;
else if ((calc==82)||(calc==85))
cl=contrast+((calc==85)?4:0);
else if (calc==83)
cl=((contrast-12)*32)/52;
else
cl=contrast;
if (cpuCompleteStop) cl+=6;
if (romErase)
{
if (calc!=89)
cl+=contrastDelta[romErasePhase>>3];
romErasePhase++;
if (romErasePhase==64)
{
romErasePhase=0;
romErase=0;
}
}
if (cl>31) cl=31;
if (cl<0) cl=0;
if (cl>16)
{
rv[0]=irv[0]; rv[6]=irv[0]+((irv[6]-irv[0])*(32-cl))/16;
gv[0]=igv[0]; gv[6]=igv[0]+((igv[6]-igv[0])*(32-cl))/16;
bv[0]=ibv[0]; bv[6]=ibv[0]+((ibv[6]-ibv[0])*(32-cl))/16;
rv[1]=rv[0]+(rv[6]-rv[0])/6;
rv[2]=rv[0]+((rv[6]-rv[0])*2)/6;
rv[3]=rv[0]+((rv[6]-rv[0])*3)/6;
rv[4]=rv[0]+((rv[6]-rv[0])*4)/6;
rv[5]=rv[0]+((rv[6]-rv[0])*5)/6;
gv[1]=gv[0]+(gv[6]-gv[0])/6;
gv[2]=gv[0]+((gv[6]-gv[0])*2)/6;
gv[3]=gv[0]+((gv[6]-gv[0])*3)/6;
gv[4]=gv[0]+((gv[6]-gv[0])*4)/6;
gv[5]=gv[0]+((gv[6]-gv[0])*5)/6;
bv[1]=bv[0]+(bv[6]-bv[0])/6;
bv[2]=bv[0]+((bv[6]-bv[0])*2)/6;
bv[3]=bv[0]+((bv[6]-bv[0])*3)/6;
bv[4]=bv[0]+((bv[6]-bv[0])*4)/6;
bv[5]=bv[0]+((bv[6]-bv[0])*5)/6;
}
else
{
rv[6]=irv[6]; rv[0]=irv[6]-((irv[6]-irv[0])*cl)/16;
gv[6]=igv[6]; gv[0]=igv[6]-((igv[6]-igv[0])*cl)/16;
bv[6]=ibv[6]; bv[0]=ibv[6]-((ibv[6]-ibv[0])*cl)/16;
rv[1]=rv[0]+(rv[6]-rv[0])/6;
rv[2]=rv[0]+((rv[6]-rv[0])*2)/6;
rv[3]=rv[0]+((rv[6]-rv[0])*3)/6;
rv[4]=rv[0]+((rv[6]-rv[0])*4)/6;
rv[5]=rv[0]+((rv[6]-rv[0])*5)/6;
gv[1]=gv[0]+(gv[6]-gv[0])/6;
gv[2]=gv[0]+((gv[6]-gv[0])*2)/6;
gv[3]=gv[0]+((gv[6]-gv[0])*3)/6;
gv[4]=gv[0]+((gv[6]-gv[0])*4)/6;
gv[5]=gv[0]+((gv[6]-gv[0])*5)/6;
bv[1]=bv[0]+(bv[6]-bv[0])/6;
bv[2]=bv[0]+((bv[6]-bv[0])*2)/6;
bv[3]=bv[0]+((bv[6]-bv[0])*3)/6;
bv[4]=bv[0]+((bv[6]-bv[0])*4)/6;
bv[5]=bv[0]+((bv[6]-bv[0])*5)/6;
}
for (j=0;j<7;j++)
rgbv[j]=bv[j]|(gv[j]<<8)|(rv[j]<<16);
{
bmp=new Graphics::TBitmap;
bmp->Width=lcdWidth;
bmp->Height=lcdHeight;
bmp->PixelFormat=pf32bit;
for (int i=0;i<lcdHeight;i++)
ScreenLine[i]=(unsigned long *)bmp->ScanLine[i];
for (y=0,lofs=0;y<lcdHeight;y++,lofs+=lcdLineBytes)
{
ofs=lofs;
for (x=0,sptr=(unsigned long*)ScreenLine[y];x<lcdWidth;x+=8,ofs++)
{
v0=oldScreen[0][ofs];
v1=oldScreen[1][ofs];
v2=oldScreen[2][ofs];
v3=oldScreen[3][ofs];
v4=oldScreen[4][ofs];
v5=oldScreen[5][ofs];
for (i=7,b=0x80;i>=0;i--,b>>=1)
{
j=6-(((v0&b)+(v1&b)+(v2&b)+(v3&b)+(v4&b)+(v5&b))>>i);
*(sptr++)=rgbv[j];
}
}
}
}
return bmp;*/
return NULL;
}
Graphics::TBitmap* GetLCD_Calc(Graphics::TBitmap *calcImage)
{
/* int x,y,i,j,b,v0,v1,v2,v3,v4,v5,v,ofs,lofs;
unsigned long *sptr,*sptr1,*sptr2;
int rv[7],gv[7],bv[7];
unsigned long rgbv[7];
unsigned long* ScreenLine[256];
int cl,w,h;
Graphics::TBitmap *bmp,*lcd;
irv[0]=irvC[0]; igv[0]=igvC[0]; ibv[0]=ibvC[0];
irv[6]=irvC[1]; igv[6]=igvC[1]; ibv[6]=ibvC[1];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -