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

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

?? gbagpu.cpp

?? 一個任天堂掌上游戲機NDS的源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/*************************************************************************** DSemu - The Next Generation                                             ** GBA scanline GPU: Plugin Implementation [gbagpu.cpp]                    ** Copyright Imran Nazar, 2005; released under the BSD public licence.     ***************************************************************************/#include <string>#include "defs.h"#include "events.h"#include "gbagpu.h"#include "config.h"#include "font5x7.h"#include "log.h"#include "err.h"//---Static private class members------------------------------------------// Every plugin has an INFO structure attached, with info about the plugin.PLUGININFO gbaGPU::pInfo={    PLUGIN_TYPE_GPU,    0x00010001,    "GBA graphics processor",    "DSemu-ng"};u8  *gbaGPU::VRAMb, *gbaGPU::OAMb;u16 *gbaGPU::VRAMh, *gbaGPU::PALh, *gbaGPU::OAMh;u32 *gbaGPU::VRAMw, *gbaGPU::PALw, *gbaGPU::OAMw;gbaGPU::IOREG gbaGPU::reg[0x30];// IO access flags: 1=Readable, 2=Writableint gbaGPU::rflags[0x30]={    3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,    3,3,3,3,3,3,3,0,3,3,3,0,0,0,0,0,};#define REG(x) reg[REG_ ## x].datau32 gbaGPU::BGX[2], gbaGPU::BGY[2];u8 gbaGPU::mospy[4];int gbaGPU::curline;std::string gbaGPU::pluginName;GUIPlugin *gbaGPU::GUI;int gbaGPU::palwinID;u32 *gbaGPU::palbuffer;u8 *gbaGPU::dispbuffer;int gbaGPU::ForceBG[4];// Convert a GBA 15-bit colour to 32-bit#define COLSHIFT(out, in) \{ \    *((out)+0) = ((in)<<3)&255; \    *((out)+1) = ((in)>>2)&255; \    *((out)+2) = ((in)>>7)&255; \    *((out)+3) = 0; \}// Table of function pointers to mode-specific renderersgbaGPU::modefptr gbaGPU::lineM[8]={    lineM0, lineM1, lineM2, lineM3,    lineM4, lineM5, lineMNULL, lineMNULL};//---Implementation--------------------------------------------------------// ACK: gladius (tile and rotated BG, and sprite renderers)void gbaGPU::scanTile(u8 *buf, int bg){    u16 bgcnt, scrnBase, charBase, hofs, vofs, x, y, tileIdx, tileY;    u16 tmpTileIdx, width=0, height=0, a, bgx, bgy, tileChar; u8 b=0, palnum;    u8 mosx, mospx, mosy;    bgcnt=reg[REG_BG0CNT+bg].data;    switch((bgcnt>>14)&3)    {        case 0: width=256; height=256; break;        case 1: width=512; height=256; break;        case 2: width=256; height=512; break;        case 3: width=512; height=512; break;    }    scrnBase=((bgcnt>>8)&0x1F)*0x400;    charBase=((bgcnt>>2)&0x3)*0x4000;    hofs=reg[REG_BG0HOFS+bg*2].data;    vofs=reg[REG_BG0VOFS+bg*2].data;/*    vramptr=VRAM+(VRAMmap[(lcd)*128]<<13);    vram8ptr=VRAM8+(VRAMmap[(lcd)*128]<<14);*/    if(bgcnt&0x0040)    {        mosx=(REG(MOSAIC)&0x000F);        mosy=((REG(MOSAIC)&0x00F0)>>4);        mospx=mosx; if(!curline) mospy[bg]=mosy;        mospy[bg]++; if(mospy[bg]<=mosy) vofs-=mospy[bg];        else mospy[bg]=0;    } else { mospx=0; mosx=0; }    if(bgcnt&0x0080)    {        bgy=((curline+vofs)&(height-1))/8;        tileIdx=scrnBase+(((bgy&31)*32));        switch((bgcnt>>14)&3)        {            case 2: if(bgy>=32) tileIdx += 32*32; break;            case 3: if(bgy>=32) tileIdx += 32*32*2; break;        }        tileY=((curline+vofs)&7)*8;        for(a=0;a<240;a++)        {            bgx=((a+hofs)&(width-1))/8;            tmpTileIdx=tileIdx+((bgx&31));            if(bgx>=32) tmpTileIdx += 32*32;            tileChar=VRAMh[tmpTileIdx];            x=(a+hofs)&7; y=tileY;            if(tileChar&0x0400) x=7-x;            if(tileChar&0x0800) y=56-y;            if(mospx>=mosx) b=VRAMb[charBase+((tileChar&0x03FF)*64)+x+y];            mospx++; if(mospx>mosx) mospx=0;            if(b) COLSHIFT(buf+a*4,PALh[b]);        }    } else {        bgy=((curline+vofs)&(height-1))/8;        tileIdx=scrnBase+(((bgy&31)*32));        switch((bgcnt>>14)&3)        {            case 2: if(bgy>=32) tileIdx += 32*32; break;            case 3: if(bgy>=32) tileIdx += 32*32*2; break;        }        tileY=((curline+vofs)&7)*4;        for(a=0;a<240;a++)        {            bgx=((a+hofs)&(width-1))/8;            tmpTileIdx=tileIdx+((bgx&31));            if(bgx>=32) tmpTileIdx += 32*32;            tileChar=VRAMh[tmpTileIdx];            x=(a+hofs)&7; y=tileY;            if(tileChar&0x0400) x=7-x;            if(tileChar&0x0800) y=28-y;            if(mospx>=mosx)            {                b=VRAMb[charBase+((tileChar&0x03FF)*32)+(x/2)+y];                if(x&1) b>>=4; b&=15;            }            palnum=((tileChar>>12)&15)*16;            mospx++; if(mospx>mosx) mospx=0;            if(b) COLSHIFT(buf+a*4,PALh[b+palnum]);        }    }}void gbaGPU::scanRot(u8 *buf, int bg){    u16 bgcnt, scrnBase, charBase;    u32 x,y; int ax,ay; s16 dx,dy; int trans; u8 mosx, mospx, mosy;    u16 tmpTileIdx, width=0, height=0, a, tileChar; u8 b=0;        bgcnt=REG(BG0CNT+bg); bg-=2;    trans=(bgcnt&0x2000)==0;    switch((bgcnt>>14)&3)    {        case 0: width=128; height=128; break;        case 1: width=256; height=256; break;        case 2: width=512; height=512; break;        case 3: width=1024; height=1024; break;    }    scrnBase=((bgcnt>>8)&0x1F)*0x800;    charBase=((bgcnt>>2)&0x3)*0x4000;    x=BGX[bg]; y=BGY[bg];    dx=REG(BG2PA+(bg*8)); dy=REG(BG2PC+(bg*8));    if(bgcnt&0x0040)    {        mosx=(REG(MOSAIC)&0x000F);        mosy=((REG(MOSAIC)&0x00F0)>>4);        mospx=mosx; if(!curline) mospy[bg]=mosy;        mospy[bg]++; if(mospy[bg]<=mosy) y-=mospy[bg]*256;        else mospy[bg]=0;    } else { mospx=0; mosx=0; }    for(a=0;a<240;a++)    {        ax=x>>8; ay=y>>8;        if ((ax >= 0 && ax < width && ay >= 0 && ay < height) || !trans)        {            tmpTileIdx=scrnBase+(((ay&(height-1))/8)*(width/8)+((ax&(width-1))/8));            tileChar=VRAMb[tmpTileIdx];            if(mospx>=mosx) b=VRAMb[charBase+tileChar*64+((ay&7)*8)+(ax&7)];            mospx+=(dx>>8); if(mospx>mosx) mospx=0;            if(b) COLSHIFT(buf+a*4,PALh[b]);        }        x+=dx; y+=dy;    }}void gbaGPU::sprites(u8 *buf, int pri){    u16 dispcnt=REG(DISPCNT), oamNum, attr0,attr1,attr2;    int x, y, i, width=-1, height=-1, rwidth, rheight, scale=1;    int spritey, baseSprite, baseInc, curIdx, palIdx; u8 b;    s16 dx,dmx,rx,dy,dmy,ry; int tx,ty,cx,cy,pitch,rotScaleParam;    if(!(dispcnt&0x1000)) return;    pri<<=10;    oamNum=128; do    {	width=0; height=0;        oamNum--;        attr2=OAMh[oamNum*4+2];        if((attr2&0x0C00)!=pri) continue;        attr0=OAMh[oamNum*4+0];        attr1=OAMh[oamNum*4+1];        x=attr1&0x01FF; y=attr0&0x00FF;                switch ((attr0 >> 14) & 3)                {                    case 0:                        // Square                        switch ((attr1 >> 14) & 3)                        {                            case 0: width = 8; height = 8; break;                            case 1: width = 16; height = 16; break;                            case 2: width = 32; height = 32; break;                            case 3: width = 64; height = 64; break;                        }                        break;                    case 1:                        // Horizontal Rectangle                        switch ((attr1 >> 14) & 3)                        {                            case 0: width = 16; height = 8; break;                            case 1: width = 32; height = 8; break;                            case 2: width = 32; height = 16; break;                            case 3: width = 64; height = 32; break;                        }                        break;                    case 2:                        // Vertical Rectangle                        switch ((attr1 >> 14) & 3)                        {                            case 0: width = 8; height = 16; break;                            case 1: width = 8; height = 32; break;                            case 2: width = 16; height = 32; break;                            case 3: width = 32; height = 64; break;                        }                        break;                }                rwidth=width; rheight=height;                if (attr0&0x0100)                    // Rot-scale on                    if (attr0&0x0200) { rwidth*=2; rheight*=2; }                else                    // Invalid sprite                    if (attr0&0x0200) width = -1;                if (width == -1)                    // Invalid sprite                    continue;                // Y clipping                if (y > ((y + rheight) & 0xff))                    if (curline >= ((y + rheight) & 0xff) && !(y < curline)) continue;                else                    if (curline < y || curline >= ((y + rheight) & 0xff)) continue;                if (attr0&0x2000) scale = 2;                spritey = curline - y;                if (spritey < 0) spritey += 256;                if (!(attr0&0x0100))                {                    if (attr1&0x2000) spritey = (height - 1) - spritey;                    if (dispcnt&0x0040)                        // 1 dimensional                        baseSprite = (attr2 & 0x3FF) + ((spritey / 8) * (width / 8)) * scale;                    else                        // 2 dimensional                        baseSprite = (attr2 & 0x3FF) + ((spritey / 8) * 0x20);                    baseInc = scale;                    if (attr1&0x1000)                    {                        baseSprite += ((width / 8) * scale) - scale;                        baseInc = -baseInc;                    }                    if (attr0&0x2000)                    {                        // 256 colors			//if(baseSprite && spritey>=0 && spritey<height)                        //printf("GPU: Line #%d: Sprite #%d: %dx%d at %d,%d, non-rotating, 8-bit\n",curline,oamNum,width,height,x,y);                        for (i = x; i < x + width; i++)                        {                            if ((i & 0x1ff) < 240 && spritey >= 0 && spritey < height)                            {                                tx = (i - x) & 7;                                if (attr1&0x1000) tx = 7 - tx;                                curIdx = baseSprite * 32 + ((spritey & 7) * 8) + tx;                                b = VRAMb[0x10000 + curIdx];                                if (b) COLSHIFT(buf+(i&0x1ff)*4,PALh[b+256]);                            }                            if (((i - x) & 7) == 7) baseSprite += baseInc;                        }                    }                    else                    {                        // 16 colors			//if(baseSprite && spritey>=0 && spritey<height)                        //printf("GPU: Line #%d: Sprite #%d: %dx%d at %d,%d, non-rotating, 4-bit\n",curline,oamNum,width,height,x,y);                        palIdx = ((attr2 >> 8) & 0xF0);                        for (i = x; i < x + width; i++)                        {                            if ((i & 0x1ff) < 240 && spritey >= 0 && spritey < height)                            {                                tx = (i - x) & 7;                                if ((attr1 & (1 << 12)) != 0) tx = 7 - tx;                                curIdx = baseSprite * 32 + ((spritey & 7) * 4) + (tx / 2);                                b = VRAMb[0x10000 + curIdx];                                if (tx & 1) b>>=4; b&=15;                                if(b) COLSHIFT(buf+(i&0x1ff)*4, PALh[palIdx+b+256]);                            }                            if (((i - x) & 7) == 7) baseSprite += baseInc;                        }                    }                }                else                {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲电影在线播放| 大美女一区二区三区| 国产麻豆午夜三级精品| 91美女片黄在线观看91美女| 欧美一区二区三区免费观看视频| 久久久久99精品国产片| 麻豆精品在线播放| 色综合天天综合网国产成人综合天| 99精品久久只有精品| 日本欧美一区二区在线观看| 成人成人成人在线视频| 日韩欧美一区二区视频| 亚洲国产综合在线| 91日韩精品一区| 久久久影视传媒| 精品一区二区三区av| 欧美写真视频网站| 精品少妇一区二区| 亚洲午夜一二三区视频| 一本大道久久a久久精品综合| 久久综合色鬼综合色| 美女视频一区二区三区| 欧美日韩一区二区三区不卡| 亚洲人午夜精品天堂一二香蕉| 大美女一区二区三区| 国产欧美1区2区3区| 国产激情视频一区二区在线观看 | 在线观看免费亚洲| 国产精品动漫网站| 欧美日韩一区在线| 一区二区三区蜜桃| 日本乱码高清不卡字幕| 伊人性伊人情综合网| 色噜噜狠狠成人中文综合| 亚洲精品成人精品456| 在线亚洲一区二区| 亚洲aaa精品| 日韩一区二区三| 免费在线一区观看| 日本精品视频一区二区| 一区二区三区免费| 欧美巨大另类极品videosbest | 亚洲午夜三级在线| 一本色道久久综合精品竹菊| 一区二区在线电影| 欧美性videosxxxxx| 奇米色一区二区三区四区| 欧美电影精品一区二区| 久久99精品国产91久久来源| 久久日韩精品一区二区五区| 国产伦精品一区二区三区在线观看| 久久蜜桃香蕉精品一区二区三区| 成人中文字幕电影| 99热国产精品| 中文字幕一区二区三区在线观看 | 精品一区二区三区在线观看 | 99免费精品视频| 有码一区二区三区| 欧美一区二区三区公司| 国内精品伊人久久久久av影院| 国产精品欧美综合在线| 欧美视频日韩视频在线观看| 六月丁香婷婷久久| 亚洲国产成人私人影院tom| 色综合久久88色综合天天| 日韩精品亚洲一区二区三区免费| 精品国产一区二区亚洲人成毛片| 成人午夜av影视| 午夜天堂影视香蕉久久| 久久综合九色综合欧美亚洲| 人人狠狠综合久久亚洲| 26uuu另类欧美| 国产一区二区三区| 久久99热狠狠色一区二区| 精品三级av在线| 高清成人免费视频| 欧美系列在线观看| 成人伦理片在线| 精品国产乱码久久久久久蜜臀| 免费高清在线一区| 欧美一区二区三区男人的天堂| 午夜精品久久久久久久久久久| 欧美国产激情二区三区| 韩国成人在线视频| 91精品国产色综合久久不卡电影| 国产免费成人在线视频| 欧美一区二区三区免费在线看 | 日韩精品一区二区三区四区视频 | 欧美乱熟臀69xxxxxx| 日本在线观看不卡视频| 久久精品人人做人人爽人人| 欧美一级片免费看| 国产剧情一区二区| 日韩精品乱码免费| 亚洲综合激情小说| 亚洲少妇30p| 精品剧情在线观看| 欧美三区在线观看| 99国产精品国产精品毛片| 蜜臀国产一区二区三区在线播放| 久久精品亚洲乱码伦伦中文 | 久久综合色8888| 亚洲一区二区在线免费看| av激情成人网| 三级在线观看一区二区| 麻豆国产精品视频| 国产不卡视频一区| 色综合一区二区| 欧美一区二区久久| 国产精品区一区二区三区| 一区二区三区欧美日韩| 日韩av电影天堂| 高清视频一区二区| 欧美视频在线观看一区| 久久久久久久久蜜桃| 亚洲男人的天堂在线aⅴ视频 | 奇米影视一区二区三区小说| 国产成人精品亚洲日本在线桃色| 91小视频在线免费看| 欧美一级淫片007| 日韩一区日韩二区| 日本免费在线视频不卡一不卡二| 国产精品一二三在| 777xxx欧美| 中文字幕一区日韩精品欧美| 日本欧美一区二区在线观看| 不卡一区二区三区四区| 91精品欧美久久久久久动漫| 国产精品久久午夜夜伦鲁鲁| 日本不卡一区二区三区| 97久久精品人人爽人人爽蜜臀 | 久久精品视频网| 亚洲电影激情视频网站| 高清不卡在线观看av| 日韩三级视频在线观看| 有坂深雪av一区二区精品| 国产成人亚洲综合a∨猫咪| 91精品久久久久久蜜臀| 亚洲美女一区二区三区| 福利电影一区二区三区| 日韩一区二区精品| 亚洲一区二区高清| 菠萝蜜视频在线观看一区| 精品99久久久久久| 日韩精品91亚洲二区在线观看| 91亚洲精品一区二区乱码| 久久久九九九九| 激情六月婷婷久久| 日韩一级视频免费观看在线| 亚洲一区二区三区四区在线| 99久久精品99国产精品 | 欧美精品一区二区久久婷婷| 亚洲午夜免费电影| 色综合一个色综合亚洲| 亚洲欧洲精品一区二区精品久久久| 久久精品理论片| 欧美一级片免费看| 日本视频在线一区| 欧美精品电影在线播放| 亚洲国产视频一区二区| 在线观看免费亚洲| 一区二区三区四区精品在线视频| 99久久久无码国产精品| 亚洲欧美一区二区视频| av在线播放成人| 中文字幕永久在线不卡| 99re这里都是精品| ...中文天堂在线一区| www.激情成人| 亚洲视频一区二区免费在线观看| 丰满亚洲少妇av| 国产精品超碰97尤物18| av色综合久久天堂av综合| 最新日韩av在线| 日本精品一区二区三区四区的功能| 亚洲欧美在线aaa| 91成人免费电影| 亚洲国产成人高清精品| 4438x亚洲最大成人网| 欧美aⅴ一区二区三区视频| 欧美一区二区在线播放| 精品影院一区二区久久久| 国产片一区二区| www.日韩精品| 亚洲成av人片在www色猫咪| 4438x成人网最大色成网站| 看电视剧不卡顿的网站| 亚洲精品一区二区三区福利 | 一区二区久久久久| 欧美日韩成人激情| 麻豆成人久久精品二区三区小说| 精品国产一区二区三区四区四| 国产91露脸合集magnet | 91精品国产综合久久小美女| 蜜桃视频免费观看一区| 国产午夜精品久久久久久久 | 另类小说视频一区二区| 久久久国产午夜精品| 99久久精品国产导航| 天天操天天色综合|