;->s.vtasm
;
;


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 chars00
 IMPORT chars18
 IMPORT vtflashphase
 IMPORT vtcolpal


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



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

 BL extabcon

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




extabcon
 MOV R0,#0
 ADR R1,extab
extlp
 MOV R4,#8
 MOV R5,#&F
 MOV R2,#0
 MOV R6,R0
exlp2
 TST   R6,#&1
 ADDNE R2,R2,R5
 MOV   R5,R5,ASL#4
 MOV   R6,R6,ASR#1
 SUBS  R4,R4,#1
 BNE   exlp2

 STR R2,[R1],#4
 ADD R0,R0,#1
 CMP R0,#256
 BNE extlp

 MOV R15,R14


extab % &400

 DCD &ff,&ff

 


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

tmask2 DCD &FEFEFEFE
tmask0 DCD &FEFE0000



flashphase  DCD 0

tflashflash       ; R0=flashphase 0x8000 or 0x0000
 
 STR R0,flashphase;
 MOV R15,R14



fancyHIS  
; produce fancy character 
; v3 points at char def            
; v1 2nd byte contains style       
; can use v4,v5,v6,sl,ip      ; not sl and ip for dble height hi res
;

 LDR     v6,flashphase
 TST     v1,v6

 BNE     foffHIS

 TST     v1,#&6000
 MOVEQ   pc,lk


 STMFD   sp!,{sl,ip}

 LDR     v6,[v3],#4
 LDR     ip,[v3],#4
 LDR     sl,[v3],#4
 STR     sl,ftabHIS+8
 LDR     v5,[v3],#4
 LDR     sl,[v3]


 TST     v1,#&4000
 BEQ     fnotitHIS    ; italics ?    skew top two bytes of character

 MOV     v4,#&7F

 TST     v6,v4 
 MOVEQ   v4,v4,LSL#8
 TSTEQ   v6,v4
 MOVEQ   v4,v4,LSL#8
 TSTEQ   v6,v4
 MOVEQ   v4,v4,LSL#8
 TSTEQ   v6,v4
 BEQ     fnotword0

 ORR     v4,v4,v4,LSL#8

 AND     v3,v6,v4
 MOV     v3,v3,LSL#1
 BIC     v6,v6,v4
 AND     v3,v3,v4
 ORR     v6,v6,v3

 CMP     v4,#&FE000000
 BNE     fdonetop

 MOV     v4,#&7F
 B       fword1


fnotword0
 MOV     v4,#&7F

 TST     ip,v4 
 MOVEQ   v4,v4,ASL#8
 TSTEQ   ip,v4
 MOVEQ   v4,v4,ASL#8
 TSTEQ   ip,v4
 MOVEQ   v4,v4,ASL#8
 TSTEQ   ip,v4
 BEQ     fdonetop

 ORR     v4,v4,v4,ASL#8

fword1
 AND     v3,ip,v4
 MOV     v3,v3,LSL#1
 BIC     ip,ip,v4
 AND     v3,v3,v4
 ORR     ip,ip,v3



fdonetop
 LDR     v4,tmask2
 AND     v3,v5,v4
 MOV     v3,v3,ASR#1
 AND     v3,v3,v4
 BIC     v5,v5,v4
 ORR     v5,v5,v3

fnotitHIS                   ; not italics
 TST     v1,#&2000          ; underline ?
 ORRNE   sl,sl,#&FF00
 ORRNE   sl,sl,#&00FF

fnotxHIS
 ADR     v3,ftabHIS
 STR     v6,ftabHIS
 STR     ip,ftabHIS+4
 STR     v5,ftabHIS+12
 STR     sl,ftabHIS+16

 LDMFD   sp!,{sl,ip}

 MOV     pc,lk

foffHIS                  ; jump here for characters that are flashed off
 ADR     v3,ftabHIS
 MOV     v4,#0
 STR     v4,ftabHIS
 STR     v4,ftabHIS+4
 STR     v4,ftabHIS+8
 STR     v4,ftabHIS+12
 STR     v4,ftabHIS+16
 MOV     pc,lk

ftabHIS
 DCD 0
 DCD 0
 DCD 0
 DCD 0
 DCD 0




fancyLOS  
; produce fancy character 
; v3 points at char def            
; v1 2nd byte contains style       
; can use v4,v5,v6,sl,ip
;

 LDR     v6,flashphase
 TST     v1,v6

 BNE     foffLOS 

 TST     v1,#&6000
 MOVEQ   pc,lk

 LDR     v6,[v3],#4
 LDR     v5,[v3],#4
 LDR     sl,[v3]

 TST     v1,#&4000
 BEQ     fnotitLOS    ; italics ?    skew top two bytes of character

 MOV     v4,#&FF

 TST     v6,v4 
 MOVEQ   v4,v4,ASL#8
 TSTEQ   v6,v4
 MOVEQ   v4,v4,ASL#8
 TSTEQ   v6,v4
 MOVEQ   v4,v4,ASL#8

 AND     v3,v6,v4
 MOV     v3,v3,LSL#1
 BIC     v6,v6,v4
 AND     v3,v3,v4
 ORR     v6,v6,v3

 LDR     v4,tmask0
 AND     v3,v5,v4
 MOV     v3,v3,LSR#1
 AND     v3,v3,v4
 BIC     v5,v5,v4
 ORR     v5,v5,v3

fnotitLOS                   ; not italics
 TST     v1,#&2000          ; underline ?
 ORRNE   sl,sl,#&FF

fnotxLOS
 ADR     v3,ftabLOS
 STR     v6,ftabLOS
 STR     v5,ftabLOS+4
 STR     sl,ftabLOS+8
 MOV     pc,lk

foffLOS                     ; branch here for characters that are off
 ADR     v3,ftabLOS
 MOV     sl,#0
 STR     sl,ftabLOS
 STR     sl,ftabLOS+4
 STR     sl,ftabLOS+8
 MOV     pc,lk

ftabLOS
 DCD 0
 DCD 0
 DCD 0


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



; 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


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

linelp00S             ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars00    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#3 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyLOS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 LDR v1,=extab
 MOV v4,a2

 LDR    sl,[v3],#4

 AND    lk,sl,#&FF       ; v2=row 0 of character - explode v2
 MOV    lk,lk,ASL#2
 LDR    v2,[v1,lk]
 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF00
 MOV    ip,ip,LSR#6      ; v2=row 1 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    lk,sl,#&FF0000
 MOV    lk,lk,LSR#14     ; v2=row 2 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF000000
 MOV    ip,ip,LSR#22     ; v2=row 3 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 LDR    sl,[v3],#4

 AND    lk,sl,#&FF
 MOV    lk,lk,ASL#2      ; v2=row 4 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 AND    ip,sl,#&FF00
 MOV    ip,ip,LSR#6     ; v2=row 5 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    lk,sl,#&FF0000      
 MOV    lk,lk,LSR#14    ; v2=row 6 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF000000
 MOV    ip,ip,LSR#22    ; v2=row 7 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 LDR    sl,[v3],#4

 AND    lk,sl,#&FF
 MOV    lk,lk,ASL#2      ; v2=row 8 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 ADD    a2,a2,#4         ; move right one posn
 SUBS   a3,a3,#1
 BNE    linelp00S

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



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

linelp18S             ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 18 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 LDR v1,=extab
 MOV v4,a2

 LDR    sl,[v3],#4

 AND    lk,sl,#&FF       ; v2=row 0 of character - explode v2
 MOV    lk,lk,ASL#2
 LDR    v2,[v1,lk]
 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF00
 MOV    ip,ip,LSR#6      ; v2=row 1 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    lk,sl,#&FF0000
 MOV    lk,lk,LSR#14     ; v2=row 2 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF000000
 MOV    ip,ip,LSR#22     ; v2=row 3 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 LDR    sl,[v3],#4

 AND    lk,sl,#&FF
 MOV    lk,lk,ASL#2      ; v2=row 4 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 AND    ip,sl,#&FF00
 MOV    ip,ip,LSR#6     ; v2=row 5 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    lk,sl,#&FF0000      
 MOV    lk,lk,LSR#14    ; v2=row 6 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF000000
 MOV    ip,ip,LSR#22    ; v2=row 7 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 LDR    sl,[v3],#4

 AND    lk,sl,#&FF
 MOV    lk,lk,ASL#2      ; v2=row 8 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF00
 MOV    ip,ip,LSR#6      ; v2=row 9 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    lk,sl,#&FF0000
 MOV    lk,lk,LSR#14     ; v2=row 10 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF000000
 MOV    ip,ip,LSR#22     ; v2=row 11 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 LDR    sl,[v3],#4

 AND    lk,sl,#&FF
 MOV    lk,lk,ASL#2      ; v2=row 12 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 AND    ip,sl,#&FF00
 MOV    ip,ip,LSR#6     ; v2=row 13 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    lk,sl,#&FF0000      
 MOV    lk,lk,LSR#14    ; v2=row 14 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF000000
 MOV    ip,ip,LSR#22    ; v2=row 15 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 LDR    sl,[v3],#4

 AND    lk,sl,#&FF
 MOV    lk,lk,ASL#2      ; v2=row 16 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,lk]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 AND    ip,sl,#&FF00
 MOV    ip,ip,LSR#6      ; v2=row 17 of character - explode v2
 CMP    ip,lk
 LDRNE  v2,[v1,ip]
 ANDNE  v2,v2,v5
 EORNE  v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte


 ADD    a2,a2,#4         ; move right one posn
 SUBS   a3,a3,#1
 BNE    linelp18S

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








; 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

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

 SUB   a4,a4,#4

linelp00D             ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars00    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#3 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyLOS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp200D
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF00
 TST    v1,#&04
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&08
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF00
 TST    v1,#&40
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&80
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 SUBS   lk,lk,#1
 BNE    linelp200D

 ADD    a2,a2,#8         ; move right one posn
 SUBS   a3,a3,#2
 BGT    linelp00D

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







; 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

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

 SUB   a4,a4,#4

linelp18D             ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#18

linelp218D
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF00
 TST    v1,#&04
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&08
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF00
 TST    v1,#&40
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&80
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 SUBS   lk,lk,#1
 BNE    linelp218D

 ADD    a2,a2,#8         ; move right one posn
 SUBS   a3,a3,#2
 BGT    linelp18D

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









; 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


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

 SUB   a4,a4,#4

linelp00DT           ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS       ; BLNE fancyLOS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp200DT
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF00
 TST    v1,#&04
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&08
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF00
 TST    v1,#&40
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&80
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 SUBS   lk,lk,#1
 BNE    linelp200DT

 ADD    a2,a2,#8         ; move right one posn
 SUBS   a3,a3,#2
 BGT    linelp00DT

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







; 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


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

 SUB   a4,a4,#4

linelp00DB           ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS       ; BLNE fancyLOS
 ADD  v3,v3,#9

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp200DB
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF00
 TST    v1,#&04
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&08
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF00
 TST    v1,#&40
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&80
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 SUBS   lk,lk,#1
 BNE    linelp200DB

 ADD    a2,a2,#8         ; move right one posn
 SUBS   a3,a3,#2
 BGT    linelp00DB

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





; 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


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

 SUB   a4,a4,#4

linelp18DT           ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp218DT
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF00
 TST    v1,#&04
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&08
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte
 MOV    ip,v2

 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF00
 TST    v1,#&40
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&80
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    ip,[v4],#4
 STR    v2,[v4],a4


 SUBS   lk,lk,#1
 BNE    linelp218DT

 ADD    a2,a2,#8         ; move right one posn
 SUBS   a3,a3,#2
 BGT    linelp18DT

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






; 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


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

 SUB   a4,a4,#4

linelp18DB           ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2


 TST  v1,#&F000
 BLNE fancyHIS
 ADD  v3,v3,#9


 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp218DB
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF00
 TST    v1,#&04
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&08
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte
 MOV    ip,v2

 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF00
 TST    v1,#&40
 ORRNE  v2,v2,#&FF0000
 TST    v1,#&80
 ORRNE  v2,v2,#&FF000000

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    ip,[v4],#4
 STR    v2,[v4],a4


 SUBS   lk,lk,#1
 BNE    linelp218DB

 ADD    a2,a2,#8         ; move right one posn
 SUBS   a3,a3,#2
 BGT    linelp18DB

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













; 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


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

 SUB   a4,a4,#12

linelp15D            ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars00    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#3 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyLOS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp215D
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&04
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&08
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&40
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&80
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte



 SUBS   lk,lk,#1
 BNE    linelp215D

 ADD    a2,a2,#16        ; move right one posn
 SUBS   a3,a3,#4
 BGT    linelp15D

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







; 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


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

 SUB   a4,a4,#12

linelp23D             ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#18

linelp223D
 LDRB   v1,[v3],#1


 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&04
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&08
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&40
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&80
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte



 SUBS   lk,lk,#1
 BNE    linelp223D

 ADD    a2,a2,#16         ; move right one posn
 SUBS   a3,a3,#4
 BGT    linelp23D

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







; 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


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

 SUB   a4,a4,#12

linelp15DT            ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS       ; BLNE fancyLOS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp215DT
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&04
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&08
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&40
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&80
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte



 SUBS   lk,lk,#1
 BNE    linelp215DT

 ADD    a2,a2,#16         ; move right one posn
 SUBS   a3,a3,#4
 BGT    linelp15DT

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






; 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


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

 SUB   a4,a4,#12

linelp15DB            ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2


 TST  v1,#&F000
 BLNE fancyHIS       ; BLNE fancyLOS
 ADD  v3,v3,#9

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp215DB
 LDRB   v1,[v3],#1

 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&04
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&08
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],#4       ; write char byte


 TST    v1,#&40
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&80
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte



 SUBS   lk,lk,#1
 BNE    linelp215DB

 ADD    a2,a2,#16         ; move right one posn
 SUBS   a3,a3,#4
 BGT    linelp15DB

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






; 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


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

 SUB   ip,a4,#4
 SUB   sl,a4,#12


linelp23DT             ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp223DT
 LDRB   v1,[v3],#1


 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],-ip


 TST    v1,#&04
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&08
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],-ip


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],-ip


 TST    v1,#&40
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&80
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],sl


 SUBS   lk,lk,#1
 BNE    linelp223DT

 ADD    a2,a2,#16         ; move right one posn
 SUBS   a3,a3,#4
 BGT    linelp23DT

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






; 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


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

 SUB   ip,a4,#4
 SUB   sl,a4,#12


linelp23DB             ; for each character to print to sprite

 LDR  v1,[a1],#4

 AND  v2,v1,#&FF
 AND  v3,v1,#&300
 ORR  v2,v2,v3
                     ; point v3 at start of char tab
 LDR  v3,=chars18    ; 9 bytes per character
 ADD  v3,v3,v2,ASL#4 ; point v3 at char
 ADD  v3,v3,v2,ASL#2

 TST  v1,#&F000
 BLNE fancyHIS
 ADD  v3,v3,#9

 AND v5,v1,#&FF000000
 ORR v5,v5,v5,LSR#8
 ORR v5,v5,v5,LSR#16

 AND v6,v1,#&FF0000
 ORR v6,v6,v6,LSL#8
 ORR v6,v6,v6,LSR#16

 MOV    v4,a2

 MOV    lk,#9

linelp223DB
 LDRB   v1,[v3],#1


 TST    v1,#&01
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&02
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],-ip


 TST    v1,#&04
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&08
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],-ip


 TST    v1,#&10
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&20
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],-ip


 TST    v1,#&40
 MOVNE  v2,#&FF
 MOVEQ  v2,#0
 TST    v1,#&80
 ORRNE  v2,v2,#&FF0000
 ORR    v2,v2,v2,ASL#8

 AND    v2,v2,v5
 EOR    v2,v2,v6         ; mask with colours
 STR    v2,[v4],a4       ; write char byte

 STR    v2,[v4],sl


 SUBS   lk,lk,#1
 BNE    linelp223DB

 ADD    a2,a2,#16         ; move right one posn
 SUBS   a3,a3,#4
 BGT    linelp23DB

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


 EXPORT extab
 EXPORT initscr
 EXPORT line00S
 EXPORT line18S
 EXPORT line00D
 EXPORT line18D
 EXPORT line00DT
 EXPORT line00DB
 EXPORT line18DT
 EXPORT line18DB

 EXPORT line15S
 EXPORT line23S
 EXPORT line15D
 EXPORT line23D
 EXPORT line15DT
 EXPORT line15DB
 EXPORT line23DT
 EXPORT line23DB

 EXPORT fancyLOS
 EXPORT fancyHIS



 EXPORT tflashflash





 END
