 ;-----------------------------\
 ;escape 4k demo                 \
 ;made for code craft contest      \
 ;code - tom/kulture 1999            \
 ;------------------------------------ \

 ;cube------------------------------------------------------------------|

 ;setup addresses
 ldr r12,free
 ldr r11,div
 ;ldr r10,texture
 ldr r10,bump
 ;
 adr r7,lc
 ldmia r7,{r7-r8}
 sub r7,r7,#512
 sub r8,r8,#512

 mov r14,#yres
 str r14,c_ycount
.cube_yloop
 ldr r14,env
 adr r3,oc
 stmia r3,{r0-r2}
 mov r13,#xres
.cube_xloop

 ;r14=yp
 ;r13=xp
 ;r12=screen
 ;r11=div
 ;r10=texture
 ;r9=ez
 ;r8=lz
 ;r7=lx
 ;---------------------
 ;r0-x r1-y (eg 160,128) r2-z (256 length)
 ;---------------------------------------
 eor r3,r0,r0,asr #31
 eor r4,r1,r1,asr #31
 eor r5,r2,r2,asr #31

 ;x>?
 cmp r3,r4
 cmpge r3,r5
 movge r3,r1,asr #14
 movge r4,r2,asr #14
 movge r5,r0,asr #14
 bge do_it
 ;y>
 cmp r4,r3
 cmpge r4,r5
 movge r3,r4
 movge r3,r0,asr #14
 movge r4,r2,asr #14
 movge r5,r1,asr #14
 bge do_it
 ;z>
 cmp r5,r3
 cmpge r5,r4
 movge r3,r5
 movge r3,r0,asr #14
 movge r4,r1,asr #14
 movge r5,r2,asr #14
.do_it
 eor r5,r5,r5,asr #31
 cmp r5,#16
 movle r4,#0
 ble cube_plot
 ;load from division table
 ldr r5,[r11,r5,lsl #2]
 ;r5=t<<14
 ;--------
 ;find coords given dx,dz,t
 mul r3,r5,r3
 mul r4,r5,r4
 mov r3,r3,asr #14-6
 mov r4,r4,asr #14-6
 ;r3=x r4=z

 ;caclulate light distance from x/z hit...
 sub r5,r3,r7
 sub r6,r4,r8
 ;load bump direction...
 and r3,r3,#63
 and r4,r4,#63
 add r3,r3,r4,lsl #6
 ldr r3,[r10,r3,lsl #2]

 mov r4,r3,asr #8 ;z
 and r3,r3,#&ff ;x

 adds r3,r3,r5,asr #1
 movlt r3,#0
 adds r4,r4,r6,asr #1
 movlt r4,#0
 cmp r3,#127
 movgt r3,#127
 cmp r4,#127
 movgt r4,#127

 add r3,r3,r4,lsl #7

 ldrb r4,[r14,r3]

.cube_plot
 strb r4,[r12],#1

 ;move pixel on virtual screen +loop
 adr r3,vx
 ldmia r3,{r3-r5}
 add r0,r0,r3
 add r1,r1,r4
 add r2,r2,r5
 subs r13,r13,#1
 bne cube_xloop

 ;reload old x coordinate
 adr r0,oc
 ldmia r0,{r0-r2}
 ;move pixel on v screen down
 adr r3,vy
 ldmia r3,{r3-r5}
 add r0,r0,r3
 add r1,r1,r4
 add r2,r2,r5
 ldr r14,c_ycount
 subs r14,r14,#1
 str r14,c_ycount
 bne cube_yloop

 b interpolate

.c_ycount
 dcd 0
