AfterBurner/src/horizon.s

95 lines
1.2 KiB
ArmAsm

/* Horizon shader
r0: (temporary)
r1: cmd.dx
r2: cmd.drow
r3: palette
r4: azrp_width
r5: cmd
r6: azrp_frag
r7: azrp_frag_height
r8: cmd.current
r9: a constant
r10: mask for color index access
*/
.global _ab_horizon_shader
.balign 4
_ab_horizon_shader:
/* r4: azrp_width (top 16 bits) | azrp_frag_height (bottom 16 bits)
r5: struct ab_horizon_cmd *cmd
r6: uint16_t *fragment */
mov.l r8, @-r15
add #4, r5
mov.l r9, @-r15
extu.w r4, r7
mov.l @r5+, r1 /* cmd.dx */
shlr16 r4
mov.l @r5+, r2 /* cmd.drow */
add #-2, r6
mov.l @r5+, r3 /* cmd.palette */
nop
mov.l @r5, r8 /* num.current */
nop
mov.l r10, @-r15 /* r10 = 0x1ff (511 colors) */
mov #-1, r10
ldrs 1f
mov #-23, r0
ldre 2f
shld r0, r10
mov.l .round, r9
nop
.row:
ldrc r4
nop
1: add #2, r6
mov r8, r0
add r9, r0
nop
shlr16 r0
nop
and r10, r0
nop
shll r0
mov.w @(r0, r3), r0
mov.w r0, @r6
2: add r1, r8
dt r7
nop
bf.s .row
add r2, r8
/* Update cmd.current for the next fragment */
mov.l r8, @r5
nop
mov.l @r15+, r10
mov.l @r15+, r9
rts
mov.l @r15+, r8
.balign 4
.round:
/* Add 256 and also round up the next unit */
.long 0x01008000