95 lines
1.2 KiB
ArmAsm
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
|