;->s.vxasm2
;
;


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


 IMPORT vxchars00
 IMPORT vxchars18

 IMPORT vxcolpal


 IMPORT vxfancylores
 IMPORT vxfancyhires


;****************************************************************************


flashphase  DCD 0

vxflashflash2       ; R0=flashphase 0x1000 or 0x0000
 
 STR R0,flashphase;
 MOV R15,R14







; a1 pointer to data in memory
; a2 pointer to destination of bit map
; a3 number of characters to output
; a4 width  of sprite in bytes
;
; v1 char word
; v2 temp
; v3 character defn.
; v4 where we write output bytes
; v5 colour
; v6 colour

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

 SUB   ip,a4,#4
 MOV   sp,a4
 SUB   a4,a4,#20

                     ; sl is free

lp169090S1           ; for each character to print to sprite

 LDR   v1,[a1],#4

 AND   v2,v1,#&FF     ; get number of character in v2
 AND   v3,v1,#&100
 ORR   v2,v2,v3

                     ; point v3 at start of char tab
 LDR   v3,=vxchars18  ; 40 bytes per character
 ADD   v3,v3,v2,ASL#5 ; point v3 at char
 ADD   v3,v3,v2,ASL#3

 LDR   v6,flashphase
 TST   v1,v6
 ADRNE v3,nullchar2
 BNE   l169090Srx

 TST   v1,#&E000
 BLNE  vxfancyhires 

l169090Srx

 MOV v6,v1,LSR#14    ; background colour
 AND v6,v6,#&3C

 MOV v5,v1,LSR#22    ; background ^ forground 
 AND v5,v5,#&3C
 EOR v5,v5,v6        ; forground colour

 LDR v4,=vxcolpal
 LDR v5,[v4,v5]
 LDR v6,[v4,v6]



 MOV    v4,a2

 MOV    lk,#10

 TST    v1,#&400
 BNE    lp169090ST
 TST    v1,#&800
 BNE    lp169090SB

lp169090S2
 LDR    v1,[v3],#4


 TST    v1,#&01                   ; 4
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&02
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4

 TST    v1,#&04
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&08
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4



 TST    v1,#&10                   ; 8
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4

 TST    v1,#&40
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4



 TST    v1,#&1000                 ; 12
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&2000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4

 TST    v1,#&4000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&8000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],a4                ; skip down one row



 TST    v1,#&10000                ; 4
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4
                 
 TST    v1,#&40000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4


 TST    v1,#&100000               ; 8
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&200000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4
                 
 TST    v1,#&400000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&800000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4




 TST    v1,#&10000000             ; 12
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20000000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4
                 
 TST    v1,#&40000000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80000000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],a4



 SUBS   lk,lk,#1
 BNE    lp169090S2

 ADD    a2,a2,#24        ; move right one posn
 SUBS   a3,a3,#4
 BGT    lp169090S1

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





lp169090SB               ; bottom of character

 ADD    v3,v3,#20


lp169090ST
 LDR    v1,[v3],#4       ; +sp, -ip


 TST    v1,#&01                   ; 4
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&02
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip

 TST    v1,#&04
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&08
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip



 TST    v1,#&10                   ; 8
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip

 TST    v1,#&40
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip



 TST    v1,#&1000                 ; 12
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&2000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip

 TST    v1,#&4000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&8000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],a4                ; skip down one row



 TST    v1,#&10000                ; 4
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip
                 
 TST    v1,#&40000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip


 TST    v1,#&100000               ; 8
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&200000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip
                 
 TST    v1,#&400000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&800000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip



 TST    v1,#&10000000             ; 12
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20000000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],-ip
                 
 TST    v1,#&40000000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80000000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],sp
 STR    v2,[v4],a4



 SUBS   lk,lk,#2
 BNE    lp169090ST

 ADD    a2,a2,#24        ; move right one posn
 SUBS   a3,a3,#4
 BGT    lp169090S1

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





nullchar2
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0






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

 SUB   ip,a4,#4
 MOV   sp,a4
 SUB   a4,a4,#20

                     ; sl is free

lp169045S1           ; for each character to print to sprite

 LDR   v1,[a1],#4

 AND   v2,v1,#&FF     ; get number of character in v2
 AND   v3,v1,#&100
 ORR   v2,v2,v3


 TST   v1,#&FE00      ; was FF
 BEQ   lf169045S

 LDR   v6,flashphase
 TST   v1,v6
 ADRNE v3,nullchar2
 BNE   l169045Srx

 TST   v1,#&C00
 BEQ   lf169045S

                      ; point v3 at start of char tab
 LDR   v3,=vxchars18  ; 40 bytes per character
 ADD   v3,v3,v2,ASL#5 ; point v3 at char
 ADD   v3,v3,v2,ASL#3


 TST   v1,#&E000
 BLNE  vxfancyhires 

 TST   v1,#&800
 ADDNE v3,v3,#20
 B     l169045Srx

lf169045S            ; come here if character not fancy
                     ; point v3 at start of char tab
 LDR  v3,=vxchars00  ; 20 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST   v1,#&E000
 BLNE  vxfancylores 

l169045Srx

 MOV v6,v1,LSR#14    ; background colour
 AND v6,v6,#&3C

 MOV v5,v1,LSR#22    ; background ^ forground 
 AND v5,v5,#&3C
 EOR v5,v5,v6        ; forground colour

 LDR v4,=vxcolpal
 LDR v5,[v4,v5]
 LDR v6,[v4,v6]


 MOV    v4,a2

 MOV    lk,#5


lp169045S2
 LDR    v1,[v3],#4


 TST    v1,#&01                   ; 4
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&02
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4

 TST    v1,#&04
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&08
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4



 TST    v1,#&10                   ; 8
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4

 TST    v1,#&40
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4



 TST    v1,#&1000                 ; 12
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&2000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4

 TST    v1,#&4000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&8000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],a4                ; skip down one row



 TST    v1,#&10000                ; 4
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4
                 
 TST    v1,#&40000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4


 TST    v1,#&100000               ; 8
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&200000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4
                 
 TST    v1,#&400000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&800000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4




 TST    v1,#&10000000             ; 12
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&20000000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],#4
                 
 TST    v1,#&40000000
 MOVNE  v2,v5
 MOVEQ  v2,v6
 TST    v1,#&80000000
 ORRNE  v2,v2,v5,ASL#16
 ORREQ  v2,v2,v6,ASL#16
 STR    v2,[v4],a4



 SUBS   lk,lk,#1
 BNE    lp169045S2

 ADD    a2,a2,#24        ; move right one posn
 SUBS   a3,a3,#4
 BGT    lp169045S1

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














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

 SUB   ip,a4,#4
 MOV   sp,a4
 SUB   a4,a4,#44

                     ; sl is free

lp329090S1           ; for each character to print to sprite

 LDR   v1,[a1],#4

 AND   v2,v1,#&FF     ; get number of character in v2
 AND   v3,v1,#&100
 ORR   v2,v2,v3

                     ; point v3 at start of char tab
 LDR   v3,=vxchars18  ; 40 bytes per character
 ADD   v3,v3,v2,ASL#5 ; point v3 at char
 ADD   v3,v3,v2,ASL#3

 LDR   v6,flashphase
 TST   v1,v6
 ADRNE v3,nullchar3
 BNE   l329090Srx

 TST   v1,#&E000
 BLNE  vxfancyhires 

l329090Srx

 MOV v6,v1,LSR#14    ; background colour
 AND v6,v6,#&3C

 MOV v5,v1,LSR#22    ; background ^ forground 
 AND v5,v5,#&3C
 EOR v5,v5,v6        ; forground colour

 LDR v4,=vxcolpal
 LDR v5,[v4,v5]
 LDR v6,[v4,v6]



 MOV    v4,a2

 MOV    lk,#10

 TST    v1,#&400
 BNE    lp329090ST
 TST    v1,#&800
 BNE    lp329090SB

lp329090S2
 LDR    v1,[v3],#4


 TST    v1,#&01                   ; 1
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&02                   ; 2
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&04                   ; 3
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&08                   ; 4
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&10                   ; 5
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&20                   ; 6
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&40                   ; 7
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&80                   ; 8
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4





 TST    v1,#&1000                 ; 9
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&2000                 ; 10
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&4000                 ; 11
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&8000                 ; 12
 STRNE  v5,[v4],a4
 STREQ  v6,[v4],a4                ; skip down one row





 TST    v1,#&10000                ; 1
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&20000                ; 2
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&40000                ; 3
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&80000                ; 4
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&100000               ; 5
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&200000               ; 6
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&400000               ; 7
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&800000               ; 8
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4




 TST    v1,#&10000000                 ; 9
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&20000000                 ; 10
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&40000000                 ; 11
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&80000000                 ; 12
 STRNE  v5,[v4],a4
 STREQ  v6,[v4],a4                    ; skip down one row




 SUBS   lk,lk,#1
 BNE    lp329090S2

 ADD    a2,a2,#48        ; move right one posn
 SUBS   a3,a3,#8
 BGT    lp329090S1

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





lp329090SB               ; bottom of character

 ADD    v3,v3,#20


lp329090ST
 LDR    v1,[v3],#4       ; +sp, -ip



 TST    v1,#&01                   ; 1
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&02                   ; 2
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&04                   ; 3
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&08                   ; 4
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&10                   ; 5
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&20                   ; 6
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip

 TST    v1,#&40                   ; 7
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&80                   ; 8
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip





 TST    v1,#&1000                 ; 9
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&2000                 ; 10
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&4000                 ; 11
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&8000                 ; 12
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],a4
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],a4                ; skip down one row





 TST    v1,#&10000                ; 1
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip



 TST    v1,#&20000                ; 2
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&40000                ; 3
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&80000                ; 4
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&100000               ; 5
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&200000               ; 6
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&400000               ; 7
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip


 TST    v1,#&800000               ; 8
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip




 TST    v1,#&10000000                 ; 9
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip

 TST    v1,#&20000000                 ; 10
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip

 TST    v1,#&40000000                 ; 11
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],-ip
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],-ip

 TST    v1,#&80000000                 ; 12
 STRNE  v5,[v4],sp
 STRNE  v5,[v4],a4
 STREQ  v6,[v4],sp
 STREQ  v6,[v4],a4                    ; skip down one row




 SUBS   lk,lk,#2
 BNE    lp329090ST

 ADD    a2,a2,#48        ; move right one posn
 SUBS   a3,a3,#8
 BGT    lp329090S1

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







nullchar3
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0





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

 SUB   ip,a4,#4
 MOV   sp,a4
 SUB   a4,a4,#44

                     ; sl is free

lp329045S1           ; for each character to print to sprite

 LDR   v1,[a1],#4

 AND   v2,v1,#&FF     ; get number of character in v2
 AND   v3,v1,#&100
 ORR   v2,v2,v3


 TST   v1,#&FE00      ; was FF
 BEQ   lf329045S

 LDR   v6,flashphase
 TST   v1,v6
 ADRNE v3,nullchar3
 BNE   l329045Srx

 TST   v1,#&C00
 BEQ   lf329045S

                      ; point v3 at start of char tab
 LDR   v3,=vxchars18  ; 40 bytes per character
 ADD   v3,v3,v2,ASL#5 ; point v3 at char
 ADD   v3,v3,v2,ASL#3


 TST   v1,#&E000
 BLNE  vxfancyhires 

 TST   v1,#&800
 ADDNE v3,v3,#20
 B     l329045Srx

lf329045S            ; come here if character not fancy
                     ; point v3 at start of char tab
 LDR  v3,=vxchars00  ; 20 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST   v1,#&E000
 BLNE  vxfancylores 

l329045Srx

 MOV v6,v1,LSR#14    ; background colour
 AND v6,v6,#&3C

 MOV v5,v1,LSR#22    ; background ^ forground 
 AND v5,v5,#&3C
 EOR v5,v5,v6        ; forground colour

 LDR v4,=vxcolpal
 LDR v5,[v4,v5]
 LDR v6,[v4,v6]


 MOV    v4,a2

 MOV    lk,#5


lp329045S2
 LDR    v1,[v3],#4


 TST    v1,#&01                   ; 1
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&02                   ; 2
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&04                   ; 3
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&08                   ; 4
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&10                   ; 5
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&20                   ; 6
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&40                   ; 7
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&80                   ; 8
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4





 TST    v1,#&1000                 ; 9
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&2000                 ; 10
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&4000                 ; 11
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&8000                 ; 12
 STRNE  v5,[v4],a4
 STREQ  v6,[v4],a4                ; skip down one row





 TST    v1,#&10000                ; 1
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&20000                ; 2
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&40000                ; 3
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&80000                ; 4
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&100000               ; 5
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&200000               ; 6
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&400000               ; 7
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4


 TST    v1,#&800000               ; 8
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4




 TST    v1,#&10000000                 ; 9
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&20000000                 ; 10
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&40000000                 ; 11
 STRNE  v5,[v4],#4
 STREQ  v6,[v4],#4

 TST    v1,#&80000000                 ; 12
 STRNE  v5,[v4],a4
 STREQ  v6,[v4],a4                    ; skip down one row




 SUBS   lk,lk,#1
 BNE    lp329045S2

 ADD    a2,a2,#48        ; move right one posn
 SUBS   a3,a3,#8
 BGT    lp329045S1

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











 EXPORT vxline329090S
 EXPORT vxline329045S
 EXPORT vxline169090S
 EXPORT vxline169045S

 EXPORT vxflashflash2


 END
