;> Stmt
CASE ROUT
 BL AEEXPR
 TEQ R10,#TOF
 BNE ERCASE1
 BL AESPAC
 TEQ R10,#13
 BNE ERCASE
 TEQ TYPE,#0
 BLNE FLOATZ
 BL PUSHTYPE
 STMFD SP!,{TYPE}
 SUB R7,AELINE,#1
 MVN R6,#0 ;count of nesting depth: will see OF, so start at -1
 B %02
06 CMP R4,#TENDCA
 SUBEQ R6,R6,#1
02 LDRB R4,[R7,#1]
 CMP R4,#&FF
 BCS NOENDC
 LDRB R4,[R7,#-1]
 CMP R4,#TOF
 ADDEQ R6,R6,#1
 ADD R5,R7,#4
 LDRB R10,[R7,#3]
 ADD R7,R7,R10
04 LDRB R4,[R5],#1
 TEQ R4,#" "
 BEQ %04
 TEQ R6,#0
 BNE %06
 CMP R4,#TENDCA
 TEQNE R4,#TWHEN
 TEQNE R4,#TOTHER
 BNE %02
 MOV LINE,R5
 BCS ENDCAS
 TEQ R4,#TOTHER
 BEQ CASEEL
CASEWH STMFD SP!,{R7} ;rqd if go back to %00
 BL AEEXPR
 LDMFD SP!,{R7}
 MOV LINE,AELINE
 LDMFD SP,{R4,R5,R6}
 BEQ CASES
 BLPL IFLT
 ORR FGRD,FSIGN,FACCX
 TEQ FACC,R5
 TEQEQ FGRD,R6
 BNE CASENE
CASEEQ BL PULLTYPE
 TEQ R10,#":"
 TEQNE R10,#13
 BEQ DONEXT
 TEQ R10,#","
 BNE ERSYNT
 MOV R0,#0
90 LDRB R10,[LINE],#1
 TEQ R10,#""""
 EOREQ R0,R0,#1
 TEQ R10,#13
 BEQ DONEXT
 TEQ R0,#0
 BNE %90
 TEQ R10,#":"
 BNE %90
 B DONEXT
CASENE TEQ R10,#","
 BEQ CASEWH
 MOV R6,#0
 B %02
CASES TEQ R4,#0
 BNE ERTYPESTR
 TEQ CLEN,R5
 BNE CASENE
 ADD R0,ARGP,#STRACC
 TEQ CLEN,R0
 BEQ CASEEQ
 ADD R1,SP,#8
80 LDRB R4,[R1],#1
 LDRB R5,[R0],#1
 TEQ R4,R5
 BNE CASENE
 TEQ R0,CLEN
 BNE %80
 B CASEEQ
CASEEL BL PULLTYPE
 B STMT
ENDCAS BL PULLTYPE
 B DONXTS
OTHER
WHEN ROUT
 LDRB R10,[LINE],#1
 TEQ R10,#13
 BNE WHEN
 SUB R2,LINE,#1
 MOV R3,#1
00 LDRB R0,[R2,#1]
 CMP R0,#&FF
 BCS NOENDC
 LDRB R0,[R2,#-1]
 CMP R0,#TOF
 ADDEQ R3,R3,#1
 ADD R1,R2,#4
 LDRB R0,[R2,#3]
 ADD R2,R2,R0
02 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ %02
 TEQ R0,#TENDCA
 BNE %00
 SUBS R3,R3,#1
 BNE %00
 MOV LINE,R1
 B DONXTS
CHAIN BL LOADER
 B RUNNER
CLEAR BL DONES
 BL SETFSA
 B NXT
DIMSPA SUB LINE,LINE,#1 ;because of Spaces
 BL CRAELV
 BEQ BADDIM
 CMP TYPE,#6
 BCS ERTYPENUM
 STMFD SP!,{FACC,TYPE}
 BL EXPR
 BL INTEGZ
 ADD R7,FACC,#1
 LDR FACC,[ARGP,#FSA]
 LDMFD SP!,{R4,R5}
 STMFD SP!,{FACC,R7}
 BL STOREA ;store thing, may yet fail
 LDMFD SP!,{FACC,R7}
 TEQ R7,#0
 BMI BADDIMSIGN
 ADD R7,R7,#3
 BIC R7,R7,#3
 ADD R7,FACC,R7
 ADD R6,R7,#512 ;generous allocation of free space below stack
 CMP R6,SP
 BCS BADDIMSIZE
 STR R7,[ARGP,#FSA]
DIMNXT MOV LINE,AELINE
 CMP R10,#","
 BNE DONEXT
DIM BL SPACES
 MOV R0,R10
 BL WORDCQ
 CMPCS R10,#"A"
 BCC BADDIM ;taken if WORDCQ failed, or if 0-9
;now have first char of item in R10 as rqd
 MOV TYPE,#5
 MOV AELINE,LINE
DIMNO LDRB R0,[AELINE],#1
 BL WORDCQ
 BCS DIMNO
 CMP R0,#"("
 BEQ DIMVAR
 CMP R0,#"%"
 MOVEQ TYPE,#4
 CMPNE R0,#"$"
 BNE DIMSPA
 LDRB R0,[AELINE],#1
 CMP R0,#"("
 BNE DIMSPA
DIMVAR MOV R4,LINE
 LDRB R3,[R4],#1 ;arrays always 2 or more chars
 STMFD SP!,{TYPE} ;size of actual array elements
 BL LOOKUP
 BNE DIMVA2 ;does not exist: easy!
 ADD FACC,FACC,#3
 BIC FACC,FACC,#3
 LDR R3,[FACC]
 CMP R3,#16
 BCC DIMVA3
 B ERNDIM ;if it does exist then it must be null
DIMVA2 MOV TYPE,#4 ;creates null pointer to rest of array
 BL CREATE ;lvalue in facc
 MOV R3,#0
DIMVA3 ADD CLEN,ARGP,#STRACC ;subscript list built in STRACC
 LDMFD SP!,{R6} ;get original type from stack
 MOV R4,#1 ;count of entries
 STMFD SP!,{FACC} ;save l value
RDLOOP STMFD SP!,{R3,R4,R6} ;allocation place, number of entries, type
 BL SPUSH
 BL EXPR
 BL INTEGZ
 CMP FACC,#&1000000
 BCS BADDIMSUB ;also removes negative numbers
 ADD R7,FACC,#1
 BL SPULL
 LDMFD SP!,{R3,R4,R6}
 STR R7,[CLEN],#4 ;add to subscript list
 MOV R1,#0
RDLOOM MOVS R7,R7,LSR #1
 ADDCS R1,R1,R4
 CMP R1,#&1000000 ;2^24
 ADDCCS R4,R4,R4 ;add if above compare ok
 BCS DIMRAM ;either r4 overflow or r1>2^24
 TEQ R7,#0
 BNE RDLOOM
 MOV R4,R1 ;multiplied pair of numbers
 CMP R10,#","
 BEQ RDLOOP
 CMP R10,#")"
 BNE BADDIMLIST
 TEQ R6,#4 ;test type
 MOVEQ R5,R4,LSL #2 ;if integer than number of bytes is 4* number of entries
 ADDNE R5,R4,R4,LSL #2 ;if real/string then 5*
 ADD R5,R5,#3
 BIC R5,R5,#3 ;number of bytes rounded to words
 ADD FACC,ARGP,#STRACC
 SUB FACC,CLEN,FACC
 ADD FACC,FACC,#8
 ADD FACC,FACC,R5
 LDR R1,[ARGP,#FSA]
 ADD R7,R1,FACC
 ADD R6,R7,#1024 ;plus generous allowance
 CMP R6,SP
 BCS DIMRAM
 LDMFD SP!,{R6} ;address to alter
 CMP R3,#1
 SUBEQ SP,SP,FACC
 MOVEQ R1,SP
 STMEQFD SP!,{FACC}
 STMEQFD SP!,{R6}
 MOVEQ FACC,#"("
 LDREQ R7,[ARGP,#LOCALARLIST]
 STMEQFD SP!,{FACC,R7}
 STREQ SP,[ARGP,#LOCALARLIST]
 STRNE R7,[ARGP,#FSA]
 STR R1,[R6] ;update pointer
 ADD R7,ARGP,#STRACC
DIMCOPY LDR FACC,[R7],#4
 STR FACC,[R1],#4
 CMP R7,CLEN
 BCC DIMCOPY
 MOV FACC,#0
 STR FACC,[R1],#4 ;terminate list
 STR R4,[R1],#4 ;put in the number of entries
DIMZER STR FACC,[R1],#4
 SUBS R5,R5,#4
 BHI DIMZER
 BL AESPAC
 B DIMNXT
END BL DONES
 BL ENDER
 B CLRSTK
ENDPR BL DONES
ENDPRA LDMFD SP!,{R4}
 TEQ R4,#TPROC
 BNE ENDPRP
 BL GTARGS
 CMP LINE,AELINE
 MOVCC LINE,AELINE
 B DONXTS
ENDPRP SUB SP,SP,#4
 BL POPA
 BEQ ENDPRA
 B ENDPRE
ENDWH LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
 BL DONES
 B ENDWHM
ENDWHP BL POPA
 BNE ERWHIL
ENDWHM LDR R4,[SP]
 CMP R4,#TENDWH
 BNE ENDWHP
 LDR AELINE,[SP,#8] ;get expression pointer
 STMFD SP!,{R10} ;preserve next character
 BL EXPR
 BEQ ERTYPEINT
 BLMI INTEGB
 LDMFD SP!,{R10}
 CMP FACC,#0
 LDRNE LINE,[SP,#4] ;restart
 BNE STMT
 PULLJ 3
 B NXT ;R10 ok!
ENVEL SUB SP,SP,#16
 MOV R1,#0
 MOV AELINE,LINE
ENVELP STMFD SP!,{R1}
 BL INTEXC
 LDMFD SP!,{R1}
 STRB FACC,[SP,R1]
 ADD R1,R1,#1
 CMP R1,#13
 BNE ENVELP
 BL EXPRDN
 STRB FACC,[SP,#13]
 MOV R1,SP
 MOV R0,#8
 SWI WORD
 ADD SP,SP,#16
 B NXT
FOR BL CRAELV
 BEQ FORCV
 CMP TYPE,#6
 BCS FORCV
 STMFD SP!,{FACC,TYPE} ;for STORE
 BL AESPAC
 CMP R10,#"="
 BNE MISSEQFOR
 BL EXPR
 CMP R10,#TTO
 BNE FORTO
 BL STORE ;start
 CMP R5,#5 ;type of assignment
 BEQ FFOR
 MOV R0,#TNEXT ;integer FOR
 MOV R6,#1 ;possible STEP
 STMFD SP!,{R0,R4,R5,R6,R7} ;TNEXT got, VAR got, ADDR, STEP got if 1, LIMIT
 BL EXPR
 BL INTEGZ
 STR FACC,[SP,#4*4] ;write limit onto stack
 CMP R10,#TSTEP
 BNE FORSTW
 BL EXPR
 BL INTEGZ
 TEQ FACC,#0
 BEQ FORSTEP
 STR FACC,[SP,#3*4] ;write new step size onto stack
FORSTW BL AEDONE
 BL MUNGLT
 STR LINE,[SP,#2*4] ;write restart position onto stack
 B STMT
FFOR MOV R0,#TFOR ;floating point FOR
 STMFD SP!,{R0,R4,R5,R6,R7,R8,R9} ;TFOR got, VAR got, ADDR, STEP(8), LIMIT(8)
 BL EXPR
 BL FLOATZ
 ADD TYPE,SP,#20
 BL FSTA ;write limit into stack
 BL FONE
 CMP R10,#TSTEP
 BNE FORSTA
 BL EXPR
 BL FLOATZ
 TEQ FACC,#0
 BEQ FORSTEP
FORSTA ADD TYPE,SP,#12 ;step offset on stack
 BL FSTA
 B FORSTW
GOSUB LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
 BL GOFACT
 BL DONES
 MOV R0,#TRETURN
 STMFD SP!,{LINE,R0}
 ADD LINE,R1,#4
 B STMT
GOTO LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
 BL GOFACT
 BL DONES
 ADD LINE,R1,#4
 B STMT
GOFACT STMFD SP!,{R14}
 BL SPTSTN
 BEQ GOTOT2
 SUB AELINE,LINE,#1
 BL EXPR
 BL INTEGZ
 CMP FACC,#65280
 BCS NOLINE
 SUB LINE,AELINE,#1
GOTOT2 BL FNDLNO
 LDMCSFD SP!,{PC}
 B NOLINE
;Address of cr before line in R1 of FACC. cs if found
FNDLNO LDR R1,[ARGP,#PAGE]
FNDLNONEXT AND R3,FACC,#255 ;continue position (R1 points to cr already)
 B SIGHT
LOOKR LDRB R2,[R1,#3]
 ADD R1,R1,R2
SIGHT LDRB R2,[R1,#1]
 CMP R2,FACC,LSR #8
 BCC LOOKR
 LDREQB R2,[R1,#2]
 CMPEQ R2,R3
 BCC LOOKR
 MOVEQ PC,R14 ;cs if found
 BICS PC,R14,#CFLAG ;return cc
IF BL AEEXPR
 BEQ ERTYPEINT
 BLMI INTEGB
 MOV LINE,AELINE
 CMP FACC,#0
 BEQ ELSE
 CMP R10,#TTHEN
 BNE DISPAT
THENLN LDRB R10,[LINE],#1
 CMP R10,#" "
 BEQ THENLN
 CMP R10,#TCONST
 BNE DISPAT
 BL SPGETN
 BL FNDLNO
 BCC NOLINE
 ADD LINE,R1,#4
 B STMT
ELSE TEQ R10,#13
 BEQ CRLINE
 TEQ R10,#TELSE
 BEQ THENLN
 TEQ R10,#TTHEN
 LDREQB R10,[LINE],#1
 TEQ R10,#13 ;trailing spaces were stripped when the line was entered
 BEQ ELSEBLK
ELSELP LDRB R10,[LINE],#1
 CMP R10,#13
 BEQ CRLINE
 CMP R10,#TELSE
 BNE ELSELP
 B THENLN
ELSEBLK ROUT
 SUB R2,LINE,#1 ;address of CR
 MOV R3,#0 ;count of nested block ifs
 B %01
00 LDRB R0,[R2,#3]
 ADD R2,R2,R0
01 LDRB R0,[R2,#1]
 CMP R0,#&FF
 BCS NOENDI
 LDRB R0,[R2,#-1] ;check end of line for block if
 CMP R0,#TTHEN
 ADDEQ R3,R3,#1 ;increment counter if present
 ADD R1,R2,#4
02 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ %02
 CMP R0,#TENDIF
 SUBEQS R3,R3,#1 ;found ENDIF so decrement count
 MOVEQ LINE,R1
 BEQ ENDIF ;found end of block with no else
 CMP R0,#TELSE2
 BNE %00
 TEQ R3,#1
 BNE %00
 MOV LINE,R1
 B STMT ;found suitable else in block
; block ELSE statement
ELSE2 ROUT
 LDRB R10,[LINE],#1
 TEQ R10,#13
 BNE ELSE2
 MOV R3,#0
 SUB R2,LINE,#1 ;r2 points to CR
 B %01
00 LDRB R0,[R2,#3]
 ADD R2,R2,R0
01 LDRB R0,[R2,#1]
 CMP R0,#&FF
 BCS NOENDI
 LDRB R0,[R2,#-1]
 CMP R0,#TTHEN
 ADDEQ R3,R3,#1
 ADD R1,R2,#4
02 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ %02
 TEQ R0,#TENDIF
 BNE %00
 SUBS R3,R3,#1
 BPL %00
 MOV LINE,R1
 B DONXTS
INPUT BL SPACES
 CMP R10,#"#"
 BEQ INPUTH
 MOV R4,#&40
 MOV R5,#0
 CMP R10,#TLINE
 MOVNE R4,#0
 SUBNE LINE,LINE,#1
INPLP BL SPACES
 BL PRSPEL
 ORRNE R4,R4,#&80
 BNE INPHP
INPLO BL SPACES
 BL PRSPEL
 BEQ INPLO
 MOV R5,#0
 BIC R4,R4,#&80
INPHP CMP R10,#","
 CMPNE R10,#";"
 BEQ INPLP
 SUB LINE,LINE,#1
 STMFD SP!,{R4,R5}
 BL CRAELV
 LDMFD SP!,{R4,R5}
 BEQ DONXTS
 MOV LINE,AELINE
 STMFD SP!,{FACC,TYPE}
 TST R4,#&40
 BNE INGET
 TEQ R5,#0
 BNE INGOT
INGET TST R4,#&80
 SWINE WRITEI+"?"
 BL INLINE
 SUB CLEN,R1,#1
INLEN LDRB R0,[CLEN,#1]!
 CMP R0,#13
 BNE INLEN
 BIC R4,R4,#&80
 TST R4,#&40
 BNE INGETB
 ADD R5,ARGP,#STRACC
INGOT MOV AELINE,R5
 BL DATAST
INTERM CMP R10,#","
 BEQ INGETC
 CMP R10,#13
 LDRB R10,[AELINE],#1
 BNE INTERM
 MOV AELINE,#0
INGETC MOV R5,AELINE
INGETB LDMFD SP!,{FACC,TYPE}
 STMFD SP!,{R4,R5}
 STMFD SP!,{FACC,TYPE}
 CMP TYPE,#128
 MOVCS TYPE,#0
 BLCC VALSTR
 BL STORE
 LDMFD SP!,{R4,R5}
 B INPLP
LET BL AELV
 BNE GOTLT
 BCS ERSYNT
 MOV R0,AELINE
LET1 LDRB R7,[R0],#1
 CMP R7,#" "
 BEQ LET1
 CMP R7,#"="
 BNE MISSEQ
 BL CREATE
 B GOTLT
LOCALERROR BL DONES
 LDR R1,[ARGP,#ERRSTK]
 LDR R2,[ARGP,#ERRORH]
 MOV R0,#TERROR
 STMFD SP!,{R0,R1,R2}
 B NXT
LOCAL BL SPACES
 CMP R10,#TERROR
 BEQ LOCALERROR
 LDR R0,[SP]
 TEQ R0,#TPROC
 TEQNE R0,#TFN
 BNE ERRNLC
 SUB LINE,LINE,#1
LOCALP BL CRAELV
 BEQ DONXTS
 MOV LINE,AELINE
 LDMFD SP!,{R5,R6,R7}
 MOV R10,FACC
 MOV AELINE,TYPE
 CMP TYPE,#256
 BCS LOCALARRAY
 BL VARIND
 BL PUSHTYPE
 STMFD SP!,{R10,AELINE}
 STMFD SP!,{R5,R6,R7}
 MOV R0,#0
 CMP AELINE,#128
 BEQ LOCALZS
 BCS LOCALZR
LOCALZN STRB R0,[R10],#1
 SUBS AELINE,AELINE,#1
 BHI LOCALZN
 B LOCALZ
LOCALARRAY LDR R1,[FACC]
 MOV R2,#4
 STMFD SP!,{R1}
 STMFD SP!,{FACC,R2}
 STMFD SP!,{R5,R6,R7}
 MOV R1,#1
 STR R1,[FACC]
 B LOCALZ
LOCALZR MOV R0,#13
 STRB R0,[R10]
 B LOCALZ
LOCALZS MOV CLEN,R3 ;0 length string somewhere
 MOV R4,R10
 BL STSTORE
LOCALZ BL SPACES
 CMP R10,#","
 BEQ LOCALP
 B DONEXT
NEXT LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
 BL AELV
 BNE STRIPA
 BCC ERSYNT
NEXM1 LDMFD SP,{R4,R5}
 TEQ R4,#TNEXT
 BEQ NOCHKI
 TEQ R4,#TFOR
 BEQ FNEXT
 BL POPA
 BEQ NEXM1
 B ERNEXT
STRIPA CMP TYPE,#128
 BCS ERSYNT
 MOV LINE,AELINE ;update pointer (something there!)
 LDMFD SP,{R4,R5}
 TEQ R4,#TNEXT
 BEQ NEXSI
 TEQ R4,#TFOR
 BNE ERNEXT
 TEQ FACC,R5
 BEQ FNEXT
NEXP2 BL POP
 BNE NEXTER
 LDMFD SP,{R4,R5}
 TEQ R4,#TFOR
 BEQ NEXSF
 TEQ R4,#TNEXT
 BNE NEXTER
NEXSI TEQ FACC,R5
 BNE NEXP2
NOCHKI LDMFD SP,{R3,R4,R5,R6,R7}
 ANDS R2,R4,#3
 BNE SLONXT ;bottom 2 bits not zero so slower
 LDR FACC,[R4] ;get contents
 ADDS FACC,FACC,R6 ;add step
 BVS INXTPL
 STR FACC,[R4] ;write back
INXTPR TEQ R6,#0 ;test sign of step
 BMI INXTCH
 CMP FACC,R7 ;test if ascending loop
INXTMT MOVLE LINE,R5 ;if <= continue
 BLE STMT
INXTPL PULLJ 5
NEXTEX BL SPACES
 CMP R10,#","
 BEQ NEXT
 B DONEXT
INXTCH CMP R7,FACC ;test if descending loop
 B INXTMT
SLONXT BIC R3,R4,#3
 LDMIA R3,{FACC,R1}
 MOV R2,R2,LSL #3
 MOV FACC,FACC,LSR R2
 RSB R2,R2,#32
 ORR FACC,FACC,R1,LSL R2
 ADDS FACC,FACC,R6
 BVS INXTPL
 STRB FACC,[R4]
 MOV R1,FACC,LSR #8
 STRB R1,[R4,#1]
 MOV R1,FACC,LSR #16
 STRB R1,[R4,#2]
 MOV R1,FACC,LSR #24
 STRB R1,[R4,#3]
 B INXTPR
NEXSF TEQ FACC,R5
 BNE NEXP2
FNEXT BIC FGRD,R5,#3
 LDMFD FGRD,{FACC,FACCX}
 AND FGRD,R5,#3
 MOVS FGRD,FGRD,LSL #3
 MOVNE FACC,FACC,LSR FGRD
 RSBNE FSIGN,FGRD,#32
 ORRNE FACC,FACC,FACCX,LSL FSIGN
 MOVNE FACCX,FACCX,LSR FGRD
 AND FSIGN,FACC,#&80000000
 ANDS FACCX,FACCX,#255
 TEQEQ FACC,#0
 ORRNE FACC,FACC,#&80000000
 ADD TYPE,SP,#12 ;address of step
 LDMIA TYPE,{FWACC,FWACCX}
 AND FWSIGN,FWACCX,#&80000000
 AND FWACCX,FWACCX,#255
 TEQ FWACC,#0
 BLNE FADDW
 LDR TYPE,[SP,#4]
 BL F1STA
 ADD TYPE,SP,#20 ;address of limit
 TEQ FWSIGN,#0 ;fadd did not hurt this value (sign of step)
 BMI FNEXTA
 BL FNEXCM
 LDRGE LINE,[SP,#8]
 BGE STMT
 PULLJ 7
 B NEXTEX
FNEXTA BL FNEXCM
 LDRLE LINE,[SP,#8]
 BLE STMT
 PULLJ 7
 B NEXTEX
FNEXCM LDMIA TYPE,{FWACC,FWACCX}
 AND FWSIGN,FWACCX,#&80000000
 CMP FWSIGN,FSIGN ;only top bits!!!!
 MOVNE PC,R14 ;easy
 AND FWACCX,FWACCX,#255
 TEQ FSIGN,#0
 BMI FNEXCP
 CMP FWACCX,FACCX
 MOVNE PC,R14
 CMP FWACC,FACC
 MOV PC,R14
FNEXCP CMP FACCX,FWACCX
 MOVNE PC,R14
 CMP FACC,FWACC
 MOV PC,R14
ON BL SPACES
 CMP R10,#TERROR
 BEQ ONERR
 CMP R10,#TELSE
 CMPNE R10,#":"
 CMPNE R10,#13
 BEQ CURSON ;cursor on/off in Command
 SUB AELINE,LINE,#1
 BL EXPR
 BL INTEGZ
 CMP R10,#TGOTO
 CMPNE R10,#TGOSUB
 CMPNE R10,#TPROC
 BNE ONER
 CMP R10,#TPROC
 SUBEQ AELINE,AELINE,#1
 SUBS FACC,FACC,#1
 BCC ONRGA
 BEQ ONGOT
 MOV R4,#0
ONSRCH LDRB R1,[AELINE],#1
 CMP R1,#13
 CMPNE R1,#TELSE
 BEQ ONRG
 CMP R1,#"("
 ADDEQ R4,R4,#1
 CMP R1,#")"
 SUBEQ R4,R4,#1
 TEQ R4,#0
 BNE ONSRCH
 CMP R1,#":"
 BEQ ONRGA
 CMP R1,#","
 BNE ONSRCH
 SUBS FACC,FACC,#1
 BNE ONSRCH
ONGOT CMP R10,#TGOSUB
 BEQ ONGOSB
 CMP R10,#TPROC
 BEQ ONPROC
 MOV LINE,AELINE
 BL GOFACT
 ADD LINE,R1,#4
 B STMT
ONGOSB MOV LINE,AELINE
 BL GOFACT
 BL ONSKIP
 MOV R0,#TRETURN
 STMFD SP!,{LINE,R0}
 ADD LINE,R1,#4
 B STMT
ONPROC LDRB R1,[AELINE],#1
 CMP R1,#" "
 BEQ ONPROC
 CMP R1,#TPROC
 BNE ONER
 BL ONSKIP
 SUB LINE,LINE,#1
 LDR R1,[ARGP,#PROCPTR]
 B FNBODY
ONSKIP MOV LINE,AELINE
ONSKPA LDRB R2,[LINE],#1
 CMP R2,#13
 CMPNE R2,#":"
 BNE ONSKPA
 MOV PC,R14
ONRGA LDRB R1,[AELINE],#1
 CMP R1,#13
 CMPNE R1,#TELSE
 BNE ONRGA
ONRG CMP R1,#13
 BEQ ONRGER
 MOV LINE,AELINE
 B THENLN
ONERR BL SPACES
 CMP R10,#TOFF
 BEQ ONERRF
 CMP R10,#TLOCAL
 SUBNE LINE,LINE,#1
 STREQ SP,[ARGP,#ERRSTK]
 STR LINE,[ARGP,#ERRORH]
 B REM
ONERRF BL DONES
 BL ORDERR
 B NXT
RESTOREERROR BL DONES
 LDMFD SP!,{R0}
 CMP R0,#TERROR
 BNE ONERRX
 LDMFD SP!,{R1,R2}
 STR R1,[ARGP,#ERRSTK]
 STR R2,[ARGP,#ERRORH]
 B NXT
PRINT BL SPACES
 CMP R10,#"#"
 BEQ PRINTH
 SUB LINE,LINE,#1
 B STRTPR
PRCOMM LDRB R0,[ARGP,#INTVAR]
 TEQ R0,#0
 BEQ STRTPR
 LDR R1,[ARGP,#TALLY]
 MOV R2,R1
PRCOML TEQ R1,#0
 BEQ STRTPR
 SUBS R1,R1,R0
 BCS PRCOML
 RSB R0,R1,#0
 BL SPCSWC
STRTPR LDRB R4,[ARGP,#INTVAR] ;prints
 MOV R5,#0 ;printf
ENDPRI BL SPACES
 CMP R10,#":"
 CMPNE R10,#13
 CMPNE R10,#TELSE
 BNE CONTPR
 BL NLINE
 B NXT
PRFUNY MOV R4,#0
 MOV R5,#0
 BL SPACES
 CMP R10,#":"
 CMPNE R10,#13
 CMPNE R10,#TELSE
 BEQ NXT
CONTPR CMP R10,#"~"
 MOVEQ R5,#1 ;print in hex
 BEQ ENDPRI
 CMP R10,#","
 BEQ PRCOMM
 CMP R10,#";"
 BEQ PRFUNY
 BL PRSPEC
 BEQ ENDPRI
 STMFD SP!,{R4,R5}
 SUB AELINE,LINE,#1
 BL EXPR
 LDMFD SP!,{R4,R5}
 SUB LINE,AELINE,#1
 BEQ PRINTA
 STMFD SP!,{R4,R5}
 LDR FWACC,[ARGP,#INTVAR];@%; r5 already has hex t/f
 BL FCONFP
 MOV CLEN,TYPE
 LDMFD SP!,{R4,R5}
 ADD R0,ARGP,#STRACC
 SUB TYPE,TYPE,R0
 SUBS R0,R4,TYPE
 BLHI SPCSWC
PRINTA BL PRINTS
 B ENDPRI
PRINTS ADD R1,ARGP,#STRACC
 TEQ R1,CLEN
 MOVEQ PC,R14
 LDR R0,[ARGP,#WIDTHLOC]
 CMN R0,#1
 BNE PRLOP2
PRLOP LDRB R0,[R1],#1
 SWI WRITEC
 TEQ R1,CLEN
 BNE PRLOP
 LDR R0,[ARGP,#TALLY]
 SUB CLEN,CLEN,#STRACC
 SUB CLEN,CLEN,ARGP
 ADD R0,R0,CLEN
 STR R0,[ARGP,#TALLY]
 MOV PC,R14
PRLOP2 STMFD SP!,{R7,R14}
 MOV R7,#0
PRLOP3 LDRB R0,[R1],#1
 BL CHOUT
 TEQ R1,CLEN
 BNE PRLOP3
 LDMFD SP!,{R7,R14}
 MOV PC,R14
PRSPEL CMP R10,#""""
 BNE PRSPEC
 STMFD SP!,{R4,R5,R14}
 MOV AELINE,LINE
 BL QSTR
 MOV LINE,AELINE
 BL PRINTS
 B PRSPEX
PRSPEC CMP R10,#"'"
 BEQ NLINE ;EQ if anything found and done
 CMP R10,#TTAB
 BEQ TAB
 CMP R10,#TSPC
 MOVNE PC,R14
 STMFD SP!,{R4,R5,R14} ;SPC N
 BL AEEXPR
 SUB LINE,AELINE,#1
 BL INTEGZ
PRSPEY BL SPCSWC
PRSPEX CMP R0,R0
 LDMFD SP!,{R4,R5,PC}
TAB STMFD SP!,{R4,R5,R14}
 BL AEEXPR
 BL INTEGZ
 CMP R10,#","
 BEQ TAB2
 CMP R10,#")"
 BNE ERBRA
 MOV LINE,AELINE
 LDR R1,[ARGP,#TALLY]
 SUBS R1,FACC,R1
 BEQ PRSPEX
 MOVCS FACC,R1
 BLCC NLINE
 B PRSPEY
TAB2 STMFD SP!,{FACC}
 BL BRA
 BL INTEGZ
 SWI WRITEI+31
 MOV R1,FACC
 LDMFD SP!,{FACC}
 SWI WRITEC
 MOV R0,R1
 SWI WRITEC
 MOV LINE,AELINE
 B PRSPEX
PROC MOV AELINE,LINE
 LDR R1,[ARGP,#PROCPTR]
 B FNBODY
READEN BL STORE
 SUB AELINE,AELINE,#1
 STR AELINE,[ARGP,#DATAP]
READS BL SPACES
 CMP R10,#","
 BNE DONEXT
READ BL CRAELV
 BEQ READS
 MOV LINE,AELINE
 CMP TYPE,#128
 BCS READST
 BL DATAIT
 STMFD SP!,{FACC,TYPE}
 BL EXPR
 B READEN
READST BL DATAIT
 STMFD SP!,{FACC,TYPE}
 BL DATAST
 B READEN
DATAIT LDR AELINE,[ARGP,#DATAP]
DATAA1 LDRB R10,[AELINE],#1
 CMP R10,#" "
 BEQ DATAA1
 CMP R10,#","
 MOVEQ PC,R14
 CMP R10,#13
 BNE DATAA1
DATAA2 LDRB R10,[AELINE]
 CMP R10,#&FF
 BCS DATAOT
 LDRB R10,[AELINE,#2]
 ADD R4,AELINE,R10 ;R4 1 on from next cr
 ADD AELINE,AELINE,#3 ;first char
DATAA3 LDRB R10,[AELINE],#1
 CMP R10,#" "
 BEQ DATAA3
 CMP R10,#TDATA
 MOVEQ PC,R14
 MOV AELINE,R4
 B DATAA2
REPEAT BL MUNGLE
 MOV R0,#TUNTIL
 STMFD SP!,{R0,LINE}
 B STMT
REPORT BL DONES
 BL NLINE
 ADD R4,ARGP,#ERRORS
 MOV R7,#0
REPORTLOP LDRB R0,[R4],#1
 CMP R0,#0
 BEQ NXT
 BL CHOUT
 B REPORTLOP
RESTORE BL SPACES
 CMP R10,#TERROR
 BEQ RESTOREERROR
 LDR R1,[ARGP,#PAGE]
 CMP R10,#":"
 CMPNE R10,#13
 CMPNE R10,#TELSE
 BEQ RESDON
 SUB LINE,LINE,#1
 BL GOFACT
 BL DONES
RESDON STR R1,[ARGP,#DATAP]
 B NXT
RETURN BL DONES
RETURNA LDMFD SP!,{R4,R5}
 CMP R4,#TRETURN
 LDREQB R10,[R5,#-1] ;get original character of statement end
 MOVEQ LINE,R5
 BEQ NXT
 SUB SP,SP,#8
 BL POPA
 BEQ RETURNA
 B ERGOSB
;Pop pops one of REPEAT.UNTIL, FOR.NEXT, WHILE.ENDWHILE, LOCAL ERROR
;NE signals no pop possible
;will use r4,r6,r7
POP LDR R4,[SP]
;entry with object in R4
POPA TEQ R4,#TUNTIL
 ADDEQ SP,SP,#8
 MOVEQ PC,R14
 TEQ R4,#TENDWH
 ADDEQ SP,SP,#12
 MOVEQ PC,R14
 TEQ R4,#TNEXT
 ADDEQ SP,SP,#20
 MOVEQ PC,R14
 TEQ R4,#TFOR
 ADDEQ SP,SP,#28
 MOVEQ PC,R14
 TEQ R4,#TERROR
 LDMEQFD SP!,{R4,R6,R7}
 STREQ R6,[ARGP,#ERRSTK]
 STREQ R7,[ARGP,#ERRORH]
 MOVEQ PC,R14
 TEQ R4,#"("
 LDMEQFD SP!,{R4,R6,R7}
 STREQ R6,[ARGP,#LOCALARLIST]
 MOVEQ R6,#0
 STREQ R6,[R7] ;undim it!
 LDMEQFD SP!,{R6}
 ADDEQ SP,SP,R6
 MOV PC,R14
;The stack is about to be moved up from SP to R0. Any local arrays in this
;area must be removed from the list set to undimensioned.
;The list first three elements are type, next, address
;use r4,r5,r6. r0 preserved.
POPLOCALAR ADD R4,ARGP,#LOCALARLIST-4
POPLOCALAR1 LDR R4,[R4,#4] ;get next field
 TEQ R4,#0 ;reached end of list?
 BEQ POPLOCALAREND
 CMP R4,R0 ;reached end of interesting bit?
 BCS POPLOCALAREND
 LDR R5,[R4]
 CMP R5,#"("
 BNE ERCATASLIST
 LDR R5,[R4,#8]
 MOV R6,#0 ;set to undimensioned
 STR R6,[R5]
 B POPLOCALAR1
POPLOCALAREND STR R4,[ARGP,#LOCALARLIST] ;finished, so truncate list
 MOV PC,R14
RUN BL DONES
RUNNER BL SETFSA
 BL ORDERR
 LDR LINE,[ARGP,#PAGE]
 LDR R0,[ARGP,#HIMEM]
 BL POPLOCALAR
 LDR SP,[ARGP,#HIMEM]
 MOV R0,#0
 STMFD SP!,{R0-R9}
 B STMT
SOUND BL SPACES
 CMP R10,#TOFF
 BEQ SOUNDON
 EORS R10,R10,#TON
 BEQ SOUNDON
 SUB AELINE,LINE,#1
 BL INTEXC
 STMFD SP!,{FACC}
 BL INTEXC
 MOV FACC,FACC,LSL #16
 LDMFD SP!,{R1}
 MOV R1,R1,LSL #16
 ORR FACC,FACC,R1,LSR #16
 STMFD SP!,{FACC}
 BL INTEXC
 STMFD SP!,{FACC}
 BL EXPRDN
 LDMFD SP!,{R1,R2}
 MOV FACC,FACC,LSL #16
 MOV R1,R1,LSL #16
 ORR FACC,FACC,R1,LSR #16
 ADD R1,ARGP,#STRACC
 STR R2,[R1]
 STR FACC,[R1,#4]
 MOV R0,#7
 SWI WORD
 B NXT
SOUNDON MOV R1,R10
 BL DONES
 MOV R2,#0
 MOV R0,#210
 SWI BYTE
 B NXT
STOP BL DONES
 B ERSTOP
SWAP BL AELV
 BEQ FACERR
 BL AESPAC
 TEQ R10,#","
 BNE ERCOMM
 STMFD SP!,{FACC,TYPE}
 BL LVBLNK
 BEQ FACERR
 MOV LINE,AELINE
 BL DONES
 LDMFD SP!,{R4,R5}
 CMP TYPE,#256
 BCS SWAPAR1
 CMP TYPE,#128
 BCC SWAP1
SWAP2 STMFD SP!,{R4,R5} ;lv1
 STMFD SP!,{FACC,TYPE} ;lv2
 MOV AELINE,SP
 BL VARIND ;of lv2
 BL PUSHTYPE ;value of lv2
 STMFD SP!,{TYPE}
 LDR FACC,[AELINE,#8]
 LDR TYPE,[AELINE,#12]
 BL VARIND ;value of lv1
 LDMFD AELINE!,{R4,R5} ;lv2
 BL STOREA ;lv2=(lv1)
 BL PULLTYPE ;(lv2)
 MOV SP,AELINE
 BL STORE ;lv1=(lv2)
 B NXT
SWAP1 TEQ TYPE,R5
 BNE SWAP2
SWAP1A LDRB R1,[FACC] ;swap 1,4,5 bytes for types 0,4,5
 LDRB R2,[R4]
 STRB R1,[R4],#1
 STRB R2,[FACC],#1
 SUBS R5,R5,#1
 BHI SWAP1A
 B NXT
SWAPAR1 CMP R5,#256
 BCC SWAP2
 CMP TYPE,R5
 BNE ERTYPESWAP
 LDR R1,[FACC] ;swap pointers to arrays
 LDR R2,[R4]
 STR R1,[R4]
 STR R2,[FACC]
 B NXT
TRACE MOV R4,#0
 MOV R5,#&80
 BL SPACES
 TEQ R10,#TSTEP
 MOVEQ R4,#TINTEGER
 BLEQ SPACES
 CMP R10,#TPROC
 CMPNE R10,#TFN
 ADDEQ R4,R4,#TFP
 ADDEQ FACC,R4,#TPROC
 BEQ TRSET1
 CMP R10,#TCONST
 BEQ TRSET2
 CMPNE R10,#TON
 ADDEQ FACC,R4,#&FF00
 BEQ TRSET1
 EORS FACC,R10,#TOFF
 BNE TRNUMB
 MOV R5,#0
TRSET1 BL DONES
TRSET STR FACC,[ARGP,#TRCNUM]
 STRB R5,[ARGP,#TRCFLG]
 B NXT
TRSET2 BL SPGETN
 ADD FACC,FACC,R4
 B TRSET1
TRNUMB STMFD SP!,{R4,R5}
 SUB LINE,LINE,#1
 BL AEEXDN
 LDMFD SP!,{R4,R5}
 ADD FACC,FACC,R4
 B TRSET
UNTIL BL AEEXDN
 LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
UNTILM LDR R4,[SP]
 CMP R4,#TUNTIL
 BNE UNTILP
 TEQ FACC,#0
 LDREQ LINE,[SP,#4]
 BEQ STMT
 PULLJ 2
 B NXT
UNTILP BL POPA
 BEQ UNTILM
 B ERREPT
WIDTH BL AEEXDN
 SUB FACC,FACC,#1
 STR FACC,[ARGP,#WIDTHLOC]
 B NXT
WHILE BL SPACES
 SUB AELINE,LINE,#1
 STMFD SP!,{AELINE} ;pointer to expression
 BL EXPR
 BL INTEGZ
 MOV LINE,AELINE
 CMP FACC,#0
 SUBEQ LINE,LINE,#1
 BEQ EWHILE
 BL MUNGLT
 MOV R0,#TENDWH
 STMFD SP!,{R0,LINE} ;token, start of block
 B STMT
EWHILX LDRB R10,[LINE],#1
 CMP R10,#&FF
 BCS CLRSTK
 ADD LINE,LINE,#2
EWHILE MOV R1,#0 ;inside strings. Facc (WHILE loop cnt) already 0
EWHILP LDRB R10,[LINE],#1
 CMP R10,#13
 BEQ EWHILX
 CMP R10,#""""
 EOREQ R1,R1,#1
 TEQ R1,#0
 BNE EWHILP
 CMP R10,#TDATA
 CMPNE R10,#TREM
 MOVEQ R1,#4
 BEQ EWHILP
 CMP R10,#TWHILE
 ADDEQ FACC,FACC,#1
 CMP R10,#TENDWH
 SUBEQ FACC,FACC,#1
 BNE EWHILP
 CMN FACC,#1
 BNE EWHILP
 PULLJ 1
 BL DONES
 B NXT
 LNK Stmt2
