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

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

?? arm7tdmi.cpp

?? 一個任天堂掌上游戲機NDS的源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/**************************************************************************
* DSemu - The Next Generation                                             *
* Portable ARM7TDMI core: Plugin implementation [arm7tdmi.cpp]            *
* Copyright Imran Nazar, 2005; released under the BSD public licence.     *
**************************************************************************/

#include <string>
#include <utility>
#include "arm7tdmi.h"
#include "armdasm.h"
#include "plgmmu32.h"
#include "plggui.h"
#include "datadefs.h"
#include "log.h"
#include "err.h"
#include "font5x7.h"

#ifdef ARM7TDMI_X86
# include "x86emit.h"
#endif

//---Static private class members------------------------------------------
// Every plugin has an INFO structure attached, with info about the plugin.

PLUGININFO ARM7TDMI::pInfo={
    PLUGIN_TYPE_CPU,
    0x00010001,
#ifdef ARM7TDMI_X86
    "Dynamic binary translator: ARM7TDMI to x86",
#else
    "Portable ARM7TDMI core",
#endif
    "DSemu-ng"
};

ARM7TDMI::REGS ARM7TDMI::reg;
std::map<u32, int> ARM7TDMI::bkpts;
std::map<u32, CODEBLOCK> ARM7TDMI::blocks;

std::string ARM7TDMI::pluginName;
FILE *ARM7TDMI::dumpfile;
MMU32Plugin *ARM7TDMI::MMU=NULL;
GUIPlugin *ARM7TDMI::GUI=NULL;
u32 *ARM7TDMI::dbgbuffer = NULL;
int ARM7TDMI::dbgwinID = 0;
ARMDasm ARM7TDMI::dasm(rdWhelper);

const char *ARM7TDMI::modeStrings[7] = {
    "USR", "FIQ", "IRQ", "SVC", "ABT", "UND", "SYS"
};

const int ARM7TDMI::modeToCpsrLUT[7] = {
    CPSR_MUSR, CPSR_MFIQ, CPSR_MIRQ, CPSR_MSVC,
    CPSR_MABT, CPSR_MUND, CPSR_MSYS
};

const int ARM7TDMI::modeFromCpsrLUT[16] = {
    MODE_USR, MODE_FIQ, MODE_IRQ, MODE_SVC,
    -1,       -1,       -1,       MODE_ABT,
    -1,       -1,       -1,       MODE_UND,
    -1,       -1,       -1,       MODE_SYS,
};

//---Implementation--------------------------------------------------------
// The ARM7TDMI_DEBUG define masks the raw register dumper; when enabled,
// this will write all 16 registers and the CPSR to a file, in binary,
// every opcode. By default, this is off, because it's godawful slow.

// Initialise plugin
// Parameters: name  - FQPN of plugin as listed in INI file
//             req   - Pointer to PluginRequest API function
//             unreq - Pointer to PluginUnrequest API function
ARM7TDMI::ARM7TDMI(std::string name, REQPTR req, UNREQPTR unreq)
{
    pName = std::string(name);
    pClass = pName.substr(0, pName.find(".")+1);
    pRequest = req;
    pUnrequest = unreq;

    pluginName = pName;

    dbgbuffer = new u32[456*128];

    if(!MMU) MMU = (MMU32Plugin*) pRequest(pClass+"mmu");
    if(!GUI) GUI = (GUIPlugin*) pRequest("UI");

    dbgwinID = GUI->subwinCreate(456, 128, "ARM7 debugger", dbgbuffer);
    
#ifdef ARM7TDMI_DEBUG
    dumpfile = fopen("dsemu-trace.bin","wb");
#endif
    
    MMU->setCPU(this);

    // Simple check: Is this a 32-bit MMU? Our CPU's 32-bit after all
    if((MMU->getCaps() & PLGMMU_CAPS_SIZEMASK) != PLGMMU_CAPS_32B)
    {
        pUnrequest(pClass+"mmu", 1); MMU = NULL;
        throw Exception(ERR_CPU_INIT, pName,
                        pClass+"mmu isn't 32-bit.");
    }

    Logger::log(pName) << "Initialised.";
}

// Plugin cleanup
ARM7TDMI::~ARM7TDMI()
{
    if(dbgbuffer) { delete dbgbuffer; dbgbuffer = NULL; }
    pUnrequest("UI",0); GUI = NULL;

    pUnrequest(pClass+"mmu", 1); MMU = NULL;

#ifdef ARM7TDMI_DEBUG
    fclose(dumpfile);
#endif

    Logger::log(pName) << "Shutdown after " << reg.clkcount << " cycles.";
}

// Reset CPU state
void ARM7TDMI::reset()
{
    memset(&reg, 0, sizeof(REGS));
    reg.curmode = MODE_SYS;
    reg.cpsr = CPSR_MSYS;
	
    MMU->reset();

    memset(dbgbuffer, 0, 456*128*4);
    status(3,0);

#ifdef ARM7TDMI_DEBUG
    reg.r[15]+=4; fwrite(reg.r, 4, 17, dumpfile); reg.r[15]-=4;
#endif

    Logger::log(pName) << "Reset.";
}

// Write to the debugger's framebuffer
void ARM7TDMI::status(int mode=3, int opt2=0)
{
    char str[512]; int a; int xdim=456, ydim=128;
    u32 r15=reg.r[15],r15orig=r15; static u32 r15old;
    static u32 dbgoldr[16],rchanged[16];
    static int dbgoldf[6],fchanged[6];
    u32 op=0; u32 col; u16 oph=0;

    int offset=0;

    if(dbgbuffer)
    {
        Font5x7 prn(dbgbuffer, xdim, ydim);

	cpsrUpdate();

    if((mode==3 && reg.flags[FLAG_T]) || (mode==2))
	r15-=(16-offset*2);
    else
	r15-=(32-offset*4);

    for(a=0;a<16;a++)
    {
        if(r15==r15orig) col=0x00FF8080; else col=0x00FFFFFF;
	if(bkpts.find(r15) != bkpts.end()) col=0x0000FFFF;
        if((r15&0x0F000000)==(r15orig&0x0F000000)) op=MMU->rdW(r15);
        switch(mode)
        {
            case 1:
                if((r15&0x0F000000)==(r15orig&0x0F000000))
                    sprintf(str,"%08X: %08X | %s",r15,op,dasm.disasm(op,r15).c_str());
                else sprintf(str,"%08X",r15);
                r15+=4;
		break;
            case 2:
                if((r15&0x0F000000)==(r15orig&0x0F000000))
                {
                    if(r15&2) oph=op>>16; else oph=op&65535;
                    sprintf(str,"%08X: %04X | %s",r15,oph,dasm.tdisasm((u32)oph,r15).c_str());
                }
                else sprintf(str,"%08X",r15);
                r15+=2; break;
            case 3:
                switch(reg.flags[FLAG_T])
                {
                    case 0:
                        if((r15&0x0F000000)==(r15orig&0x0F000000))
                            sprintf(str,"%08X: %08X | %s",r15,op,dasm.disasm(op,r15).c_str());
                        else sprintf(str,"%08X",r15);
                        r15+=4; break;
                    case 1:
                        if((r15&0x0F000000)==(r15orig&0x0F000000))
                        {
                            if(r15&2) oph=op>>16; else oph=op&65535;
                            sprintf(str,"%08X: %04X | %s",r15,oph,dasm.tdisasm(oph,r15).c_str());
                        }
                        else sprintf(str,"%08X",r15);
                        r15+=2; break;
                }
        }
        prn.print(str,0,a*8,col);
    }

    for(a=0;a<=15;a++)
    {
        sprintf(str,"r%02d: %08X",a,reg.r[a]);
        if(r15old!=r15orig)
        {
            if(reg.r[a]!=dbgoldr[a]) { dbgoldr[a]=reg.r[a]; rchanged[a]=1; }
            else rchanged[a]=0;
        }
        if(rchanged[a]) prn.print(str,56*6,a*8,0x000000FF);
	else prn.print(str,56*6,a*8,0x00FFFFFF);
    }
    
    sprintf(str,"%s",modeStrings[reg.curmode]);
    prn.print(str, 72*6, 56 ,0x00FFFFFF);

    a=(reg.cpsr&CPSR_N)>>31; sprintf(str,"N: %d",a);
    if(r15old!=r15orig)
        if(a!=dbgoldf[0]) { dbgoldf[0]=a; fchanged[0]=1; } else fchanged[0]=0;
    if(fchanged[0]) prn.print(str,72*6,0,0x000000FF);
    else prn.print(str,72*6,0,0x00FFFFFF);

    a=(reg.cpsr&CPSR_Z)>>30; sprintf(str,"Z: %d",a);
    if(r15old!=r15orig)
        if(a!=dbgoldf[1]) { dbgoldf[1]=a; fchanged[1]=1; } else fchanged[1]=0;
    if(fchanged[1]) prn.print(str,72*6,8,0x000000FF);
    else prn.print(str,72*6,8,0x00FFFFFF);

    a=(reg.cpsr&CPSR_C)>>29; sprintf(str,"C: %d",a);
    if(r15old!=r15orig)
        if(a!=dbgoldf[2]) { dbgoldf[2]=a; fchanged[2]=1; } else fchanged[2]=0;
    if(fchanged[2]) prn.print(str,72*6,16,0x000000FF);
    else prn.print(str,72*6,16,0x00FFFFFF);

    a=(reg.cpsr&CPSR_V)>>28; sprintf(str,"V: %d",a);
    if(r15old!=r15orig)
        if(a!=dbgoldf[3]) { dbgoldf[3]=a; fchanged[3]=1; } else fchanged[3]=0;
    if(fchanged[3]) prn.print(str,72*6,24,0x000000FF);
    else prn.print(str,72*6,24,0x00FFFFFF);

    a=(reg.cpsr&CPSR_T)>>5;  sprintf(str,"T: %d",a);
    if(r15old!=r15orig)
        if(a!=dbgoldf[5]) { dbgoldf[5]=a; fchanged[5]=1; } else fchanged[5]=0;
    if(fchanged[5]) prn.print(str,72*6,40,0x000000FF);
    else prn.print(str,72*6,40,0x00FFFFFF);

    if(r15old!=r15orig) r15old=r15orig;

    }

    GUI->subwinRefresh(dbgwinID);
}

// Function the disassembler will use to read memory
u32 ARM7TDMI::rdWhelper(u32 addr) { return MMU->rdW(addr); }

// Save registers, and switch processor modes
void ARM7TDMI::modeSwitch(int in, int out)
{
    //---Save state
    reg.r0 = reg.r[0]; reg.r1 = reg.r[1];
    reg.r2 = reg.r[2]; reg.r3 = reg.r[3];
    reg.r4 = reg.r[4]; reg.r5 = reg.r[5];
    reg.r6 = reg.r[6]; reg.r7 = reg.r[7];

    if(in == MODE_FIQ)
    {
	reg.r8fiq = reg.r[8];   reg.r9fiq = reg.r[9];
	reg.r10fiq = reg.r[10]; reg.r11fiq = reg.r[11];
	reg.r12fiq = reg.r[12];
    } else {
	reg.r8 = reg.r[8];   reg.r9 = reg.r[9];
	reg.r10 = reg.r[10]; reg.r11 = reg.r[11];
	reg.r12 = reg.r[12];
    }
    switch(in)
    {
	case MODE_USR:
	case MODE_SYS: reg.r13 = reg.r[13]; reg.r14 = reg.r[14]; break;
	case MODE_IRQ: reg.r13irq = reg.r[13]; reg.r14irq = reg.r[14]; break;
	case MODE_FIQ: reg.r13fiq = reg.r[13]; reg.r14fiq = reg.r[14]; break;
	case MODE_SVC: reg.r13svc = reg.r[13]; reg.r14svc = reg.r[14]; break;
	case MODE_ABT: reg.r13abt = reg.r[13]; reg.r14abt = reg.r[14]; break;
	case MODE_UND: reg.r13und = reg.r[13]; reg.r14und = reg.r[14]; break;
    }
    reg.r15 = reg.r[15];
    
    //---Switch to new mode
    if(out == MODE_FIQ)
    {
	reg.r[8] = reg.r8fiq;   reg.r[9] = reg.r9fiq;
	reg.r[10] = reg.r10fiq; reg.r[11] = reg.r11fiq;
	reg.r[12] = reg.r12fiq;
    } else {
	reg.r[8] = reg.r8;   reg.r[9] = reg.r9;
	reg.r[10] = reg.r10; reg.r[11] = reg.r11;
	reg.r[12] = reg.r12;
    }
    switch(out)
    {
	case MODE_USR:
	case MODE_SYS: reg.r[13] = reg.r13; reg.r[14] = reg.r14; break;
	case MODE_IRQ: reg.r[13] = reg.r13irq; reg.r[14] = reg.r14irq; break;
	case MODE_FIQ: reg.r[13] = reg.r13fiq; reg.r[14] = reg.r14fiq; break;
	case MODE_SVC: reg.r[13] = reg.r13svc; reg.r[14] = reg.r14svc; break;
	case MODE_ABT: reg.r[13] = reg.r13abt; reg.r[14] = reg.r14abt; break;
	case MODE_UND: reg.r[13] = reg.r13und; reg.r[14] = reg.r14und; break;
    }
    
    reg.curmode = out;
    cpsrUpdate();
}

// Update the CPSR based on the flags[] array
void ARM7TDMI::cpsrUpdate()
{
    if(reg.flags[FLAG_N]) reg.cpsr|=CPSR_N; else reg.cpsr&=(~CPSR_N);
    if(reg.flags[FLAG_Z]) reg.cpsr|=CPSR_Z; else reg.cpsr&=(~CPSR_Z);
    if(reg.flags[FLAG_C]) reg.cpsr|=CPSR_C; else reg.cpsr&=(~CPSR_C);
    if(reg.flags[FLAG_V]) reg.cpsr|=CPSR_V; else reg.cpsr&=(~CPSR_V);
    if(reg.flags[FLAG_T]) reg.cpsr|=CPSR_T; else reg.cpsr&=(~CPSR_T);
    reg.cpsr &= ~CPSR_M;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品中文字幕一区二区小辣椒| 色综合色狠狠综合色| 成人综合婷婷国产精品久久| 99久免费精品视频在线观看 | 7777精品伊人久久久大香线蕉经典版下载 | 欧美天堂亚洲电影院在线播放| 欧美一区二区三区成人| 国产精品毛片无遮挡高清| 日本在线不卡视频| 91碰在线视频| 国产午夜精品一区二区三区视频| 日韩精品电影一区亚洲| 99久精品国产| 国产精品天美传媒| 韩国成人精品a∨在线观看| 欧美日韩日本视频| 亚洲日本在线视频观看| 国产在线精品一区二区| 91精品中文字幕一区二区三区| 亚洲欧美在线aaa| 韩国一区二区三区| 欧美成人r级一区二区三区| 午夜a成v人精品| 91高清在线观看| 国产精品白丝在线| 成人av网站在线观看| 国产亚洲精品久| 国产成人在线免费观看| 国产亚洲一区二区三区四区| 久久国产日韩欧美精品| 91精品婷婷国产综合久久性色| 亚洲图片欧美视频| 欧美无砖专区一中文字| 亚洲在线视频网站| 91精品福利视频| 一区二区三区四区在线播放| 91色综合久久久久婷婷| 亚洲激情av在线| 日本丶国产丶欧美色综合| 亚洲精品伦理在线| 欧美午夜不卡在线观看免费| 五月综合激情网| 欧美疯狂做受xxxx富婆| 人人精品人人爱| 日韩一区二区三区观看| 精品一区二区成人精品| 精品粉嫩超白一线天av| 成人免费高清在线观看| 亚洲视频 欧洲视频| 色久综合一二码| 亚洲国产精品久久不卡毛片| 日韩美女视频一区二区在线观看| 伦理电影国产精品| 国产日韩亚洲欧美综合| 97久久超碰国产精品电影| 亚洲午夜精品在线| 日韩欧美色电影| 成人av先锋影音| 亚洲一卡二卡三卡四卡无卡久久| 欧美一区二区二区| 国产成人自拍网| 夜夜精品视频一区二区| 欧美日韩国产精品自在自线| 麻豆成人久久精品二区三区红| 久久综合网色—综合色88| 播五月开心婷婷综合| 亚洲va国产va欧美va观看| 欧美成人伊人久久综合网| 粉嫩高潮美女一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 欧美日韩精品电影| 国产成人免费视| 亚洲成人高清在线| 国产欧美久久久精品影院| 一本大道久久精品懂色aⅴ| 免费在线一区观看| 综合久久久久综合| 日韩一区二区影院| 99精品欧美一区二区三区小说| 三级亚洲高清视频| 中文字幕一区三区| 欧美成人艳星乳罩| 在线这里只有精品| 国产精品一二三四区| 亚洲亚洲精品在线观看| 国产三级三级三级精品8ⅰ区| 91黄色激情网站| 国产成人在线看| 日韩电影在线免费观看| 亚洲日本在线视频观看| 欧美精品一区二区高清在线观看| 日本韩国一区二区| 懂色av噜噜一区二区三区av| 三级在线观看一区二区| 夜色激情一区二区| 国产欧美综合在线| 精品伦理精品一区| 欧美日韩成人激情| 色婷婷av一区二区| 91影视在线播放| 成人小视频免费观看| 久久99国产精品麻豆| 亚洲成人在线免费| 亚洲免费在线视频| 国产精品久久久久精k8 | 中文字幕一区二区三区av| 日韩手机在线导航| 欧美日韩成人综合在线一区二区| 99久久精品国产精品久久| 国产成人日日夜夜| 国产成人精品免费视频网站| 美女看a上一区| 久久国产欧美日韩精品| 日产精品久久久久久久性色| 亚洲福利电影网| 亚洲成av人片www| 亚洲最大成人综合| 一区二区三区在线视频观看58| 亚洲欧美在线观看| 一区二区三区日本| 有坂深雪av一区二区精品| 亚洲乱码日产精品bd| 亚洲综合网站在线观看| 亚洲精品国久久99热| 亚洲人成网站在线| 一区二区三区美女视频| 亚洲图片欧美色图| 日本不卡123| 黑人巨大精品欧美一区| 国产成人在线视频网站| 从欧美一区二区三区| 99久久综合国产精品| 色综合久久久久久久久| 91福利在线观看| 欧美一区二区三级| 久久久夜色精品亚洲| 国产婷婷色一区二区三区| 国产精品国产三级国产| 亚洲欧洲综合另类在线| 亚洲午夜久久久久久久久电影院| 日韩av电影免费观看高清完整版| 精品一区二区三区香蕉蜜桃| 春色校园综合激情亚洲| 色婷婷亚洲一区二区三区| 欧美日韩国产中文| 精品久久久久av影院| 久久亚洲欧美国产精品乐播| 中文字幕一区二区三区在线不卡 | 麻豆精品国产91久久久久久| 国产精品自拍三区| 在线精品视频一区二区| 日韩一区二区三区av| 国产精品伦一区二区三级视频| 亚洲精品伦理在线| 精品在线免费视频| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美精三区欧美精三区| 欧美激情综合在线| 日本aⅴ精品一区二区三区| 成人免费高清在线观看| 欧美丰满少妇xxxbbb| 国产精品久久久久久久蜜臀| 天天免费综合色| 成人av网站在线观看免费| 欧美一级日韩一级| 亚洲老司机在线| 国产又黄又大久久| 欧美高清视频一二三区| 中文字幕一区日韩精品欧美| 麻豆一区二区在线| 色婷婷综合激情| 国产精品网站在线播放| 美女网站色91| 欧美日韩视频不卡| 亚洲日本在线看| 福利一区在线观看| 日韩美女天天操| 日韩极品在线观看| 91成人在线精品| 国产精品视频一二三区| 久久精品国产99| 91.成人天堂一区| 亚洲永久精品大片| 97精品超碰一区二区三区| 久久亚洲捆绑美女| 精品一区二区三区日韩| 69堂亚洲精品首页| 亚洲成人在线免费| 欧洲精品一区二区| 亚洲三级在线观看| av电影在线不卡| 国产精品美女久久福利网站| 国产一区二区影院| 久久这里只有精品首页| 久久机这里只有精品| 日韩一区国产二区欧美三区| 日本成人在线电影网| 5月丁香婷婷综合| 日韩精品电影在线观看| 欧美一区二区三区四区在线观看|