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

📄 emu.cpp

📁 bung.cpp bung.dfm bung.h DbgWarn.cpp DbgWarn.dfm DbgWarn.h Debug.cpp Debug.dfm Debug.h Emu.cpp Emu
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <vcl\registry.hpp>
#pragma hdrstop
#include <stdio.h>
#include <dir.h>

#include "Emu.h"
#include <clipbrd.hpp>
#include "gbcemu.h"
#include "bung.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TEmuWnd *EmuWnd;

int startInDebug=0;
int showSpeed=0;
int scaleFact=2;
int paused=0;

extern int cmdLineValid;
extern char initialROM[256];

char currentROM[256];

POINT gbPoly[]={{3,9},{8,5},{278,5},{283,8},{283,466},{279,476},{273,482},
    {268,485},{243,492},{222,495},{192,499},{169,501},{119,501},{94,499},
    {72,496},{49,492},{33,489},{22,486},{17,485},{13,483},{10,480},
    {5,473},{3,468}};
int gbPolyPointCount=23;

static int clicked=0;
static int clickX,clickY;

void PauseStart()
{
/*    pauseLevel++;
    if (pauseLevel>1)
        return;
    int startTime=GetTickCount();
    while (!pauseExit)
    {
        Sleep(0);
        if ((GetTickCount()-startTime)>3000)
            break;
    }
    pauseExit=false;
    pause=true;
    SetEvent(emuEvent);
    while (!pauseReady)
    {
        Sleep(0);
        if ((GetTickCount()-startTime)>3000)
            break;
    }*/
}

void PauseEnd()
{
/*    pauseLevel--;
    if (pauseLevel)
        return;
    pause=false;
    pauseReady=false;
    SetEvent(emuEvent);
    int startTime=GetTickCount();
    while (!pauseExit)
    {
        Sleep(0);
        if ((GetTickCount()-startTime)>3000)
            break;
    }*/
}

//---------------------------------------------------------------------------
int lcdOnly=0;

__fastcall TEmuWnd::TEmuWnd(TComponent* Owner)
    : TForm(Owner)
{
    enforceRatio=0;
}
//---------------------------------------------------------------------------
extern char *ScreenLine[288];

extern HINSTANCE hInst;
bool minimizeOnDeactivate=true;
int showSkin=1;

void __fastcall TEmuWnd::Make()
{
    minimizeOnDeactivate=false;
    enforceRatio=0;
    Caption="";
    Application->Title=Caption;
    if (!Fullscreenview1->Checked)
    {
//        BorderStyle=bsSizeable;
        FormStyle=(Stayontop1->Checked)?fsStayOnTop:fsNormal;
        AutoScroll=false;
        Application->ProcessMessages();
//        int sf1w=(currentSkin==-1)?0:skinImageSm->Width;
//        int sf1h=(currentSkin==-1)?0:skinImageSm->Height;
//        int sf2w=(currentSkin==-1)?0:skinImageLg->Width;
//        int sf2h=(currentSkin==-1)?0:skinImageLg->Height;
//        if (currentSkin==-1)
        if (showSkin)
        {
            Normal1xview1->Checked=(scaleFact==1);
            Large2xview1->Checked=(scaleFact==2);
            ClientWidth=288*scaleFact;
            ClientHeight=507*scaleFact;
            gb->Width=288*scaleFact;
            gb->Height=507*scaleFact;
            batt->Left=24*scaleFact;
            batt->Top=88*scaleFact;
            batt->Width=12*scaleFact;
            batt->Height=13*scaleFact;
            LCD->Left=64*scaleFact;
            LCD->Top=54*scaleFact;
            LCD->ClientWidth=160*scaleFact;
            LCD->ClientHeight=144*scaleFact;
            GBC_LCDPos(LCD->Left,LCD->Top);
        }
        else
        {
            ClientWidth=160*scaleFact;
            ClientHeight=144*scaleFact;
            LCD->Left=0;
            LCD->Top=0;
            GBC_LCDPos(0,0);
            batt->Left=350;
        }
//        else if ((skin[currentSkin].defW)&&
//                 (skin[currentSkin].defH))
//        {
//            ClientWidth=skin[currentSkin].defW;
//            ClientHeight=skin[currentSkin].defH;
//            Image->Width=skin[currentSkin].defW;
//            Image->Height=skin[currentSkin].defH;
//            skin[currentSkin].defW=0;
//            skin[currentSkin].defH=0;
//            Normal1xview1->Checked=false;
//            Large2xview1->Checked=false;
//            if (((abs((Image->Width-sf1w)))<5)&&
//                ((abs((Image->Height-sf1h)))<5))
//            {
//                Normal1xview1->Checked=true;
//                scaleFact=1;
//                ClientWidth=skinImageSm->Width;
//                ClientHeight=skinImageSm->Height;
//                Image->Width=skinImageSm->Width;
//                Image->Height=skinImageSm->Height;
//                LCD->Left=skinLcd.left/(3-scaleFact);
//                LCD->Top=skinLcd.top/(3-scaleFact);
//                LCD->ClientWidth=160*scaleFact;
//                LCD->ClientHeight=144*scaleFact;
//            }
//            else if (((abs((Image->Width-sf2w)))<5)&&
//                     ((abs((Image->Height-sf2h)))<5))
//            {
//                Large2xview1->Checked=true;
//                scaleFact=2;
//                ClientWidth=skinImageLg->Width;
//                ClientHeight=skinImageLg->Height;
//                Image->Width=skinImageLg->Width;
//                Image->Height=skinImageLg->Height;
//                LCD->Left=skinLcd.left/(3-scaleFact);
//                LCD->Top=skinLcd.top/(3-scaleFact);
//                LCD->ClientWidth=160*scaleFact;
//                LCD->ClientHeight=144*scaleFact;
//            }
//            else
//            {
//                if (LCD->Width>160)
//                    scaleFact=2;
//                else
//                    scaleFact=1;
//                int imgW=(skinImageLg)?skinImageLg->Width:(160<<1);
//                int imgH=(skinImageLg)?skinImageLg->Height:(144<<1);
//                LCD->Left=skinLcd.left*Image->Width/imgW;
//                LCD->Width=(skinLcd.right-skinLcd.left)*Image->Width/imgW;
//                LCD->Top=skinLcd.top*Image->Height/imgH;
//                LCD->Height=(skinLcd.bottom-skinLcd.top)*Image->Height/imgH;
//            }
//        }
//        else if (scaleFact==1)
//        {
//            Normal1xview1->Checked=true;
//            Large2xview1->Checked=false;
//            ClientWidth=skinImageSm->Width;
//            ClientHeight=skinImageSm->Height;
//            Image->Width=skinImageSm->Width;
//            Image->Height=skinImageSm->Height;
//            LCD->Left=skinLcd.left/(3-scaleFact);
//            LCD->Top=skinLcd.top/(3-scaleFact);
//            LCD->ClientWidth=160*scaleFact;
//            LCD->ClientHeight=144*scaleFact;
//        }
//        else
//        {
//            Normal1xview1->Checked=false;
//            Large2xview1->Checked=true;
//            ClientWidth=skinImageLg->Width;
//            ClientHeight=skinImageLg->Height;
//            Image->Width=skinImageLg->Width;
//            Image->Height=skinImageLg->Height;
//            LCD->Left=skinLcd.left/(3-scaleFact);
//            LCD->Top=skinLcd.top/(3-scaleFact);
//            LCD->ClientWidth=160*scaleFact;
//            LCD->ClientHeight=144*scaleFact;
//        }
//        calcImage=skinImageLg;
//        None1->Checked=(currentSkin==-1);
//        while (Currentskin1->Count>1)
//            Currentskin1->Delete(1);
//        for (int i=0;i<skinCount;i++)
//        {
//            TMenuItem *itm=new TMenuItem(Currentskin1);
//            itm->Caption=skin[i].name;
//            itm->Checked=(i==currentSkin);
//            itm->OnClick=OnSkinSelect;
//            Currentskin1->Add(itm);
//        }
    }
    else
    {
        BorderStyle=bsNone;
        FormStyle=fsStayOnTop;
        AutoScroll=false;
        Application->ProcessMessages();
        Left=0; Top=0;
        Width=GetDeviceCaps(Canvas->Handle,HORZRES);
        Height=GetDeviceCaps(Canvas->Handle,VERTRES);
        LCD->Left=0; LCD->Width=Width;
        LCD->Top=0; LCD->Height=Height;
    }
    enforceRatio=1;
    minimizeOnDeactivate=true;
    POINT *p=new POINT[gbPolyPointCount];
    for (int i=0;i<gbPolyPointCount;i++)
    {
        p[i].x=gbPoly[i].x*scaleFact;
        p[i].y=gbPoly[i].y*scaleFact;
    }
    SetWindowRgn(Handle,CreatePolygonRgn(p,gbPolyPointCount,WINDING),true);
    delete[] p;
    GBC_SetWindow(Handle);
    Visible=true;
}

int lcdUpdate;
void __fastcall TEmuWnd::FormCreate(TObject *Sender)
{
    lcdUpdate=0;

    if (!GBC_Init(Handle))
        ExitProcess(0);
    GBC_LCDScaleFact(1);
    GBC_LCDPos(LCD->Left,LCD->Top);
    scaleFact=1;

    if (cmdLineValid)
    {
        GBC_LoadROM(initialROM);
        strcpy(currentROM,initialROM);
        batt->Visible=true;
    }

    Application->OnIdle=TEmuWnd::OnIdle;
//    Application->OnActivate=FormActivate;
    Application->OnDeactivate=FormDeactivate;
    Application->OnMinimize=OnMinimize;
    Application->OnRestore=OnRestore;

    TRegistry *reg=new TRegistry;
    reg->RootKey=HKEY_LOCAL_MACHINE;
    reg->OpenKey("\\Software\\gbc",true);
    if (reg->ValueExists("StayOnTop"))
    {
        if (reg->ReadInteger("StayOnTop"))
            Stayontop1->Checked=true;
        else
            Stayontop1->Checked=false;
    }
    if (reg->ValueExists("FullScreen"))
    {
        if (reg->ReadInteger("FullScreen"))
        {
            Fullscreenview1->Checked=true;
            Normal1xview1->Checked=false;
            Large2xview1->Checked=false;
            Enterdebugger1->Enabled=false;
            Showpercentageofactualspeed1->Enabled=false;
            Stayontop1->Enabled=false;
        }
        else
            Fullscreenview1->Checked=false;
    }
    reg->CloseKey();
    delete reg;

//    emuThread=new EmuThread(false);

    Make();

//    EnableSound();
}
//---------------------------------------------------------------------------
extern int needPaint;
extern HWND hWnd;
void __fastcall TEmuWnd::OnIdle(TObject *,bool& done)
{
/*    if (needPaint)
    {
        HDC dc=GetDC(hWnd);
        BitBlt(dc,0,0,EmuWnd->gba->Width,EmuWnd->gba->Height,
            EmuWnd->gba->Picture->Bitmap->Canvas->Handle,0,0,SRCAND);
        BitBlt(dc,0,0,EmuWnd->gb->Width,EmuWnd->gb->Height,
            EmuWnd->gb->Picture->Bitmap->Canvas->Handle,0,0,SRCPAINT);
        ReleaseDC(hWnd,dc);
        needPaint=0;
    }*/
    done=false;
    if (!paused)
    {
        GBC_Run();
        static int oldPercent=0;
        int percent=GBC_GetPercentSpeed();
        if (showSpeed&&(oldPercent!=percent))
        {
            char str[64];
            sprintf(str,"%d%%",percent);
            Speed->Caption=str;
            oldPercent=percent;
        }
    }
    else
        done=true;
}


void __fastcall TEmuWnd::LCDPaint(TObject *Sender)
{
    GBC_PaintLCD();
}
//---------------------------------------------------------------------------


//extern int TransferFile(char *fn);
void __fastcall TEmuWnd::SendFile1Click(TObject *Sender)
{
//    PauseStart();
    TOpenDialog *dlog=new TOpenDialog(this);
    dlog->DefaultExt="gb";
    dlog->FileName="*.gb;*.gbc";
    dlog->FilterIndex=1;
    dlog->Options.Clear();
    dlog->Options << ofFileMustExist << ofPathMustExist << ofAllowMultiSelect;
    dlog->Filter="Gameboy ROMs (*.gb;*.gbc)|*.gb;*.gbc";
    char cwd[256];
    getcwd(cwd,256);
    dlog->InitialDir=cwd;
    if (dlog->Execute())
    {
        Screen->Cursor=crHourGlass;
        strcpy(currentROM,dlog->FileName.c_str());
        SendtoBungXChanger1->Enabled=true;
        GBC_LoadROM(dlog->FileName.c_str());
        batt->Visible=true;
        if (startInDebug)
            GBC_EnterDebug();
        Screen->Cursor=crDefault;
    }
    delete dlog;
//    PauseEnd();
}
//---------------------------------------------------------------------------

//extern void ResetEmu();
void __fastcall TEmuWnd::Reset1Click(TObject *Sender)
{
//    PauseStart();
    GBC_Reset();
    if (startInDebug)
        GBC_EnterDebug();
//    PauseEnd();
}
//---------------------------------------------------------------------------

void __fastcall TEmuWnd::FormDestroy(TObject *Sender)
{
//    DisableSound();
//    while (exitEmu)
//        Sleep(0);
//    CloseSkin();
    GBC_Close();
    TRegistry *reg=new TRegistry;
    reg->RootKey=HKEY_LOCAL_MACHINE;
    reg->OpenKey("\\Software\\gbc",true);
    reg->WriteInteger("LCDOnly",lcdOnly);
    reg->WriteInteger("StayOnTop",Stayontop1->Checked?1:0);
    reg->WriteInteger("FullScreen",Fullscreenview1->Checked?1:0);
    reg->CloseKey();
    delete reg;
}

⌨️ 快捷键说明

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