⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rom.cpp

📁 一个gba的模拟器源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 + -