mgba-emu / mgba

mGBA Game Boy Advance Emulator
https://mgba.io/
Mozilla Public License 2.0
5.68k stars 783 forks source link

LDMS with empty rlist does not reload CPSR when it should #2127

Closed ladystarbreeze closed 3 years ago

ladystarbreeze commented 3 years ago

In mGBA 0.9.0, the LDM rbase, {}^ instruction does not reload CPSR. Hardware interprets an empty rlist as "transfer r15" (which is correctly implemented in mGBA); however, this also applies to LDMS, so hardware ends up reloading CPSR.

; switch to Abort mode, set up SPSR
mov     r0, 0x17
msr     cpsr_csxf, r0
orr     r0, 0xF0000000
msr     spsr, r0

adr     r1, .Pool_Main
dw      0xE8D10000 ; ldmia r1, {}^

.Main_PrintResult:
    ; save new CPSR value, switch back to System mode
    mrs     r0, cpsr ; F0000017h on hardware, 00000017h in mGBA
    msr     cpsr_csxf, 0x1F
    mov     r1, 8
    bl      .PrintHex

.Loop_Endless:
    b       .Loop_Endless

.Pool_Main:
    dw      MEM_ROM0 + .Main_PrintResult

ldmia_empty_cpsr

ldmia_empty_cpsr_mGBA

ldmia_empty_cpsr.zip

endrift commented 3 years ago

Talk about an edge case of an edge case. Doesn't look hard to fix though.