[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:
parent
872a22ae51
commit
f4e65d15c0
|
@ -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 */;\
|
||||
|
|
|
@ -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 */;\
|
||||
|
|
Loading…
Reference in New Issue