亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gbcemu.cpp

?? 一個gba的模擬器源代碼
?? CPP
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <registry.hpp>
#include <stdio.h>
#include "rom.h"
#include "debug.h"
#include "gbcemu.h"
#include "gotodialog.h"
#include "search.h"
#include "pal.h"
#include "value.h"
#include "dbgwarn.h"
#include "tileview.h"
#include "sound.h"
#include "dbgwarn.h"
#include "debug.h"
#include "z80.h"
#include "reg.h"
#include "MapView.h"
//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be perfomring new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------
USEFORM("Debug.cpp", DebugWnd);
USEFORM("Gotodialog.cpp", GoToDlg);
USEFORM("Search.cpp", SearchDlg);
USEUNIT("rom.cpp");
USEUNIT("Sound.cpp");
USEFORM("Pal.cpp", PalView);
USEFORM("About.cpp", AboutDlg);
USEFORM("Value.cpp", NewValueDlg);
USEFORM("DbgWarn.cpp", DebugWarnDlg);
USEFORM("TileView.cpp", TileWnd);
USEASM("AsmZ80.asm");
USEFORM("reg.cpp", RegCode);
USEFORM("MapView.cpp", MapWnd);
USELIB("..\..\CBuilder3\Lib\dxguid.lib");
//---------------------------------------------------------------------------
Graphics::TBitmap *bmp;
unsigned long perfFreq;
volatile bool showDebugWnd=false;
extern int debug,run,debugStartPC;
int percentChange=0;
int percent=0;
int enableDebugWarnings=0;
int lcdXOfs,lcdYOfs;
int emuMode=EMUMODE_ACCURACY;
int init=0;
int instrCount=0;

//extern Z80_Regs R;

HWND hWnd;
TCanvas *LCDCanvas;

char* debugErrorText[]=
    {"","","Two consecutive HALT instructions have caused the CPU to hang"};

char* debugWarnText[]=
    {"An attempt was made to access a disabled RAM bank",
     "An attempt was made to access an invalid memory location",
     "Non-high memory was accessed during a DMA operation",
     "DMA was enabled from code outside of the high memory area",
     "Video/OAM memory was accessed during an LCD refresh",
     "An instruction was executed that may trigger the OAM memory bug",
     "The HALT instruction was executed with interrupts disabled and is not followed by a NOP",
     "The STOP instruction was executed without the CPU speed switch set",
     "An attempt was made to switch to a RAM/ROM page that is out of range",
     "The stack is set to ROM area; what were you thinking, you moron?!",
     "GDMA was enabled outside of VBlank"};

//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
    return 1;
}
//---------------------------------------------------------------------------

int _export __cdecl GBC_Init(HWND _hWnd)
{
    hWnd=_hWnd;
    bmp=new Graphics::TBitmap;
    bmp->Width=320;
    bmp->Height=288;
    bmp->PixelFormat=pf15bit;
    for (int i=0;i<288;i++)
        ScreenLine[i]=(char *)bmp->ScanLine[i];
    GenFilter();
    int color=Filter[0x7fff];
    color=((color>>10)<<19)|(((color>>5)&31)<<11)|((color&31)<<3)+0x70707;
    bmp->Canvas->Brush->Color=(TColor)color;
    bmp->Canvas->Pen->Color=(TColor)color;
    bmp->Canvas->Rectangle(0,0,160*scaleFact,144*scaleFact);
    LARGE_INTEGER li;
    QueryPerformanceFrequency(&li);
    perfFreq=li.u.LowPart/32;
    LCDCanvas=new TCanvas;
    LCDCanvas->Handle=GetDC(hWnd);
    for (int i=0;i<DBW_COUNT;i++)
        debugWarn[i]=0;
    DebugWnd=new TDebugWnd(NULL);
    GoToDlg=new TGoToDlg(NULL);
    SearchDlg=new TSearchDlg(NULL);
    NewValueDlg=new TNewValueDlg(NULL);
    PalView=new TPalView(NULL);
    DebugWarnDlg=new TDebugWarnDlg(NULL);
    TileWnd=new TTileWnd(NULL);
    MapWnd=new TMapWnd(NULL);
    EnableSound(hWnd);
    instrCount=0;
    init=1;
    return 1;
}

void _export __cdecl GBC_SetWindow(HWND _hWnd)
{
    if (init==0) return;
    hWnd=_hWnd;
    LCDCanvas->Handle=GetDC(hWnd);
}

void _export __cdecl GBC_Close()
{
    if (init==0) return;
    DisableSound();
    ReleaseDC(hWnd,LCDCanvas->Handle);
    delete LCDCanvas;
    CloseEmu();
    delete bmp;
}

void _export __cdecl GBC_LoadROM(char *filename)
{
    if (init==0) return;
    CloseEmu();
    InitEmu(filename);
    Reset();
}

void _export __cdecl GBC_CloseROM()
{
    if (init==0) return;
    CloseEmu();
    int color=Filter[0x7fff];
    color=((color>>10)<<19)|(((color>>5)&31)<<11)|((color&31)<<3)+0x70707;
    bmp->Canvas->Brush->Color=(TColor)color;
    bmp->Canvas->Pen->Color=(TColor)color;
    bmp->Canvas->Rectangle(0,0,160*scaleFact,144*scaleFact);
    LCDCanvas->Draw(lcdXOfs,lcdYOfs,bmp);
}

void _export __cdecl GBC_Run()
{
    if (init==0) return;
    if (!romLoaded)
    {
        Sleep(50);
        return;
    }
    if (showDebugWnd)
    {
        DebugWnd->Show();
        DebugWnd->Update();
        showDebugWnd=false;
        return;
    }
    if ((!debug)||(run))
    {
        int i;
        for (i=0;i<=1;i++)
        {
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
            Execute();
        }
        if ((!soundEnable)&&(restrictSpeed))
        {
            static int lastTime=0;
            LARGE_INTEGER li;
            if (!lastTime)
            {
                QueryPerformanceCounter(&li);
                lastTime=li.u.LowPart;
            }
            QueryPerformanceCounter(&li);
            int curTime=li.u.LowPart;
            int time=curTime-lastTime;
            if (time<perfFreq)
            {
                while (time<perfFreq)
                {
                    Sleep(10);
                    QueryPerformanceCounter(&li);
                    curTime=li.u.LowPart;
                    time=curTime-lastTime;
                }
                lastTime+=perfFreq;
            }
            else
                lastTime=curTime;
        }
        if (run)
        {
            static int ticks=0; ticks+=133;
            static int lastTime=GetTickCount();
            int curTime=GetTickCount();
            if ((curTime-lastTime)>=1000)
            {
                percentChange++;
                percent=(ticks*100)/(4194*(curTime-lastTime)/1000);
                lastTime=curTime;
                ticks=0;
            }
        }
    }
    else
        Sleep(10);
    if (debugWarnMsg!=-1)
    {
        if (debugWarnMsg>=0)
        {
            MessageBox(DebugWnd->Handle,debugWarnText[
                debugWarnMsg],"Debug Warning",
                MB_OK|MB_ICONWARNING);
        }
        else
        {
            MessageBox(DebugWnd->Handle,debugErrorText[
                -debugWarnMsg],"Error",MB_OK|MB_ICONSTOP);
        }
        debugWarnMsg=-1;
    }
}

void _export __cdecl GBC_PaintLCD()
{
    if (init==0) return;
    LCDCanvas->Draw(lcdXOfs,lcdYOfs,bmp);
}

void _export __cdecl GBC_Reset()
{
    if (init==0) return;
    Reset();
}

void _export __cdecl GBC_SetLCDUpdateFreq(int freq)
{
    if (init==0) return;
    lcdUpdateFreq=freq;
}

void _export __cdecl GBC_SetSoundQuality(int quality)
{
    if (init==0) return;
    sndQuality=quality;
}

void _export __cdecl GBC_EnableSound()
{
    if (init==0) return;
    EnableSound(hWnd);
}

void _export __cdecl GBC_DisableSound()
{
    if (init==0) return;
    DisableSound();
}

void _export __cdecl GBC_KeyDown(int key)
{
    if (init==0) return;
    keys&=~key;
    intReq|=INT_KEY;
}

void _export __cdecl GBC_KeyUp(int key)
{
    if (init==0) return;
    keys|=key;
    intReq|=INT_KEY;
}

void _export __cdecl GBC_SetSpeedRestrict(int restrict)
{
    if (init==0) return;
    restrictSpeed=restrict;
}

int _export __cdecl GBC_GetPercentSpeed()
{
    if (init==0) return 0;
    return percent;
}

void _export __cdecl GBC_EnterDebug()
{
    if (init==0) return;
    debug=1; run=0;
    debugStartPC=regPC;
    DebugWnd->Show();
    DebugWnd->Update();
}

int _export __cdecl GBC_DebugWarnDlg()
{
    if (init==0) return enableDebugWarnings;
    int oldRun=run;
    run=0;
    if (DebugWarnDlg->ShowModal()==2)
    {
        int enable=0;
        for (int i=0;i<DebugWarnDlg->List->Items->Count;i++)
        {
            debugWarn[i]=DebugWarnDlg->List->Checked[i];
            if (debugWarn[i]) enable=1;
        }
        enableDebugWarnings=enable;
    }
    run=oldRun;
    return enableDebugWarnings;
}

void _export __cdecl GBC_LCDScaleFact(int fact)
{
    if (init==0) return;
    scaleFact=fact;
    bmp->Width=160*scaleFact;
    bmp->Height=144*scaleFact;
    bmp->PixelFormat=pf15bit;
    for (int i=0;i<(144*scaleFact);i++)
        ScreenLine[i]=(char *)bmp->ScanLine[i];
}

void _export __cdecl GBC_LCDPos(int x,int y)
{
    if (init==0) return;
    lcdXOfs=x;
    lcdYOfs=y;
}

void _export __cdecl GBC_SetMode(int mode)
{
    if (init==0) return;
    emuMode=mode;
    if (emuMode==EMUMODE_ACCURACY)
    {
        getmemfunc=getmem;
        putmemfunc=putmem;
    }
    else
    {
        getmemfunc=getmem_direct;
        putmemfunc=putmem_direct;
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清在线成人网| 激情五月激情综合网| 成人欧美一区二区三区在线播放| 国产精品福利一区二区| 日韩va亚洲va欧美va久久| 韩国三级电影一区二区| 久久久久久久久免费| 亚洲欧美另类小说| 麻豆成人91精品二区三区| 色婷婷激情综合| 久久久久久久综合狠狠综合| 丁香五精品蜜臀久久久久99网站| 国产精品不卡一区二区三区| 91麻豆成人久久精品二区三区| 久久精品夜色噜噜亚洲aⅴ| 无码av中文一区二区三区桃花岛| 成人性视频网站| 久久久久久久免费视频了| 成人h动漫精品一区二| 欧美r级电影在线观看| 亚洲福利一二三区| 色狠狠色狠狠综合| 亚洲日本va午夜在线影院| 成人短视频下载| 亚洲高清免费视频| 欧美激情综合五月色丁香小说| 久久激五月天综合精品| 欧美成人一区二区三区片免费| www.欧美日韩| 一区二区三区精品久久久| 成人涩涩免费视频| 午夜精品一区在线观看| 久久久久久9999| 欧美精品日韩精品| 婷婷国产在线综合| 中文字幕一区在线| 精品久久久久一区| 在线观看视频一区二区 | 国产成人av福利| 日韩女优电影在线观看| 成人免费观看视频| 午夜欧美视频在线观看| 国产精品亲子乱子伦xxxx裸| 99精品久久久久久| 亚洲欧美日韩在线播放| 亚洲精品一区二区三区在线观看| 精品一区二区三区久久| 国产日韩欧美精品在线| 成人午夜视频网站| 久久精品国产99久久6| 亚洲乱码日产精品bd | 欧美日韩精品久久久| 视频一区免费在线观看| 日韩亚洲欧美成人一区| 国产在线播精品第三| 国产精品久久久一区麻豆最新章节| 欧美一区二区播放| 国产高清精品网站| 久久精品国产一区二区三 | 69久久99精品久久久久婷婷| 精品一区二区三区影院在线午夜| 亚洲精品欧美激情| 中文字幕在线免费不卡| 国产精品久久久久久久第一福利 | 不卡在线观看av| 国产成人鲁色资源国产91色综 | 国产精品 日产精品 欧美精品| 奇米影视7777精品一区二区| 国产日本亚洲高清| 精品国产精品网麻豆系列| 欧美电影免费观看高清完整版在| 欧美精品自拍偷拍| 欧美日韩亚洲综合在线| 国产一区二区三区四区五区美女 | 国产精品亚洲第一| 亚洲国产精品黑人久久久| 国产亚洲制服色| 国产网站一区二区三区| 国产精品日产欧美久久久久| 中文字幕国产精品一区二区| 国产精品三级视频| 国产精品的网站| 亚洲免费观看在线观看| 亚洲综合无码一区二区| 久久久99久久精品欧美| 久久久久久97三级| 综合自拍亚洲综合图不卡区| 一区精品在线播放| 樱花草国产18久久久久| 同产精品九九九| 免费在线观看精品| 国产东北露脸精品视频| 成人av在线资源| 欧美性色综合网| 波多野洁衣一区| 91视视频在线观看入口直接观看www| 91亚洲国产成人精品一区二区三 | 91精品福利在线| 欧美图片一区二区三区| 欧美乱妇23p| 亚洲国产精品影院| 久久精工是国产品牌吗| 99久久久精品| 91精品久久久久久久99蜜桃| 久久蜜臀精品av| 亚洲欧美色综合| 全部av―极品视觉盛宴亚洲| 国产精品原创巨作av| 在线观看91视频| 精品国产露脸精彩对白| 亚洲欧美韩国综合色| 日本不卡视频在线观看| 成人激情图片网| 51久久夜色精品国产麻豆| 欧美激情中文不卡| 亚洲成人av一区| 亚洲一二三级电影| 国产美女精品在线| 欧美怡红院视频| 久久久久久久av麻豆果冻| 亚洲激情校园春色| 国产一区二区免费在线| 在线观看日韩高清av| 久久久精品日韩欧美| 亚洲高清三级视频| 粉嫩久久99精品久久久久久夜 | 久久99精品久久久久久动态图| 不卡电影免费在线播放一区| 91精品国产欧美一区二区18 | 91久久线看在观草草青青| 亚洲精品一区在线观看| 亚洲第四色夜色| 91亚洲国产成人精品一区二区三 | 国产女人aaa级久久久级| 奇米影视7777精品一区二区| 91年精品国产| 亚洲国产成人自拍| 国精产品一区一区三区mba桃花| 91久久人澡人人添人人爽欧美| 久久精品在线观看| 蜜桃精品视频在线| 欧美日韩一级片网站| 最新欧美精品一区二区三区| 国模一区二区三区白浆| 日韩一区二区三区在线观看| 亚洲精品国产品国语在线app| 丁香另类激情小说| 久久精品一二三| 狠狠色综合播放一区二区| 欧美一区二区三区小说| 亚洲国产精品影院| 在线日韩国产精品| 亚洲免费大片在线观看| 91性感美女视频| 国产精品免费丝袜| 国产v综合v亚洲欧| 欧美激情一区二区三区在线| 国产999精品久久久久久绿帽| 亚洲精品一区二区三区99| 麻豆极品一区二区三区| 日韩限制级电影在线观看| 日本麻豆一区二区三区视频| 欧美情侣在线播放| 日本网站在线观看一区二区三区| 欧美三级午夜理伦三级中视频| 亚洲一卡二卡三卡四卡无卡久久| 色88888久久久久久影院按摩| 亚洲美女区一区| 欧美日韩精品欧美日韩精品一 | 久久久久亚洲综合| 国产成人在线色| 国产精品乱人伦| 色婷婷综合在线| 亚洲与欧洲av电影| 91精品国产色综合久久| 麻豆精品在线播放| 国产午夜精品一区二区| 成人91在线观看| 亚洲在线视频一区| 欧美一区二区在线不卡| 国产一区啦啦啦在线观看| 久久久国产精品午夜一区ai换脸| 国产999精品久久| 亚洲欧美日本韩国| 制服丝袜在线91| 国产综合色视频| 中文字幕一区免费在线观看| 日本乱人伦aⅴ精品| 视频一区二区国产| 久久久九九九九| 日本道精品一区二区三区 | 国内精品在线播放| 亚洲私人影院在线观看| 欧美揉bbbbb揉bbbbb| 精品一区二区在线视频| 国产精品无人区| 欧美丰满高潮xxxx喷水动漫| 国产精品夜夜嗨| 一区二区三区.www| 精品美女被调教视频大全网站|