[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
					
				
					 2 changed files with 13 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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…
	
	Add table
		
		Reference in a new issue