azuray/azuray/shader_floor.S

116 lines
1.4 KiB
ArmAsm

# TODO: This is currently unused, the floor uses the C shader.
.global _azuray_floor_line
# Parameters:
# vram, floor_x, floor_z, ortho_dir.x
# ortho_dir.z, xlen, 0, color1, color2
# Register allocation:
# r0: (temp)
# r1: (temp)
# r2: color1
# r3: color2
# r4: vram
# r5: floor_x
# r6: floor_z
# r7: ortho_dir.x
# r8: ortho_dir.z
# r9: xlen
# r10: _
# r11: -16 (for num -> int conversion)
# r12: loop counter
_azuray_floor_line:
mov.l r8, @-r15
nop
mov.l r9, @-r15
nop
mov.l r10, @-r15
nop
mov.l @(12, r15), r8
nop
mov.l @(16, r15), r9
nop
mov.l @(20, r15), r10
nop
mov.l @(24, r15), r2
nop
mov.l @(28, r15), r3
nop
mov.l r11, @-r15
mov #-16, r11
# ---
1: mov r5, r0
xor r6, r0
mov r2, r1
shad r11, r0
shlr r0
nop
bf.s 3f
add r7, r5
mov r3, r1
nop
3: mov.w r1, @r4
dt r9
/* Sneaky vram++ */
mov.w @r4+, r0
nop
bf.s 1b
add r8, r6
# ---
bra 4f
nop
# --- alternative loop ending ---
2: dt r9
nop
/* Sneaky vram++ */
add r7, r5
mov.w @r4+, r0
bf.s 1b
add r8, r6
# ---
4: mov.l @r15+, r11
mov.l @r15+, r10
mov.l @r15+, r9
rts
mov.l @r15+, r8
/*
for(int x = 0; x < DWIDTH; x++) {
int wx = floor_x.ifloor();
int wz = floor_z.ifloor();
if((uint)wx < MI.width() && (uint)wz < MI.height()) {
*vram = (wx ^ wz) & 1 ? color2 : color1;
}
floor_x += ortho_dir.x;
floor_z += ortho_dir.z;
vram++;
}
*/