+ mov pc, r0
+ .size new_dyna_start, .-new_dyna_start
+
+/* --------------------------------------- */
+
+.align 2
+.global ari_read_ram8
+.global ari_read_ram16
+.global ari_read_ram32
+.global ari_read_ram_mirror8
+.global ari_read_ram_mirror16
+.global ari_read_ram_mirror32
+.global ari_write_ram8
+.global ari_write_ram16
+.global ari_write_ram32
+.global ari_write_ram_mirror8
+.global ari_write_ram_mirror16
+.global ari_write_ram_mirror32
+.global ari_write_ram_mirror_ro32
+.global ari_read_bios8
+.global ari_read_bios16
+.global ari_read_bios32
+.global ari_read_io8
+.global ari_read_io16
+.global ari_read_io32
+.global ari_write_io8
+.global ari_write_io16
+.global ari_write_io32
+
+.macro ari_read_ram bic_const op
+ ldr r0, [fp, #address-dynarec_local]
+.if \bic_const
+ bic r0, r0, #\bic_const
+.endif
+ \op r0, [r0]
+ str r0, [fp, #readmem_dword-dynarec_local]
+ mov pc, lr
+.endm
+
+ari_read_ram8:
+ ari_read_ram 0, ldrb
+
+ari_read_ram16:
+ ari_read_ram 1, ldrh
+
+ari_read_ram32:
+ ari_read_ram 3, ldr
+
+.macro ari_read_ram_mirror mvn_const, op
+ ldr r0, [fp, #address-dynarec_local]
+ mvn r1, #\mvn_const
+ and r0, r1, lsr #11
+ orr r0, r0, #1<<31
+ \op r0, [r0]
+ str r0, [fp, #readmem_dword-dynarec_local]
+ mov pc, lr
+.endm
+
+ari_read_ram_mirror8:
+ ari_read_ram_mirror 0, ldrb
+
+ari_read_ram_mirror16:
+ ari_read_ram_mirror (1<<11), ldrh
+
+ari_read_ram_mirror32:
+ ari_read_ram_mirror (3<<11), ldr
+
+/* invalidation is already taken care of by the caller */
+.macro ari_write_ram bic_const var pf
+ ldr r0, [fp, #address-dynarec_local]
+ ldr\pf r1, [fp, #\var-dynarec_local]
+.if \bic_const
+ bic r0, r0, #\bic_const
+.endif
+ str\pf r1, [r0]
+ mov pc, lr
+.endm
+
+ari_write_ram8:
+ ari_write_ram 0, byte, b
+
+ari_write_ram16:
+ ari_write_ram 1, hword, h
+
+ari_write_ram32:
+ ari_write_ram 3, word,
+
+.macro ari_write_ram_mirror mvn_const var pf
+ ldr r0, [fp, #address-dynarec_local]
+ mvn r3, #\mvn_const
+ ldr\pf r1, [fp, #\var-dynarec_local]
+ and r0, r3, lsr #11
+ ldr r2, [fp, #invc_ptr-dynarec_local]
+ orr r0, r0, #1<<31
+ ldrb r2, [r2, r0, lsr #12]
+ str\pf r1, [r0]
+ tst r2, r2
+ movne pc, lr
+ lsr r0, r0, #12
+ b invalidate_block
+.endm
+
+ari_write_ram_mirror8:
+ ari_write_ram_mirror 0, byte, b
+
+ari_write_ram_mirror16:
+ ari_write_ram_mirror (1<<11), hword, h
+
+ari_write_ram_mirror32:
+ ari_write_ram_mirror (3<<11), word,
+
+ari_write_ram_mirror_ro32:
+ load_var_adr r0, pcsx_ram_is_ro
+ ldr r0, [r0]
+ tst r0, r0
+ movne pc, lr
+ nop
+ b ari_write_ram_mirror32
+
+
+.macro ari_read_bios_mirror bic_const op
+ ldr r0, [fp, #address-dynarec_local]
+ orr r0, r0, #0x80000000
+ bic r0, r0, #(0x20000000|\bic_const) @ map to 0x9fc...
+ \op r0, [r0]
+ str r0, [fp, #readmem_dword-dynarec_local]
+ mov pc, lr
+.endm
+
+ari_read_bios8:
+ ari_read_bios_mirror 0, ldrb
+
+ari_read_bios16:
+ ari_read_bios_mirror 1, ldrh
+
+ari_read_bios32:
+ ari_read_bios_mirror 3, ldr
+
+
+@ for testing
+.macro ari_read_io_old tab_shift
+ str lr, [sp, #-8]! @ EABI alignment..
+.if \tab_shift == 0
+ bl psxHwRead32
+.endif
+.if \tab_shift == 1
+ bl psxHwRead16
+.endif
+.if \tab_shift == 2
+ bl psxHwRead8
+.endif
+ str r0, [fp, #readmem_dword-dynarec_local]
+ ldr pc, [sp], #8
+.endm
+
+.macro ari_read_io readop mem_tab tab_shift
+ ldr r0, [fp, #address-dynarec_local]
+ ldr r1, [fp, #psxH_ptr-dynarec_local]
+.if \tab_shift == 0
+ bic r0, r0, #3
+.endif
+.if \tab_shift == 1
+ bic r0, r0, #1
+.endif
+ bic r2, r0, #0x1f800000
+ ldr r12,[fp, #\mem_tab-dynarec_local]
+ subs r3, r2, #0x1000
+ blo 2f
+@ ari_read_io_old \tab_shift
+ cmp r3, #0x880
+ bhs 1f
+ ldr r12,[r12, r3, lsl #\tab_shift]
+ tst r12,r12
+ beq 2f
+0:
+ str lr, [sp, #-8]! @ EABI alignment..
+ blx r12
+ str r0, [fp, #readmem_dword-dynarec_local]
+ ldr pc, [sp], #8
+
+1:
+.if \tab_shift == 1 @ read16
+ cmp r2, #0x1c00
+ blo 2f
+ cmp r2, #0x1e00
+ bhs 2f
+ ldr r12,[fp, #spu_readf-dynarec_local]
+ b 0b
+.endif
+2:
+ @ no handler, just read psxH
+ \readop r0, [r1, r2]
+ str r0, [fp, #readmem_dword-dynarec_local]
+ mov pc, lr
+.endm
+
+ari_read_io8:
+ ari_read_io ldrb, tab_read8, 2
+
+ari_read_io16:
+ ari_read_io ldrh, tab_read16, 1
+
+ari_read_io32:
+ ari_read_io ldr, tab_read32, 0
+
+.macro ari_write_io_old tab_shift
+.if \tab_shift == 0
+ b psxHwWrite32
+.endif
+.if \tab_shift == 1
+ b psxHwWrite16
+.endif
+.if \tab_shift == 2
+ b psxHwWrite8
+.endif
+.endm
+
+.macro ari_write_io pf var mem_tab tab_shift
+ ldr r0, [fp, #address-dynarec_local]
+ ldr\pf r1, [fp, #\var-dynarec_local]
+.if \tab_shift == 0
+ bic r0, r0, #3
+.endif
+.if \tab_shift == 1
+ bic r0, r0, #1
+.endif
+ bic r2, r0, #0x1f800000
+ ldr r12,[fp, #\mem_tab-dynarec_local]
+ subs r3, r2, #0x1000
+ blo 0f
+@ ari_write_io_old \tab_shift
+ cmp r3, #0x880
+ bhs 1f
+ ldr r12,[r12, r3, lsl #\tab_shift]
+ mov r0, r1
+ tst r12,r12
+ bxne r12
+0:
+ ldr r3, [fp, #psxH_ptr-dynarec_local]
+ str\pf r1, [r2, r3]
+ mov pc, lr
+1:
+ cmp r2, #0x1c00
+ blo 0b
+ cmp r2, #0x1e00
+.if \tab_shift != 0
+ ldrlo pc, [fp, #spu_writef-dynarec_local]
+.else
+ @ write32 to SPU - very rare case (is this correct?)
+ bhs 0b
+ add r2, r0, #2
+ mov r3, r1, lsr #16
+ push {r2,r3,lr}
+ mov lr, pc
+ ldr pc, [fp, #spu_writef-dynarec_local]
+ pop {r0,r1,lr}
+ ldr pc, [fp, #spu_writef-dynarec_local]
+.endif
+ nop
+ b 0b
+.endm
+
+ari_write_io8:
+ @ PCSX always writes to psxH, so do we for consistency
+ ldr r0, [fp, #address-dynarec_local]
+ ldr r3, [fp, #psxH_ptr-dynarec_local]
+ ldrb r1, [fp, #byte-dynarec_local]
+ bic r2, r0, #0x1f800000
+ ldr r12,[fp, #tab_write8-dynarec_local]
+ strb r1, [r2, r3]
+ subs r3, r2, #0x1000
+ movlo pc, lr
+@ ari_write_io_old 2
+ cmp r3, #0x880
+ movhs pc, lr
+ ldr r12,[r12, r3, lsl #2]
+ mov r0, r1
+ tst r12,r12
+ bxne r12