;->s.b
;
;


R0 RN 0
R1 RN 1
R2 RN 2
R3 RN 3
R4 RN 4
R5 RN 5
R6 RN 6
R7 RN 7
R8 RN 8
R9 RN 9
R10 RN 10
R11 RN 11
R12 RN 12
R13 RN 13
R14 RN 14
R15 RN 15
PC  RN 15


a1 RN 0
a2 RN 1
a3 RN 2
a4 RN 3
v1 RN 4
v2 RN 5
v3 RN 6
v4 RN 7
v5 RN 8
v6 RN 9
sl RN 10
fp RN 11
ip RN 12
sp RN 13
lk RN 14
lr RN 14
pc RN 15

f0 FN 0
f1 FN 1
f2 FN 2
f3 FN 3
f4 FN 4
f5 FN 5
f6 FN 6
f7 FN 7





osbyte * 6
OS_Byte * 6
osvduv * 49
osword * 7
xoffch * 19
xonch  * 17
OS_EnterOS * &16
SVC_Mode * 3


 AREA  VTASM1, REL, CODE


; ****************************************************************************
; screen handling code commences at this point 



sum    RN 4
jbig   RN 5
i      RN 6
temp1x RN 7
temp1y RN 8
temp2x RN 9
temp2y RN 10


; xresid(int point,int npoint,int * vec,int * vector);


xresid
 MOV   ip,sp
 STMFD sp!,{v1-v6,sl,fp,ip,lk,pc}
 SUB   fp,ip,#4

 MOV   sum,#0
 MOV   i,a2
 MOV   jbig,#0

xrstart

 ADD   jbig,jbig,a1
xr1
 CMP   jbig,a2
 BLE   xr2
 ADD   a4,a4,#8
 SUB   jbig,jbig,a2
 B     xr1
xr2

 LDMIA a3!,{temp1x,temp1y}
 LDMIA a4 ,{temp2x,temp2y}

 SUB   temp1x,temp1x,temp2x
 MOV   temp1x,temp1x,ASR#6

 MLA   sum,temp1x,temp1x,sum

 SUB   temp1y,temp1y,temp2y
 MOV   temp1y,temp1y,ASR#6

 MLA   sum,temp1y,temp1y,sum


 SUBS  i,i,#1
 BNE   xrstart

 MOV   a1,sum

 LDMEA fp,{v1-v6,sl,fp,sp,pc}



alx  RN 0
aly  RN 1
alcx RN 2
alcy RN 3
arcx RN 4
arcy RN 5
arx  RN 6
ary  RN 7
stk  RN 8
stkl RN 9
vec  RN 10

t1   RN 12
t2   RN 13
ptl  RN 14




scaletab
 CMP   t1,#0
 CMP   t1,#256
 CMP   t1,#512
 CMP   t1,#768
 CMP   t1,#1024
 CMP   t1,#1280
 CMP   t1,#1536
 CMP   t1,#1792
 CMP   t1,#2048

; xsetscale(int x,int y);


xsetscale
 MOV   ip,sp
 STMFD sp!,{v1-v6,sl,fp,ip,lk,pc}
 SUB   fp,ip,#4


 ADR   a3,scaletab
 LDR   a4,[a3,a1,ASL#2]
 STR   a4,s1
 STR   a4,s3

 LDR   a4,[a3,a2,ASL#2]
 STR   a4,s2
 STR   a4,s4

 LDMEA fp,{v1-v6,sl,fp,sp,pc}




; a1 
; a2 
; a3 
; a4 
;
; v1 
; v2 
; v3 
; v4 
;
; first 8 regs, curve a coords
;
; v5 stack pointer
; v6 stack index
;
; lk where we write stuff
; sl
; ip



; int xgencurv(bezier * p,ipoint2 * vector,ipoint2 * veclim)


xgencurv
 MOV   ip,sp
 STMFD sp!,{v1-v6,sl,fp,ip,lk,pc}
 SUB   fp,ip,#4


 ADR   stk ,sspace
 MOV   stkl,stk

 MOV   ptl,a3

 MOV   vec,a2

 MOV   t1 ,a1

 LDMIA t1!,{alx-ary}


gcstart

 CMP   stk,stkl
 BLT   gcexit


 SUBS  t1,alx,arx
 RSBMI t1,t1,#0

s1
 CMP   t1,#512
 BGT   xgst

 SUBS  t1,aly,ary
 RSBMI t1,t1,#0

s2
 CMP   t1,#1024
 BGT   xgst

 SUBS  t1,alcx,arcx
 RSBMI t1,t1,#0

s3
 CMP   t1,#512
 BGT   xgst

 SUBS  t1,alcy,arcy
 RSBMI t1,t1,#0


s4
 CMP   t1,#1024
 BGT   xgst

; points close enough, so unstack

 
 STMIA  vec!,{alx,aly}
 STMIA  vec!,{arx,ary}

 CMP    vec,ptl
 BGE    gcexit

 SUB    stk,stk,#32

 LDMIA  stk,{alx-ary}

 B     gcstart

xgst
                                   ; x coords 
 STR   arx,[stk,#24]
 STR   ary,[stk,#28]


 ADD   t1,arcx,alcx
 MOV   t1,t1,ASR#1

 ADD   t2,arcx,arx
 MOV   t2,t2,ASR#1
 STR   t2,[stk,#16]

 ADD   t2,t2,t1
 MOV   t2,t2,ASR#1
 STR   t2,[stk,#8]

 ADD   alcx,alx,alcx
 MOV   alcx,alcx,ASR#1

 ADD   arcx,t1,alcx
 MOV   arcx,arcx,ASR#1

 ADD   arx,arcx,t2
 MOV   arx,arx,ASR#1

; STR   arx,[stk,#0]

                                   ; y coords
 ADD   t1,alcy,arcy
 MOV   t1,t1,ASR#1

 ADD   t2,arcy,ary
 MOV   t2,t2,ASR#1
 STR   t2,[stk,#20]

 ADD   t2,t2,t1
 MOV   t2,t2,ASR#1
 STR   t2,[stk,#12]

 ADD   alcy,aly,alcy
 MOV   alcy,alcy,ASR#1

 ADD   arcy,t1,alcy
 MOV   arcy,arcy,ASR#1

 ADD   ary,arcy,t2
 MOV   ary,ary,ASR#1

; STR   ary,[stk,#4]

 STMIA  stk,{arx,ary}


 ADD   stk,stk,#32

 B     gcstart


gcexit

; MOV   a1,pt

 MOV   a1,vec

 LDMEA fp,{v1-v6,sl,fp,sp,pc}




sspace % &4000



 EXPORT xresid
 EXPORT xsetscale
 EXPORT xgencurv


 END
