-.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
- mov pc, lr
-
-ari_write_io16:
- ari_write_io h, hword, tab_write16, 1
-
-ari_write_io32:
- ari_write_io , word, tab_write32, 0
+rcnt0_read_count_m0:
+ rcntx_read_mode0 0
+
+rcnt1_read_count_m0:
+ rcntx_read_mode0 1
+
+rcnt2_read_count_m0:
+ rcntx_read_mode0 2
+
+rcnt0_read_count_m1:
+ /* r0 = address, r2 = cycles */
+ ldr r3, [fp, #rcnts-dynarec_local+6*4+7*4*0] @ cycleStart
+ mov_16 r1, 0x3334
+ sub r2, r2, r3
+ mul r0, r1, r2 @ /= 5
+ lsr r0, #16
+ bx lr
+
+rcnt1_read_count_m1:
+ /* r0 = address, r2 = cycles */
+ ldr r3, [fp, #rcnts-dynarec_local+6*4+7*4*1]
+ mov_24 r1, 0x1e6cde
+ sub r2, r2, r3
+ umull r3, r0, r1, r2 @ ~ /= hsync_cycles, max ~0x1e6cdd
+ bx lr
+
+rcnt2_read_count_m1:
+ /* r0 = address, r2 = cycles */
+ ldr r3, [fp, #rcnts-dynarec_local+6*4+7*4*2]
+ mov r0, r2, lsl #16-3
+ sub r0, r3, lsl #16-3
+ lsr r0, #16 @ /= 8
+ bx lr