mirror of https://github.com/mgba-emu/mgba.git
GBA: Implement bad I/O register loading
This commit is contained in:
parent
b3d08eceb1
commit
eee291e00e
1
CHANGES
1
CHANGES
|
@ -38,6 +38,7 @@ Misc:
|
||||||
- GBA Audio: Implement missing flags on SOUNDCNT_X register
|
- GBA Audio: Implement missing flags on SOUNDCNT_X register
|
||||||
- Util: Use VFile for configuration
|
- Util: Use VFile for configuration
|
||||||
- GBA Memory: Implement several unimplemented memory access types
|
- GBA Memory: Implement several unimplemented memory access types
|
||||||
|
- GBA: Implement bad I/O register loading
|
||||||
|
|
||||||
0.3.1: (2015-10-24)
|
0.3.1: (2015-10-24)
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
|
32
src/gba/io.c
32
src/gba/io.c
|
@ -636,6 +636,38 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) {
|
||||||
case REG_DMA3CNT_LO:
|
case REG_DMA3CNT_LO:
|
||||||
// Write-only register
|
// Write-only register
|
||||||
return 0;
|
return 0;
|
||||||
|
case REG_BG0HOFS:
|
||||||
|
case REG_BG0VOFS:
|
||||||
|
case REG_BG1HOFS:
|
||||||
|
case REG_BG1VOFS:
|
||||||
|
case REG_BG2HOFS:
|
||||||
|
case REG_BG2VOFS:
|
||||||
|
case REG_BG3HOFS:
|
||||||
|
case REG_BG3VOFS:
|
||||||
|
case REG_BG2PA:
|
||||||
|
case REG_BG2PB:
|
||||||
|
case REG_BG2PC:
|
||||||
|
case REG_BG2PD:
|
||||||
|
case REG_BG2X_LO:
|
||||||
|
case REG_BG2X_HI:
|
||||||
|
case REG_BG2Y_LO:
|
||||||
|
case REG_BG2Y_HI:
|
||||||
|
case REG_BG3PA:
|
||||||
|
case REG_BG3PB:
|
||||||
|
case REG_BG3PC:
|
||||||
|
case REG_BG3PD:
|
||||||
|
case REG_BG3X_LO:
|
||||||
|
case REG_BG3X_HI:
|
||||||
|
case REG_BG3Y_LO:
|
||||||
|
case REG_BG3Y_HI:
|
||||||
|
case REG_WIN0H:
|
||||||
|
case REG_WIN1H:
|
||||||
|
case REG_WIN0V:
|
||||||
|
case REG_WIN1V:
|
||||||
|
case REG_MOSAIC:
|
||||||
|
case REG_BLDY:
|
||||||
|
// Write-only register
|
||||||
|
return GBALoad16(gba->cpu, 0x01000000, 0); // Simulate a bad load
|
||||||
case REG_DISPCNT:
|
case REG_DISPCNT:
|
||||||
case REG_DISPSTAT:
|
case REG_DISPSTAT:
|
||||||
case REG_VCOUNT:
|
case REG_VCOUNT:
|
||||||
|
|
|
@ -145,19 +145,19 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender
|
||||||
GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer);
|
GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer);
|
||||||
break;
|
break;
|
||||||
case REG_BG0CNT:
|
case REG_BG0CNT:
|
||||||
value &= 0xFFCF;
|
value &= 0xDFFF;
|
||||||
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[0], value);
|
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[0], value);
|
||||||
break;
|
break;
|
||||||
case REG_BG1CNT:
|
case REG_BG1CNT:
|
||||||
value &= 0xFFCF;
|
value &= 0xDFFF;
|
||||||
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[1], value);
|
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[1], value);
|
||||||
break;
|
break;
|
||||||
case REG_BG2CNT:
|
case REG_BG2CNT:
|
||||||
value &= 0xFFCF;
|
value &= 0xFFFF;
|
||||||
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[2], value);
|
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[2], value);
|
||||||
break;
|
break;
|
||||||
case REG_BG3CNT:
|
case REG_BG3CNT:
|
||||||
value &= 0xFFCF;
|
value &= 0xFFFF;
|
||||||
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[3], value);
|
GBAVideoSoftwareRendererWriteBGCNT(softwareRenderer, &softwareRenderer->bg[3], value);
|
||||||
break;
|
break;
|
||||||
case REG_BG0HOFS:
|
case REG_BG0HOFS:
|
||||||
|
@ -242,6 +242,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender
|
||||||
break;
|
break;
|
||||||
case REG_BLDCNT:
|
case REG_BLDCNT:
|
||||||
GBAVideoSoftwareRendererWriteBLDCNT(softwareRenderer, value);
|
GBAVideoSoftwareRendererWriteBLDCNT(softwareRenderer, value);
|
||||||
|
value &= 0x3FFF;
|
||||||
break;
|
break;
|
||||||
case REG_BLDALPHA:
|
case REG_BLDALPHA:
|
||||||
softwareRenderer->blda = value & 0x1F;
|
softwareRenderer->blda = value & 0x1F;
|
||||||
|
@ -252,6 +253,7 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender
|
||||||
if (softwareRenderer->bldb > 0x10) {
|
if (softwareRenderer->bldb > 0x10) {
|
||||||
softwareRenderer->bldb = 0x10;
|
softwareRenderer->bldb = 0x10;
|
||||||
}
|
}
|
||||||
|
value &= 0x1F1F;
|
||||||
break;
|
break;
|
||||||
case REG_BLDY:
|
case REG_BLDY:
|
||||||
softwareRenderer->bldy = value & 0x1F;
|
softwareRenderer->bldy = value & 0x1F;
|
||||||
|
@ -313,10 +315,12 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REG_WININ:
|
case REG_WININ:
|
||||||
|
value &= 0x3F3F;
|
||||||
softwareRenderer->winN[0].control.packed = value;
|
softwareRenderer->winN[0].control.packed = value;
|
||||||
softwareRenderer->winN[1].control.packed = value >> 8;
|
softwareRenderer->winN[1].control.packed = value >> 8;
|
||||||
break;
|
break;
|
||||||
case REG_WINOUT:
|
case REG_WINOUT:
|
||||||
|
value &= 0x3F3F;
|
||||||
softwareRenderer->winout.packed = value;
|
softwareRenderer->winout.packed = value;
|
||||||
softwareRenderer->objwin.packed = value >> 8;
|
softwareRenderer->objwin.packed = value >> 8;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue