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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dsmmusub.cpp

?? 一個(gè)任天堂掌上游戲機(jī)NDS的源代碼
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*************************************************************************** DSemu - The Next Generation                                             ** GBA memory management: Plugin implementation [gbammu.cpp]               ** Copyright Imran Nazar, 2005; released under the BSD public licence.     ***************************************************************************/#include <string>#include <fstream>#include "defs.h"#include "dsmmusub.h"#include "arm7tdmi.h"#include "plgcpu.h"#include "config.h"#include "log.h"#include "err.h"#include "font5x7.h"#include "byteswap.h"//---Static private class members------------------------------------------// Every plugin has an INFO structure attached, with info about the plugin.PLUGININFO dsMMUsub::pInfo={    PLUGIN_TYPE_MMU,    0x00010001,    "DS SubCPU memory manager",    "DSemu-ng"};u8  *dsMMUsub::EWRAM , *dsMMUsub::IWRAM , *dsMMUsub::BIOS , *dsMMUsub::ROM ;u16 *dsMMUsub::EWRAMh, *dsMMUsub::IWRAMh, *dsMMUsub::BIOSh, *dsMMUsub::ROMh;u32 *dsMMUsub::EWRAMw, *dsMMUsub::IWRAMw, *dsMMUsub::BIOSw, *dsMMUsub::ROMw;u8 *dsMMUsub::SWRAM; u16 *dsMMUsub::SWRAMh; u32 *dsMMUsub::SWRAMw;std::string dsMMUsub::pluginName;GUIPlugin *dsMMUsub::GUI=NULL;ARM7TDMI *dsMMUsub::CPU=NULL;int dsMMUsub::dmpwinID;u32 *dsMMUsub::dmpbuffer;u32 dsMMUsub::dmpaddr = 0x04000000;dsMMUsub::PAGE dsMMUsub::mmioPages[256];dsMMUsub::IOREG dsMMUsub::interruptIO[4];u32 dsMMUsub::ROMsize;u32 dsMMUsub::BIOSsize;std::string dsMMUsub::ROMfile;int dsMMUsub::waitSRAM, dsMMUsub::waitROM0;int dsMMUsub::waitROM1, dsMMUsub::waitROM2;int dsMMUsub::waitROM0s, dsMMUsub::waitROM1s, dsMMUsub::waitROM2s;u32 dsMMUsub::prevROMaddr;// Pointer to the DMA subhandlerdsMMUsub::DMA *dsMMUsub::dma=NULL;//---Implementation--------------------------------------------------------// Load a binaryvoid dsMMUsub::load(std::string fname){    ROMfile = std::string(fname);	    NDShead hd(fname);        std::ifstream input(fname.c_str(), std::ios::binary);    u8 *tmp = new u8[hd.head.arm7size];    if(!tmp) throw Exception(ERR_MMU_LOAD, pName,		             "Couldn't allocate temporary ROM space.");    input.seekg(hd.head.arm7src, std::ios::beg);    input.read((char*)tmp, hd.head.arm7size);    input.close();        ROMsize=nlpo2(hd.head.arm7size);    for(u32 i=0; i<hd.head.arm7size>>2; i++)	wrW(hd.head.arm7dest+(i<<2), ((u32*)tmp)[i]);        CPU->setPC(hd.head.arm7exec);    char str[256];    sprintf(str, "Loaded %d bytes to %08X, starting ARM7 execution at %08X.",            hd.head.arm7size, hd.head.arm7dest, hd.head.arm7exec);    Logger::log(pluginName) << str;}// Switch privilege levels (totally ignored in GBA's MMU)void dsMMUsub::priv(u8 level) { }void dsMMUsub::waitstates(u16 r){    switch(r&0x0003)    {	case 0: waitSRAM=4; break; case 1: waitSRAM=3; break;	case 2: waitSRAM=2; break; case 3: waitSRAM=8; break;    }    switch(r&0x000C)    {	case 0x0000: waitROM0=4; break; case 0x0004: waitROM0=3; break;	case 0x0008: waitROM0=2; break; case 0x000C: waitROM0=8; break;    }    waitROM0s=(r&0x0010)?1:2;    switch(r&0x0060)    {	case 0x0000: waitROM1=4; break; case 0x0020: waitROM1=3; break;	case 0x0040: waitROM1=2; break; case 0x0060: waitROM1=8; break;    }    waitROM1s=(r&0x0080)?1:4;    switch(r&0x0300)    {	case 0x0000: waitROM2=4; break; case 0x0100: waitROM2=3; break;	case 0x0200: waitROM2=2; break; case 0x0300: waitROM2=8; break;    }    waitROM2s=(r&0x0400)?1:8;    prevROMaddr=0;}// NOTE: The MMU works by splitting the address space into pages, each of// which may be assigned a set of access handlers. The default handlers// simply signal an unknown access; these are overwritten if a plugin// wants to do something interesting.// Register a range (set the pagetable entry)void dsMMUsub::rangeReg(u8 page, rdBptr _rdB, rdHptr _rdH, rdWptr _rdW,                               wrBptr _wrB, wrHptr _wrH, wrWptr _wrW){    if(!pagetable[page].set)    {        if(_rdB) pagetable[page].rdB=_rdB;        if(_rdH) pagetable[page].rdH=_rdH;        if(_rdW) pagetable[page].rdW=_rdW;        if(_wrB) pagetable[page].wrB=_wrB;        if(_wrH) pagetable[page].wrH=_wrH;        if(_wrW) pagetable[page].wrW=_wrW;	pagetable[page].set = 1;    }}// Wrappers for the pagetable entry for a given address// NOTE: Endianness is automatically adjusted between host and emulationu8 dsMMUsub::rdB(u32 addr) { return pagetable[PAGE_INDEX].rdB(addr); }u16 dsMMUsub::rdH(u32 addr){ return mtohs(pagetable[PAGE_INDEX].rdH(addr)); }u32 dsMMUsub::rdW(u32 addr){ return mtohl(pagetable[PAGE_INDEX].rdW(addr)); }void dsMMUsub::wrB(u32 addr, u8 data) { pagetable[PAGE_INDEX].wrB(addr, data); }void dsMMUsub::wrH(u32 addr, u16 data){ pagetable[PAGE_INDEX].wrH(addr, htoms(data)); }void dsMMUsub::wrW(u32 addr, u32 data){ pagetable[PAGE_INDEX].wrW(addr, htoml(data)); }// Region-specific I/O// NOTE: The BIOS and ROM are (of course) non-writableu8  dsMMUsub::rdB_EWRAM(u32 addr) { CPU->clockAdd(2); return EWRAM [(addr&0x003FFFFF)   ]; }u16 dsMMUsub::rdH_EWRAM(u32 addr) { CPU->clockAdd(2); return EWRAMh[(addr&0x003FFFFF)>>1]; }u32 dsMMUsub::rdW_EWRAM(u32 addr) { CPU->clockAdd(5); return EWRAMw[(addr&0x003FFFFF)>>2]; }u8  dsMMUsub::rdB_IWRAM(u32 addr) { return IWRAM [(addr&0x0000FFFF)   ]; }u16 dsMMUsub::rdH_IWRAM(u32 addr) { return IWRAMh[(addr&0x0000FFFF)>>1]; }u32 dsMMUsub::rdW_IWRAM(u32 addr) { return IWRAMw[(addr&0x0000FFFF)>>2]; }u8  dsMMUsub::rdB_SWRAM(u32 addr) { return SWRAM [(addr&0x0000FFFF)   ]; }u16 dsMMUsub::rdH_SWRAM(u32 addr) { return SWRAMh[(addr&0x0000FFFF)>>1]; }u32 dsMMUsub::rdW_SWRAM(u32 addr) { return SWRAMw[(addr&0x0000FFFF)>>2]; }u8  dsMMUsub::rdB_BIOS (u32 addr) { return BIOS  [(addr&BIOSsize  )   ]; }u16 dsMMUsub::rdH_BIOS (u32 addr) { return BIOSh [(addr&BIOSsize  )>>1]; }u32 dsMMUsub::rdW_BIOS (u32 addr) { return BIOSw [(addr&BIOSsize  )>>2]; }u8  dsMMUsub::rdB_ROM  (u32 addr){    switch(addr&0x0E000000)    {	case 0x08000000: CPU->clockAdd((addr==(prevROMaddr+1))?waitROM0s:waitROM0); break;	case 0x0A000000: CPU->clockAdd((addr==(prevROMaddr+1))?waitROM1s:waitROM1); break;	case 0x0C000000: CPU->clockAdd((addr==(prevROMaddr+1))?waitROM2s:waitROM2); break;    }    prevROMaddr=addr;    return ROM   [(addr&ROMsize   )   ];}u16 dsMMUsub::rdH_ROM  (u32 addr){    switch(addr&0x0E000000)    {	case 0x08000000: CPU->clockAdd((addr==(prevROMaddr+2))?waitROM0s:waitROM0); break;	case 0x0A000000: CPU->clockAdd((addr==(prevROMaddr+2))?waitROM1s:waitROM1); break;	case 0x0C000000: CPU->clockAdd((addr==(prevROMaddr+2))?waitROM2s:waitROM2); break;    }    prevROMaddr=addr;    return ROMh  [(addr&ROMsize   )>>1];}u32 dsMMUsub::rdW_ROM  (u32 addr){    switch(addr&0x0E000000)    {	case 0x08000000: CPU->clockAdd((addr==(prevROMaddr+4))?waitROM0s+3:waitROM0+3); break;	case 0x0A000000: CPU->clockAdd((addr==(prevROMaddr+4))?waitROM1s+3:waitROM1+3); break;	case 0x0C000000: CPU->clockAdd((addr==(prevROMaddr+4))?waitROM2s+3:waitROM2+3); break;    }    prevROMaddr=addr;    return ROMw  [(addr&ROMsize   )>>2];}void dsMMUsub::wrB_EWRAM(u32 a, u8  d) { CPU->clockAdd(2); EWRAM [(a&0x003FFFFF)   ]=d; }void dsMMUsub::wrH_EWRAM(u32 a, u16 d) { CPU->clockAdd(2); EWRAMh[(a&0x003FFFFF)>>1]=d; }void dsMMUsub::wrW_EWRAM(u32 a, u32 d) { CPU->clockAdd(5); EWRAMw[(a&0x003FFFFF)>>2]=d; }void dsMMUsub::wrB_IWRAM(u32 a, u8  d) { IWRAM [(a&0x0000FFFF)   ]=d; }void dsMMUsub::wrH_IWRAM(u32 a, u16 d) { IWRAMh[(a&0x0000FFFF)>>1]=d; }void dsMMUsub::wrW_IWRAM(u32 a, u32 d) { IWRAMw[(a&0x0000FFFF)>>2]=d; }void dsMMUsub::wrB_SWRAM(u32 a, u8  d) { SWRAM [(a&0x00007FFF)   ]=d; }void dsMMUsub::wrH_SWRAM(u32 a, u16 d) { SWRAMh[(a&0x00007FFF)>>1]=d; }void dsMMUsub::wrW_SWRAM(u32 a, u32 d) { SWRAMw[(a&0x00007FFF)>>2]=d; }void dsMMUsub::wrB_BIOS (u32 a, u8  d) { }void dsMMUsub::wrH_BIOS (u32 a, u16 d) { }void dsMMUsub::wrW_BIOS (u32 a, u32 d) { }void dsMMUsub::wrB_ROM  (u32 a, u8  d) { }void dsMMUsub::wrH_ROM  (u32 a, u16 d) { }void dsMMUsub::wrW_ROM  (u32 a, u32 d) { }// Default pagetable entries (signal that something bad happened)u8 dsMMUsub::rdB_BAD(u32 a){    char str[128];    sprintf(str, "Bad access: rdB %08X", a);//    Logger::log(pluginName) << str;    return 0;}u16 dsMMUsub::rdH_BAD(u32 a){    char str[128];    sprintf(str, "Bad access: rdH %08X", a);//    Logger::log(pluginName) << str;    return 0;}u32 dsMMUsub::rdW_BAD(u32 a){    char str[128];    sprintf(str, "Bad access: rdW %08X", a);//    Logger::log(pluginName) << str;    return 0;}void dsMMUsub::wrB_BAD(u32 a, u8 d){    char str[128];    sprintf(str, "Bad access: wrB %08X, %02X", a, d);    Logger::log(pluginName) << str;}void dsMMUsub::wrH_BAD(u32 a, u16 d){    char str[128];    sprintf(str, "Bad access: wrH %08X, %04X", a, d);    Logger::log(pluginName) << str;}void dsMMUsub::wrW_BAD(u32 a, u32 d){    char str[128];    sprintf(str, "Bad access: wrW %08X, %08X", a, d);    Logger::log(pluginName) << str;}// Memory-mapped I/O registration. This works similarly to main memory,// by paging the space. Of course, each page is much smaller.void dsMMUsub::mmioReg(u8 page, rdBptr _rdB, rdHptr _rdH, rdWptr _rdW,                              wrBptr _wrB, wrHptr _wrH, wrWptr _wrW){    if(!mmioPages[page].set)    {        if(_rdB) mmioPages[page].rdB=_rdB;        if(_rdH) mmioPages[page].rdH=_rdH;        if(_rdW) mmioPages[page].rdW=_rdW;        if(_wrB) mmioPages[page].wrB=_wrB;        if(_wrH) mmioPages[page].wrH=_wrH;        if(_wrW) mmioPages[page].wrW=_wrW;	mmioPages[page].set = 1;    }}// Wrapper functions that will be called to access MMIO; these index// the MMIO page table.// NOTE: No endian conversions are done here; they're performed by the// top-level rd?/wr? functions.u8 dsMMUsub::rdB_MMIO(u32 a) { return mmioPages[MMIO_PAGE_INDEX].rdB(a); }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美极品少妇xxxxⅹ高跟鞋| 欧美在线视频全部完| 91超碰这里只有精品国产| 亚洲色图一区二区| 色综合久久久久网| 亚洲一区免费观看| 91精品国产免费| 久久精品国产99| 国产嫩草影院久久久久| 99久久99久久精品免费观看| 中文字幕亚洲电影| 欧美在线一区二区| 久久99国产精品成人| 久久久久国产精品人| 99久久婷婷国产| 麻豆精品一区二区| 国产精品久久久久久久久免费樱桃| 色www精品视频在线观看| 夜夜精品视频一区二区| 日韩欧美123| 成人福利在线看| 久久99精品国产麻豆不卡| 国产精品亲子伦对白| 91麻豆精品国产91久久久资源速度| 国产成人午夜99999| 亚洲免费观看高清完整| 国产视频一区在线观看| 欧美性做爰猛烈叫床潮| 国产91精品免费| 日韩黄色片在线观看| 亚洲一区免费视频| 国产精品入口麻豆原神| 久久综合色婷婷| 欧美日韩你懂得| 欧美最猛黑人xxxxx猛交| 国产在线播放一区三区四| 日韩国产一二三区| 亚洲第一成年网| 午夜日韩在线电影| 亚洲一区免费在线观看| 亚洲亚洲精品在线观看| 亚洲综合在线五月| 亚洲欧美国产77777| 成人欧美一区二区三区在线播放| 国产视频一区二区在线| 久久综合九色欧美综合狠狠 | 日本视频中文字幕一区二区三区| 国产精品每日更新在线播放网址 | 91丨porny丨首页| 91视频在线看| 欧美性高清videossexo| 日韩午夜在线观看| 精品国产污网站| 久久久午夜精品理论片中文字幕| 欧美国产激情二区三区| 亚洲国产精品成人久久综合一区| 精品剧情在线观看| 久久精品亚洲一区二区三区浴池| 国产精品每日更新在线播放网址| 国产欧美一区二区三区鸳鸯浴 | 午夜精品久久久久久| 精品一区二区三区视频在线观看| 国产福利一区二区三区视频在线| 91片在线免费观看| 91精品国产综合久久精品麻豆| 久久久久99精品一区| 亚洲制服欧美中文字幕中文字幕| 免费成人深夜小野草| 成人高清视频在线| 精品国产91洋老外米糕| 亚洲女同一区二区| 国产一区二区三区国产| 国产亚洲精品bt天堂精选| 亚洲自拍偷拍欧美| 国产精品一区一区| 777午夜精品视频在线播放| 国产精品嫩草影院av蜜臀| 人人超碰91尤物精品国产| 成人av影院在线| 精品国产一区二区三区忘忧草| 国产精品免费av| 激情综合五月婷婷| 欧美剧在线免费观看网站| 亚洲男同性恋视频| 91香蕉国产在线观看软件| 中文字幕精品在线不卡| 奇米色一区二区三区四区| 欧美视频日韩视频在线观看| 亚洲人成在线观看一区二区| 中文字幕不卡在线| 国产精品资源在线看| 欧美精品一区男女天堂| 亚洲大片在线观看| 欧美伦理影视网| 日韩电影免费一区| 8v天堂国产在线一区二区| 偷拍一区二区三区| 欧美电影免费观看高清完整版在线| 日本aⅴ免费视频一区二区三区| 色视频一区二区| 亚洲高清免费在线| 欧美成人r级一区二区三区| 夜夜精品视频一区二区| 欧美国产成人精品| 色8久久人人97超碰香蕉987| 亚洲高清免费视频| 日韩久久久精品| 成人美女在线观看| 亚洲精品成人在线| 日韩一级大片在线| 国产成人在线观看免费网站| 自拍偷拍欧美精品| 欧美疯狂做受xxxx富婆| 久久99国产精品免费网站| 久久精品亚洲国产奇米99| 在线亚洲免费视频| 精品在线播放免费| 自拍偷拍国产精品| 精品少妇一区二区三区在线播放| 国产凹凸在线观看一区二区| 亚洲成在人线在线播放| 久久综合国产精品| 中文字幕第一区二区| 91精品国产欧美一区二区成人 | 国产麻豆精品theporn| 国产欧美日韩中文久久| 欧美日韩一区二区三区视频| 成人激情免费网站| 日日夜夜免费精品| 精品国产一区二区三区忘忧草 | 午夜激情综合网| 一区二区三区精密机械公司| 久久久久久久综合狠狠综合| 91久久香蕉国产日韩欧美9色| 国产电影精品久久禁18| 日韩精品五月天| 亚洲猫色日本管| 亚洲私人影院在线观看| 国产精品网站在线观看| 久久麻豆一区二区| 欧美精品一区二区三| 精品久久久久久久久久久久久久久 | 欧美性欧美巨大黑白大战| 一本色道久久加勒比精品| 91丨九色丨国产丨porny| 99riav一区二区三区| av爱爱亚洲一区| 色综合久久综合| 欧美日韩国产123区| 91传媒视频在线播放| 欧美放荡的少妇| 91国偷自产一区二区三区成为亚洲经典 | 蜜芽一区二区三区| 日本少妇一区二区| 国产伦理精品不卡| 成人午夜视频网站| 欧美性受极品xxxx喷水| 欧美日韩免费高清一区色橹橹 | 中文字幕中文乱码欧美一区二区 | 欧美日韩国产一级| 精品国产免费一区二区三区四区 | 91精品国产色综合久久ai换脸 | 蜜臀91精品一区二区三区| 激情六月婷婷综合| 色综合夜色一区| 日韩一级片在线播放| 中文字幕亚洲在| 日韩精品91亚洲二区在线观看| 国产·精品毛片| 欧美一级日韩免费不卡| 中文字幕精品一区| 麻豆视频观看网址久久| 成人国产在线观看| 精品99久久久久久| 日韩在线一二三区| 91成人在线精品| 中文字幕欧美国产| 极品销魂美女一区二区三区| 在线亚洲人成电影网站色www| 日韩一级黄色片| 日韩精品电影一区亚洲| 欧美最猛黑人xxxxx猛交| 成人欧美一区二区三区白人| 老司机精品视频线观看86| 91久久线看在观草草青青| 国产精品入口麻豆原神| 国产黄色精品视频| 精品久久久久99| 黄页视频在线91| xvideos.蜜桃一区二区| 久久99精品久久只有精品| 欧美一级电影网站| 日韩精品乱码免费| 日韩一区二区影院| 日韩二区三区在线观看| 日韩一区二区三区视频| 日本特黄久久久高潮| 亚洲精品在线免费播放| 国产尤物一区二区在线| 国产视频一区二区在线|