[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