
 ;Realtime sphere raytracing...
.tracer
 ;Load+reset counter
 adr r0,spheres
 ldmia r0,{r1-r3}
 ldr r4,counter
 add r3,r3,#255
.conloop
 add r1,r1,r2,asr #5
 sub r2,r2,r1,asr #5
 add r3,r3,r2,asr #5
 subs r4,r4,#1
 bne conloop
 sub r3,r3,#255
 str r4,counter
 ;recalculate -4ac
 mul r4,r1,r1
 mla r4,r2,r2,r4
 mla r4,r3,r3,r4
 sub r4,r4,#128*128
 mvn r4,r4,lsl #2
 stmia r0,{r1-r4}

 ;Main demo

 adr r13,bss
 ldr r7,sqr
 mov r0,#yres
 str r0,yp
.ray_loopy
 mov r14,#xres
.ray_loopx
 ;ray <<14 - r0-r2
 ldmia r13!,{r0-r2}

 adr r8,spheres
 ldmia r8,{r8-r11}
 ;Calculate sphere intersections..

 ;sphere************************************************
 ;r8-r11 dx,dy,dz,-4c
 ;r7=sqr
 ;b^2-c:
 mul r3,r0,r8
 mla r3,r1,r9,r3
 mla r4,r2,r10,r3
 mvn r4,r4,asr #13
 mlas r3,r4,r4,r11
 ;r3=b^2-4ac
 ;r4=-b
 ;if <0 no intersection
 movlt r3,r0,asr #7
 movlt r4,r1,asr #7
 movlt r5,r2,asr #7
 movlt r0,#0
 movlt r11,#128
 blt planes
 ;square root

 ldr r3,[r7,r3,lsl #2]
 sub r5,r4,r3
 mov r5,r5,asr #1
 ;r5=t
 ;calculate intersection coordinates->surface normal
 mul r3,r5,r0
 mul r11,r5,r1 ;we need to keep y intersection for planes bit..
 mul r5,r2,r5

 ;mvn r6,r8
 ;rsb r3,r6,r3,asr #14
 ;mvn r6,r9
 ;rsb r4,r6,r11,asr #14
 ;mvn r6,r10
 ;rsb r5,r6,r5,asr #14
 add r3,r8,r3,asr #14 ;suprisingly similair in effect... (doh!)
 add r4,r9,r11,asr #14
 add r5,r10,r5,asr #14

 ;r3-r5=normal<<7
 ;now reflect incoming ray from surface
 ;(n.v)
 mvn r0,r0 ;v is pointing away from surface..
 mvn r1,r1
 mvn r2,r2
 mul r6,r0,r3
 mov r6,r6,asr #7
 mul r10,r1,r4
 add r6,r6,r10,asr #7
 mul r10,r2,r5
 add r6,r6,r10,asr #7
 ;r6=n.v<<14
 ;rx=(2*n*n.l)-v
 mul r3,r6,r3
 mov r3,r3,asr #13 ;r3=rx<<7
 sub r3,r3,r0,asr #7
 ;ry=(2*n*n.l)-v
 mul r4,r6,r4
 mov r4,r4,asr #13 ;r4=ry<<7
 sub r4,r4,r1,asr #7
 ;rz=(2*n*n.l)-v
 mul r5,r6,r5
 mov r5,r5,asr #13 ;r5=rz<<7
 sub r5,r5,r2,asr #7
 ;r3-r5=r<<7
 ;calc phong..
 ;load light vectors<<7
 mov r10,#-128
 ;r.l
 mul r1,r8,r3
 mla r1,r9,r4,r1
 mlas r1,r10,r5,r1
 movle r0,#0
 mulgt r0,r1,r1
 movgt r0,r0,asr #14+7
 ;r0=phong
 ;calc plane intersection
 ;plane distance/ry
 mov r11,r11,asr #14
 add r11,r11,#128
.planes
 ;r4=ry
 mov r1,#0
 mov r2,#0
 cmp r4,#0
 movle r6,#&80 ;blue component
 ble noplane
 adr r6,bss+xres*yres*12+sq_max*4+4
 ldr r4,[r6,r4,lsl #2]
 mul r4,r11,r4
 ;r4=t<<14
 mul r3,r4,r3
 mul r5,r4,r5
 ;r3-r5=intersection x+y coords <<14+7
 mov r3,r3,asr #14+7+7
 mov r5,r5,asr #14+7+7
 and r3,r3,#1
 and r5,r5,#1
 add r3,r3,r5,lsl #1
 cmp r3,#0
 moveq r1,#&c0
 cmp r3,#1
 moveq r2,#&c0
 cmp r3,#2
 moveq r2,#&c0
 cmp r3,#3
 moveq r1,#&c0
 subs r1,r1,r4,asr #16
 movlt r1,#0
 subs r2,r2,r4,asr #16
 movlt r2,#0
 mov r6,#0
.noplane
 add r1,r0,r1
 cmp r1,#255
 movgt r1,#255
 add r2,r0,r2
 cmp r2,#255
 movgt r2,#255
 add r3,r0,r6
 cmp r3,#255
 movgt r3,#255
 orr r1,r1,r2,lsl #8
 orr r1,r1,r3,lsl #16

.plot
 mov r2,r1
 add r3,r12,#320*4
 stmia r3,{r1-r2}
 stmia r12!,{r1-r2}
 ;
 subs r14,r14,#1
 bne ray_loopx
 add r12,r12,#320*4
 ldr r0,yp
 subs r0,r0,#1
 str r0,yp
 bne ray_loopy

 ldr r1,work
 subs r1,r1,#1
 moveq r1,#3
 str r1,work

 b main_loop

.spheres
 dcd 100
 dcd 100
 dcd -300
 dcd 0


.yp
 dcd 0
