;> Stmt
CASE ROUT
 BL AEEXPR
 TEQ R10,#TOF
 BNE ERCASE1
 LDRB R10,[AELINE],#1
 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}
 TEQ R4,#0
 BEQ CASES
 TEQ TYPE,#0
 BEQ ERTYPEINT
 [ FP=0
 BLPL IFLT
 ORR FGRD,FSIGN,FACCX
 TEQ FACC,R5
 TEQEQ FGRD,R6
 |
 LDFD F1,[SP,#4]
 FLTPLD FACC,IACC
 CMF FACC,F1
 ]
 BEQ CASEEQ
CASENE TEQ R10,#","
 BEQ CASEWH
 MOV R6,#0
 B %02
CASES TEQ TYPE,#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
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
CASEEL BL PULLTYPE
 B STMT
ENDCAS BL PULLTYPE
 B DONXTS
;hit WHEN and OTHERWISE implies going to ENDCASE at current level
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 ;increase level if see OF at end of line
 ADD R1,R2,#4
 LDRB R0,[R2,#3]
 ADD R2,R2,R0
02 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ %02
 TEQ R0,#TENDCA ;decrease level if see ENDCASE at start of line
 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,#TFPLV+1
 BCS ERTYPENUM
 STMFD SP!,{IACC,TYPE}
 BL EXPR
 BL INTEGY
 ADD R7,IACC,#1
 LDR IACC,[ARGP,#FSA]
 LDMFD SP!,{R4,R5}
 STMFD SP!,{IACC,R7}
 BL STOREA ;store thing, may yet fail
 LDMFD SP!,{IACC,R7}
 TEQ R7,#0
 BMI BADDIMSIGN
 ADD R7,R7,#3
 BIC R7,R7,#3
 ADD R7,IACC,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,#TFPLV
 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
 CMP TYPE,#TFPLV
 MOVEQ TYPE,#128
 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 IACC,IACC,#3
 BIC IACC,IACC,#3
 LDR R3,[IACC]
 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!,{TYPE} ;get original type from stack
 MOV R1,#1 ;count of entries
 STMFD SP!,{IACC} ;save l value
RDLOOP STMFD SP!,{R1,R3,TYPE} ;allocation place, number of entries, type
 BL SPUSH
 BL EXPR
 BL INTEGY
 CMP IACC,#&1000000
 BCS BADDIMSUB ;also removes negative numbers
 ADD R7,IACC,#1
 BL SPULL
 LDMFD SP!,{R1,R3,TYPE}
 STR R7,[CLEN],#4 ;add to subscript list
 MOV R4,#0
RDLOOM MOVS R7,R7,LSR #1
 ADDCS R4,R4,R1
 CMP R4,#&1000000 ;2^24
 ADDCCS R1,R1,R1 ;add if above compare ok
 BCS DIMRAM ;either r1 overflow or r4>2^24
 TEQ R7,#0
 BNE RDLOOM
 MOV R1,R4 ;multiplied pair of numbers
 CMP R10,#","
 BEQ RDLOOP
 CMP R10,#")"
 BNE BADDIMLIST
 TEQ TYPE,#4 ;test type
 MOVEQ R5,R1,LSL #2 ;if integer than number of bytes is 4* number of entries
 ADDNE R5,R1,R1,LSL #2 ;if real/string then 5*
 [ FP=1
 TEQ TYPE,#8
 MOVEQ R5,R1,LSL #3
 ]
 ADD R5,R5,#3
 BIC R5,R5,#3 ;number of bytes rounded to words
 ADD IACC,ARGP,#STRACC
 SUB IACC,CLEN,IACC
 ADD IACC,IACC,#8
 ADD IACC,IACC,R5
 LDR R4,[ARGP,#FSA]
 ADD R7,R4,IACC
 ADD R6,R7,#1024 ;plus generous allowance
 CMP R6,SP
 BCS DIMRAM
 LDMFD SP!,{R6} ;address to alter
 CMP R3,#1
 SUBEQ SP,SP,IACC
 MOVEQ R4,SP
 STMEQFD SP!,{IACC}
 STMEQFD SP!,{R6}
 ADDEQ IACC,TYPE,#256
 LDREQ R7,[ARGP,#LOCALARLIST]
 STMEQFD SP!,{IACC,R7}
 STREQ SP,[ARGP,#LOCALARLIST]
 STRNE R7,[ARGP,#FSA]
 STR R4,[R6] ;update pointer
 ADD R7,ARGP,#STRACC
DIMCOPY LDR IACC,[R7],#4
 STR IACC,[R4],#4
 CMP R7,CLEN
 BCC DIMCOPY
 MOV IACC,#0
 STR IACC,[R4],#4 ;terminate list
 STR R1,[R4],#4 ;put in the number of entries
 BL INITIALISERAM
 BL AESPAC
 B DIMNXT
;R0 word to save
;R4 base address
;R5 number of bytes
INITIALISERAM MOV R1,R0
 MOV R2,R0
 MOV R3,R0
INITIALISERAM1 SUBS R5,R5,#16
 STMHSIA R4!,{R0,R1,R2,R3}
 BHI INITIALISERAM1
 MOVEQ PC,R14
 CMN R5,#8
 STMLOIA R4!,{R0}
 STMEQIA R4!,{R0,R1}
 STMHIIA R4!,{R0,R2,R3}
 MOV PC,R14
END BL SPACES
 CMP R10,#"="
 BEQ ENDCHANGE
 BL DONE
 BL ENDER
 B CLRSTK
ENDCHANGE BL AEEXDN
 SUB R7,R0,#&8000 ;subtract start of world
 LDR R4,[ARGP,#HIMEM]
 SUB R5,R4,SP ;amount of space on stack
 LDR R6,[ARGP,#FSA]
 ADD R2,R6,#1024
 ADD R2,R2,R5 ;FSA+1024+amount of space on stack
 CMP R2,R0
 BCS ERREND
;first move the stack down
ENDCHANGE1 LDR R3,[SP],#4
 STR R3,[R6],#4 ;R6=FSA
 CMP SP,R4 ;R4=HIMEM
 BCC ENDCHANGE1
;change memory size
 MOV R0,R7
 MOV R1,#-1
 SWI WIMPSLOT
 ADD R0,R0,#&8000 ;add start of world
 SUB R7,R0,SP ;remember difference - how far the world moved!
 MOV SP,R0
 STR SP,[ARGP,#MEMLIMIT]
 STR SP,[ARGP,#HIMEM]
;move stack back up again
 LDR R1,[ARGP,#FSA]
ENDCHANGE2 LDR R3,[R6,#-4]!
 STR R3,[SP,#-4]!
 CMP R6,R1
 BHI ENDCHANGE2
;patch self references on the stack
 ADD R4,ARGP,#LOCALARLIST-4
 LDR R0,[ARGP,#ERRSTK]
 ADD R0,R0,R7
 STR R0,[ARGP,#ERRSTK]
 MOV R0,#0 ;false: no error in local realloc
 STR R0,[ARGP,#INSTALLLIST] ;kill installed libraries
ENDCHANGELOCALAR LDR R3,[R4,#4] ;next field
 TEQ R3,#0
 BEQ ENDCHANGELOCALARDONE
 ADD R3,R3,R7 ;alter reference to stack
 STR R3,[R4,#4]
 MOV R4,R3
 LDR R5,[R4,#8] ;address of owner
 LDR R6,[R5]
 ADD R6,R6,R7 ;move owner's idea of where we are
 ADD R1,R4,#16 ;check its pointing at us
 CMP R6,R1
 STREQ R6,[R5]
 MOVNE R0,#1 ;remember error
 B ENDCHANGELOCALAR
ENDCHANGELOCALARDONE TEQ R0,#0
 BEQ NXT
 B ERRENDARRAYREF
ENDPR BL DONES
ENDPRA LDMFD SP!,{R4}
 TEQ R4,#TPROC
 BNE ENDPRP
 MOV TYPE,#TINTEGER
 BL GTARGS
 SUB SP,SP,#4
 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
 TEQ TYPE,#0
 BEQ ERTYPEINT
 BLMI SFIX
 LDMFD SP!,{R10}
 CMP IACC,#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 IACC,[SP,R1]
 ADD R1,R1,#1
 CMP R1,#13
 BNE ENVELP
 BL EXPRDN
 STRB IACC,[SP,#13]
 MOV R1,SP
 MOV R0,#8
 SWI WORD
 ADD SP,SP,#16
 B NXT
FOR BL CRAELV
 BEQ FORCV
 CMP TYPE,#TFPLV+1
 BCS FORCV
 STMFD SP!,{IACC,TYPE} ;for STORE
 BL AESPAC
 CMP R10,#"="
 BNE MISSEQFOR
 BL EXPR
 CMP R10,#TTO
 BNE FORTO
 BL STORE ;start
 CMP R5,#TFPLV ;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 INTEGY
 STR IACC,[SP,#4*4] ;write limit onto stack
 CMP R10,#TSTEP
 BNE FORSTW
 BL EXPR
 BL INTEGY
 TEQ IACC,#0
 BEQ FORSTEP
 STR IACC,[SP,#3*4] ;write new step size onto stack
FORSTW BL AEDONE
 SUB LINE,LINE,#1
 BL MUNGLE
 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 FLOATY
 [ FP=0
 ADD TYPE,SP,#20
 FSTA TYPE ;write limit into stack
 BL FONE
 |
 STFD FACC,[SP,#20]
 MVFD FACC,#1
 ]
 CMP R10,#TSTEP
 BNE FORSTA
 BL EXPR
 BL FLOATY
 [ FP=0
 TEQ FACC,#0
 |
 CMF FACC,#0
 ]
 BEQ FORSTEP
FORSTA
 [ FP=0
 ADD TYPE,SP,#12 ;step offset on stack
 FSTA TYPE
 |
 STFD FACC,[SP,#12]
 ]
 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
 LDR R0,[ARGP,#FSA]
 ADD R0,R0,#1024
 CMP R0,SP
 BCC STMT
 B ERDEEPNEST
GOTO LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
 BL GOFACT
 BL DONES
 ADD LINE,R1,#4
 B STMT
GOFACT AND R1,LINE,#CACHEMASK
 ADD R1,ARGP,R1,LSL #CACHESHIFT
 LDMIA R1,{R1,R2,R4}
 CMP R4,LINE
 ADDEQ LINE,LINE,R2
 MOVEQ PC,R14
 STMFD SP!,{R14}
 MOV AELINE,LINE
 BL SPTSTN
 BEQ GOTOT2
 SUB AELINE,LINE,#1
 BL EXPR
 BL INTEGY
 CMP IACC,#65280
 BCS NOLINE
 SUB LINE,AELINE,#1
 BL FNDLNO
 LDMCSFD SP!,{PC}
 B NOLINE
GOTOT2 BL FNDLNO
 BCC NOLINE
 AND R3,AELINE,#CACHEMASK
 ADD R3,ARGP,R3,LSL #CACHESHIFT
 SUB R2,LINE,AELINE
 STMIA R3,{R1,R2,AELINE}
 LDMFD SP!,{PC}
;Address of cr before line in R1 of FACC. cs if found
FNDLNO LDR R1,[ARGP,#PAGE]
FNDLNONEXT AND R3,IACC,#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,IACC,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
 TEQ TYPE,#0
 BEQ ERTYPEINT
 BLMI SFIX
 MOV LINE,AELINE
 CMP IACC,#0
 BEQ ELSE
 CMP R10,#TTHEN
 BNE DISPAT
THENLN LDRB R10,[LINE],#1
 CMP R10,#" "
 BEQ THENLN
 CMP R10,#TCONST
 BNE DISPAT
 LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
 AND R1,LINE,#CACHEMASK
 ADD R1,ARGP,R1,LSL #CACHESHIFT
 LDMIA R1,{R1,R2,R4}
 CMP R4,LINE
 ADDEQ LINE,R1,#4
 BEQ STMT
 BL SPGETN
 BL FNDLNO
 BCC NOLINE
 SUB R4,LINE,#3
 AND R3,R4,#CACHEMASK
 ADD R3,ARGP,R3,LSL #CACHESHIFT
 STMIA R3,{R1,R2,R4}
 ADD LINE,R1,#4
 B STMT
ELSE TEQ R10,#13
 BEQ CRLINE
 TEQ R10,#TELSE
 BEQ THENLN
 TEQ R10,#TTHEN ;check to see if block structured
 BEQ ELSEBLK
ELSELP LDRB R10,[LINE],#1
 CMP R10,#13
 BEQ CRLINE
ELSELP1 CMP R10,#TELSE
 BEQ THENLN
 LDRB R10,[LINE],#1
 CMP R10,#13
 BEQ CRLINE
 CMP R10,#TELSE
 BNE ELSELP
 B THENLN
ELSEBLK ROUT
 LDRB R10,[LINE],#1
 TEQ R10,#13 ;trailing spaces were stripped when the line was entered
 BNE ELSELP1 ;not a block structured one
 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!,{IACC,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
 LDRB R0,[CLEN]
 CMP R0,#13
 MOV R0,#","
 STRNEB R0,[CLEN]
INTERM LDRB R10,[AELINE],#1
 CMP R10,#","
 BEQ INGETC
 CMP R10,#13
 BNE INTERM
 MOV AELINE,#0
INGETC MOV R5,AELINE
INGETB LDMFD SP!,{IACC,TYPE}
 STMFD SP!,{R4,R5}
 STMFD SP!,{IACC,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
LOCALDATA BL DONES
 LDR R1,[ARGP,#DATAP]
 MOV R0,#TDATA
 STMFD SP!,{R0,R1}
 B NXT
LOCAL BL SPACES
 CMP R10,#TERROR
 BEQ LOCALERROR
 CMP R10,#TDATA
 BEQ LOCALDATA
 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,IACC
 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,[IACC]
 MOV R2,#4
 STMFD SP!,{R1}
 STMFD SP!,{IACC,R2}
 STMFD SP!,{R5,R6,R7}
 MOV R1,#1
 STR R1,[IACC]
 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
 MOV AELINE,LINE
NEXTBLNK LDRB R10,[AELINE],#1
 CMP R10,#" "
 BEQ NEXTBLNK
 CMP R10,#"!"
 CMPNE R10,#"?"
 BCC NEXM1 ;ignore : and CR
 AND R1,AELINE,#CACHEMASK
 ADD R1,ARGP,R1,LSL #CACHESHIFT
 LDMIA R1,{IACC,R1,R4,TYPE}
 CMP R4,AELINE
 BNE NEXTVBNOTCACHE
 ADDS AELINE,AELINE,R1
 BPL STRIPA
 BIC AELINE,AELINE,#TFP ;array element
 BL ARLOOKCACHE
 BNE STRIPA
 B NEXM1
NEXTVBNOTCACHE BL LVNOTCACHE
 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 IACC,R5
 BEQ FNEXT
NEXP2 BL POP
 BNE NEXTER
 LDMFD SP,{R4,R5}
 TEQ R4,#TFOR
 BEQ NEXSF
 TEQ R4,#TNEXT
 BNE NEXTER
NEXSI TEQ IACC,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 IACC,[R4] ;get contents
 ADDS IACC,IACC,R6 ;add step
 BVS INXTPL
 STR IACC,[R4] ;write back
INXTPR TEQ R6,#0 ;test sign of step
 BMI INXTCH
 CMP IACC,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,IACC ;test if descending loop
 B INXTMT
SLONXT BIC R3,R4,#3
 LDMIA R3,{IACC,R1}
 MOV R2,R2,LSL #3
 MOV IACC,IACC,LSR R2
 RSB R2,R2,#32
 ORR IACC,IACC,R1,LSL R2
 ADDS IACC,IACC,R6
 BLVC STORER0MISAL
 BVC INXTPR
 B INXTPL
NEXSF TEQ IACC,R5
 BNE NEXP2
FNEXT
 [ FP=0
 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
 |
 LDFD FACC,[R5]
 LDFD F1,[SP,#12] ;step
 CMF F1,#0
 ADFD FACC,F1,FACC
 STFD FACC,[R5]
 LDFD F1,[SP,#20] ;limit
 BMI FNEXTA
 CMF FACC,F1
 LDRLE LINE,[SP,#8]
 BLE STMT
 PULLJ 7
 B NEXTEX
FNEXTA CMF FACC,F1
 LDRGE LINE,[SP,#8]
 BGE STMT
 PULLJ 7
 B NEXTEX
 ]
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 INTEGY
 CMP R10,#TGOTO
 CMPNE R10,#TGOSUB
 CMPNE R10,#TPROC
 BNE ONER
 CMP R10,#TPROC
 SUBEQ AELINE,AELINE,#1
 SUBS IACC,IACC,#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 IACC,IACC,#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
RESTOREDATA BL DONES
 LDMFD SP!,{R0}
 CMP R0,#TDATA
 BNE ERRDATASTACK
 LDMFD SP!,{R1}
 STR R1,[ARGP,#DATAP]
 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]
 MOVS R2,R1
 BEQ STRTPR
 MOV R3,R0
PRCOML1 MOVS R3,R3,LSL #1
 CMPCC R3,R1
 BCC PRCOML1
 MOV R3,R3,ROR #1
PRCOML2 SUBS R1,R1,R3
 BEQ STRTPR
 SUBCSS R1,R1,R3
 BEQ STRTPR
 ADDCC R1,R1,R3
 MOV R3,R3,LSR #1
 CMP R3,R0
 BCS PRCOML2
 RSB R0,R1,R0
 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
 TEQ TYPE,#0
 BEQ PRINTA
 STMFD SP!,{R4,R5}
 LDR R4,[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
 ADD R0,ARGP,#STRACC
 SUB R1,CLEN,R0
 SWI WRITEN
 LDR R0,[ARGP,#TALLY]
 ADD R0,R0,R1
 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 INTEGY
PRSPEY BL SPCSWC
PRSPEX CMP R0,R0
 LDMFD SP!,{R4,R5,PC}
TAB STMFD SP!,{R4,R5,R14}
 BL AEEXPR
 BL INTEGY
 CMP R10,#","
 BEQ TAB2
 CMP R10,#")"
 BNE ERBRA
 MOV LINE,AELINE
 LDR R1,[ARGP,#TALLY]
 SUBS R1,IACC,R1
 BEQ PRSPEX
 MOVCS IACC,R1
 BLCC NLINE
 B PRSPEY
TAB2 STMFD SP!,{IACC}
 BL BRA
 BL INTEGZ
 SWI WRITEI+31
 MOV R1,IACC
 LDMFD SP!,{IACC}
 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
 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!,{IACC,TYPE}
 BL EXPR
 SUB AELINE,AELINE,#1
 B READEN
READST BL DATAIT
 STMFD SP!,{IACC,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
 CMP R10,#TDATA
 BEQ RESTOREDATA
 LDR R1,[ARGP,#PAGE]
 CMP R10,#"+"
 BEQ RESTOREREL
 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
RESTOREREL BL AEEXDN
 SUB R1,LINE,#2
RESTOREREL1 LDRB R2,[R1],#1
 CMP R2,#13
 BNE RESTOREREL1
 LDRB R2,[R1],#1
 ADD R1,R1,#2
 CMP R2,#&FF
 BEQ NOLINE
 SUBS R0,R0,#1
 BGT RESTOREREL1
 SUB R1,R1,#4
 B RESDON
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 one of REPEAT.UNTIL, FOR.NEXT, WHILE.ENDWHILE, LOCAL ERROR, LOCAL DATA
;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,#TDATA
 LDMEQFD SP!,{R4,R6}
 STREQ R6,[ARGP,#DATAP]
 MOVEQ PC,R14
 SUBS R6,R4,#256
 MOVCC PC,R14 ;signals NE
 CMP R6,#4
 CMPNE R6,#TFPLV
 CMPNE R6,#128
 MOVNE PC,R14 ;check valid arrays
 LDMFD SP!,{R4,R6,R7}
 STR R6,[ARGP,#LOCALARLIST]
 MOV R6,#0
 STR R6,[R7] ;undim it!
 CMP R4,#256+128
 BNE POPA2
 MOV R6,R14
 ADD R7,SP,#4
 BL CLRSTRARRAY
 MOV R14,R6
POPA2 LDMFD SP!,{R6}
 ADD SP,SP,R6
 MOVS R6,#0 ;signal POP was possible
 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]
 SUBS R5,R5,#256
 BCC ERCATASLIST
 CMP R5,#4
 CMPNE R5,#TFPLV
 CMPNE R5,#128
 BNE ERCATASLIST
 CMP R5,#128
 BNE POPLOCALAR2
 STMFD SP!,{R7,R14}
 ADD R7,R4,#16 ;purge array on stack
 BL CLRSTRARRAY
 LDMFD SP!,{R7,R14}
POPLOCALAR2 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
;clear string array so that all space is back on heap. Entry with R7 as
;address of array. Uses/destroys no registers
CLRSTRARRAY STMFD SP!,{R0-R7,AELINE,R14}
CLRSTRARR1 LDR R4,[R7],#4
 CMP R4,#0
 BNE CLRSTRARR1
 ADD R4,R7,#4
 LDR AELINE,[R7]
 MOV R2,R3
CLRSTRARR2 BL STSTORE
 ADD R4,R4,#5
 SUBS AELINE,AELINE,#1
 BNE CLRSTRARR2
 LDMFD SP!,{R0-R7,AELINE,PC}
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
BEATS BL AEEXDN
 SWI SOUNDEVENTQBEAT
 B NXT
VOICES BL AEEXDN
 MOV R1,#0
 MOV R2,#0
 MOV R3,#0
 MOV R4,#0
 SWI SOUNDCONFIGURE
 B NXT
VOICE BL INTEXA
 STMFD SP!,{IACC}
 BL EXPR
 TEQ TYPE,#0
 BNE ERTYPESTR
 BL AEDONE
 LDMFD SP!,{R0}
 ADD R1,ARGP,#STRACC
 MOV R4,#0
 STRB R4,[CLEN]
 SWI SOUNDVOICE
 B NXT
TEMPO BL AEEXDN
 SWI SOUNDEVENTTEMPO
 B NXT
STEREO BL INTEXA
 STMFD SP!,{IACC}
 BL EXPRDN
 MOV R1,IACC
 LDMFD SP!,{R0}
 SWI SOUNDSTEREO
 B NXT
SOUND BL SPACES
 CMP R10,#TOFF
 BEQ SOUNDOFF
 EORS R10,R10,#TON
 BEQ SOUNDON
 SUB AELINE,LINE,#1
 BL INTEXC
 STMFD SP!,{IACC}
 BL INTEXC
 MOV IACC,IACC,LSL #16
 LDMFD SP!,{R1}
 MOV R1,R1,LSL #16
 ORR IACC,IACC,R1,LSR #16
 STMFD SP!,{IACC}
 BL INTEXC
 STMFD SP!,{IACC}
 BL EXPR
 BL INTEGY
 LDMFD SP!,{R1,R2}
 MOV IACC,IACC,LSL #16
 MOV R1,R1,LSL #16
 ORR R3,IACC,R1,LSR #16
 CMP R10,#","
 BNE SOUNDFOUR
 STMFD SP!,{R2,R3}
 BL EXPRDN ;time parameter in R0 as required
 MOV R1,#0
 LDMFD SP!,{R2,R3}
 SWI SOUNDEVENTQSCHEDULE
 B NXT
SOUNDFOUR BL AEDONE
 ADD R1,ARGP,#STRACC
 STMIA R1,{R2,R3}
 MOV R0,#7
 SWI WORD
 B NXT
SOUNDOFF MOV R0,#1
 B SOUNDENABLEON
SOUNDON MOV R0,#2
SOUNDENABLEON BL DONES
 SWI SOUNDENABLE
 B NXT
STOP BL DONES
 B ERSTOP
SWAP BL AELV
 BEQ FACERR
 BL AESPAC
 TEQ R10,#","
 BNE ERCOMM
 STMFD SP!,{IACC,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!,{IACC,TYPE} ;lv2
 MOV AELINE,SP
 BL VARIND ;of lv2
 BL PUSHTYPE ;value of lv2
 STMFD SP!,{TYPE}
 LDR IACC,[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,[IACC] ;swap 1,4,5/8 bytes for types 0,4,5/8
 LDRB R2,[R4]
 STRB R1,[R4],#1
 STRB R2,[IACC],#1
 SUBS R5,R5,#1
 BHI SWAP1A
 B NXT
SWAPAR1 CMP R5,#256
 BCC SWAP2
 CMP TYPE,R5
 BNE ERTYPESWAP
 LDR R1,[IACC] ;swap pointers to arrays
 LDR R2,[R4]
 STR R1,[R4]
 STR R2,[IACC]
 B NXT
TRACE BL SPACES
 TEQ R10,#TTO
 BEQ TRACETO
 TEQ R10,#TCLOSE
 BEQ TRACECLOSE
 LDR R4,[ARGP,#TRCNUM]
 BIC R4,R4,#TINTEGER ;clear step bit
 MOV R5,#&80 ;trcflg to be on after this...
 TEQ R10,#TSTEP
 ORREQ R4,R4,#TINTEGER
 BLEQ SPACES
 CMP R10,#TPROC
 CMPNE R10,#TFN
 ORREQ IACC,R4,#TFP ;turn on proc/fn trace
 BEQ TRSET1
 BIC R4,R4,#&FF ;clear any existing line number
 BIC R4,R4,#&FF00
 CMP R10,#TCONST ;constant number?
 BEQ TRSET2
 CMPNE R10,#TON ;on anyway
 ORREQ IACC,R4,#&FF00 ;big enough number
 BEQ TRSET1
 EORS IACC,R10,#TOFF
 BNE TRNUMB
 MOV R5,#0
TRSET1 BL DONES
;TRCNUM word has: b31: trace proc/fn
;                 b30: trace step
;                 b15-0: trace max line number
TRSET STR IACC,[ARGP,#TRCNUM]
 STRB R5,[ARGP,#TRCFLG]
 B NXT
TRSET2 BL SPGETN
 ADD IACC,IACC,R4
 B TRSET1
TRNUMB STMFD SP!,{R4,R5}
 SUB LINE,LINE,#1
 BL AEEXDN
 LDMFD SP!,{R4,R5}
 ADD IACC,IACC,R4
 B TRSET
TRACETO BL AEEXPR
 BL OSSTRI
 BL AEDONE
 LDR R1,[ARGP,#TRACEFILE]
 TEQ R1,#0
 MOV R0,#0
 STR R0,[ARGP,#TRACEFILE] ;kill handle!
 SWINE OPEN
 ADD R1,ARGP,#STRACC
 MOV R0,#&80
 SWI OPEN
 STR R0,[ARGP,#TRACEFILE]
 CMP R0,#0
 MOV R0,#&12 ;set type
 MOV R2,#&FF
 ORR R2,R2,#&F00
 SWINE FILE+&20000
 SWIEQ FILE
 B NXT
TRACECLOSE BL DONES
 LDR R1,[ARGP,#TRACEFILE]
 TEQ R1,#0
 MOV R0,#0
 STR R0,[ARGP,#TRACEFILE] ;kill handle!
 SWINE OPEN
 B NXT
UNTIL BL AEEXDN
 LDR R4,[ARGP,#ESCWORD]
 CMP R4,#0
 BLNE DOEXCEPTION
UNTILM LDR R4,[SP]
 CMP R4,#TUNTIL
 BNE UNTILP
 TEQ IACC,#0
 LDREQ LINE,[SP,#4]
 BEQ STMT
 PULLJ 2
 B NXT
UNTILP BL POPA
 BEQ UNTILM
 B ERREPT
WIDTH BL AEEXDN
 SUB IACC,IACC,#1
 STR IACC,[ARGP,#WIDTHLOC]
 B NXT
WHILE BL SPACES
 SUB AELINE,LINE,#1
 STMFD SP!,{AELINE} ;pointer to expression
 BL EXPR
 BL INTEGY
 SUB LINE,AELINE,#1
 CMP IACC,#0
 BEQ EWHILE
 BL MUNGLE
 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 IACC,IACC,#1
 CMP R10,#TENDWH
 SUBEQ IACC,IACC,#1
 BNE EWHILP
 CMN IACC,#1
 BNE EWHILP
 PULLJ 1
 BL DONES
 B NXT
 LNK Stmt2
