mirror of https://github.com/mgba-emu/mgba.git
parent
f33593537b
commit
9ddf82bebc
1
CHANGES
1
CHANGES
|
@ -6,6 +6,7 @@ Emulation fixes:
|
||||||
- ARM: Fix ALU reading PC after shifting
|
- ARM: Fix ALU reading PC after shifting
|
||||||
- ARM: Fix STR storing PC after address calculation
|
- ARM: Fix STR storing PC after address calculation
|
||||||
- GB: Fix GBC game registers after skipping BIOS
|
- GB: Fix GBC game registers after skipping BIOS
|
||||||
|
- GB Video: Fix state after skipping BIOS (fixes mgba.io/i/1715 and mgba.io/i/1716)
|
||||||
- GBA: Add missing RTC overrides for Legendz games
|
- GBA: Add missing RTC overrides for Legendz games
|
||||||
- GBA BIOS: Implement dummy sound driver calls
|
- GBA BIOS: Implement dummy sound driver calls
|
||||||
- GBA BIOS: Improve HLE BIOS timing
|
- GBA BIOS: Improve HLE BIOS timing
|
||||||
|
|
|
@ -161,6 +161,7 @@ void GBVideoInit(struct GBVideo* video);
|
||||||
void GBVideoReset(struct GBVideo* video);
|
void GBVideoReset(struct GBVideo* video);
|
||||||
void GBVideoDeinit(struct GBVideo* video);
|
void GBVideoDeinit(struct GBVideo* video);
|
||||||
void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* renderer);
|
void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* renderer);
|
||||||
|
void GBVideoSkipBIOS(struct GBVideo* video);
|
||||||
void GBVideoProcessDots(struct GBVideo* video, uint32_t cyclesLate);
|
void GBVideoProcessDots(struct GBVideo* video, uint32_t cyclesLate);
|
||||||
|
|
||||||
void GBVideoWriteLCDC(struct GBVideo* video, GBRegisterLCDC value);
|
void GBVideoWriteLCDC(struct GBVideo* video, GBRegisterLCDC value);
|
||||||
|
|
|
@ -460,13 +460,13 @@ void GBReset(struct SM83Core* cpu) {
|
||||||
|
|
||||||
GBVideoReset(&gb->video);
|
GBVideoReset(&gb->video);
|
||||||
GBTimerReset(&gb->timer);
|
GBTimerReset(&gb->timer);
|
||||||
|
GBIOReset(gb);
|
||||||
if (!gb->biosVf) {
|
if (!gb->biosVf) {
|
||||||
GBSkipBIOS(gb);
|
GBSkipBIOS(gb);
|
||||||
} else {
|
} else {
|
||||||
mTimingSchedule(&gb->timing, &gb->timer.event, 0);
|
mTimingSchedule(&gb->timing, &gb->timer.event, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
GBIOReset(gb);
|
|
||||||
GBAudioReset(&gb->audio);
|
GBAudioReset(&gb->audio);
|
||||||
GBSIOReset(&gb->sio);
|
GBSIOReset(&gb->sio);
|
||||||
|
|
||||||
|
@ -561,6 +561,7 @@ void GBSkipBIOS(struct GB* gb) {
|
||||||
mTimingSchedule(&gb->timing, &gb->timer.event, 0);
|
mTimingSchedule(&gb->timing, &gb->timer.event, 0);
|
||||||
|
|
||||||
GBIOWrite(gb, REG_LCDC, 0x91);
|
GBIOWrite(gb, REG_LCDC, 0x91);
|
||||||
|
GBVideoSkipBIOS(&gb->video);
|
||||||
|
|
||||||
if (gb->biosVf) {
|
if (gb->biosVf) {
|
||||||
GBUnmapBIOS(gb);
|
GBUnmapBIOS(gb);
|
||||||
|
|
|
@ -214,6 +214,24 @@ static bool _statIRQAsserted(GBRegisterSTAT stat) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GBVideoSkipBIOS(struct GBVideo* video) {
|
||||||
|
video->mode = 1;
|
||||||
|
video->modeEvent.callback = _endMode1;
|
||||||
|
|
||||||
|
if (video->p->model == GB_MODEL_CGB) {
|
||||||
|
video->ly = GB_VIDEO_VERTICAL_PIXELS;
|
||||||
|
video->p->memory.io[REG_LY] = video->ly;
|
||||||
|
video->stat = GBRegisterSTATClearLYC(video->stat);
|
||||||
|
}
|
||||||
|
video->stat = GBRegisterSTATSetMode(video->stat, video->mode);
|
||||||
|
|
||||||
|
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_VBLANK);
|
||||||
|
GBUpdateIRQs(video->p);
|
||||||
|
video->p->memory.io[REG_STAT] = video->stat;
|
||||||
|
mTimingDeschedule(&video->p->timing, &video->modeEvent);
|
||||||
|
mTimingSchedule(&video->p->timing, &video->modeEvent, GB_VIDEO_HORIZONTAL_LENGTH << video->p->doubleSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
struct GBVideo* video = context;
|
struct GBVideo* video = context;
|
||||||
if (video->frameskipCounter <= 0) {
|
if (video->frameskipCounter <= 0) {
|
||||||
|
|
Loading…
Reference in New Issue