/* 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