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

📄 rom.cpp

📁 一个gba的模拟器源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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=calcImage->Width;
        bmp->Height=calcImage->Height;
        bmp->PixelFormat=pf32bit;
        lcd=new Graphics::TBitmap;
        lcd->Width=lcdWidth<<1;
        lcd->Height=lcdHeight<<1;
        lcd->PixelFormat=pf32bit;
        for (int i=0;i<(lcdHeight<<1);i++)
            ScreenLine[i]=(unsigned long *)lcd->ScanLine[i];
    	for (y=0,lofs=0;y<lcdHeight;y++,lofs+=lcdLineBytes)
    	{
  	    	ofs=lofs;
      		for (x=0,sptr1=(unsigned long*)ScreenLine[y<<1],sptr2=
                (unsigned long*)ScreenLine[(y<<1)+1];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);
                    unsigned long v=rgbv[j];
                    *(sptr1++)=v; *(sptr1++)=v;
                    *(sptr2++)=v; *(sptr2++)=v;
   	    		}
   		    }
        }
        if (calcImage)
            bmp->Canvas->Draw(0,0,calcImage);
        bmp->Canvas->Draw(skinLcd.left,skinLcd.top,lcd);
        delete lcd;
    }
    return bmp;*/
    return NULL;
}

void AddSkin(char *name,int size)
{
/*    FILE *fp=fopen(name,"rb");
    if (!fp) return;
    char str[9];
    fread(str,8,1,fp);
    str[8]=0;
    if (strcmp(str,"VTIv2.1 "))
    {
        fclose(fp);
        return;
    }
    strcpy(skin[skinCount].file,name);
    fread(skin[skinCount].name,64,1,fp);
    fread(&skin[skinCount].calc,4,1,fp);
    fseek(fp,0,SEEK_SET);
    skin[skinCount].csum=0;
    for (int i=0;i<size;i++)
        skin[skinCount].csum+=fgetc(fp)&0xff;
    TRegistry *reg=new TRegistry;
    reg->RootKey=HKEY_LOCAL_MACHINE;
    reg->OpenKey("\\Software\\ACZ\\Virtual TI\\Skins",true);
    char keyName[96];
    sprintf(keyName,"%s",name);
    skin[skinCount].defW=0;
    skin[skinCount].defH=0;
    if (reg->OpenKey(keyName,false))
    {
        if (reg->ValueExists("Checksum"))
        {
            if (reg->ReadInteger("Checksum")==
                skin[skinCount].csum)
            {
                if ((reg->ValueExists("Width"))&&
                    (reg->ValueExists("Height")))
                {
                    skin[skinCount].defW=reg->ReadInteger("Width");
                    skin[skinCount].defH=reg->ReadInteger("Height");
                }
            }
        }
    }
    reg->CloseKey();
    delete reg;
    fclose(fp);
    skinCount++;*/
}

void AnalyzeSkins()
{
    ffblk ff;
    int done;

    skinCount=0;
/*    done=findfirst("*.skn",&ff,FA_RDONLY|FA_ARCH);
    while (!done)
    {
        AddSkin(ff.ff_name,ff.ff_fsize);
        done=findnext(&ff);
    }*/
}

void LoadSkin(int n)
{
/*    char filename[256];
    if (initPath[0])
    {
        sprintf(filename,"%s%s%s",initPath,(initPath[strlen(
            initPath)-1]=='\\')?"":"\\",skin[n].file);
    }
    else
        strcpy(filename,skin[n].file);
    FILE *fp=fopen(filename,"rb");
    if (!fp) return;
    fseek(fp,80,SEEK_SET);
    TColor white,black;
    fread(&white,4,1,fp);
    fread(&black,4,1,fp);
    irvC[0]=((int)black)&0xff; irvC[1]=((int)white)&0xff;
    igvC[0]=(((int)black)>>8)&0xff; igvC[1]=(((int)white)>>8)&0xff;
    ibvC[0]=(((int)black)>>16)&0xff; ibvC[1]=(((int)white)>>16)&0xff;
    fread(&skinLcd,sizeof(RECT),1,fp);
    fread(skinKey,sizeof(RECT),80,fp);
    Screen->Cursor=crHourGlass;
    if (!skinImageLg) skinImageLg=new Graphics::TBitmap;
    skinImageLg->PixelFormat=pf24bit;
    ReadJPEG(fp,skinImageLg);
    if (!skinImageSm) skinImageSm=new Graphics::TBitmap;
    skinImageSm->Width=skinImageLg->Width>>1;
    skinImageSm->Height=skinImageLg->Height>>1;
    skinImageSm->PixelFormat=pf24bit;
    TRect r;
    r.Left=0; r.Right=skinImageSm->Width;
    r.Top=0; r.Bottom=skinImageSm->Height;
    skinImageSm->Canvas->StretchDraw(r,skinImageLg);
    Screen->Cursor=crDefault;
    fclose(fp);
    currentSkin=n;*/
}

void CloseSkin(int saveSkin)
{
/*    if (saveSkin)
    {
        TRegistry *reg=new TRegistry;
        reg->RootKey=HKEY_LOCAL_MACHINE;
        if ((currentSkin!=-1)&&(!EmuWnd->Fullscreenview1->Checked))
        {
            reg->OpenKey("\\Software\\ACZ\\Virtual TI\\Skins",true);
            char keyName[96];
            sprintf(keyName,"%s",skin[currentSkin].file);
            reg->OpenKey(keyName,true);
            reg->WriteInteger("Checksum",(int)((unsigned long)
                skin[currentSkin].csum));
            reg->WriteInteger("Width",EmuWnd->Image->Width);
            reg->WriteInteger("Height",EmuWnd->Image->Height);
            skin[currentSkin].defW=EmuWnd->Image->Width;
            skin[currentSkin].defH=EmuWnd->Image->Height;
            reg->CloseKey();
        }
        reg->OpenKey("\\Software\\ACZ\\Virtual TI\\Skins",true);
        char keyName[24];
        switch (calc)
        {
            case 73: strcpy(keyName,"DefaultSkin73"); break;
            case 82: strcpy(keyName,"DefaultSkin82"); break;
            case 83: strcpy(keyName,"DefaultSkin83"); break;
            case 84: strcpy(keyName,"DefaultSkin83Plus"); break;
            case 85: strcpy(keyName,"DefaultSkin85"); break;
            case 86: strcpy(keyName,"DefaultSkin86"); break;
            case 89: strcpy(keyName,"DefaultSkin89"); break;
            case 92: case 93: strcpy(keyName,"DefaultSkin92"); break;
            case 94: strcpy(keyName,"DefaultSkin92Plus"); break;
        }
        if (currentSkin!=-1)
            reg->WriteString(keyName,skin[currentSkin].file);
        else
            reg->WriteString(keyName,"");
        reg->CloseKey();
        delete reg;
    }
    if (skinImageLg) { delete skinImageLg; skinImageLg=NULL; }
    if (skinImageSm) { delete skinImageSm; skinImageSm=NULL; }
    skinLcd.left=0; skinLcd.right=lcdWidth<<1;
    skinLcd.top=0; skinLcd.bottom=lcdHeight<<1;
    currentSkin=-1;
    irvC[0]=0; irvC[1]=255;
    igvC[0]=0; igvC[1]=255;
    ibvC[0]=0; ibvC[1]=255;*/
}

unsigned char getmem_direct(unsigned short addr)
{
    if (addr<0xf000)
    {
        if (!mem[addr>>12])
            return 0;
        return mem[addr>>12][addr&0xfff];
    }
    return getmem(addr);
}

unsigned char getmem(unsigned short addr)
{
    if ((dmaClk)&&(addr<0xff00))
    {
        if (addr<0x8000)
        {
            if (dmaType==0)
            {
                if (debugWarn[DBW_DMA])
                    DebugWarn(DBW_DMA);
                return 0;
            }
        }
        else if (addr<0xa000)
        {
            if (dmaType==1)
            {
                if (debugWarn[DBW_DMA])
                    DebugWarn(DBW_DMA);
                return 0;
            }
        }
        else
        {
            if (dmaType==2)
            {
                if (debugWarn[DBW_DMA])
                    DebugWarn(DBW_DMA);
                return 0;
            }
        }
    }
    if (addr<0x8000)
    {
        if (!mem[addr>>12])
        {
            if (debugWarn[DBW_INVALIDMEM])
                DebugWarn(DBW_INVALIDMEM);
            return 0;
        }
        return mem[addr>>12][addr&0xfff];
    }
    else if (addr<0xa000)
    {
        if ((lcdMode==3)&&(hiRam[0x40]&0x80))
        {
            if (debugWarn[DBW_VIDMEM])
                DebugWarn(DBW_VIDMEM);
            return 0;
        }
        return vidRam[(vidPage<<13)+(addr&0x1fff)];
    }
    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 0;
        }
        return mem[addr>>12][addr&0xfff];
    }
    else if (addr<0xfe00)
        return intRam[(hiRam[0x70]<<12)+(addr&0xfff)];
    if (addr<0xfea0)
    {
        if ((lcdMode>=2)&&(hiRam[0x40]&2)&&(hiRam[0x40]&0x80))
        {
            if (debugWarn[DBW_VIDMEM])
                DebugWarn(DBW_VIDMEM);
            return 0;
        }
        return oam[addr&0xff];
    }
    else if (addr<0xff00)
        return 0;
    else if (addr==0xff00)
    {
        hiRam[0]=(hiRam[0]&0xf0)|(((hiRam[0]&0x10)?15:(keys&0xf))&
            ((hiRam[0]&0x20)?15:((keys>>4)&0xf)));
        return hiRam[0];
    }
    else if (addr==0xff0f)
    {
        hiRam[0xf]=intReq;
        return hiRam[0xf];
    }
    else if (addr==0xff26)
    {
        hiRam[0x26]=(hiRam[0x26]&0xf0)|(snd4Enable<<3)|
            (snd3Enable<<2)|(snd2Enable<<1)|snd1Enable;
        return hiRam[0x26];
    }
    else if ((addr>=0xff30)&&(addr<0xff40))
    {
//        if ((!(hiRam[0x26]&0x80))||(!(hiRam[0x1a]&0x80)))
            return hiRam[addr&0xff];
//        return rand()&0xff;
    }
    else if (addr==0xff41)
    {
        hiRam[0x41]=(hiRam[0x41]&0xf8)|((lcdY==
            hiRam[0x45])?4:0)|lcdMode;
//        hiRam[0x41]=(hiRam[0x41]&0xf8)|(hiRam[0x41]&4)|lcdMode;
        int v=hiRam[0x41];
//        if (lcdY!=hiRam[0x45])
//            hiRam[0x41]&=~4;
        return v;
    }
    else if (addr==0xff44)
    {
        hiRam[0x44]=lcdY;
        return hiRam[0x44];
    }
    else if (addr==0xff69)
    {
        unsigned char v;
        if (hiRam[0x68]&1)
            v=(bgPalGB[(hiRam[0x68]>>1)&31]>>8)&0xff;
        else
            v=bgPalGB[(hiRam[0x68]>>1)&31]&0xff;
        if (hiRam[0x68]&0x80)
            hiRam[0x68]=((hiRam[0x68]+1)&63)|0x80;
        return v;
    }
    else if (addr==0xff6b)
    {
        unsigned char v;
        if (hiRam[0x6a]&1)
            v=(objPalGB[(hiRam[0x6a]>>1)&31]>>8)&0xff;
        else
            v=objPalGB[(hiRam[0x6a]>>1)&31]&0xff;
        if (hiRam[0x6a]&0x80)
            hiRam[0x6a]=((hiRam[0x6a]+1)&63)|0x80;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -