⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rom.cpp

📁 一个gba的模拟器源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        return v;
    }
    else
        return hiRam[addr&0xff];
}

unsigned short getmem_word(unsigned short addr)
{
    return getmem(addr)+(getmem(addr+1)<<8);
}

unsigned long getmem_dword(unsigned short addr)
{
    return getmem(addr)+(getmem(addr+1)<<8)+
        (getmem(addr+2)<<16)+(getmem(addr+3)<<24);
}

void putmem_direct(unsigned short addr,unsigned char v)
{
    if (addr<0x8000)
        putmem(addr,v);
    else if (addr<0xf000)
    {
        if (!mem[addr>>12])
            return;
        mem[addr>>12][addr&0xfff]=v;
    }
    else if (addr<0xfe00)
        intRam[(hiRam[0x70]<<12)+(addr&0xfff)]=v;
    else if (addr<0xfea0)
        oam[addr&0xff]=v;
    else if (addr<0xff00)
        return;
    else if ((addr>=0xff00)&&(addr<0xff80))
        putmem(addr,v);
    else
        hiRam[addr&0xff]=v;
}

void putmem(unsigned short addr,unsigned char v)
{
    if ((dmaClk)&&(addr<0xff00))
    {
        if (addr<0x8000)
        {
            if (dmaType==0)
            {
                if (debugWarn[DBW_DMA])
                    DebugWarn(DBW_DMA);
                return;
            }
        }
        else if (addr<0xa000)
        {
            if (dmaType==1)
            {
                if (debugWarn[DBW_DMA])
                    DebugWarn(DBW_DMA);
                return;
            }
        }
        else
        {
            if (dmaType==2)
            {
                if (debugWarn[DBW_DMA])
                    DebugWarn(DBW_DMA);
                return;
            }
        }
    }
    if (addr<0x8000)
    {
        switch(mbc)
        {
            case 0: return;
            case 1:
                if (addr<=0x1fff)
                {
                    if (((v&0xf)==0xa)&&(ram))
                    {
                        ramEnable=1;
                        mem[0xa]=&ram[ramPage<<13];
                        mem[0xb]=&ram[(ramPage<<13)+0x1000];
                    }
                    else
                    {
                        ramEnable=0;
                        mem[0xa]=NULL; mem[0xb]=NULL;
                    }
                }
                else if ((addr>=0x2000)&&(addr<=0x3fff))
                {
                    romPage=(mbc1Mode)?(v&0x1f):(v&0x7f);
                    if (romPage==0) romPage=1;
                    while ((romPage<<14)>=romSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        romPage-=romSize>>14;
                    }
                    mem[4]=&rom[romPage<<14];
                    mem[5]=&rom[(romPage<<14)+0x1000];
                    mem[6]=&rom[(romPage<<14)+0x2000];
                    mem[7]=&rom[(romPage<<14)+0x3000];
                }
                else if ((addr>=0x4000)&&(addr<=0x5fff))
                {
                    if (mbc1Mode==0)
                    {
                        romPage=(romPage&0x1f)|((v&3)<<5);
                        if (romPage==0) romPage=1;
                        while ((romPage<<14)>=romSize)
                        {
                            if (debugWarn[DBW_PAGERANGE])
                                DebugWarn(DBW_PAGERANGE);
                            romPage-=romSize>>14;
                        }
                        mem[4]=&rom[romPage<<14];
                        mem[5]=&rom[(romPage<<14)+0x1000];
                        mem[6]=&rom[(romPage<<14)+0x2000];
                        mem[7]=&rom[(romPage<<14)+0x3000];
                    }
                    else if (ramSize)
                    {
                        ramPage=v&3;
                        while ((ramPage<<13)>=ramSize)
                        {
                            if (debugWarn[DBW_PAGERANGE])
                                DebugWarn(DBW_PAGERANGE);
                            ramPage-=ramSize>>13;
                        }
                        if (ramEnable)
                        {
                            mem[0xa]=&ram[ramPage<<13];
                            mem[0xb]=&ram[(ramPage<<13)+0x1000];
                        }
                    }
                }
                else if ((addr>=0x6000)&&(addr<=0x7fff))
                {
                    mbc1Mode=v&1;
                    if (mbc1Mode==1) romPage&=0x1f;
                }
                break;
            case 2:
                if ((addr<=0x1fff)/*&&(!(addr&0x100))*/)
                {
                    if (((v&0xf)==0xa)&&(ram))
                    {
                        ramEnable=1;
                        mem[0xa]=ram;
                        mem[0xb]=&ram[0x1000];
                    }
                    else
                    {
                        ramEnable=0;
                        mem[0xa]=NULL; mem[0xb]=NULL;
                    }
                }
                else if ((addr>=0x2000)&&(addr<=0x3fff)/*&&(addr&0x100)*/)
                {
                    romPage=v&0xf;
                    if (romPage==0) romPage=1;
                    while ((romPage<<14)>=romSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        romPage-=romSize>>14;
                    }
                    mem[4]=&rom[romPage<<14];
                    mem[5]=&rom[(romPage<<14)+0x1000];
                    mem[6]=&rom[(romPage<<14)+0x2000];
                    mem[7]=&rom[(romPage<<14)+0x3000];
                }
                break;
            case 3:
                if (addr<=0x1fff)
                {
                    if (((v&0xf)==0xa)&&(ram))
                    {
                        ramEnable=1;
                        mem[0xa]=&ram[ramPage<<13];
                        mem[0xb]=&ram[(ramPage<<13)+0x1000];
                    }
                    else
                    {
                        ramEnable=0;
                        mem[0xa]=NULL; mem[0xb]=NULL;
                    }
                }
                else if ((addr>=0x2000)&&(addr<=0x3fff))
                {
                    romPage=v&0x7f;
                    if (romPage==0) romPage=1;
                    while ((romPage<<14)>=romSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        romPage-=romSize>>14;
                    }
                    mem[4]=&rom[romPage<<14];
                    mem[5]=&rom[(romPage<<14)+0x1000];
                    mem[6]=&rom[(romPage<<14)+0x2000];
                    mem[7]=&rom[(romPage<<14)+0x3000];
                }
                else if ((addr>=0x4000)&&(addr<=0x5fff)&&(ramSize))
                {
                    ramPage=v&3;
                    while ((ramPage<<13)>=ramSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        ramPage-=ramSize>>13;
                    }
                    if (ramEnable)
                    {
                        mem[0xa]=&ram[ramPage<<13];
                        mem[0xb]=&ram[(ramPage<<13)+0x1000];
                    }
                }
                break;
            case 5:
                if (addr<=0x1fff)
                {
                    if (((v&0xf)==0xa)&&(ram))
                    {
                        ramEnable=1;
                        mem[0xa]=&ram[ramPage<<13];
                        mem[0xb]=&ram[(ramPage<<13)+0x1000];
                    }
                    else
                    {
                        ramEnable=0;
                        mem[0xa]=NULL; mem[0xb]=NULL;
                    }
                }
                else if ((addr>=0x2000)&&(addr<=0x2fff))
                {
                    romPage=(romPage&0x100)|(int)(v&0xff);
                    while ((romPage<<14)>=romSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        romPage-=romSize>>14;
                    }
                    mem[4]=&rom[romPage<<14];
                    mem[5]=&rom[(romPage<<14)+0x1000];
                    mem[6]=&rom[(romPage<<14)+0x2000];
                    mem[7]=&rom[(romPage<<14)+0x3000];
                }
                else if ((addr>=0x3000)&&(addr<=0x3fff))
                {
                    romPage=(romPage&0xff)|(((int)(v&1))<<8);
                    while ((romPage<<14)>=romSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        romPage-=romSize>>14;
                    }
                    mem[4]=&rom[romPage<<14];
                    mem[5]=&rom[(romPage<<14)+0x1000];
                    mem[6]=&rom[(romPage<<14)+0x2000];
                    mem[7]=&rom[(romPage<<14)+0x3000];
                }
                else if ((addr>=0x4000)&&(addr<=0x5fff)&&(ramSize))
                {
                    ramPage=v&0xf;
                    while ((ramPage<<13)>=ramSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        ramPage-=ramSize>>13;
                    }
                    if (ramEnable)
                    {
                        mem[0xa]=&ram[ramPage<<13];
                        mem[0xb]=&ram[(ramPage<<13)+0x1000];
                    }
                }
                break;
            case 6:
                if (addr<=0x1fff)
                {
                    if (((v&0xf)==0xa)&&(ram))
                    {
                        ramEnable=1;
                        mem[0xa]=&ram[ramPage<<13];
                        mem[0xb]=&ram[(ramPage<<13)+0x1000];
                    }
                    else
                    {
                        ramEnable=0;
                        mem[0xa]=NULL; mem[0xb]=NULL;
                    }
                }
                else if ((addr>=0x2000)&&(addr<=0x2fff))
                {
                    romPage=(romPage&0x100)|(int)(v&0xff);
                    while ((romPage<<14)>=romSize)
                        romPage-=romSize>>14;
                    mem[4]=&rom[romPage<<14];
                    mem[5]=&rom[(romPage<<14)+0x1000];
                    mem[6]=&rom[(romPage<<14)+0x2000];
                    mem[7]=&rom[(romPage<<14)+0x3000];
                }
                else if ((addr>=0x3000)&&(addr<=0x3fff))
                {
                    romPage=(romPage&0xff)|(((int)(v&1))<<8);
                    while ((romPage<<14)>=romSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        romPage-=romSize>>14;
                    }
                    mem[4]=&rom[romPage<<14];
                    mem[5]=&rom[(romPage<<14)+0x1000];
                    mem[6]=&rom[(romPage<<14)+0x2000];
                    mem[7]=&rom[(romPage<<14)+0x3000];
                }
                else if ((addr>=0x4000)&&(addr<=0x5fff)&&(ramSize))
                {
                    ramPage=v&0x7;
                    while ((ramPage<<13)>=ramSize)
                    {
                        if (debugWarn[DBW_PAGERANGE])
                            DebugWarn(DBW_PAGERANGE);
                        ramPage-=ramSize>>13;
                    }
                    if (ramEnable)
                    {
                        mem[0xa]=&ram[ramPage<<13];
                        mem[0xb]=&ram[(ramPage<<13)+0x1000];
                    }
                }
                break;
        }
    }
    else if (addr<0xa000)
    {
        if ((lcdMode==3)&&(hiRam[0x40]&0x80))
        {
            if (debugWarn[DBW_VIDMEM])
                DebugWarn(DBW_VIDMEM);
            return;
        }
        vidRam[(vidPage<<13)+(addr&0x1fff)]=v;
    }
    else if (addr<0xf000)
    {
        if (!mem[addr>>12])
        {
            if ((addr<0xc000)&&(!ramEnable)&&
                (debugWarn[DBW_RAMDISABLED]))
                DebugWarn(DBW_RAMDISABLED);
            else if (debugWarn[DBW_INVALIDMEM])
                DebugWarn(DBW_INVALIDMEM);
            return;
        }
        mem[addr>>12][addr&0xfff]=v;
    }
    else if (addr<0xfe00)
        intRam[(hiRam[0x70]<<12)+(addr&0xfff)]=v;
    else if (addr<0xfea0)
    {
        if ((lcdMode>=2)&&(hiRam[0x40]&2)&&(hiRam[0x40]&0x80))
        {
            if (debugWarn[DBW_VIDMEM])
                DebugWarn(DBW_VIDMEM);
            return;
        }
        oam[addr&0xff]=v;
    }
    else if (addr<0xff00)
        return;
    else if (addr==0xff04)
        hiRam[4]=0;
    else if (addr==0xff07)
    {
        hiRam[7]=v;
        if (v&4)
        {
            switch(v&3)
            {
                case 0: timerClkCount=1024; break;
                case 1: timerClkCount=16; break;
                case 2: timerClkCount=64; break;
                case 3: timerClkCount=256; break;
            }
        }
        else
            timerClkCount=0;
        #ifndef C_CORE
            minTime=0;
        #endif
    }
#ifndef EXECTRACK
    else if (addr==0xff0f)
        intReq=hiRam[0xf]=v;
#endif
    else if (addr==0xff26)
    {
        hiRam[0x26]=v;
        if (!(v&0x80))
        {
            snd1Enable=0;
            snd2Enable=0;
            snd3Enable=0;
            snd4Enable=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -