;> Command
APPEND BL AEEXPR
 BL OSSTRI
 BL AEDONE
 LDR R0,[ARGP,#PAGE]
 MOV R2,#0
APPENDNO LDRB R3,[R0,#1]
 CMP R3,#&FF
 LDRNEB R3,[R0,#3]
 MOVNE R2,R0
 ADDNE R0,R0,R3
 BNE APPENDNO
 LDRB R3,[R2,#1]
 LDRB R0,[R2,#2]
 ORR R7,R0,R3,LSL #8
 TEQ R2,#0
 MOVEQ R7,#10
 LDR LINE,[ARGP,#TOP]
 SUB R2,LINE,#2
 BL OSFILELOAD
 BL ENDER
 [ FP=0
 MOV FACC,R7
 BL IFLT
 MOV FGRD,#0
 BL FTENFQ
 BL FTENFQ
 BL SFIX
 |
 FLTD FACC,R7
 DVFD FACC,FACC,#10
 DVFD FACC,FACC,#10
 FIXDZ IACC,FACC
 ]
 ADD IACC,IACC,#1
 RSB R4,IACC,IACC,LSL #2 ;5
 ADD R4,IACC,R4,LSL #3 ;2
 MOV R4,R4,LSL #2 ;3
 SUB R0,LINE,#2
 MOV R5,#10
 BL RENUM2
 B FSASET
AUTO BL GETTWO
 BL ENDER
00 STMFD SP!,{R4,R5}
 MOV R0,R4
 MOV TYPE,#0
 BL NPRN
 BL INLINE
 BL AUMATCH
 LDR R4,[SP]
 ADD LINE,ARGP,#OUTPUT
 BL INSRT
 BL SETFSA
 LDMFD SP!,{R4,R5}
 ADD R4,R4,R5
 CMP R4,#65280
 BCC %B00
 B FSASET
GETTWO STMFD SP!,{R14}
 MOV R0,#10
 BL SPTSTN
 SUBNE LINE,LINE,#1 ;if not found go backwards
 MOV R4,R0 ;start
 MOV R0,#10
 BL SPACES
 CMP R10,#","
 BNE NO
 BL SPTSTN
 BLEQ SPACES
NO BL DONE
 MOVS R5,R0 ;step
 LDMNEFD SP!,{PC}
 B ERSILL
CRUNCH BL AEEXDN
 LDR R1,[ARGP,#PAGE]
 BL CRUNCHROUTINE
 STR R2,[ARGP,#TOP]
 B FSASET
DELETE BL SPTSTN
 BNE ERSYNT
 MOV R4,R0
 BL SPACES
 CMP R10,#","
 BNE ERCOMM
 BL SPTSTN
 BNE ERSYNT
 MOV R5,R0
 BL REMOVE
 B FSASET
HELP BL SPACES
 BL LEXTABADR ;R2=Lexical Table
 SUB R0,LINE,#1 ;R1=characters to interpret
 ADR R1,HELPNAME
 SWI BASICTrans_HELP
 ADR LINE,HELPTXT
 CMP R1,#0
 BNE STMT
 B CLRSTK
HELPNAME
 = "$Name.",0
HELPTXT = "!(",THIMEM,"-4)=@%:",TPRINT,""""
 = "ARM BBC BASIC V"
 [ FP=1
 = "I (64 bit fp)"
 ]
 = " assembled on $CurrentDate.."":"
 = TESCSTMT,TSYS,"&62c82,25,",TTO,"P-",TPAGE,",",TEND,"-",TLOMEM,",",THIMEM,"-",TEND,TTO,";@%:"

 = TIF,"@%",TAND,"1:@%=&900:",TPRINT,"""The program size is """,TTO,"P-",TPAGE,""" bytes,"
 = " the variables use """,TEND,"-",TLOMEM,""" bytes.""'"
 = """There are """,THIMEM,"-",TEND,""" bytes of memory remaining.""",13,0,0,0
 = "@%=!(",THIMEM,"-4):",TEND,13
 ALIGN
INSTALL LDR R0,[ARGP,#HIMEM]
 LDR R1,[ARGP,#MEMLIMIT]
 CMP R0,R1
 BNE ERINSTALL
 BL LIBSUB
 LDR R1,[ARGP,#MEMLIMIT]
 SUB R1,R1,R4
 LDR R0,[ARGP,#INSTALLLIST]
 STR R0,[R1,#-4]!
 STR R1,[ARGP,#MEMLIMIT]
 STR R1,[ARGP,#HIMEM]
 STR R1,[ARGP,#INSTALLLIST]
INSTALLCOPY LDR R0,[R2,#4]!
 STR R0,[R1,#4]!
 SUBS R4,R4,#4
 BHI INSTALLCOPY
 B CLRSTK
LOAD BL LOADER
 B FSASET
TEXTLOAD BL AEEXPR
 BL OSSTRI
 BL AEDONE
 BL LOADFILEFINAL
 B FSASET
LOADFILEFINAL MOV R0,#5
 ADD R1,ARGP,#STRACC
 SWI FILE
 SUB R7,SP,#1024
 CMP R0,#1
 SUBEQ R7,R7,R4
 LDR R2,[ARGP,#PAGE]
 ADD R2,R2,#256 ;if getting tight on memory, don't want to leave too much
 CMP R2,R7
 MOVCS R7,R2
 MOV R2,R7
 MOV R3,#0
 MOV R0,#&FF
 SWI FILE
 MOV R0,#13
 LDR R1,[ARGP,#PAGE]
 STRB R0,[R1],#1
 MOV R0,#&FF
 STRB R0,[R1],#1 ;post index to get value for TOP
 STR R1,[ARGP,#TOP]
 MOV R1,R7 ;start (duplicate)
 ADD R5,R1,R4 ;finish
;major entry point for incore files
;check to see if valid tokenised file
;R1=R7 start; R5=END
LOADFILEINCORE LDRB R6,[R7]
 TEQ R6,#13
 BNE LOADFILE0
 LDRB R6,[R7,#1]
 CMP R6,#&FF
 BEQ LOADFILETOKENCOPY ;initial file is in internal form: copy to right place
 LDRB R6,[R7,#3]
 CMP R6,#4 ;reality check for offset
 ADDCS R7,R7,R6
 BCS LOADFILEINCORE
;failed to verify as tokenised. Lexically analyse from R1 to R5
LOADFILE0 MOV R4,#9 ;initial line number
 STMFD SP!,{R14}
 BIC R9,R9,#1 ;clear bottom bit
LOADFILEENTRY STMFD SP!,{R4,R5}
 BL MATCH
 LDMFD SP!,{R4} ;pop line number
 STMFD SP!,{R1} ;push address in source
 ADD LINE,ARGP,#OUTPUT
 BL SPTSTN
 BEQ LOADFILEENTRYLINE ;has number
 ORR R9,R9,#1 ;needs renumber
 ADD LINE,ARGP,#OUTPUT
 BL INSERT ;put at current end of text with current line number
 B LOADFILEENTRYDONE
LOADFILEENTRYLINE MOV R4,R0
 BL INSRT
LOADFILEENTRYDONE LDMFD SP!,{R1,R5}
 CMP R1,R5
 BCC LOADFILEENTRY
 TST R9,#1
 LDMEQFD SP!,{PC}
 MOV R4,#10
 MOV R5,#10
 BL RENUM1
 MOV R0,#7
 SWI BASICTrans_Message
 LDMVCFD SP!,{PC}
 SWI WRITES
 = "Program renumbered",10,13,0
 LDMFD SP!,{PC}
LOADFILETOKENCOPY LDR R0,[ARGP,#PAGE]
 ANDS R2,R1,#3 ;word mask
 BEQ LOADFILEFCOPYALIGN
 MOV R2,R2,LSL #3
 RSB R3,R2,#32
LOADFILEFCOPYMIS BIC R6,R1,#3
 LDMIA R6,{R6,R7}
 MOV R6,R6,LSR R2
 ORR R6,R6,R7,LSL R3
 STR R6,[R0],#4
 ADD R1,R1,#4
 CMP R1,R5
 BCC LOADFILEFCOPYMIS
 B ENDER
LOADFILEFCOPYALIGN LDR R7,[R1],#4
 STR R7,[R0],#4
 CMP R1,R5
 BCC LOADFILEFCOPYALIGN
 B ENDER
LOADER STMFD SP!,{R14}
 BL AEEXPR
 BL OSSTRI
 BL AEDONE
 BL OSFILEINFO
 LDR R2,[ARGP,#PAGE]
 CMP R0,#1
 BNE LOADER1
 ADD R4,R4,#3
 BIC R4,R4,#3
 ADD R4,R2,R4
 LDR R3,[ARGP,#HIMEM]
 SUB R3,R3,#20*4
 CMP R4,R3
 BCS CANTLOAD
LOADER1 BL OSFILELOAD
 LDMFD SP!,{R14}
ENDER LDR R0,[ARGP,#PAGE]
FNDTOP LDRB R1,[R0]
 CMP R1,#13
 BNE BADPRO
 LDRB R1,[R0,#1]
 CMP R1,#&FF
 BEQ SETTOP
 LDRB R1,[R0,#3]
 CMP R1,#4
 ADDCS R0,R0,R1
 BCS FNDTOP
BADPRO MOV R0,#8
 SWI BASICTrans_Message
 BVC CLRSTK
 SWI WRITES
 = 13,10,"Bad program",10,13,0
 B CLRSTK
SETTOP ADD R0,R0,#2
 STR R0,[ARGP,#TOP]
 MOV PC,R14
;print r0 in decimal, uses r4, r1. No limit on size of r0
CARDINALPRINT MOV R4,#0
 STMFD SP!,{R14,R5,R6,R2,R3}
 MOV R3,#9
 B PRNCOMMON
;print r0 in decimal
;uses r4,r1
POSITE MOV R4,#0
 B PRN
NPRN MOV R4,#5
PRN STMFD SP!,{R14,R5,R6,R2,R3}
 MOV R3,#4
PRNCOMMON MOV R1,R0
 ADR R5,VALUES
NUMLOP MOV R0,#"0"
 LDR R6,[R5,R3,LSL #2]
00 SUBS R1,R1,R6
 ADDCS R0,R0,#1
 BCS %B00
 ADD R1,R1,R6
 CMP R0,#"0"
 MOVNE R4,#1
 TEQ R4,#1
 TEQNE R3,#0
 BEQ NUMLPA
 TEQ R4,#0
 BEQ NUMLPB
 MOV R0,#" "
NUMLPA BL CHOUT ;warning TYPE, R7 used
NUMLPB SUBS R3,R3,#1
 BCS NUMLOP
 LDMFD SP!,{PC,R5,R6,R2,R3}
VALUES & 1
 & 10
 & 100
 & 1000
 & 10000 ;numbers <=99999
 & 100000
 & 1000000
 & 10000000
 & 100000000
 & 1000000000
SPCSWC MOV TYPE,#0
;Print r0 spaces
SPCOUT STMFD SP!,{R14,R1}
 TEQ R0,#0
 LDMMIFD SP!,{R1,PC}
 ANDS R1,R0,#255
 LDMEQFD SP!,{R1,PC}
 MOV R0,#" "
SPCLOP BL CHOUT
 SUBS R1,R1,#1
 BNE SPCLOP
 LDMFD SP!,{R1,PC}
CHOUTNOCOUNT TST R7,#128
 BEQ CHOUTS1
CHOUT TST R7,#128
 BEQ CHOUTS
 CMP TYPE,#&8000
 BCC CHOUTS
 BEQ CHOUTTRACE
 STRB R0,[TYPE],#1
 CMP TYPE,SP
 MOVCC PC,R14
 MOV R0,#9
 SWI BASICTrans_Message
 BVC FSASET
 SWI WRITES
 = 10,13,"Not enough room to convert this program to text",10,13,0
 B FSASET
CHOUTTRACE STMFD SP!,{R0,R1}
 LDR R1,[ARGP,#TRACEFILE]
 TEQ R1,#0
 BEQ CHOUTS2
 SWI BPUT+&20000 ;xosbput
 LDMVCFD SP!,{R0,R1}
 MOVVC PC,R14
 MOV R0,#0
 STR R0,[ARGP,#TRACEFILE]
 SWI OPEN+&20000 ;xosfind=close
 LDMFD SP!,{R0,R1}
 MOV PC,R14
CHOUTS STMFD SP!,{R0,R1}
CHOUTS2 LDR R0,[ARGP,#WIDTHLOC]
 LDR R1,[ARGP,#TALLY]
 CMP R0,R1
 MOVCC R1,#0
 SWICC NEWLINE
 ADD R1,R1,#1
 STR R1,[ARGP,#TALLY]
 LDMFD SP!,{R0,R1}
CHOUTS1 SWI WRITEC
 MOV PC,R14
EDIT BL OSCLIREGS
 ADR R0,EDITTXT
 SWI CLI
 LDR R0,[ARGP,#TOP]
 CMP R0,#0
 BPL CLRSTK
 BIC R0,R0,#&80000000
 STR R0,[ARGP,#TOP]
 B FSASET
EDITTXT = "ARMBE",0
 ALIGN
LIST LDRB R7,[ARGP,#LISTOP]
 LDRB R0,[LINE]
 CMP R0,#"O"
 BNE LISTGO
 ADDEQ LINE,LINE,#1
 BL AEEXDN
 CMP IACC,#32
 BCS ERLISTO
 STRB IACC,[ARGP,#LISTOP]
 B CLRSTK
TEXTSAVE MOV R0,#64+128
 MOV AELINE,LINE
 LDRB R10,[AELINE]
 CMP R10,#"O"
 BNE TEXTSAVEGO
 ADDEQ AELINE,AELINE,#1
 BL INTEXC
 ORR R0,R0,#64+128
TEXTSAVEGO STMFD SP!,{R0}
 BL EXPR
 BL OSSTRI
 BL AEDONE
 LDMFD SP!,{R7}
 B TWINGO
TWIN MOV R7,#&80
 BL DONES
 B TWINGO
TWINO BL AEEXDN
 CMP IACC,#16
 BCS ERTWINO
 ORR R7,IACC,#&80
TWINGO BL SETFSA ;init fsa to top
 SUB LINE,LINE,#1
 CMP R10,#13
 BNE ERSYNT
LISTGO MOV R4,#0 ;start 0
 MOV R5,#&FF
 ORR R5,R5,#&FE00 ;end 65279
 BL SPTSTN ;check for possible start
 BNE NONUML ;no start given
 MOV R4,R0 ;start at this line
 BL SPACES
 CMP R10,#","
 BEQ GOTCX ;followed by something
 MOV R5,R4 ;followed by nothing: set end to start
 B GOTCFF
NONUML CMP R10,#","
 BNE GOTCFF ;no number, no comma, could be IF
GOTCX BL SPTSTN
 MOVEQ R5,R0 ;second number to end
 BLEQ SPACES
GOTCFF CMP R10,#TIF
 MOV AELINE,LINE
 SUBNE AELINE,LINE,#1 ;pointer to match string
 BLNE DONE
 BL ENDER ;fault if bad program
 BL TWINBG ;get pointer for TWIN chout
 MOV IACC,R4 ;move in start line number
 BL FNDLNO ;find it
 MOV LINE,R1
 MOV R6,#0 ;clear structure space count
 B GETNUM
ENDLN MOV R0,#10
 BL CHOUTNOCOUNT
 CMP R7,#128
 SWICC WRITEI+13 ;write out return as well if to screen etc.
 MOV R0,#0
 STR R0,[ARGP,#TALLY]
GETNEW LDRB R0,[R2,#3] ;R2 has initial LINE in it
 ADD LINE,R2,R0
GETNUM LDRB R0,[LINE,#1]
 LDRB R1,[LINE,#2]
 ORR R0,R1,R0,LSL #8 ;combine to word
 CMP R0,R5 ;test against limit
 BLS LTTEST
 CMP R7,#128
 BCC CLRSTK ;end of LIST
 TST R7,#64
 BEQ FINISHTWIN
 MOV R5,TYPE ;end address
 BL TWINBG
 MOV R4,TYPE ;start address
 ADD R1,ARGP,#STRACC
 MVN R2,#0
 B SAVEFILECLRSTK
FINISHTWIN ADD R1,ARGP,#STRACC
 LDR R0,TWINTXT
 STR R0,[R1],#4
 MOV R0,#" "
 STRB R0,[R1],#1
 MOV R0,#"@"
 STRB R0,[R1],#1
 MOV R4,TYPE
 BL TWINBG
 BL TWINHX
 MOV R0,#","
 STRB R0,[R1],#1
 MOV TYPE,R4
 BL TWINHX
 MOV R0,#";"
 STRB R0,[R1],#1
 ADD R3,ARGP,#CALLEDNAME
TWINCOPYCALL LDRB R0,[R3],#1
 STRB R0,[R1],#1
 TEQ R0,#0
 BNE TWINCOPYCALL
 ADD R0,ARGP,#STRACC
 BL OSCLIREGS
 SWI CLI
TWINTXT = "Twin"
TWINHX MOV R2,#32-4 ;covert TYPE to string ptd to by r1
TWINLP MOV R0,TYPE,LSR R2
 AND R0,R0,#15
 CMP R0,#9
 ORRLS R0,R0,#"0"
 ADDHI R0,R0,#"A"-10
 STRB R0,[R1],#1
 SUBS R2,R2,#4
 BPL TWINLP
 MOV PC,R14
TWINBG LDR TYPE,[ARGP,#FSA]
 CMP TYPE,#&9000
 MOVCC TYPE,#&9000
 MOV PC,R14
LTTEST LDRB R3,[ARGP,#ESCFLG]
 CMP R3,#&80
 BCS ESCAPE ;only reasonable exception
 MOV R4,#0 ;don't list line
 LDRB R14,[AELINE]
 CMP R14,#13
 MOVEQ R4,#1 ;list line if no search string
 MOV R3,#0 ;token expansion
 MOV R2,LINE ;save line
 ADD LINE,LINE,#4
 TEQ R6,#0
 MOVMI R6,#0 ;reset count if negative
 STMFD SP!,{R6} ;current indent
LTLOOP LDRB R10,[LINE],#1
 CMP R10,#13
 BEQ CHKLST ;finished prescan
 CMP R10,#TREM
 MOVEQ R3,R10 ;if REM flip token expansion forever
 CMP R10,#""""
 EOREQ R3,R3,R10 ;if " flip token expansion
 TEQ R3,#0
 BNE LPSIMT
 CMP R10,#TNEXT
 CMPNE R10,#TUNTIL
 CMPNE R10,#TENDWH
 CMPNE R10,#TENDCA
 CMPNE R10,#TENDIF
 SUBEQ R6,R6,#2 ;dec count
 CMP R10,#TFOR
 CMPNE R10,#TREPEAT
 ADDEQ R6,R6,#2 ;inc count
 LDRB R14,[LINE,#-2] ;previous character
 TEQ R14,#TESCSTMT
; TEQNE R14,#TESCFN
; TEQNE R14,#TESCCOM
 BNE LPSIMT
 CMP R10,#TWHILE
 CMPNE R10,#TCASE
 ADDEQ R6,R6,#2
 B LTLOOP
LPSIMT TST R4,#1
 BNE LTLOOP ;already decided to list line
 MOV R1,#0 ;offset down string
LPSIMS LDRB R14,[AELINE,R1]
 CMP R14,#13
 MOVEQ R4,#1 ;listable line
 BEQ LTLOOP
 CMP R10,#TCONST
 ADDEQ LINE,LINE,#3
 CMP R14,R10
 LDRB R10,[LINE,R1]
 ADD R1,R1,#1
 BEQ LPSIMS ;loop if equal
 B LTLOOP
CHKLST LDRB R14,[LINE,#-2]
 CMP R14,#TTHEN
 ADDEQ R6,R6,#2 ;do multiline if then else endif
 LDMFD SP!,{R3} ;old count
 CMP R3,R6
 MOVCS R3,R6 ;use minimum
 TEQ R4,#0
 BEQ GETNEW
 ADD LINE,R2,#4 ;first char to list
 BL LISTLINE
 B ENDLN
LISTLINE STMFD SP!,{R14}
 TST R7,#8
 BLEQ NPRN
 MOV R4,#0
 ANDS R0,R7,#1
 BLNE SPCOUT
 B LPSD1
LPSD TST R7,#4
 BEQ LPQUOT
 BL CHOUT
 MOV R0,#10
 BL CHOUTNOCOUNT
 CMP R7,#128
 MOV R0,#13
 BLCC CHOUTNOCOUNT
 MOV R0,#0
 STR R0,[ARGP,#TALLY]
 AND R0,R7,#1
 TST R7,#8
 ADDEQ R0,R0,#5
 BL SPCOUT
LPSD1 MOVS R0,R3
 TSTNE R7,#2
 BLNE SPCOUT
 B LP
LPQUOT BL CHOUT
LP LDRB R0,[LINE],#1
 CMP R0,#13
 LDMEQFD SP!,{PC}
 CMP R0,#""""
 EOREQ R4,R4,#1 ;flip expansion flag
 TEQ R4,#0
 BNE LPQUOT
 TEQ R0,#":"
 BEQ LPSD
 CMP R0,#&7F
 BCC LPQUOT
 CMP R0,#TCONST
 BNE LPSIMP
 BL SPGETN
 BL POSITE
 MOV R4,#0
 TST R7,#8
 BEQ LP
 CMP R7,#128
 SWICC NEWLINE
 B USESLINENUMBERS
LPSIMP CMP R0,#TREM
 MOVEQ R4,#4 ;no more expansion after this
 BL TOKOUT
 B LP
LVAR ROUT
 BL DONES
 MOV R0,#10
 SWI BASICTrans_Message
 BVC LVAR1
 SWI WRITES
 = "Static Integer variables:               @% = """,0
 ALIGN
LVAR1 ADD R7,ARGP,#INTVAR
 LDR R5,[R7],#4
 CMP R5,#&1000000
 SWICS WRITEI+"+"
 AND R4,R5,#&F0000
 CMP R4,#&10000
 SWICC WRITEI+"g"
 SWIEQ WRITEI+"e"
 SWIHI WRITEI+"f"
 AND R0,R5,#&FF
 MOV TYPE,#0
 BL POSITE
 TST R5,#&800000
 SWIEQ WRITEI+"."
 SWINE WRITEI+","
 AND R0,R5,#&FF00
 MOV R0,R0,LSR #8
 BL POSITE
 SWI WRITEI+""""
 MOV R6,#"A"
 MOV R5,#3
10 ADD R10,R0,#5
 ADD R5,R5,#1
 TST R5,#3
 SWIEQ NEWLINE
 BEQ %12
13 SWI WRITEI+" "
 ADD R10,R10,#1
 CMP R10,#20
 BCC %13
12 MOV R0,R6
 SWI WRITEC
 SWI WRITES
 = "% = ",0
 LDR IACC,[R7],#4
 BL LVRPINT
 ADD R6,R6,#1
 TEQ R6,#"Z"+1
 BNE %10
 SWI NEWLINE
 MOV R0,#0
 STR R0,[ARGP,#FNTEMPLOC]
 STR R0,[ARGP,#FNTEMPLOC+4]
 STR R0,[ARGP,#FNTEMPLOC+8]
 STR R0,[ARGP,#FNTEMPLOC+12]
 ADD R5,ARGP,#VARPTR
 ADD R7,R5,#("z"+1-"A")*4
 MOV R6,#"A"-1
21 ADD R6,R6,#1
 TEQ R5,R7
 BEQ LVARDX
 LDR R4,[R5],#4
 TEQ R4,#0
 BEQ %21
 MOV R11,#256
 MOV R0,#11
 SWI BASICTrans_Message
 BVC %20
 SWI WRITES
 = "Dynamic variables:",0
 B %20
22 LDR R4,[R5],#4 ;head of chain
23 TEQ R4,#0
 BEQ %29
20 RSBS R0,R11,#20
 RSBLSS R0,R11,#40
 RSBLSS R0,R11,#60
 SWILS NEWLINE
 MOVLS R11,#0
 BLS LVRDFF
 ADD R11,R11,R0
 MOV TYPE,#0
 BL SPCOUT
LVRDFF MOV R2,R4
 LDR R4,[R2],#4 ;next in chain
 MOV R0,R6
 SWI WRITEC
LVRDNO ADD R11,R11,#1
 LDRB R0,[R2],#1
 TEQ R0,#0
 SWINE WRITEC
 BNE LVRDNO
 MOV R0,R2
 LDRB R2,[R0,#-2]
 TEQ R2,#"("
 BEQ %24
 TEQ R2,#"$"
 BEQ %25
 TEQ R2,#"%"
 MOVEQ TYPE,#4
 MOVNE TYPE,#TFPLV
 [ FP=0
 ADDEQ R0,R0,#3
 BICEQ R0,R0,#3
 |
 ADD R0,R0,#3
 BIC R0,R0,#3
 ]
 BL VARIND
 SWI WRITES
 = " = ",0
 ADD R11,R11,#3
 STMFD SP!,{R4}
 BL LVRPRT
 LDMFD SP!,{R4}
 B %23
24 ADD R0,R0,#3
 BIC R0,R0,#3
 LDR R2,[R0]
 CMP R2,#16
 BCC LVRDAN
 LDR R0,[R2],#4
LVRDAP SUB R0,R0,#1
 STMFD SP!,{R2,R4}
 BL LVRPINT
 LDMFD SP!,{R2,R4}
 LDR R0,[R2],#4
 ADD R11,R11,#1
 TEQ R0,#0
 SWINE WRITEI+","
 BNE LVRDAP
 SWI WRITEI+")"
 B %23
LVRDAN CMP R2,#1
 BEQ LVRDAN2
 SWI WRITES
 = "undimensioned)",0
 ADD R11,R11,#14
 B %23
LVRDAN2 SWI WRITES
 = "local)",0
 ADD R11,R11,#6
 B %23
25 MOV TYPE,#128
 BL VARIND
 SWI WRITES
 = " = """,0
 ADD R11,R11,#5
 ADD R1,ARGP,#STRACC
 TEQ R1,CLEN
 BEQ %28
27 LDRB R0,[R1],#1
 TEQ R0,#127
 CMPNE R0,#" "-1
 MOVLS R0,#"."
 SWI WRITEC
 ADD R11,R11,#1
 TEQ R1,CLEN
 BNE %27
28 SWI WRITEI+""""
 B %23
29 ADD R6,R6,#1
 TEQ R5,R7
 BNE %22
 SWI NEWLINE
LVARDX LDR R1,[ARGP,#PROCPTR]
 TEQ R1,#0
 BEQ LVARPX
 MOV R11,#0
 MOV R0,#12
 SWI BASICTrans_Message
 BVC LVARP1
 SWI WRITES
 = "Procedures:",10,13,0
 ALIGN
LVARP1 BL LVARFMT
 SWI WRITES
 = "PROC",0
 ADD R11,R11,#3
 BL LVARFN
 BNE LVARP1
 SWI NEWLINE
LVARPX LDR R1,[ARGP,#FNPTR]
 TEQ R1,#0
 BEQ LVARLIB
 MOV R11,#0
 MOV R0,#13
 SWI BASICTrans_Message
 BVC LVARF0
 SWI WRITES
 = "Functions:",10,13,0
 ALIGN
LVARF0 BL LVARFMT
 SWI WRITES
 = "FN",0
 ADD R11,R11,#1
 BL LVARFN
 BNE LVARF0
 SWI NEWLINE
LVARLIB LDR R1,[ARGP,#LIBRARYLIST]
 TEQ R1,#0
 BEQ LVARINST
 MOV R0,#14
 SWI BASICTrans_Message
 BVC LVARLIB0
 SWI WRITES
 = "Libraries:",10,13,0
 ALIGN
LVARLIB0 ADD LINE,R1,#8
 BL LVARLINE
 LDR R1,[R1]
 CMP R1,#0
 BNE LVARLIB0
LVARINST LDR R1,[ARGP,#INSTALLLIST]
 TEQ R1,#0
 BEQ LVAROVER
 MOV R0,#15
 SWI BASICTrans_Message
 BVC LVARILIB0
 SWI WRITES
 = "Installed libraries:",10,13,0
 ALIGN
LVARILIB0 ADD LINE,R1,#8
 BL LVARLINE
 LDR R1,[R1]
 CMP R1,#0
 BNE LVARILIB0
LVAROVER LDR R7,[ARGP,#OVERPTR]
 TEQ R7,#0
 BEQ LVARDONE
 LDR R1,[R7]
 LDR R2,[R7,#4]
 CMN R2,#1
 BEQ LVARDONE
 MOV R0,#16
 SWI BASICTrans_Message
 BVC LVARCUROVERLAY
 SWI WRITES
 = "Current Overlay (from """,0
 ALIGN
LVARCUROVERLAY ADD R2,R2,R2,LSL #2
 ADD R0,R1,R2
 BL VARSTR
 ADD R0,ARGP,#STRACC
 SUB R1,CLEN,R0
 SWI WRITEN
 SWI WRITES
 = """):",10,13,0
 ALIGN
 ADD LINE,R7,#12+4
 BL LVARLINE
LVARDONE B CLRSTK
;list first line of program without line number!
LVARLINE MOV R7,#8
 LDRB R0,[LINE,#-2]
 CMP R0,#255
 MOVEQ PC,R14
 STMFD SP!,{R1,R14}
 BL LISTLINE
 SWI NEWLINE
 LDMFD SP!,{R1,PC}
;list functions or procedures
LVARFN STMFD SP!,{R14,R8}
 LDR R10,[R1],#4
 MOV R0,R1
 SWI WRITE0
 SUB R1,R0,R1
 ADD R11,R11,R1
 ADD R0,R0,#3
 BIC R7,R0,#3
 LDMFD R7!,{R0,R1}
 TEQ R0,#0
 BEQ LVARF1
 SWI WRITEI+"("
 ADD R11,R11,#2
LVARFA TST R1,#&100
 BEQ %41
 TST R1,#&8000
 BNE %41
 SWI WRITES
 = "RETURN ",0
 ADD R11,R11,#7
41 ANDS R2,R1,#255
 BNE %42
 SWI WRITES
 = "byte",0
 ADD R11,R11,#4
42 TEQ R2,#4
 BNE %43
 SWI WRITES
 = "integer",0
 ADD R11,R11,#7
43 TEQ R2,#TFPLV
 BNE %44
 SWI WRITES
 = "real",0
 ADD R11,R11,#4
44 TEQ R2,#128
 BNE %45
 SWI WRITES
 = "string",0
 ADD R11,R11,#6
45 CMP R2,#129
 BCC %46
 SWI WRITES
 = "$ string",0
 ADD R11,R11,#8
46 TST R1,#&8000
 BEQ %49
 SWI WRITES
 = " array",0
 ADD R11,R11,#6
49 LDMFD R7!,{R0,R1}
 TEQ R0,#0
 ADDNE R11,R11,#1
 SWINE WRITEI+","
 BNE LVARFA
 SWI WRITEI+")"
LVARF1 MOVS R1,R10
 LDMFD SP!,{R8,PC}
LVARFMT STMFD SP!,{R14}
 TEQ R11,#0
 BEQ LVRFMX
 RSBS R0,R11,#40
 SWILS NEWLINE
 MOVLS R11,#0
 BLS LVRFMX
 ADD R11,R11,R0
 MOV TYPE,#0
 BL SPCOUT
LVRFMX LDMFD SP!,{PC}
LVRPINT MOV TYPE,#TINTEGER
LVRPRT MOV R4,#&900 ;TEMPORARY!
 STMFD SP!,{R5,R6,R7,R14}
 MOV R5,#0
 BL FCONFP
 ADD R0,ARGP,#STRACC
 MOV R5,#0
 STRB R5,[TYPE]
 SWI WRITE0
 ADD R0,ARGP,#STRACC
 SUB R0,TYPE,R0
 ADD R11,R11,R0
 LDMFD SP!,{R5,R6,R7,PC}
OLD BL DONES
 MOV R0,#0
 LDR R1,[ARGP,#PAGE]
 STRB R0,[R1,#1]
 BL ENDER
 B FSASET
RENUM BL GETTWO
 BL RENUM1
 B FSASET
RENUM1 LDR R0,[ARGP,#PAGE]
RENUM2 STMFD SP!,{R0,R14,TYPE} ;renumber from r4 step r5 starting at r0
 BL ENDER
 LDR R7,[ARGP,#TOP]
 LDR R1,[SP]
NUMBA LDRB R10,[R1,#1] ;phase 1: remember current line numbers
 CMP R10,#&FF
 BEQ NUMBB
 STRB R10,[R7],#1
 LDRB R10,[R1,#2]
 STRB R10,[R7],#1
 LDRB R10,[R1,#3]
 ADD R1,R1,R10
 CMP R7,SP
 BCC NUMBA
 B ERNUMM
NUMBB LDR R1,[SP]
NUMBC LDRB R10,[R1,#1]
 CMP R10,#&FF
 BEQ NUMBD
 CMP R4,#65280
 BCS NUMBCFAIL
 STRB R4,[R1,#2]
 MOV R0,R4,LSR #8
 STRB R0,[R1,#1]
 ADD R4,R4,R5
 LDRB R10,[R1,#3]
 ADD R1,R1,R10
 B NUMBC
NUMBCFAIL LDR R6,[ARGP,#TOP]
 LDR R1,[SP]
NUMBCFAIL1 LDRB R0,[R6],#1
 STRB R0,[R1,#1]
 LDRB R0,[R6],#1
 STRB R0,[R1,#2]
 LDRB R0,[R1,#3]
 ADD R1,R1,R0
 CMP R6,R7
 BCC NUMBCFAIL1
 B ERNUMO
NUMBD LDR LINE,[SP]
 ADD LINE,LINE,#1
NUMBE LDRB R10,[LINE],#1
 CMP R10,#&FF
 LDMEQFD SP!,{R0,TYPE,PC}
 LDRB R7,[LINE],#1
 ADD R7,R7,R10,LSL #8
 ADD LINE,LINE,#1
 MOV TYPE,#0 ;in strings
NUMBF LDRB R10,[LINE],#1
 CMP R10,#""""
 EOREQ TYPE,TYPE,#1
 CMP R10,#13
 BEQ NUMBE
 TEQ TYPE,#0
 BNE NUMBF
 CMP R10,#TREM
 CMPNE R10,#TDATA
 MOVEQ TYPE,#2
 CMP R10,#TCONST
 BNE NUMBF
 MOV AELINE,LINE
 BL SPGETN
;have line number in R0
;must search cross reference for it
 LDR R4,[ARGP,#TOP]
 LDR R5,[SP]
NUMBH LDRB R10,[R5,#1]
 CMP R10,#&FF
 BEQ NUMBJ
 LDRB R2,[R4],#1 ;hi
 LDRB R1,[R4],#1 ;lo
 ORR R1,R1,R2,LSL #8
 CMP R1,R0
 LDRNEB R1,[R5,#3] ;if not found, continue
 ADDNE R5,R5,R1
 BNE NUMBH
;found number in xref process
 LDRB R5,[R5,#2] ;get lo byte of new number
 ORR R5,R5,R10,LSL #8; new number
 MOV R2,AELINE
 BL CONSTI
 B NUMBF
NUMBJ MOV R1,R0
 MOV R2,R7
 MOV R0,#23
 SWI BASICTrans_Message
 BVC NUMBF
 SWI WRITES
 = "Failed with ",0
 MOV R0,R1
 BL POSITE
 SWI WRITES
 = " on line ",0
 MOV R0,R7
 BL POSITE
 SWI NEWLINE
 B NUMBF
SAVE BL SPACES
 TEQ R10,#13
 BEQ SAVEIC
 SUB LINE,LINE,#1
 BL AEEXPR
 BL OSSTRI
 BL AEDONE
 BL ENDER
 ADD R1,ARGP,#STRACC
SAVEFIL LDR R4,[ARGP,#PAGE]
 LDR R5,[ARGP,#TOP]
 MVN R2,#0
 SUB R2,R2,#&F00-&B00
;save date stamped file [R1] of type R2 from R4 to R5
SAVEFILECLRSTK STMFD SP!,{R1}
 MOV R0,#14 ;fetch date stamp
 SUB R1,SP,#8
 MOV R3,#3
 STR R3,[R1]
 STR R2,[R1,#4]
 SWI WORD
 MOV R0,#0
 LDR R2,[R1,#4]
 LDR R3,[R1]
 LDMFD SP!,{R1}
 SWI FILE
 B CLRSTK
SAVEIC BL ENDER
 LDR R1,[ARGP,#PAGE]
 LDRB R0,[R1,#1]
 CMP R0,#&FF
 BEQ BADIC
 ADD R1,R1,#4
SAVEI2 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ SAVEI2
 TEQ R0,#TREM
 BNE BADIC
SAVEI3 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ SAVEI3
 TEQ R0,#">"
 BEQ SAVEFIL
 B BADIC
OSFILELOADSTRACC ADD R1,ARGP,#STRACC
OSFILELOAD MOV R0,#255
 MOV R3,#0
OSFILERETURN SWI FILE
 MOV PC,R14
OSFILEINFOSTRACC ADD R1,ARGP,#STRACC
OSFILEINFO MOV R0,#5
 B OSFILERETURN
 LNK ErrorMsgs
