[arm/arm64] Fix OAM/VRAM byte writes

Forgot to add byte-doubling codepath for byte writes. This is correctly
implemented in x86 and MIPS.
This commit is contained in:
David Guillen Fandos 2023-04-26 00:29:38 +02:00
parent 872a22ae51
commit f4e65d15c0
2 changed files with 13 additions and 0 deletions

View File

@ -511,6 +511,11 @@ execute_load_builder(u32, ldr, 3, 4, read_memory32)
#define store_align_16() and w1, w1, #0xffff; bic w0, w0, #1
#define store_align_32() bic w0, w0, #3
// For byte-accesses on 16 bit buses
#define dup8(reg) bfi reg, reg, #8, #24 // Duplicates byte to u16
#define dup16(reg)
#define dup32(reg)
// Write out to memory.
// Input:
@ -560,6 +565,7 @@ ext_store_ewram_u##store_type: ;\
;\
ext_store_vram_u##store_type: ;\
ext_store_vram_u##store_type##_safe: ;\
dup##store_type(w1) /* Duplicate byte if necessary */;\
and w0, w0, #(0x1ffff & ~stmask16) /* Mask to mirror memory (+align)*/;\
sub w3, w0, #0x8000 /* Mirrored addr for last bank */;\
cmp w0, #0x18000 /* Check if exceeds 96KB */;\
@ -570,6 +576,7 @@ ext_store_vram_u##store_type##_safe: ;\
;\
ext_store_oam_ram_u##store_type: ;\
ext_store_oam_ram_u##store_type##_safe: ;\
dup##store_type(w1) /* Duplicate byte if necessary */;\
and w0, w0, #(0x3ff & ~stmask16) /* Mask to mirror memory (+align)*/;\
add x3, reg_base, #OAM_RAM_OFF /* x3 = oam ram base */;\
str_op16 w1, [x0, x3] /* store data */;\

View File

@ -472,6 +472,10 @@ return_to_main:
#define mask_addr_bus16_16(nbits) mask_addr_16(nbits)
#define mask_addr_bus16_8(nbits) mask_addr_16(nbits)
#define dup8(reg) bic r1, r1, #0xff00; orr r1, r1, lsl #8;
#define dup16(reg)
#define dup32(reg)
@ Write out to memory.
@ Input:
@ -532,6 +536,7 @@ ext_store_ewram_u##store_type: ;\
ext_store_vram_u##store_type: ;\
save_flags() ;\
mask_addr_bus16_##store_type(17) /* Mask to mirror memory (+align)*/;\
dup##store_type(r1) /* Duplicate byte if necessary */;\
cmp r0, #0x18000 /* Check if exceeds 96KB */;\
subcs r0, r0, #0x8000 /* Mirror to the last bank */;\
add r2, reg_base, #VRAM_OFF /* r2 = vram base */;\
@ -541,6 +546,7 @@ ext_store_vram_u##store_type: ;\
;\
ext_store_oam_ram_u##store_type: ;\
mask_addr_bus16_##store_type(10) /* Mask to mirror memory (+align)*/;\
dup##store_type(r1) /* Duplicate byte if necessary */;\
add r2, reg_base, #OAM_RAM_OFF /* r2 = oam ram base */;\
str_op16 r1, [r0, r2] /* store data */;\
str r2, [reg_base, #OAM_UPDATED] /* write non zero to signal */;\