’΄Xƒ~ƒj‚a‚`‚r‚h‚b‚Μ‘Sƒ\[ƒX

–ί‚ι



ish7046.inc‚ΦƒWƒƒƒ“ƒvj

ccmb7046.asm
; ----------------------------------------------------
;  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

i‚±‚Μƒy[ƒW‚̐ζ“ͺ‚Ι–ί‚ιj

sh7046.inc
RAMTOP	EQU	H'FFFFD000

SCIBASE	EQU	H'FFFF81C0

SMR_2	EQU	H'FFFF81C0
BRR_2	EQU	H'FFFF81C1
SCR_2	EQU	H'FFFF81C2
TDR_2	EQU	H'FFFF81C3
SSR_2	EQU	H'FFFF81C4
RDR_2	EQU	H'FFFF81C5
SDCR_2	EQU	H'FFFF81C6
SMR_3	EQU	H'FFFF81D0
BRR_3	EQU	H'FFFF81D1
SCR_3	EQU	H'FFFF81D2
TDR_3	EQU	H'FFFF81D3
SSR_3	EQU	H'FFFF81D4
RDR_3	EQU	H'FFFF81D5
SDCR_3	EQU	H'FFFF81D6

TCR_3	EQU	H'FFFF8200
TCR_4	EQU	H'FFFF8201
TMDR_3	EQU	H'FFFF8202
TMDR_4	EQU	H'FFFF8203
TIORH_3	EQU	H'FFFF8204
TIORL_3	EQU	H'FFFF8205
TIORH_4	EQU	H'FFFF8206
TIORL_4	EQU	H'FFFF8207
TIER_3	EQU	H'FFFF8208
TIER_4	EQU	H'FFFF8209
TOER	EQU	H'FFFF820A
TOCR	EQU	H'FFFF820B
TGCR	EQU	H'FFFF820D
TCNT_3	EQU	H'FFFF8210
TCNT_4	EQU	H'FFFF8212
TCDR	EQU	H'FFFF8214
TDDR	EQU	H'FFFF8216
TGRA_3	EQU	H'FFFF8218
TGRB_3	EQU	H'FFFF821A
TGRA_4	EQU	H'FFFF821C
TGRB_4	EQU	H'FFFF821E
TCNTS	EQU	H'FFFF8220
TCBR	EQU	H'FFFF8222
TGRC_3	EQU	H'FFFF8224
TGRD_3	EQU	H'FFFF8226
TGRC_4	EQU	H'FFFF8228
TGRD_4	EQU	H'FFFF822A
TSR_3	EQU	H'FFFF822C
TSR_4	EQU	H'FFFF822D
TSTR	EQU	H'FFFF8240
TSYR	EQU	H'FFFF8241
TCR_0	EQU	H'FFFF8260
TMDR_0	EQU	H'FFFF8261
TIORH_0	EQU	H'FFFF8262
TIORL_0	EQU	H'FFFF8263
TIER_0	EQU	H'FFFF8264
TSR_0	EQU	H'FFFF8265
TCNT_0	EQU	H'FFFF8266
TGRA_0	EQU	H'FFFF8268
TGRB_0	EQU	H'FFFF826A
TGRC_0	EQU	H'FFFF826C
TGRD_0	EQU	H'FFFF826E
TCR_1	EQU	H'FFFF8280
TMDR_1	EQU	H'FFFF8281
TIOR_1	EQU	H'FFFF8282
TIER_1	EQU	H'FFFF8284
TSR_1	EQU	H'FFFF8285
TCNT_1	EQU	H'FFFF8286
TGRA_1	EQU	H'FFFF8288
TGRB_1	EQU	H'FFFF828A
TCR_2	EQU	H'FFFF82A0
TMDR_2	EQU	H'FFFF82A1
TIOR_2	EQU	H'FFFF82A2
TIER_2	EQU	H'FFFF82A4
TSR_2	EQU	H'FFFF82A5
TCNT_2	EQU	H'FFFF82A6
TGRA_2	EQU	H'FFFF82A8
TGRB_2	EQU	H'FFFF82AA
ICSR1	EQU	H'FFFF83C0
OCSR	EQU	H'FFFF83C2

IPRA	EQU	H'FFFF8348
IPRD	EQU	H'FFFF834E
IPRE	EQU	H'FFFF8350
IPRF	EQU	H'FFFF8352
IPRG	EQU	H'FFFF8354
IPRH	EQU	H'FFFF8356
ICR1	EQU	H'FFFF8358
ISR	EQU	H'FFFF835A
IPRI	EQU	H'FFFF835C
IPRJ	EQU	H'FFFF835E
IPRK	EQU	H'FFFF8360
ICR2	EQU	H'FFFF8366

IOBASE	EQU	H'FFFF8380

PADRL	EQU	H'FFFF8382
PAIORL	EQU	H'FFFF8386
PACRL3	EQU	H'FFFF838A
PACRL1	EQU	H'FFFF838C
PACRL2	EQU	H'FFFF838E
PBDR	EQU	H'FFFF8390
PBIOR	EQU	H'FFFF8394
PBCR1	EQU	H'FFFF8398
PBCR2	EQU	H'FFFF839A
PEDRL	EQU	H'FFFF83B0
PFDR	EQU	H'FFFF83B2
PEIORL	EQU	H'FFFF83B4
PEIORH	EQU	H'FFFF83B6
PECRL1	EQU	H'FFFF83B8
PECRL2	EQU	H'FFFF83BA
PECRH	EQU	H'FFFF83BC
PEDRH	EQU	H'FFFF83BE
PGDR	EQU	H'FFFF83CD

CMSTR	EQU	H'FFFF83D0
CMCSR_0	EQU	H'FFFF83D2
CMCNT_0	EQU	H'FFFF83D4
CMCOR_0	EQU	H'FFFF83D6
CMCSR_1	EQU	H'FFFF83D8
CMCNT_1	EQU	H'FFFF83DA
CMCOR_1	EQU	H'FFFF83DC

ADDR8	EQU	H'FFFF8430
ADDR9	EQU	H'FFFF8432
ADDR10	EQU	H'FFFF8434
ADDR11	EQU	H'FFFF8436
ADDR12	EQU	H'FFFF8438
ADDR13	EQU	H'FFFF843A
ADDR14	EQU	H'FFFF843C
ADDR15	EQU	H'FFFF843E
ADDR16	EQU	H'FFFF8440
ADDR17	EQU	H'FFFF8442
ADDR18	EQU	H'FFFF8444
ADDR19	EQU	H'FFFF8446
ADCSR_0	EQU	H'FFFF8480
ADCSR_1	EQU	H'FFFF8481
ADCSR_2	EQU	H'FFFF8482
ADCR_0	EQU	H'FFFF8488
ADCR_1	EQU	H'FFFF8489
ADCR_2	EQU	H'FFFF848A
ADTSR	EQU	H'FFFF87F4

FLMCR1	EQU	H'FFFF8580
FLMCR2	EQU	H'FFFF8581
EBR1	EQU	H'FFFF8582
EBR2	EQU	H'FFFF8583
RAMER	EQU	H'FFFF8628

UBARH	EQU	H'FFFF8600
UBARL	EQU	H'FFFF8602
UBAMRH	EQU	H'FFFF8604
UBAMRL	EQU	H'FFFF8606
UBBR	EQU	H'FFFF8608
UBCR	EQU	H'FFFF860A

TCSR	EQU	H'FFFF8610
TCNT	EQU	H'FFFF8611
RSTCSR	EQU	H'FFFF8612

SBYCR	EQU	H'FFFF8614
SYSCR	EQU	H'FFFF8618
MSTCR1	EQU	H'FFFF861C
MSTCR2	EQU	H'FFFF861E
BCR1	EQU	H'FFFF8620

DTEA	EQU	H'FFFF8700
DTEB	EQU	H'FFFF8701
DTEC	EQU	H'FFFF8702
DTED	EQU	H'FFFF8703
DTCSR	EQU	H'FFFF8706
DTBR	EQU	H'FFFF8708
DTEE	EQU	H'FFFF8710
DTEF	EQU	H'FFFF8711

MMT_TMDR	EQU	H'FFFF8A00
MMT_TSR		EQU	H'FFFF8A04
MMT_TCNT	EQU	H'FFFF8A06
MMT_TDDR	EQU	H'FFFF8A0C
ICSR2	EQU	H'FFFF83C4
TPBR	EQU	H'FFFF8A0A
TPDR	EQU	H'FFFF8A08
TCNR	EQU	H'FFFF8A02
TBRU_B	EQU	H'FFFF8A10
TGRUU	EQU	H'FFFF8A12
TGRU	EQU	H'FFFF8A14
TGRUD	EQU	H'FFFF8A16
TDCNT0	EQU	H'FFFF8A18
TDCNT1	EQU	H'FFFF8A1A
TBRU_F	EQU	H'FFFF8A1C
TBRV_B	EQU	H'FFFF8A20
TGRVU	EQU	H'FFFF8A22
TGRV	EQU	H'FFFF8A24
TGRVD	EQU	H'FFFF8A26
TDCNT2	EQU	H'FFFF8A28
TDCNT3	EQU	H'FFFF8A2A
TBRV_F	EQU	H'FFFF8A2C
TBRW_B	EQU	H'FFFF8A30
TGRWU	EQU	H'FFFF8A32
TGRW	EQU	H'FFFF8A34
TGRWD	EQU	H'FFFF8A36
TDCNT4	EQU	H'FFFF8A38
TDCNT5	EQU	H'FFFF8A3A
TBRW_F	EQU	H'FFFF8A3C