; ----------------------------------------------------
; CHO-CHO-MINI BASIC INTERPRETER for SH7046
; (C)2007 A.Hiramatsu (07/09/01)
; ----------------------------------------------------
INCLUDE (SH7046.INC)
VARS EQU 26
DEFINE LINEP R11
DEFINE EXEP R12
SEGMENT TEXT
DC.L INIT,WRKTOP,INIT,WRKTOP
DC.L BADINS,NULINT,BADSLT,NULINT
DC.L NULINT,ADRERR,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
DC.L NULINT,NULINT,NULINT,NULINT
NULINT: RTE
NOP
INIT: MOV.L A_MSTCR1,R13
MOV.W MSTCR1D,R0
MOV.W R0,@R13
MOV.L IOBASE1,R13
LDC R13,GBR
MOV.W PACRL1D,R0
MOV.W R0,@(PACRL1-IOBASE,GBR)
MOV.W PACRL2D,R0
MOV.W R0,@(PACRL2-IOBASE,GBR)
MOV.W PACRL3D,R0
MOV.W R0,@(PACRL3-IOBASE,GBR)
MOV.L SCIBASE1,R13
LDC R13,GBR
MOV #H'00,R0 ; ASYN,8B,NOPARI,STOP=1,NO MP,CLK=1/1
MOV.B R0,@(SMR_2-SCIBASE,GBR)
MOV.B R0,@(SMR_3-SCIBASE,GBR)
MOV #H'00,R0 ; NO INT,TX/RX DISABLE,INTERNAL CLOCK
MOV.B R0,@(SCR_2-SCIBASE,GBR)
MOV.B R0,@(SCR_3-SCIBASE,GBR)
MOV #79,R0 ; 9600 BAUD
MOV.B R0,@(BRR_2-SCIBASE,GBR)
MOV.B R0,@(BRR_3-SCIBASE,GBR)
MOV.L DLYCNT,R1
INITLP: DT R1
BF INITLP
MOV #H'30,R0 ; NO INT,TX/RX ENABLE,INTERNAL CLOCK
MOV.B R0,@(SCR_2-SCIBASE,GBR)
MOV.B R0,@(SCR_3-SCIBASE,GBR)
MOV.B @(RDR_2-SCIBASE,GBR),R0 ; DUMMY READ
MOV.B @(SSR_2-SCIBASE,GBR),R0
AND #H'84,R0 ; CLEAR RXRDY & ERRORS
MOV.B R0,@(SSR_2-SCIBASE,GBR)
MOV.B @(RDR_3-SCIBASE,GBR),R0 ; DUMMY READ
MOV.B @(SSR_3-SCIBASE,GBR),R0
AND #H'84,R0 ; CLEAR RXRDY & ERRORS
MOV.B R0,@(SSR_3-SCIBASE,GBR)
MOV.L WRKTOP1,R13
LDC R13,GBR
BRA MAIN
NOP
ALIGN 2
MSTCR1D:DC.W H'F033 ; USE SCI2,SCI3
PACRL1D:DC.W H'0005 ; USE TXD3,RXD2,TXD2,RXD2
PACRL2D:DC.W H'5000
PACRL3D:DC.W H'03C0
ALIGN 4
A_MSTCR1: DC.L MSTCR1
IOBASE1: DC.L IOBASE
DLYCNT: DC.L 25000
SCIBASE1: DC.L SCIBASE
WRKTOP1: DC.L WRKTOP
MAXLL EQU 240 ; LINE BUFFER MAX LENGTH
; CONVERT BINARY TO ASCII
; PARAM R2:VALUE R3 DST STRING POINTER
; USE R0,R1
UITOA: BRA ITOA11
MOV.L R3,@-R15 ; SAVE R3
ITOA: CMP/PZ R2
BT/S ITOA1
MOV #H'20,R0
NEG R2,R2
MOV #H'2D,R0
ITOA1: MOV.B R0,@R3 ; SET SIGN
ADD #1,R3
MOV.L R3,@-R15 ; SAVE R3
ITOA11: STS.L PR,@-R15
MOV.L ITOAE9,R1
BSR ITOASB
MOV #H'30,R0
MOV.L ITOAE8,R1
BSR ITOASB
MOV #H'30,R0
MOV.L ITOAE7,R1
BSR ITOASB
MOV #H'30,R0
MOV.L ITOAE6,R1
BSR ITOASB
MOV #H'30,R0
MOV.L ITOAE5,R1
BSR ITOASB
MOV #H'30,R0
MOV.W ITOAE4,R1
BSR ITOASB
MOV #H'30,R0
MOV.W ITOAE3,R1
BSR ITOASB
MOV #H'30,R0
MOV.W ITOAE2,R1
BSR ITOASB
MOV #H'30,R0
MOV #H'0A,R1
BSR ITOASB
MOV #H'30,R0
LDS.L @R15+,PR
MOV R2,R0
ADD #H'30,R0
MOV.B R0,@R3 ; FINAL DIGIT
ADD #1,R3
MOV #0,R0
MOV.B R0,@R3 ; END OF STRING
MOV.L @R15+,R3
MOV #H'20,R1
MOV #9,R4
ITOA2: MOV.B @R3,R0 ; ZERO SUPLESS
CMP/EQ #H'30,R0
BF ITOAE
MOV.B R1,@R3
DT R4
BF/S ITOA2
ADD #1,R3
ITOAE: RTS
NOP
ITOAE4: DC.W H'2710
ITOAE3: DC.W H'3E8
ITOAE2: DC.W H'64
ALIGN 4
ITOAE9: DC.L H'3B9ACA00
ITOAE8: DC.L H'5F5E100
ITOAE7: DC.L H'989680
ITOAE6: DC.L H'F4240
ITOAE5: DC.L H'186A0
ITOASB: CMP/HS R1,R2
BF ITOASE
SUB R1,R2
BRA ITOASB
ADD #1,R0
ITOASE: MOV.B R0,@R3
RTS
ADD #1,R3
; GET CHAR
GETCH: MOV.B @(LATKEY-WRKTOP,GBR),R0
CMP/EQ #0,R0
BF GETCHE
MOV.L SCIBASE2,R13
STC.L GBR,@-R15 ; SAVE GBR
LDC R13,GBR
MOV.L R1,@-R15 ; SAVE R1
MOV.L R2,@-R15 ; SAVE R2
GETCHL: MOV.B @(SSR_3-SCIBASE,GBR),R0
TST #H'40,R0 ; RX READY ?
BF GETCHX
TST #H'38,R0 ; ERROR BITS
BT GETCHL
AND #H'C4,R0 ; CLEAR ERRORS
BRA GETCHL
MOV R0,@(SSR_3-SCIBASE,GBR)
GETCHX: AND #H'84,R0 ; CLEAR RXRDY & ERRORS
MOV R0,R1 ; SSR DATA -> R1
MOV.B @(RDR_3-SCIBASE,GBR),R0 ; GET RX DATA
MOV R0,R2 ; RX DATA - > R2
MOV R1,R0 ; SSR DATA
MOV.B R0,@(SSR_3-SCIBASE,GBR)
EXTU.B R2,R0 ; RX DATA
MOV.L @R15+,R2
MOV.L @R15+,R1
RTS
LDC.L @R15+,GBR
GETCHE: SHLL8 R0
MOV.B R0,@(LATKEY-WRKTOP,GBR) ; CLEAR LATKEY
MOV.B R0,@(LATKTM-WRKTOP,GBR) ; CLEAR LATKTM
SHLR8 R0
RTS
EXTU.B R0,R0
; PUT CHAR
PUTCH: STC.L GBR,@-R15
MOV.L SCIBASE2,R13
MOV.L R2,@-R15
MOV.L R1,@-R15
LDC R13,GBR
MOV.L R0,@-R15
MOV.L LATKEY1,R2
PUTCHL: MOV.B @(SSR_3-SCIBASE,GBR),R0
TST #H'80,R0 ; TX READY ?
BF PUTCHX
MOV.B @R2,R1 ; LATKEY
TST R1,R1
BF PUTCHL
TST #H'40,R0 ; RX READY ?
BF PUTCH1
TST #H'38,R0 ; ERROR BITS
BT PUTCHL
AND #H'C4,R0 ; CLEAR ERRORS
BRA PUTCHL
MOV.B R0,@(SSR_3-SCIBASE,GBR)
PUTCH1: MOV R0,R1
MOV.B @(RDR_3-SCIBASE,GBR),R0
MOV.B R0,@R2 ; UPDATE LATKEY
MOV R1,R0
AND #H'84,R0 ; CLEAR RXRDY & ERRORS
BRA PUTCHL
MOV.B R0,@(SSR_3-SCIBASE,GBR)
PUTCHX: MOV R0,R1
MOV.L @R15+,R0
MOV.B R0,@(TDR_3-SCIBASE,GBR) ; TX DATA
MOV R1,R0
AND #H'7F,R0 ; CLEAR TXRDY FLAG
MOV.B R0,@(SSR_3-SCIBASE,GBR)
MOV.L @R15+,R1
MOV.L @R15+,R2
RTS
LDC.L @R15+,GBR
ALIGN 4
SCIBASE2: DC.L SCIBASE
LATKEY1: DC.L LATKEY
; MISC DISPLAY ROUTINES
CRLF: STS.L PR,@-R15
BSR PUTCH
MOV #H'0D,R0
LDS.L @R15+,PR
BRA PUTCH
MOV #H'0A,R0
SPACE: BRA PUTCH
MOV #H'20,R0
PUTSTR: MOV.B @R2+,R0
STS.L PR,@-R15
PUTSTRL:CMP/EQ #0,R0
BT PUTSTE
BSR PUTCH
NOP
BRA PUTSTRL
MOV.B @R2+,R0
PUTSTE: LDS.L @R15+,PR
RTS
NOP
; GET LINE
GETLN: MOV.L R4,@-R15
MOV.L R5,@-R15
STS.L PR,@-R15
MOV #0,R3 ; LENGTH
MOV R3,R0
MOV.B R0,@(LATKEY-WRKTOP,GBR) ; CLEAR LATKEY
MOV.L LINBUF1,R4
MOV #MAXLL,R5
GETLNL: BSR GETCH
NOP
CMP/EQ #H'03,R0 ; CTRL-C
BT GETLNN
CMP/EQ #H'0D,R0
BT GETLNE
CMP/EQ #H'08,R0
BT GETLBS
CMP/EQ #H'09,R0
BF GETLN1
MOV #H'20,R0 ; TAB -> SPACE
GETLN1: MOV #H'20,R13
CMP/HS R13,R0 ; IGNORE UNPRINTABLE CODE
BF GETLNL
CMP/HS R5,R3 ; MAX LENGTH ?
BT GETLNL
BSR PUTCH ; ECHO BACK
MOV.B R0,@R4 ; PUT TO BUFFER
ADD #1,R3
BRA GETLNL
ADD #1,R4
GETLNE: BSR CRLF
NOP
BRA GETLNEE
CLRT ; SUCCESS:CLEAR TFLG
GETLNN: BSR CRLF
NOP
SETT ; FAIL:SET TFLG
GETLNEE:MOV #0,R0
MOV.B R0,@R4 ; END OF LINE
MOV.B R0,@(LATKEY-WRKTOP,GBR) ; CLEAR LATKEY
LDS.L @R15+,PR
MOV.L @R15+,R5
MOV.L @R15+,R4
RTS
MOV.B R0,@(LATKTM-WRKTOP,GBR) ; CLEAR LATKTM
GETLBS: TST R3,R3 ; LENGTH=0 ?
BT GETLNL
BSR PUTCH ; BACK CURSOR
MOV #H'08,R0
BSR PUTCH ; ERASE
MOV #H'20,R0
BSR PUTCH ; BACK CURSOR
MOV #H'08,R0
ADD #-1,R3 ; DECREMENT LENGTH
BRA GETLNL
ADD #-1,R4 ; DECREMENT POINTER
ALIGN 4
LINBUF1:DC.L LINBUF
DOT: MOV.L R3,@-R15
MOV.L ITOABF1,R3
STS.L PR,@-R15
BSR ITOA
NOP
MOV.L ITOABF1,R2
BSR PUTCH
MOV.B @R2+,R0 ; SIGN
BRA UDOT1
NOP
UDOT: MOV.L R3,@-R15
MOV.L ITOABF1,R3
STS.L PR,@-R15
BSR UITOA
NOP
MOV.L ITOABF1,R2
UDOT1: MOV.B @R2+,R0
CMP/EQ #0,R0
BT UDOTE
CMP/EQ #H'20,R0
BT UDOT1
BSR PUTSTR
ADD #-1,R2
UDOTE: LDS.L @R15+,PR
RTS
MOV.L @R15+,R3
UDOTR: MOV.L R3,@-R15
MOV.L ITOABF1,R3
STS.L PR,@-R15
BSR UITOA
NOP
MOV.L ITOABF1,R2
BSR PUTSTR
NOP
LDS.L @R15+,PR
RTS
MOV.L @R15+,R3
ALIGN 4
ITOABF1:DC.L ITOABF
; ---------------------------
; PRIMITIVE RUNTIME ROUTINES
; ---------------------------
XEQ: CMP/EQ R1,R2
RTS
MOVT R2
XNEQ: CMP/EQ R1,R2
MOVT R2
TST R2,R2
RTS
MOVT R2
XGT: CMP/GT R1,R2
RTS
MOVT R2
XGE: CMP/GE R1,R2
RTS
MOVT R2
XLT: CMP/GE R1,R2
MOVT R2
TST R2,R2
RTS
MOVT R2
XLE: CMP/GT R1,R2
MOVT R2
TST R2,R2
RTS
MOVT R2
XNOT: TST R2,R2
RTS
MOVT R2
XSGN: CMP/PZ R2
BF XSGNM
CMP/PL R2
BT XSGNP
RTS
MOV #0,R2
XSGNP: RTS
MOV #1,R2
XSGNM: RTS
MOV #-1,R2
XPLUS: RTS
ADD R1,R2
XMINUS: RTS
SUB R1,R2
X_OR: RTS
OR R1,R2
XAND: RTS
AND R1,R2
XXOR: RTS
XOR R1,R2
XABS: CMP/PZ R2
BT XABSE
NEG R2,R2
XABSE: RTS
NOP
XNEG: RTS
NEG R2,R2
XCPL: RTS
NOT R2,R2
XPEEK: MOV.B @R2,R2
RTS
EXTU.B R2,R2
XFREE: MOV R2,R0
CMP/EQ #0,R0
BT XFRE0
CMP/EQ #1,R0
BT XFRE1
CMP/EQ #2,R0
BF JILLFUN1
MOV.L @(ENDFRE-WRKTOP,GBR),R0 ; FRE(2) : END OF FREE
RTS
MOV R0,R2
XFRE0: MOV.L @(ENDFRE-WRKTOP,GBR),R0 ; FRE(0) : TOTAL BYTES OF FREE
MOV R0,R2
MOV.L @(FREE-WRKTOP,GBR),R0
RTS
SUB R0,R2
XFRE1: MOV.L @(FREE-WRKTOP,GBR),R0 ; FRE(1) : TOP OF FREE
RTS
MOV R0,R2
JILLFUN1:
BRA ILLFUN
NOP
XMUL: MUL.L R1,R2
RTS
STS MACL,R2
XIDIV: STS.L PR,@-R15
MOV R1,R0
XOR R2,R0 ; RESULT SIGN
MOV.L R0,@-R15
CMP/PZ R1
BT IDIV1
NEG R1,R1
IDIV1: CMP/PZ R2
BT IDIV2
NEG R2,R2
IDIV2: BSR XDIV
NOP
MOV.L @R15+,R0 ; RESULT SIGN
LDS.L @R15+,PR
CMP/PZ R0
BT IDIV3
NEG R2,R2
IDIV3: RTS
NOP
; DEVIDE R2/R1
JDIV0: BRA DIV0
NOP
XDIV: TST R1,R1
BT JDIV0
MOV.L R3,@-R15
MOV #0,R3
DIV0U
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
DIV1 R1,R3
ROTCL R2
RTS
MOV.L @R15+,R3
; PRINT CAST
XCHR: BRA PUTCH
MOV R2,R0
; ------------------------------
; MISC ROUTINES FOR INTERPRETER
; ------------------------------
; SCAN LINE NO. EQUAL TO R2
SCNEQL: MOV.L @(BASTOP-WRKTOP,GBR),R0
MOV R0,R3
SCNELP: MOV.L @R3,R1 ; LINE NO.
MOV.B @(4,R3),R0 ; LINE LENGTH
TST R1,R1
BT SCNEN ; LINE NO.=0,END OF TEXT
CMP/EQ R1,R2
BT SCNEE
EXTU.B R0,R0
ADD #5,R3
BRA SCNELP
ADD R0,R3
SCNEE: RTS ; RETRUN R3=ADDR OF LINE
SETT ; SET TFLG
SCNEN: RTS
CLRT ; CLEAR TFLG
; SCAN LINE NO. HIGHER OR SAME R2
SCNHSL: MOV.L @(BASTOP-WRKTOP,GBR),R0
MOV R0,R3
SCNHLP: MOV.L @R3,R1 ; LINE NO.
MOV.B @(4,R3),R0 ; LINE LENGTH
TST R1,R1
BT SCNEN ; LINE NO.=0,END OF TEXT
CMP/HS R2,R1
BT SCNEN ; FOUND HIGHER OR SAME LINE
EXTU.B R0,R1
ADD #5,R3
BRA SCNHLP
ADD R1,R3
; LIST LINE
LSTLIN: STS.L PR,@-R15
BSR UDOTR
MOV.L @R3+,R2
BSR SPACE
ADD #1,R3 ; SKIP LENGTH
BSR PUTSTR
MOV R3,R2
BRA CRLF
LDS.L @R15+,PR
LSKPSP: MOV EXEP,R3
SKIPSP: MOV #H'20,R13
SKPSPL: MOV.B @R3,R0
CMP/EQ #0,R0 ; END OF LINE
BT/S SKPSPE
EXTU.B R0,R0
CMP/HI R13,R0 ; PRINTABLE CHAR
BT SKPSPE
BRA SKPSPL
ADD #1,R3
SKPSPE: RTS
NOP
LQEOS: MOV EXEP,R3
SQEOS: STS.L PR,@-R15
BSR SKIPSP
NOP
LDS.L @R15+,PR
QEOS: CMP/EQ #H'3A,R0 ; ':'
BT QEOSE
CMP/EQ #H'27,R0 ; SINGLE QUOTE
BT QEOSE
TST R0,R0 ; END OF LINE
BT QEOSE
RTS
CLRT ; RETURN TBIT=0
QEOSE: RTS
SETT
LXPRPA: MOV EXEP,R3 ; EXPECT RIGHT PAREN
SXPRPA: STS.L PR,@-R15
BSR SKIPSP
NOP
LDS.L @R15+,PR
EXPRPA: CMP/EQ #H'29,R0 ; ')'
BF JSYNERR2
ADD #1,R3
RTS
MOV R3,EXEP
LXPCOM: MOV EXEP,R3 ; EXPECT COMMA
SXPCOM: STS.L PR,@-R15
BSR SKIPSP
NOP
LDS.L @R15+,PR
EXPCOM: CMP/EQ #H'2C,R0 ; ','
BF JSYNERR2
ADD #1,R3
RTS
MOV R3,EXEP
JSYNERR2:
BRA SYNERR
NOP
LXPSTR: MOV EXEP,R3
SXPSTR: STS.L PR,@-R15
BSR SKIPSP
NOP
LDS.L @R15+,PR
EXPSTR: MOV.B @R2,R0
MOV.B @R3+,R1
TST R0,R0
BT EXPSTE
CMP/EQ R1,R0
BF JSYNERR2
BRA EXPSTR
ADD #1,R2
EXPSTE: RTS
NOP
; SCAN WORD
; PARAM:R3=EXEP,R2=TABLE
SCAN: MOV R3,EXEP
SCANLP: TST R2,R2 ; R2=0:NOT FOUND
BT SCANN
MOV R2,R1
ADD #8,R1 ; SKIP LINK & EXEADR
SCANL2: MOV.B @R1+,R0
MOV.B @R3+,R4
CMP/EQ #0,R0
BT SCANE ; '\0'=END OF STRING,FOUND
CMP/EQ R4,R0
BT SCANL2
MOV.L @R2,R2 ; MISS MATCH,GET LINK
BRA SCANLP
MOV EXEP,R3 ; RESET TEXT POINTER
SCANE: ADD #-1,R3
MOV.L @(4,R2),R2 ; GET EXEC ADDR
RTS
SETT ; FOUND,SET TBIT
SCANN: RTS
CLRT ; NOT FOUND,CLEAR TBIT
QDECCH: MOV #H'30,R13
CMP/HS R13,R0 ; A=H'3A
BT CLRCY ; IF NOT DECIMAL CHAR,RETURN WITH TBIT=0
ADD #-H'30,R0 ; -H'30 ASCII TO BIN
RTS
SETT ; SET TBIT
CLRCY: RTS
CLRT ; CLEAR TBIT
QALPHA: MOV #H'5B,R13
CMP/HS R13,R0 ; < 'Z'
BT CLRCY
MOV #H'41,R13
RTS
CMP/HS R13,R0 ; <= 'A'
QALDEC: MOV #H'30,R13
CMP/HS R13,R0 ; < '0'
BF CLRCY
MOV #H'5B,R13
CMP/HS R13,R0 ; > 'Z'
BT CLRCY
MOV #H'3A,R13
CMP/HS R13,R0 ; <='9'
BF QALDE
MOV #H'41,R13
CMP/HS R13,R0 ; < 'A'
BF CLRCY
QALDE: RTS
SETT
ATOI: STS.L PR,@-R15
MOV #0,R2
ATOIL: MOV.B @R3+,R0
BSR QDECCH ; 0..9 ?
EXTU.B R0,R0
BF ATOIE
MOV R2,R1
SHLL2 R2 ; x4
ADD R1,R2 ; x5
SHLL R2 ; x10
BRA ATOIL
ADD R0,R2
ATOIE: LDS.L @R15+,PR
RTS
ADD #-1,R3
GETLIT: MOV.B @R3,R0
MOV #H'30,R13
EXTU.B R0,R0
CMP/HS R13,R0 ; DEC ?
BF CLRCY
MOV #H'3A,R13
CMP/HS R13,R0
BT CLRCY
STS.L PR,@-R15
BSR ATOI ; VALUE -> R2
NOP
LDS.L @R15+,PR
RTS
SETT
SGNLIT: CMP/EQ #H'2D,R0 ; '-' ?
BF GETLIT
STS.L PR,@-R15
BSR GETLIT
ADD #1,R3
LDS.L @R15+,PR
RTS
NEG R2,R2
GETVAR: MOV.B @R3,R0
STS.L PR,@-R15
BSR QALPHA
EXTU.B R0,R0
BF/S GTVARE ; NOT VAR,R2 INVALID
LDS.L @R15+,PR
ADD #-H'41,R0 ; -H'41
SHLL2 R0 ; x4
MOV R0,R2
MOV.L @(VARTOP-WRKTOP,GBR),R0
ADD #1,R3 ; EXEP -> R3
SETT
GTVARE: RTS ; IF NOT VAR,TFLG=0
ADD R0,R2 ; VAR ADDR -> R2
GETVAL: STS.L PR,@-R15
BSR GETLIT
NOP
BT GETVAE
MOV.B @R3,R0
CMP/EQ #H'28,R0 ; '('
BF GETVA2
BSR SCGFRM
ADD #1,R3
GETVA1: BSR SXPRPA ; RETURN R3=EXEP
NOP
GETVAE: LDS.L @R15+,PR
RTS
SETT
GETVA2: MOV.L FUNCT1,R2
BSR SCAN
NOP
BF GETVA4
BSR SCGFRM ; PARAMETER
MOV.L R2,@-R15 ; SAVE FUNC ADDR
MOV.L @R15+,R13 ; FUNC ADDR
JSR @R13 ; EXEC FUNCTION
NOP
BRA GETVA1
MOV EXEP,R3
GETVA4: BSR GETVAR
NOP
BF JSYNERR3
LDS.L @R15+,PR
RTS
MOV.L @R2,R2 ; R2=VAR ADDR
JSYNERR3:
BRA SYNERR
NOP
ALIGN 4
FUNCT1: DC.L FUNCT
; CHECK LEVEL1 OPERATORS
QL1OPR: CMP/EQ #H'3D,R0 ; '='
BT OPEQ
CMP/EQ #H'3C,R0 ; '<'
BT QL1OP2
CMP/EQ #H'3E,R0 ; '>'
BF QOPN0
MOV.B @(1,R3),R0
ADD #1,R3
CMP/EQ #H'3D,R0 ; '='
BT OPGE
MOV.L XGT1,R4
RTS
SETT
OPGE: ADD #1,R3
MOV.L XGE1,R4
RTS
SETT
QL1OP2: MOV.B @(1,R3),R0
ADD #1,R3
CMP/EQ #H'3D,R0 ; '='
BT OPLE
CMP/EQ #H'3E,R0 ; '>'
BT OPNE
MOV.L XLT1,R4
RTS
SETT
OPLE: ADD #1,R3
MOV.L XLE1,R4
RTS
SETT
OPNE: ADD #1,R3
MOV.L XNEQ1,R4
RTS
SETT
OPEQ: ADD #1,R3
MOV.L XEQ1,R4
RTS
SETT
ALIGN 4
XGT1: DC.L XGT
XGE1: DC.L XGE
XLT1: DC.L XLT
XLE1: DC.L XLE
XNEQ1: DC.L XNEQ
XEQ1: DC.L XEQ
QOPN2: ADD #-1,R3
QOPN1: ADD #-1,R3
QOPN0: RTS
CLRT
; CHECK LEVEL2 OPERATORS
QL2OPR: CMP/EQ #H'2B,R0 ; '+'
BT OPPLUS
CMP/EQ #H'2D,R0 ; '-'
BT OPMIN
CMP/EQ #H'4F,R0 ; 'O'
BT QL2OP2
CMP/EQ #H'58,R0 ; 'X'
BF QOPN0
MOV.B @(1,R3),R0
ADD #1,R3
CMP/EQ #H'4F,R0 ; 'O'
BF QOPN1
MOV.B @(1,R3),R0
ADD #1,R3
CMP/EQ #H'52,R0 ; 'R'
BF QOPN2
ADD #1,R3
MOV.L XXOR1,R4
RTS
SETT
QL2OP2: MOV.B @(1,R3),R0
ADD #1,R3
CMP/EQ #H'52,R0 ; 'R'
BF QOPN1
ADD #1,R3
MOV.L X_OR1,R4
RTS
SETT
OPPLUS: ADD #1,R3
MOV.L XPLUS1,R4
RTS
SETT
OPMIN: ADD #1,R3
MOV.L XMINUS1,R4
RTS
SETT
; CHECK LEVEL3 OPERATORS
QL3OPR: CMP/EQ #H'2A,R0 ; '*'
BT OPMUL
CMP/EQ #H'2F,R0 ; '/'
BT OPIDIV
CMP/EQ #H'41,R0 ; 'A'
BF QOPN0
MOV.B @(1,R3),R0
ADD #1,R3
CMP/EQ #H'4E,R0 ; 'N'
BF QOPN1
MOV.B @(1,R3),R0
ADD #1,R3
CMP/EQ #H'44,R0 ; 'D'
BF QOPN2
ADD #1,R3
MOV.L XAND1,R4
RTS
SETT
OPMUL: ADD #1,R3
MOV.L XMUL1,R4
RTS
SETT
OPIDIV: ADD #1,R3
MOV.L XIDIV1,R4
RTS
SETT
ALIGN 4
XXOR1: DC.L XXOR
X_OR1: DC.L X_OR
XPLUS1: DC.L XPLUS
XMINUS1:DC.L XMINUS
XAND1: DC.L XAND
XMUL1: DC.L XMUL
XIDIV1: DC.L XIDIV
CHKSTK: MOV.L @(SPLIM-WRKTOP,GBR),R0
CMP/HI R0,R15
BF JOUTWRK1
RTS
NOP
CHKSS: MOV.L @(SSLIM-WRKTOP,GBR),R0
CMP/HI R0,R14
BF JOUTWRK1
RTS
NOP
JOUTWRK1:
BRA OUTWRK
NOP
CHKSID: MOV.L @(SPLIM-WRKTOP,GBR),R0 ; SPLIM=SSBTM
MOV.L @R14,R5
CMP/HS R0,R14
BT JSTRERR1
CMP/EQ R1,R5
BF JSTRERR1
RTS
ADD #4,R14
JSTRERR1:
BRA STRERR
NOP
GETFRM: STS.L PR,@-R15
BSR CHKSTK
NOP
BSR SFRML2
MOV EXEP,R3
BF GTFRME
FRML1L: BSR SKIPSP
NOP
BSR QL1OPR
NOP
BF FRML1E
MOV.L R2,@-R15 ; OPELAND 1
BSR SFRML2
MOV.L R4,@-R15 ; OPERATOR EXEC ADDR
BF JSYNERR4
BSR XOPER ; (OPELAND 1)OPERATOR(OPELAND 2) -> R2
NOP
BRA FRML1L
NOP
FRML1E: SETT
GTFRME: LDS.L @R15+,PR
RTS
MOV R3,EXEP
SCGFRM: MOV R3,EXEP ; STORE EXEP
CGTFRM: STS.L PR,@-R15
BSR SKIPSP
NOP
BSR GETFRM ; CHECK & GET FORM
NOP
LDS.L @R15+,PR
BF JSYNERR4
RTS ; RETURN TBIT=1
NOP
XOPER: MOV.L @R15+,R4 ; OPERATOR
MOV R2,R1 ; OPELAND 2
JMP @R4 ; EXEC OPERATOR
MOV.L @R15+,R2 ; OPELAND 1
SFRML22:BRA FRMLV2
LDS.L @R15+,PR
SFRML2: STS.L PR,@-R15
BSR SKIPSP
NOP
CMP/EQ #H'2D,R0 ; '-'
BF SFRML22
ADD #1,R3
BSR FRMLV2
MOV R3,EXEP
LDS.L @R15+,PR
BF JSYNERR4
NEG R2,R2
RTS
SETT
FRMLV2: STS.L PR,@-R15
BSR FRMLV3
NOP
BF GTFRME
FRML2L: BSR SKIPSP
NOP
BSR QL2OPR
NOP
BF FRML1E
MOV.L R2,@-R15 ; OPELAND 1
BSR FRMLV3
MOV.L R4,@-R15 ; OPERATOR EXEC ADDR
BF JSYNERR4
BSR XOPER ; (OPELAND 1)OPERATOR(OPELAND 2) -> R2
NOP
BRA FRML2L
NOP
FRMLV3: STS.L PR,@-R15
BSR SKIPSP
NOP
BSR GETVAL
NOP
BF GTFRME
FRML3L: BSR SKIPSP
NOP
BSR QL3OPR
NOP
BF FRML1E
MOV.L R2,@-R15 ; OPELAND 1
BSR SKIPSP
MOV.L R4,@-R15 ; OPERATOR EXEC ADDR
BSR GETVAL ; OPELAND2
NOP
BF JSYNERR4
BSR XOPER ; (OPELAND 1)OPERATOR(OPELAND 2) -> R2
NOP
BRA FRML3L
NOP
JSYNERR4:
BRA SYNERR
NOP
GETRNG: STS.L PR,@-R15
MOV #1,R0
MOV.L R0,@(LRANGT-WRKTOP,GBR)
MOV #-1,R0
BSR LSKPSP
MOV.L R0,@(LRANGE-WRKTOP,GBR)
CMP/EQ #H'2D,R0 ; '-'
BT GTRNG3
BSR GETLIT
NOP
BF/S GTRGEE ; ALL RANGE
MOV R3,EXEP
GTRNG2: MOV R2,R0
BSR LSKPSP
MOV.L R0,@(LRANGT-WRKTOP,GBR)
CMP/EQ #H'2D,R0 ; '-'
BF GTRNGE
GTRNG3: BSR SKIPSP
ADD #1,R3
BSR GETLIT
NOP
BF/S GTRGEE ; SET BEGIN ONLY
MOV R3,EXEP
GTRNGE: MOV R2,R0
MOV.L R0,@(LRANGE-WRKTOP,GBR)
GTRGEE: LDS.L @R15+,PR
RTS
NOP
; ------------------------
; INTERPRETER MAIN ENGINE
; ------------------------
EXELIN: STS.L PR,@-R15
MOV #0,R0
MOV.B R0,@(EXLFLG-WRKTOP,GBR)
EXELLP: MOV #0,R0
MOV.B R0,@(EXSFLG-WRKTOP,GBR)
BSR CHKBRK
NOP
BSR SKIPSP
MOV EXEP,R3
CMP/EQ #0,R0 ; END OF LINE
BT EXELNE
MOV.L STATM1,R2
BSR SCAN
NOP
BT EXELN1
BSR QLET
NOP
BF EXELN2
BSR GETFRM
MOV.L R2,@-R15 ; SAVE VAR ADDR
MOV.L @R15+,R0 ; VAR ADDR
BRA EXELN3
MOV.L R2,@R0 ; STORE VALUE
EXELN1: JSR @R2 ; EXEC STATEMENT
MOV R3,EXEP
MOV.B @(EXLFLG-WRKTOP,GBR),R0 ; EXIT LINE ?
CMP/EQ #0,R0
BF EXELNE
EXELN2: MOV.B @(EXSFLG-WRKTOP,GBR),R0 ; EXIT STATEMENT ?
CMP/EQ #0,R0
BF EXELLP
MOV EXEP,R3
EXELN3: BSR SKIPSP
NOP
MOV R3,EXEP
CMP/EQ #0,R0
BT EXELNE ; END OF LINE ?
CMP/EQ #H'27,R0 ; REM
BT EXELNE
CMP/EQ #H'3A,R0 ; ':'
BF JSYNERR4
ADD #1,R3
BRA EXELLP
MOV R3,EXEP
EXELNE: LDS.L @R15+,PR
RTS
NOP
JSTRERR2:
BRA STRERR
NOP
ALIGN 4
STATM1: DC.L STATM
; -------------------------------------
; BODY OF STATEMENTS & DIRECT COMMANDS
; -------------------------------------
XRUN: MOV.L @(BASTOP-WRKTOP,GBR),R0
BSR CLRWK
MOV R0,LINEP
MOV #1,R0
MOV.B R0,@(RUNFLG-WRKTOP,GBR)
RUNLP1: MOV.L @LINEP,R2 ; LINE NO.
MOV LINEP,EXEP
ADD #5,EXEP ; SKIP LINE NO. & LENGTH
TST R2,R2 ; LINE NO.=0:END OF TEXT
BT RUNEND
RUNLP2: BSR EXELIN
NOP
MOV.B @(EXLFLG-WRKTOP,GBR),R0 ; EXIT BY EXLFLG,NOT BY END OF LINE
CMP/EQ #1,R0
BT RUNLP1 ; EXLFLG=1:GOTO,GOSUB
CMP/EQ #2,R0
BT RUNLP2 ; EXLFLG=2:NEXT,RETRUN
MOV.B @(4,LINEP),R0 ; LENGTH
ADD #5,LINEP
EXTU.B R0,R0
BRA RUNLP1
ADD R0,LINEP ; NEXT LINE
RUNEND: BRA XEND
NOP
XNEW: BSR NEW
NOP
BRA TOPPRM
NOP
NEW: MOV.L RAMTOP1,R0
MOV #H'FC,R13
AND R13,R0
MOV #0,R3
MOV.L R0,@(BASTOP-WRKTOP,GBR)
MOV.L R3,@R0 ; SET END MARKER(LINE NO.=0)
ADD #4,R0
MOV #3,R3 ; LENGTH & EOL \0
SHLL16 R3
SHLL8 R3
MOV.L R3,@R0
ADD #4,R0
MOV.L R0,@(BASEND-WRKTOP,GBR)
CLRWK: MOV.L @(SSBTM-WRKTOP,GBR),R0 ; INITIAL SOFT STACK
MOV #VARS,R1
MOV R0,R14
MOV.L @(VARTOP-WRKTOP,GBR),R0 ; CLEAR VARIABLES
MOV #0,R3
CLRWKL: MOV.L R3,@R0
DT R1
BF/S CLRWKL
ADD #4,R0
MOV.L @(BASEND-WRKTOP,GBR),R0
MOV.L R0,@(FREE-WRKTOP,GBR)
MOV.L @(VARTOP-WRKTOP,GBR),R0
MOV.L R0,@(ENDFRE-WRKTOP,GBR)
MOV #0,R0
RTS
MOV.L R0,@(FORVAR-WRKTOP,GBR)
ALIGN 4
RAMTOP1:DC.L RAMTOP
XLIST: BSR SKIPSP
MOV EXEP,R3
MOV R3,EXEP
BSR GETRNG
NOP
MOV.L @(LRANGT-WRKTOP,GBR),R0
BSR SCNHSL
MOV R0,R2
LISTLP: MOV.L @R3,R2 ; LINE NO.
MOV.L R3,@-R15 ; SAVE LINE ADDR
MOV.L @(LRANGE-WRKTOP,GBR),R0
TST R2,R2
BT LISTE ; LINE NO.=0:END OF TEXT
CMP/HI R0,R2
BT LISTE ; BREAK IF LINE NO. > RANGE END
BSR LSTLIN
NOP
BSR CHKBRK
NOP
MOV.L @R15+,R3 ; SAVED LINE ADDRESS
MOV.B @(4,R3),R0 ; LENGTH
ADD #5,R3
EXTU.B R0,R0
BRA LISTLP
ADD R0,R3 ; NEXT LINE
LISTE: BRA TOPPRM
NOP
CHKBRK: MOV.B @(LATKEY-WRKTOP,GBR),R0
MOV.L SCIBASE3,R13
CMP/EQ #0,R0
BF CHKBR1
STC.L GBR,@-R15
LDC.L R13,GBR
MOV.B @(SSR_3-SCIBASE,GBR),R0
TST #H'38,R0 ; ERROR BITS
BF CHKBR2
TST #H'40,R0 ; RX READY ?
BT CHKBR3
MOV R0,R1
MOV.B @(RDR_3-SCIBASE,GBR),R0 ; RX DATA
MOV R0,R2
MOV R1,R0
AND #H'84,R0 ; CLEAR RXRDY FLAG
MOV.B R0,@(SSR_3-SCIBASE,GBR)
MOV R2,R0
CMP/EQ #H'03,R0 ; CTRL-C ?
BT JBREAK1
LDC.L @R15+,GBR
MOV.B R0,@(LATKEY-WRKTOP,GBR)
MOV #30,R0
RTS
MOV.B R0,@(LATKTM-WRKTOP,GBR)
CHKBR1: CMP/EQ #H'03,R0 ; CTRL-C ?
BF CHKBR3
BRA JBREAK1
NOP
CHKBR2: AND #H'C4,R0 ; CLEAR ERRORS
MOV.B R0,@(SSR_3-SCIBASE,GBR)
CHKBR3: MOV.B @(LATKTM-WRKTOP,GBR),R0
LDC.L @R15+,GBR
CMP/EQ #0,R0
BT CHKBR4
ADD #-1,R0
RTS
MOV.B R0,@(LATKTM-WRKTOP,GBR)
CHKBR4: MOV #0,R0 ; CLEAR LATKEY
RTS
MOV.B R0,@(LATKEY-WRKTOP,GBR)
JBREAK1:BRA BREAK
NOP
ALIGN 4
SCIBASE3: DC.L SCIBASE
XDEL: BSR GETRNG
NOP
MOV.L @(LRANGT-WRKTOP,GBR),R0
BSR SCNEQL
MOV R0,R2
BF JBADLIN1
MOV.L @(LRANGE-WRKTOP,GBR),R0
MOV R3,@-R15 ; SAVE TRANSFER DST ADDR
BSR SCNEQL
MOV R0,R2
BF JBADLIN1
MOV.B @(4,R3),R0 ; LENGTH
ADD #5,R3
EXTU.B R0,R0
ADD R0,R3 ; TRANSFER SRC ADDR
MOV.L @(BASEND-WRKTOP,GBR),R0
SUB.L R3,R0 ; TRANSFER BYTES
MOV R0,R1
BSR LDIR
MOV.L @R15+,R2 ; TRANSFER DST ADDR
MOV R2,R0
BRA TOPPRM
MOV.L R0,@(BASEND-WRKTOP,GBR)
JBADLIN1:
BRA BADLIN
NOP
JSYNERR5:
BRA SYNERR
NOP
JILLFUN3:
BRA ILLFUN
NOP
XPRINT: STS.L PR,@-R15
BSR SQEOS
MOV EXEP,R3
BF PRINT1
PRINCR: BRA CRLF
LDS.L @R15+,PR
PRINTL: BSR SQEOS ; SQEOS RETURN GOTTEN CHAR
NOP
PRINT1: BT/S PRINTR
MOV R3,EXEP
CMP/EQ #H'22,R0 ; QUOTE
BT PRINTQ
MOV.L PCAST1,R2 ; PRINT CAST
BSR SCAN
NOP
BT PRINTF
BSR CGTFRM
MOV R3,EXEP
BSR DOT
NOP
BRA PRINTE
NOP
PRINTQ: BSR PRTQS
NOP
BRA PRINTE
NOP
PRINTF: BSR SCGFRM
MOV.L R2,@-R15 ; EXEC ADDR
MOV.L @R15+,R3 ; EXEC ADDR
JSR @R3
NOP
BSR SXPRPA ; EXPECT ')'
MOV EXEP,R3
PRINTE: BSR SKIPSP
NOP
MOV R3,EXEP
CMP/EQ #H'2C,R0 ; ','
BF PRINCR ; NOT COMMA,THEN RETURN WITH CRLF
BRA PRINTL ; CONTINUE
ADD #1,R3
PRINTR: LDS.L @R15+,PR
RTS
NOP
PRTQS: STS.L PR,@-R15
ADD #1,R3
PRTQSL: MOV.B @R3,R0
TST R0,R0
BT PRINTR ; END OF LINE ?
CMP/EQ #H'22,R0 ; QUOTE ?
BT/S PRINTR
ADD #1,R3
BSR PUTCH
NOP
BRA PRTQSL
NOP
ALIGN 4
PCAST1: DC.L PCAST
XGOTO: STS.L PR,@-R15
BSR CGTFRM
NOP
BSR SCNEQL
NOP
BF JBADLIN
GOTO1: LDS.L @R15+,PR
MOV R3,LINEP
GOTO2: MOV #1,R0
RTS
MOV.B R0,@(EXLFLG-WRKTOP,GBR)
XGOSUB: STS.L PR,@-R15
BSR CGTFRM
NOP
BSR SCNEQL
NOP
BF JBADLIN
BSR CHKSS
NOP
MOV.L IDGSUB1,R13
MOV.L LINEP,@-R14
MOV.L EXEP,@-R14
BRA GOTO1
MOV.L R13,@-R14
XRET: STS.L PR,@-R15
MOV.L IDGSUB1,R1
BSR CHKSID
NOP
LDS.L @R15+,PR
MOV.L @R14+,EXEP
MOV.L @R14+,LINEP
MOV #2,R0
RTS
MOV.B R0,@(EXLFLG-WRKTOP,GBR)
JBADLIN:
BRA BADLIN
NOP
JSTRERR3:
BRA STRERR
NOP
ALIGN 4
IDGSUB1:DC.L H'47535542
XIF: STS.L PR,@-R15
BSR CGTFRM
NOP
BSR SXPRPA ; R3=EXEP
NOP
BSR SKIPSP
NOP
TST R2,R2 ; R2=RESULT OF FORM
BT/S IF1LN1
LDS.L @R15+,PR
MOV R3,EXEP
MOV #1,R0
RTS
MOV.B R0,@(EXSFLG-WRKTOP,GBR) ; EXEC CURRENT LINE
IF1LN1: MOV.B @(4,LINEP),R0 ; SKIP CURRENT LINE
ADD #5,LINEP
EXTU.B R0,R0
BRA GOTO2
ADD R0,LINEP ; NEXT LINE
XFOR: STS.L PR,@-R15
BSR CHKSS
NOP
MOV.L FORLIN1,R13 ; PUSH 'FOR' WORK AREA
MOV.L @(16,R13),R0 ; FORSTP
MOV.L @(12,R13),R1 ; FORTO
MOV.L @(8,R13),R2 ; FORVAR
MOV.L R0,@-R14 ; PUSH FORSTP
MOV.L R1,@-R14 ; PUSH FORTO
MOV.L R2,@-R14 ; PUSH FORVAR
MOV.L @(4,R13),R0 ; FOREXP
MOV.L @R13,R1 ; FORLIN
MOV.L IDFOR1,R2
MOV.L R0,@-R14 ; PUSH FORXP
MOV.L R1,@-R14 ; PUSH FORLIN
MOV.L R2,@-R14 ; IDFOR
MOV #1,R0
BSR QLET
MOV.L R0,@(FORSTP-WRKTOP,GBR) ; DEFAULT STEP=1
BF JSYNERR6
MOV R2,R0
MOV.L R0,@(FORVAR-WRKTOP,GBR)
BSR CGTFRM
MOV.L R2,@-R15 ; SAVE VAR ADDR
MOV.L @R15+,R3 ; VAR ADDR
MOV.L R2,@R3 ; STORE INITIAL VALUE
MOV.L T_TO1,R2
BSR LXPSTR
NOP
BSR CGTFRM
MOV R3,EXEP
MOV R2,R0
BSR SQEOS ; END OF STATEMNENT ?
MOV.L R0,@(FORTO-WRKTOP,GBR)
BT FOREND
MOV.L T_STEP1,R2
BSR EXPSTR
NOP
BSR CGTFRM
MOV R3,EXEP
MOV R2,R0
MOV.L R0,@(FORSTP-WRKTOP,GBR)
FOREND:
BSR SKIPSP
NOP
MOV R3,EXEP
CMP/EQ #0,R0 ; END OF LINE ?
BF/S FOREN2
LDS.L @R15+,PR
MOV LINEP,R3
ADD #4,R3
MOV.B @R3+,R0
EXTU.B R0,R0
ADD R3,R0
MOV.L R0,@(FORLIN-WRKTOP,GBR)
ADD #5,R0
RTS
MOV.L R0,@(FOREXP-WRKTOP,GBR)
FOREN2: MOV R3,R0
MOV.L R0,@(FOREXP-WRKTOP,GBR)
MOV LINEP,R0
RTS
MOV.L R0,@(FORLIN-WRKTOP,GBR)
ALIGN 4
T_TO1: DC.L T_TO
T_STEP1:DC.L T_STEP
QLET: STS.L PR,@-R15
BSR SKIPSP
MOV EXEP,R3
BSR GETVAR
MOV.L R3,@-R15 ; SAVE R3
BF QLETN
BSR SKIPSP
NOP
CMP/EQ #H'3D,R0 ; '='
BF QLETN
ADD #1,R3
MOV R3,EXEP
ADD #4,R15 ; DISPOSE PUSHED R3
LDS.L @R15+,PR
RTS
SETT
QLETN: MOV.L @R15+,R3
LDS.L @R15+,PR
RTS
MOV R3,EXEP
JSYNERR6:
BRA SYNERR
NOP
XNEXT: MOV.L FORLIN1,R13
MOV.L @(8,R13),R0 ; FORVAR
MOV.L @(12,R13),R1 ; FORTO
MOV.L @(16,R13),R2 ; FORSTP
TST R0,R0
BT JSTRERR3
MOV.L @R0,R3 ; READ VAR
ADD R2,R3 ; ADD STEP
CMP/PZ R2 ; SIGN OF STEP
BF/S NEXTN
MOV.L R3,@R0 ; UPDATE VAR
CMP/GT R1,R3 ; R3(VAR) > R1(TO) ?
BT NEXTE
BRA NEXTC
MOV.L @R13,LINEP ; LOAD FORLIN,CONTINUE LOOP
NEXTN: CMP/GE R1,R3
BF NEXTE ; R2(VAR) < R0(TO)
MOV.L @R13,LINEP ; LOAD FORLIN,CONTINUE LOOP
NEXTC: MOV @(4,R13),EXEP ; FOREXP
MOV #2,R0
RTS
MOV.B R0,@(EXLFLG-WRKTOP,GBR)
NEXTE: STS.L PR,@-R15
MOV.L IDFOR1,R1
BSR CHKSID
NOP
LDS.L @R15+,PR
MOV.L FORLIN1,R13 ; RESTORE 'FOR' SYSTEM VAR
MOV.L @R14+,R0
MOV.L @R14+,R1
MOV.L @R14+,R2
MOV.L R0,@R13 ; FORLIN
MOV.L R1,@(4,R13) ; FOREXP
MOV.L R2,@(8,R13) ; FORVAR
MOV.L @R14+,R0
MOV.L @R14+,R1
MOV.L R0,@(12,R13) ; FORTO
RTS
MOV.L R1,@(16,R13) ; FORSTP
ALIGN 4
FORLIN1:DC.L FORLIN
IDFOR1: DC.L H'464F5220
XPOKE: STS.L PR,@-R15
BSR CGTFRM
NOP
BSR SKIPSP
MOV.L R2,@-R15 ; SAVE ADDR
BSR LXPCOM
NOP
BSR CGTFRM ; VALUE
MOV R3,EXEP
MOV.L @R15+,R0 ; ADDR
LDS.L @R15+,PR
RTS
MOV.B R2,@R0
JILLFUN4:
BRA ILLFUN
NOP
XINPUT: STS.L PR,@-R15
MOV.B @(RUNFLG-WRKTOP,GBR),R0
CMP/EQ #0,R0
BT INPUTN
BSR SKIPSP
MOV EXEP,R3
CMP/EQ #H'22,R0 ; QUOTE
BF INPUT1
BSR PRTQS
NOP
BSR SXPCOM ; EXPECT COMMA
NOP
INPUT1: BSR GETLN
NOP
BT JBREAK2
MOV.L LINBUF3,R0
MOV.L R0,@(GTPTR-WRKTOP,GBR) ; USE 'GTPTR' TEMPORALY
INPLP: BSR SKIPSP
MOV EXEP,R3
BSR GETVAR
NOP
BF JSYNERR6
MOV R3,EXEP
MOV.L R2,@-R15 ; VAR ADDR
MOV.L @(GTPTR-WRKTOP,GBR),R0
BSR SKIPSP
MOV R0,R3
BSR SGNLIT
NOP
MOV R3,R0
MOV.L R0,@(GTPTR-WRKTOP,GBR)
MOV.L @R15+,R3 ; VAR ADDR
BF INPL1 ; IF NO VALUE,NO TOUCH VAR
MOV.L R2,@R3
INPL1: BSR SKIPSP
MOV EXEP,R3
CMP/EQ #H'2C,R0 ; ',' ?
BF INPEND
ADD #1,R3
MOV R3,EXEP
MOV.L @(GTPTR-WRKTOP,GBR),R0
BSR SKIPSP
MOV R0,R3
CMP/EQ #H'2C,R0 ; ',' ?
BF INPLP
ADD #1,R3
MOV R3,R0
BRA INPLP
MOV.L R0,@(GTPTR-WRKTOP,GBR)
INPEND: LDS.L @R15+,PR
RTS
MOV R3,EXEP
JBREAK2:BRA BREAK
NOP
INPUTN: BRA BADMOD
NOP
XEND: MOV.L @(SSBTM-WRKTOP,GBR),R0
CMP/EQ R0,R14
BT JTOPPRM
BRA UXPEND
NOP
JTOPPRM:
BRA TOPPRM
NOP
ALIGN 4
LINBUF3:DC.L LINBUF
LDIR: TST R1,R1 ; R1=0 ?
BT LDIRE
LDIRL: MOV.B @R3+,R0
DT R1
MOV.B R0,@R2
BF/S LDIRL
ADD #1,R2
LDIRE: RTS
NOP
LDDR: TST R1,R1
BT LDDRE ; R1=0 ?
LDDRL: ADD #-1,R3
MOV.B @R3,R0
DT R1
BF/S LDDRL
MOV.B R0,@-R2
LDDRE: RTS
NOP
; -------
; TRAPS
; -------
ADRERR: MOV.L M_ADR1,R2
MOV.L M_ERR1,R1
BRA XTRAP
NOP
BADINS: MOV.L M_BAD1,R2
MOV.L M_INS1,R1
BRA XTRAP
NOP
BADSLT: MOV.L M_BAD1,R2
MOV.L M_SLT1,R1
XTRAP: MOV.L @R15+,R0 ; SAVED PC
MOV.L WRKTOP2,R15
LDC R15,GBR
BSR CRLF
MOV.L R0,@(TRPADR-WRKTOP,GBR)
BSR PUTSTR
NOP
BSR SPACE
NOP
BSR PUTSTR
MOV R1,R2
BSR PUTCH
MOV #7,R0 ; BEEP
BSR SPACE
NOP
MOV.L @(TRPADR-WRKTOP,GBR),R0
BSR UDOT
MOV R0,R2
BSR CRLF
NOP
BRA TOPPRM
NOP
ALIGN 4
M_ADR1: DC.L M_ADR
M_INS1: DC.L M_INS
M_SLT1: DC.L M_SLT
; -------
; ERRORS
; -------
OUTWRK: MOV.L M_OUT1,R2
MOV.L M_WRKS1,R1
BRA XERROR
NOP
SYNERR: MOV.L M_SYN1,R2
MOV.L M_ERR1,R1
BRA XERROR
NOP
DIV0: MOV.L M_DIV01,R2
BRA XERROR0
NOP
BADMOD: MOV.L M_BAD1,R2
MOV.L M_MODE1,R1
BRA XERROR
NOP
BREAK: MOV.L M_BRK1,R2
BRA XERROR0
NOP
BADLIN: MOV.L M_BAD1,R2
MOV.L M_LIN1,R1
BRA XERROR
NOP
STRERR: MOV.L M_STRC1,R2
MOV.L M_ERR1,R1
BRA XERROR
NOP
ILLFUN: MOV.L M_ILL1,R2
BRA XERROR0
NOP
OUTMEM: MOV.L M_OUT1,R2
MOV.L M_MEM1,R1
BRA XERROR
NOP
UXPEND: MOV.L WRKTOP2,R0
LDC R0,GBR
MOV #0,R0
MOV.L M_UXPE1,R2
BRA XERROR0
MOV.B R0,@(RUNFLG-WRKTOP,GBR)
ALIGN 4
M_OUT1: DC.L M_OUT
M_WRKS1:DC.L M_WRKS
M_SYN1: DC.L M_SYN
M_ERR1: DC.L M_ERR
M_DIV01:DC.L M_DIV0
M_BAD1: DC.L M_BAD
M_MODE1:DC.L M_MODE
M_BRK1: DC.L M_BRK
M_LIN1: DC.L M_LIN
M_STRC1:DC.L M_STRC
M_ILL1: DC.L M_ILL
M_MEM1: DC.L M_MEM
M_UXPE1:DC.L M_UXPE
XERROR0:SUB.L R1,R1
XERROR: MOV.L WRKTOP2,R15
BSR CRLF
LDC R15,GBR
BSR PUTSTR
NOP
TST R1,R1 ; 2ND MESSAGE ?
BT ERROR1
BSR SPACE
NOP
BSR PUTSTR
MOV R1,R2
ERROR1: BSR PUTCH
MOV #7,R0 ; BEEP
BSR CRLF
NOP
MOV.B @(RUNFLG-WRKTOP,GBR),R0
CMP/EQ #0,R0
BT ERRORE
BSR LSTLIN
MOV LINEP,R3
ERRORE: BRA TOPPRM
NOP
ALIGN 4
WRKTOP2:DC.L WRKTOP
; ------
; MAIN
; ------
MAIN: MOV.L WRKTOP3,R15
LDC R15,GBR
STC SR,R0
MOV.L R0,@(GTPTR-WRKTOP,GBR)
MOV.L #H'F0,R0
EXTU.B R0,R0
LDC R0,SR
MOV R15,R14
MOV #63,R13
SHLL2 R13
SUB R13,R14
MOV R14,R0
MOV.L R0,@(SPLIM-WRKTOP,GBR) ; HARDWARE STACK LIMIT
MOV #80,R13
SHLL2 R13
SUB R13,R0
MOV.L R0,@(SSLIM-WRKTOP,GBR) ; SOFTWARE STACK LIMIT
ADD #-24,R0 ; MARGIN
MOV #VARS,R13
SHLL2 R13
SUB R13,R0
BSR NEW
MOV.L R0,@(VARTOP-WRKTOP,GBR) ; TOP OF VAR AREA
MOV.L @(GTPTR-WRKTOP,GBR),R0
LDC R0,SR
MOV.L M_OPEN1,R2
BSR PUTSTR
NOP
BSR XFREE
MOV #0,R2
BSR UDOT
NOP
MOV.L M_BYTS1,R2
BSR PUTSTR
NOP
; ---------------
; USER INTERFACE
; ---------------
TOPPRM: MOV.L M_OK1,R2
BSR PUTSTR
NOP
TOPLEV: MOV.L WRKTOP3,R15
LDC R15,GBR
MOV.L @(SPLIM-WRKTOP,GBR),R0
MOV R0,R14
MOV #0,R0
BSR GETLN
MOV.B R0,@(RUNFLG-WRKTOP,GBR)
BT TOPLEV
BSR LTOUPP ; CONVERT TO O-MOJI
NOP
MOV.L LINBUF4,R3
BSR SKIPSP
NOP
BSR GETLIT
NOP
BT TOPLV1
MOV #0,R2
BRA TOPLV2 ; NO LINE NO.:DIRECT MODE
TOPLV1: TST R2,R2 ; LINE NO.=0 : BAD LINE NO.
BT JBADLIN2
ADD #1,R2
TST R2,R2
BT JBADLIN2 ; LINE NO.=H'FFFFFFFF : BAD LINE NO.
ADD #-1,R2
TOPLV2: MOV R2,R0
MOV R0,@(ENTNO-WRKTOP,GBR)
MOV.B @R3,R0 ; FIRST NOT NUM CHAR
CMP/EQ #H'20,R0
BF TOPLV3 ; EXIST SPACE AFTER LINE NO. ?
ADD #1,R3 ; SKIP FIRST SPACE
TOPLV3: MOV R3,R0
MOV.L R0,@(GTPTR-WRKTOP,GBR)
MOV.L @(ENTNO-WRKTOP,GBR),R0
CMP/EQ #0,R0
BF ENTPRG
BSR EXELIN
MOV R3,EXEP ; EXEC DIRECT COMMAND
BRA TOPLEV
NOP
JBADLIN2:
BRA BADLIN
NOP
ALIGN 4
WRKTOP3:DC.L WRKTOP
M_OPEN1:DC.L M_OPEN
M_BYTS1:DC.L M_BYTS
M_OK1: DC.L M_OK
; LINE CONVERT TO UPPER
LTOUPP: MOV.L LINBUF4,R3
LTOUPL: MOV.B @R3,R0
CMP/EQ #0,R0
BT LTOUE2 ; END OF LINE
CMP/EQ #H'27,R0 ; REM
BT LTOUE1
CMP/EQ #H'22,R0 ; QUOTE
BT LTOUPQ
MOV #H'61,R13
CMP/HS R13,R0 ; >'a' ?
BF LTOUP1
MOV #H'7A,R13
CMP/HI R13,R0 ; <'z' ?
BT LTOUP1
ADD #-H'20,R0
MOV.B R0,@R3
LTOUP1: BRA LTOUPL
ADD #1,R3
LTOUPQ: MOV.B @(1,R3),R0
LTUPQL: ADD #1,R3
CMP/EQ #0,R0
BT LTOUE2 ; END OF LINE
CMP/EQ #H'22,R0 ; EXIT QUOTE
BT LTOUP1
BRA LTUPQL
MOV.B @(1,R3),R0
LTOUE1: MOV.B @R3,R0 ; FIND END OF LINE
CMP/EQ #0,R0
BT LTOUE2
BRA LTOUE1
ADD #1,R3
LTOUE2: ADD #-1,R3 ; TRIM TAIL SPACE
MOV.B @R3,R0
MOV #H'20,R13
EXTU.B R0,R0
CMP/HI R13,R0
BT LTOUPE
MOV #0,R0 ; SET END OF LINE
BRA LTOUE2
MOV.B R0,@R3
LTOUPE: RTS
NOP
ALIGN 4
LINBUF4:DC.L LINBUF
ENTPRG: MOV R0,R2 ; LINE NO.
MOV.L @(GTPTR-WRKTOP,GBR),R0
MOV R0,R3
BSR SKIPSP
MOV R3,R4 ; SAVE R3
MOV R4,R3
CMP/EQ #0,R0
BT DELLIN ; ENTER LINE NO. ONLY:DELETE LINE
MOV #MAXLL+6,R13
MOV #6,R1 ; INITIAL ENTRY LENGTH
EXTU.B R13,R13
ENTPL: CMP/EQ R13,R1 ; LENGTH = MAXLL + 6 ?
BT ENTP1
MOV.B @R3,R0
CMP/EQ #0,R0
BT ENTP2 ; END OF LINE ?
ADD #1,R3
BRA ENTPL
ADD #1,R1
ENTP1: MOV #0,R0
MOV.B R0,@R3 ; FORCE SET END OF LINE
ENTP2: MOV R1,R0 ; ALIGN 4 BYTES
TST #3,R0
BT ENTP3
MOV #0,R0
ADD #1,R3
MOV.B R0,@R3
BRA ENTP2
ADD #1,R1
ENTP3: MOV R1,R0
BSR SCNHSL
MOV.B R0,@(ENTLEN-WRKTOP,GBR) ; NEW LINE LENGTH
MOV R3,R0
MOV.L R0,@(ENTADR-WRKTOP,GBR)
CMP/EQ R2,R1
BF INSLIN ; R1<>R2:NOT FOUND SAME LINE NO.
ADD #4,R3 ; SKIP LINE NO.
MOV.B @R3+,R2 ; LENGTH OF FOUND LINE
MOV.L @(BASEND-WRKTOP,GBR),R0
EXTU.B R2,R2
ADD R2,R3 ; ADDR OF NEXT LINE
SUB.L R3,R0
MOV.L R0,@(GTLEN-WRKTOP,GBR) ; TRASFER BYTES
MOV.B @(ENTLEN-WRKTOP,GBR),R0
MOV R0,R1
ADD #-5,R1 ; SIZE OF LINE HEADER
SUB R2,R1 ; NEW LENGTH-OLD LENGTH
TST R1,R1
BT REPLNX ; SAME LENGTH
CMP/PL R1
BT INCLIN ; NEW LINE IS LONGER
MOV R3,R2 ; NEXT LINE
ADD R1,R2 ; CALC TARGET ADDR
MOV.L @(GTLEN-WRKTOP,GBR),R0 ; BYTES
BSR LDIR
MOV R0,R1
MOV R2,R0
MOV.L R0,@(BASEND-WRKTOP,GBR)
BRA REPLNX
MOV.L R0,@(FREE-WRKTOP,GBR)
INCLIN: MOV.L @(BASEND-WRKTOP,GBR),R0 ; SOURCE ADDR+1
BRA INSLNX
MOV R0,R3
INSLIN: MOV R0,R3 ; R0=ENTADR
MOV.L @(BASEND-WRKTOP,GBR),R0
MOV R0,R2
SUB R3,R0 ; CALC TRANSFER BYTES
MOV.L R0,@(GTLEN-WRKTOP,GBR)
MOV.B @(ENTLEN-WRKTOP,GBR),R0
MOV R2,R3 ; BASEND(SOURCE ADDR+1)
EXTU.B R0,R1
INSLNX: MOV.L @(ENDFRE-WRKTOP,GBR),R0
MOV R3,R2
ADD R1,R2 ; CALC TARGET ADDR+1
CMP/HI R0,R2
BT JOUTMEM1
MOV R2,R0
MOV.L R0,@(BASEND-WRKTOP,GBR)
MOV.L R0,@(FREE-WRKTOP,GBR)
MOV.L @(GTLEN-WRKTOP,GBR),R0
BSR LDDR
MOV R0,R1
REPLNX: MOV.L @(ENTADR-WRKTOP,GBR),R0
MOV R0,R2
MOV.L @(ENTNO-WRKTOP,GBR),R0
MOV R0,@R2 ; SET LINE NO.
ADD #4,R2
MOV.B @(ENTLEN-WRKTOP,GBR),R0
EXTU.B R0,R1
ADD #-5,R1 ; -5 (SIZE OF LINE HEADER)
MOV.B R1,@R2 ; SET LENGTH
ADD #1,R2
MOV.L @(GTPTR-WRKTOP,GBR),R0
BSR LDIR
MOV R0,R3 ; LINBUF
BRA TOPLEV
NOP
JBADLIN3:
BRA BADLIN
NOP
JOUTMEM1:
BRA OUTMEM
NOP
DELLIN: BSR SCNEQL
NOP
BF JBADLIN3
MOV R3,R2 ; DESTINATION ADDR
ADD #4,R3
MOV.B @R3+,R1 ; LENGTH OF DELETE LINE
MOV.L @(BASEND-WRKTOP,GBR),R0
EXTU.B R1,R1
ADD R1,R3 ; NEXT LINE(SOURCE ADDR)
MOV R0,R1
BSR LDIR
SUB R3,R1 ; TRANSFER BYTES
MOV R2,R0
MOV.L R0,@(BASEND-WRKTOP,GBR)
BRA TOPLEV
MOV.L R0,@(FREE-WRKTOP,GBR)
; ----------
; MESSAGES
; ----------
M_OUT: DC.B "OUT OF"
DC.B 0
M_BAD: DC.B "BAD"
DC.B 0
M_ERR: DC.B "ERROR"
DC.B 0
M_WRKS: DC.B "WORKSPACE"
DC.B 0
M_SYN: DC.B "SYNTAX"
DC.B 0
M_DIV0: DC.B "DIVIDE BY ZERO"
DC.B 0
M_MODE: DC.B "MODE"
DC.B 0
M_BRK: DC.B "BREAK"
DC.B 0
M_LIN: DC.B "LINE NO."
DC.B 0
M_STRC: DC.B "STRUCTURE NEST"
DC.B 0
M_ILL: DC.B "ILLEGAL FUNCTION CALL"
DC.B 0
M_MEM: DC.B "MEMORY"
DC.B 0
M_UXPE: DC.B "UNEXPECTED END"
DC.B 0
M_ADR: DC.B "ADDRESS"
DC.B 0
M_INS: DC.B "INSTRUCTION"
DC.B 0
M_SLT: DC.B "DELAYED SLOT"
DC.B 0
M_OPEN: DC.B "** CHO-CHO-MINI BASIC for SH7046"
DC.B H'0D,H'0A
DC.B "Copyright(C) 2006 A.Hiramatsu"
DC.B H'0D,H'0A,0
M_BYTS: DC.B " BYTES FREE"
DC.B H'0D,H'0A,0
M_OK: DC.B "OK"
DC.B H'0D,H'0A,0
; ------------
; NAME TABLES
; ------------
; FUNCTIONS
ALIGN 4
FL_1: DC.L 0
DC.L XABS
DC.B "ABS("
DC.B 0
ALIGN 4
FL_2: DC.L FL_1
DC.L XCPL
DC.B "CPL("
DC.B 0
ALIGN 4
FL_3: DC.L FL_2
DC.L XFREE
DC.B "FRE("
DC.B 0
ALIGN 4
FL_4: DC.L FL_3
DC.L XNOT
DC.B "NOT("
DC.B 0
ALIGN 4
FL_5: DC.L FL_4
DC.L XNEG
DC.B "NEG("
DC.B 0
ALIGN 4
FL_6: DC.L FL_5
DC.L XPEEK
DC.B "PEEK("
DC.B 0
ALIGN 4
FUNCT: DC.L FL_6
DC.L XSGN
DC.B "SGN("
DC.B 0
; PRINT STATEMENT CAST
ALIGN 4
PL_1: DC.L 0
DC.L XCHR
DC.B "CHR("
DC.B 0
ALIGN 4
PCAST: DC.L PL_1
DC.L UDOT
DC.B "USGN("
DC.B 0
; STATEMENTS & DIRECT COMMANDS
ALIGN 4
CL_1: DC.L 0
DC.L XNEW
DC.B "NEW"
DC.B 0
ALIGN 4
CL_2: DC.L CL_1
DC.L XDEL
DC.B "DELETE"
DC.B 0
ALIGN 4
CL_3: DC.L CL_2
DC.L XRUN
DC.B "RUN"
DC.B 0
ALIGN 4
CL_4: DC.L CL_3
DC.L XLIST
DC.B "LIST"
DC.B 0
ALIGN 4
SL_1: DC.L CL_4
DC.L XEND
DC.B "END"
DC.B 0
ALIGN 4
SL_2: DC.L SL_1
DC.L XFOR
DC.B "FOR"
DC.B 0
ALIGN 4
SL_3: DC.L SL_2
DC.L XGOTO
DC.B "GOTO"
DC.B 0
ALIGN 4
SL_4: DC.L SL_3
DC.L XGOSUB
DC.B "GOSUB"
DC.B 0
ALIGN 4
SL_5: DC.L SL_4
DC.L XINPUT
DC.B "INPUT"
DC.B 0
ALIGN 4
SL_6: DC.L SL_5
DC.L XIF
DC.B "IF("
DC.B 0
ALIGN 4
SL_7: DC.L SL_6
DC.L XNEXT
DC.B "NEXT"
DC.B 0
ALIGN 4
SL_8: DC.L SL_7
DC.L XPRINT
DC.B "PRINT"
DC.B 0
ALIGN 4
SL_9: DC.L SL_8
DC.L XPOKE
DC.B "POKE"
DC.B 0
ALIGN 4
SL_10: DC.L SL_9
DC.L XRET
DC.B "RETURN"
DC.B 0
ALIGN 4
STATM: DC.L SL_10
DC.L XPRINT
DC.B "?"
DC.B 0
; TOKENS
T_TO: DC.B "TO"
DC.B 0
T_STEP: DC.B "STEP"
DC.B 0
SEGMENT BSS
WRKTOP:
LATKEY: DC.B 0 ; LATEST KEY CODE:FOR GETC()
LATKTM: DC.B 0 ; LATEST KEY CODE LIVE TIMER
ENTLEN: DC.B 0 ; ENTRIED LINE LENGTH
RUNFLG: DC.B 0 ; RUNNING
EXLFLG: DC.B 0 ; EXIT LINE FLAG
EXSFLG: DC.B 0 ; EXIT STATEMENT FLAG
ALIGN 4
SPLIM: ; HARDSTACK LIMIT(=SSBTM)
SSBTM: DC.L 0 ; SOFTSTACK BOTTOM
SSLIM: DC.L 0 ; SOFTSTACK LIMIT
VARTOP: DC.L 0 ; VAR AREA TOP
BASTOP: DC.L 0 ; BASIC TEXT TOP
BASEND: DC.L 0 ; BASIC TEXT END
FREE: DC.L 0 ; USER FREE AREA
ENDFRE: DC.L 0 ; END OF FREE AREA
LRANGT: DC.L 0 ; LINE RANGE TOP
LRANGE: DC.L 0 ; LINE RANGE END
ENTNO: DC.L 0 ; ENTRIED LINE NO.
ENTADR: DC.L 0 ; LINE ENTRY ADDR
GTPTR: DC.L 0 ; GLOBAL TARGET POINTER
GTLEN: DC.L 0 ; GLOBAL TRASFER LENGTH
FORLIN: DC.L 0 ; 'FOR' LOOP TOP LINE
FOREXP: DC.L 0 ; 'FOR' LOOP TOP EXECUTE POINTER
FORVAR: DC.L 0 ; CONTROL VAR
FORTO: DC.L 0 ; END VALUE
FORSTP: DC.L 0 ; STEP VALUE
TRPADR: DC.L 0
ITOABF: DS.B 12
LINBUF: DS.B MAXLL+4
END
|