📄 emu.cpp
字号:
//---------------------------------------------------------------------------
#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 + -