	title	ASSEMBLY SOURCE PREPROCESSOR
*
* ASP: Assembly Source Preprocessor
*
* Copyright 1983-2005 Dave Dunfield
* All rights reserved.
*
STACK	EQU	OSEND		SYSTEM STACK SPACE
USP	EQU	STACK-512	USER STACK SPACE
CTSP	EQU	USP-512		CONTROL STACK SPACE
*
	ORG	OSRAM		PROGRAM EXECUTION SPACE
* PROGRAM ENTRY
ASP	CMPA	#'?'		QUERY OPERAND?
	BNE	QUAL		NO, LOOK FOR QUALIFIER
	SSR	25
	FCCZ	'Use: ASP[/COMMENT/SOURCE/QUIET] <ASP source file>'
	SSR	0
*
* PARSE	FOR QUALIFIERS
*
QUAL	LDA	,Y		GET CHAR FROM COMMAND LINE
	CMPA	#'/'		IS IT A QUALIFIER?
	BNE	MAIN		NO, GET PARAMETERS
	LEAX	QTABLE,PCR	POINT TO QUALIFIER TABLE
	SSR	18		LOOK IT UP
	CMPB	#QMAX		IS IT IN RANGE
	BHS	QERR		IF SO, IT'S INVALID
	LEAX	QFLAGS,PCR	POINT TO QUALIFIER FLAGS
	CLR	B,X		SET THE FLAG
	BRA	QUAL		LOOK FOR ANOTHER QUALIFIER
QERR	SSR	24		DISPLAY MESSAGE
	FCCZ	/Invalid qualifier: '/
	LDA	,Y+		GET CHARACTER
DSQU1	SSR	33		DISPLAY
	LDA	,Y+		GET NEXT CHAR
	BEQ	GOABO		NULL IS DELIMITER
	CMPA	#'/'		START OF ANOTHER QUALIFIER?
	BEQ	GOABO		IF SO, QUIT
	CMPA	#' '		SPACE?
	BEQ	GOABO		IF SO, QUIT
	CMPA	#$0D		END OF LINE?
	BNE	DSQU1		NO, KEEP DUMPING
GOABO	SSR	25		DISPLAY MESSAGE
	FCB	$27,0		CHARACTERS TO DISPLAY
	LDA	#1		INVALID OPERAND RETURN CODE
ABORT	SSR	0		RETURN TO OS
*
* OPEN INPUT FILE
*
MAIN	LDS	#STACK
	SSR	11		GET NAME
	LBNE	ABORT		ERROR
	LDD	#'AS'		'AS'
	STD	,X		SAVE
	LDA	#'P'		'P', CR
	STA	2,X		SAVE
	LDU	#INPFIL		PT TO INPUT
	SSR	55		OPEN FOR READ
	BNE	ABORT		BAD, GIVE UP
	LDA	#'M'		'ASM'
	STA	2,X		SET LAST CHAR
	LDU	#OUTFIL		PT TO OUTPUT
	SSR	56		OPEN FOR WRITE
	LBNE	ABORT		INVALID
	LDU	#USP		POINT TO USER STACK SPACE
	LDX	#SYMTAB		POINT TO SYMBOL TABLE
	CLR	,X		START OFF WITH NO SYMBOLS
	STX	SYMEND		SAVE POINTER
	TST	QUIET		ARE WE BEING QUIET?
	BEQ	RDINP		IF SO, DON'T MAKE ANY NOISE
	SSR	25		DISPLAY MESSAGE
	FCC	'ASP version 1.0'
	FCB	$0A,$0D
	FCCZ	'Processing source file...'
*
* READ LINE OF INPUT
*
RDINP	LDD	LINE		GET CURRENT LINE NUMBER
	ADDD	#1		INCREMENT
	STD	LINE		RESAVE
	LDX	#INPLIN		POINT TO INPUT LINE
	TFR	X,Y		COPY TO Y FOR LATER
RDIN1	LBSR	RDINPF		READ A CHAR
	BNE	CRVARS		END OF FILE
	STA	,X+		SAVE IT
	CMPA	#$0D		END OF LINE?
	BNE	RDIN1		NO, KEEP READING
	SSR	4		LOOK FOR INPUT
	BEQ	RDINP		NULL LINE, IGNORE
	CMPA	#'*'		COMMANT?
	BEQ	PROCOM		IF SO, SKIP IT
* WE HAVE INPUT LINE
	PSHS	Y		SAVE IT
	LDA	SOURCE		IS SOURCE COPY ENABLED?
	BNE	NOSORC		NO, SKIP IT
	LBSR	STROUT		WRITE STRING
	FCCZ	'*>> '		MESSAGE
WRSRLI	LDA	,Y+		GET CHAR
	LBSR	WROUT		OUTPUT
	CMPA	#$0D		END OF LINE?
	BNE	WRSRLI		CONTINUE
* TEST FOR LABLE ON LINE
NOSORC	LDY	,S		GET POINTER BACK
	LDA	,Y		GET CHAR
	CMPA	#'A'		<'A'
	BLO	NOSR1		NO LABLE
	CMPA	#'Z'		>'Z'?
	BHI	NOSR1		NO LABLE
SRCLAB	LDA	,Y+		GET CHAR
	LBSR	VALSYM		IS THIS IT?
	BEQ	SRCLAB		KEEP GOING
	CMPA	#':'		LABLE?
	BNE	NOSR1		NOT A LABLE
	PULS	Y		RESTORE Y
	LBSR	CPVAR
	LBSR	STROUT
	FCB	$09
	FCC	'EQU'
	FCB	$09,'*',$0D,0
	LEAY	1,Y		ADVANCE
	PSHS	Y		RESAVE
NOSR1	PULS	Y		RESTORE Y
	STS	SAVS		SAVE SP
	STU	SAVU		SAVE U
	LDX	#RESWRD
	SSR	18		LOOK UP WORD
	LDX	#HNDLRS		POINTS TO HANDLERS
	ASLB			SHIFT FOR DOUBLE BYTE WORDS
	JSR	[B,X]		EXECUTE PROGRAM CODE
	BRA	RDINP		READ NEXT LINE
* PROCESS COMMENT LINE
PROCOM	TST	COMNT		INCLUDE IN OUTPUT?
	BNE	RDINP		NO, SKIP IT
WRCOMN	LDA	,Y+		GET CHAR
	LBSR	WROUT		WRITE IT
	CMPA	#$0D		END OF LINE?
	BNE	WRCOMN		NO, CONTINUE
	LBRA	RDINP		NEXT LINE
*
* END OF COMPILE, CREATE VARIABLE STATEMENTS
*
CRVARS	LDD	DATADR		GET DATA ADDRESS
	BEQ	NODORG		DON'T ORG DATA
	LBSR	STROUT		WRITE STRING
	FCB	9		TAB
	FCC	'ORG'
	FCB	9		TAB,CR
	FCCZ	'$'
	LDD	DATADR		GET DATA ADDRESS
	LBSR	WRHEXW		OUTPUT HEX WORD
	LBSR	ENDCR		WRITE A NEW LINE CHARACTER
NODORG	LDX	#SYMTAB		POINT TO SYMBOL TABLE
NODOR1	TST	,X		AT END?
	BEQ	ENDVAR		IF SO, WE ARE AT THE END
	TFR	X,Y		SAVE IT
IDENTI	LDA	,Y+		GET CHAR
	BPL	IDENTI		LOOK FOR NEXT
	LDB	,Y		GET TYPE
	BMI	VARNXT		CONSTANT, SKIP IT
WRNAM	LDA	,X		GET VAR
	ANDA	#$7F		CONVERT TO NORM
	LBSR	WROUT		OUTPUT IT
	LDA	,X+		GET NEXT
	BPL	WRNAM		OUTPUT
	LBSR	STROUT		WRITE STRING
	FCB	9		TAB
	FCC	'RMB'
	FCB	9
	FCCZ	'$'
	BITB	#2		TEST FOR WORD
	PSHS	CC		SAVE FLAGS
	LDD	1,X		GET LENGTH
	BNE	DEFA		DEFAULT TO ONE
	INCB			CONVERT TO ONE
DEFA	PULS	CC		RESTORE FLAGS
	BEQ	WRLEN		OK
	LSLB			SHIFT B
	ROLA			TIMES TWO
WRLEN	LBSR	WRHEXW		WRITE IT
	LBSR	ENDCR		NEW LINE
VARNXT	LEAX	3,Y		POINT TO NEXT
	BRA	NODOR1
* VARIALES ARE CREATED
ENDVAR	LDU	#OUTFIL		PT TO OUTPUT
	SSR	57		CLOSE OUTPUT FILE
	LDD	ERRCNT		ANY ERRORS?
	BEQ	ENDOK		END WAS OK
	SSR	26		DISPLAY NUMBER
	SSR	25
	FCCZ	' errors reported.'
	LDA	#100
ENDOK	LBRA	ABORT
*
* STATEMENT HANDLERS
*
* SET CODE ADDRESS
CODE	LBSR	STROUT		SET STRING TO OUTPUT FILE
	FCB	$09		TAB
	FCC	'ORG'		ORIGIN
	FCB	$09,0		TAB, END
	LBSR	CPELEM		COPY NEXT ELEMENT
* END LINE WITH	CARRIAGE RETURN
ENDCR	LDA	#$0D		GET CARRIAGE RETURN
	LBRA	WROUT		END LINE
* SET DATA ADDRESS
DATA	LBSR	GETNUM		GET DATA VALUE
	STA	DATADR		SAVE DATA ADDRESS
	RTS
* VARIABLE DECLARATION
VARIAB	LSRB			CONVERT BACK TO NORMAL VALUE
	STB	TEMP		SAVE TYPE
	LDX	#DTAB		POINT TO DATA TABLE
	SSR	18		LOOK FOR IT
	TSTB			IS IT CONSTANT?
	BNE	NORVAR		NO, NORMAL VARIABLE
* SET A	CONSTANT VALUE
CONSTA	SSR	4		SKIP TO NEXT
	PSHS	Y		SAVE IT
	LBSR	CRSYM		CREATE SYMBOL
	LDA	TEMP		GET DATA TYPE
	ORA	#$80		SET CONSTANT BIT
	STA	,X		SET SYMBOL TYPE
	PULS	Y		RESTORE Y
	LBSR	CPVAR		COPY VARIABLE NAME
	LBSR	SKIP		GET NEXT
	CMPA	#'='		EQUALS?
	BNE	SYNTAX		INVALID CONSTANT
	LBSR	STROUT		WRITE A STRING
	FCB	$09		TAB
	FCC	'EQU'
	FCB	$09,0
	LBSR	CPELEM		SAVE IT
	BSR	ENDCR		WRITE CARRIAGE RETURN
	LBSR	SKIP		GET NEXT
	CMPA	#','		MORE DATA?
	BEQ	CONSTA		IF SO, GO FOR MORE
	CMPA	#$0D		END OF LINE?
	BNE	SYNTAX		INVALID
	RTS
*
* SYNTAX ERROR
*
SYNTAX	LBSR	ERROR		DISPLAY ERROR MESSAGE
	FCCZ	'Incorrect Syntax'
	RTS
* NORMAL VARIABLE DECLARATION
NORVAR	SSR	4		POINT TO VARIABLE
	LBSR	CRSYM		CREATE SYMBOL
	LDA	TEMP		GET DATA TYPE
	STA	,X+		SAVE IT
	LBSR	SKIP		GET NEXT
	CMPA	#'('		ARRAY?
	BNE	NOALL		DON'T ALLOCATE SPACE
	LBSR	GETNUM		GET INPUT NUMBER
	STD	,X		SET ARRAYYSIZE
	LBSR	SKIP		GET NEXT
	CMPA	#')'		CLOSING VALUE?
	BNE	SYNTAX		NO, ERROR
	LBSR	SKIP		GET NEXT
NOALL	CMPA	#','		DO ANOTHER?
	BEQ	NORVAR		IF SO, GO IT AGAIN
	CMPA	#$0D		END OF LINE?
	BNE	SYNTAX		NO, INVALIE
WRSRTS	RTS
*
* 'ASM' COMMAND
*
ASM	LDX	#INPLIN		GET INPUT LINE
	TFR	X,Y		COPY
ASM1	LBSR	RDINPF		GET DATA
	BNE	WRSRTS		END
	STA	,X+		SAVE IT
	CMPA	#$0D		END OF LINE
	BNE	ASM1		CONTINUE
	LDX	#ENDWRD		POINT TO 'END'
	SSR	18		IS THIS IT
	TSTB			FOUND IT
	BEQ	WRSRTS		IF SO, EXIT
	LDX	#INPLIN		POINT TO INPUT LINE
ASM2	LDA	,X+		GET IT
	LBSR	WROUT		OUTPUT
	CMPA	#$0D		END OF LINE?
	BNE	ASM2		NO, WAIT
	BRA	ASM		GET NEXT
* 'SUBROUTINE' STATEMENT
SUBR	LDA	#$82		INDICATE SUBROUTINE
	LBRA	PUSHS		SAVE IT
* DO CONDITIONALS
DOCOND	LDA	#$FF
	STA	BYTE
	LBSR	EXPR		CALCULATE EXPRESION
	LDA	BYTE		GET VALUE
	PSHS	A		SAVE IT
	LBSR	STROUT
	FCB	$09
	FCC	'PSHS'
	FCB	$09,0
	TST	,S		WAS IT BYTE
	BEQ	PSYBY		PUSH BYTE
	LBSR	STROUT
	FCCZ	'A,'		ADD A
PSYBY	LBSR	STROUT
	FCB	'B',$0D,0
* LOOK UP CONDITIONAL
	LBSR	SKIP		ADVANCE
	CMPA	#','
	BNE	DOCSYN		BAD
	LBSR	SKIP
	LDB	,Y+		GET SECOND PART
	LDX	#CONTAB-2   POINT TO TABLE
DOCON1	LEAX	2,X		ADVANCE
	TST	,X		END?
	BEQ	DOCSYN		BAD SYNTAX
	CMPD	,X++		SAME?
	BNE	DOCON1		NO, KEEP LOOKING
	LBSR	SKIP		ADVANCE
	CMPA	#','		IS IT COMMA?
	BNE	DOCSYN		SYNTAX
	PSHS	X		SAVE
	LBSR	EXPR		EVALUATE NEXT EXPRESSION
	TST	BYTE		IS IT BYTE
	BNE	CWRDOK		WORD IS OK
	TST	2,S		WAS LAST BYTE
	BEQ	CWRDOK		NO PROB
	LBSR	STROUT		OUTPUT
	FCB	$09
	FCC	'CLRA'
	FCB	$0D,0		CLEAR ACCA
CWRDOK	LDA	2,S
	STA	BYTE		SAVE BYTE INDICATOR
	LBSR	WRINS
	FCCZ	'CMP'
	LBSR	STROUT
	FCB	$09
	FCCZ	',S+'
	LDA	2,S		GET BYTE INDICATOR
	BEQ	CBYTOK		BYTE IS OK
	LDA	#'+'
	LBSR	WROUT		OUTPUT
CBYTOK	LDA	#$0D
	LBSR	WROUT
	LBSR	STROUT
	FCB	$9,'L','B',0
	PULS	X
	LDA	,X+
	LBSR	WROUT
	LDA	,X
	LBSR	WROUT
	PULS	A		RESTORE STACK
	LDA	#9
	LBRA	WROUT		OUTPUT
DOCSYN	PULS	A
	LBSR	ERROR
	FCCZ	'Incorrect Syntax.'
	RTS
* WHILE STATEMENT
WHILE	LBSR	GETLAB		GET A LABLE
	LBSR	PUSHD		SAVE ON STACK
	PSHS	A,B		SAVE IT
	LBSR	GETLAB		GET LABLE
	LBSR	PUSHD		SAVE IT
	LBSR	WRLAB		OUTPUT LABLE
	LDA	#$81		INDICATE WHILE
	LBSR	PUSHS		SAVE IT
	LBSR	DOCOND		EVALUATE CONDITIONALS
	PULS	A,B		RESTORE LABLE
	LBRA	WRLCR		OUTPUT
* IF STATEMENT
CIF	LBSR	GETLAB		GET NEXT LABLE
	LBSR	PUSHD		SAVE
	PSHS	A,B		SAVE
	LDA	#$80		INDICATE 'IF'
	LBSR	PUSHS		SAVE
	LBSR	DOCOND		DO CONDITIONALS
	PULS	A,B		RESTORE
	LBRA	WRLCR		OUTPUT
* END STATEMENT
CEND	LBSR	POPS		GET DATA
	SUBA	#$80		IS IT 'IF'?
	BEQ	WREQP		NO
* END CORRESPONDS TO A 'WHILE' OR 'UNTIL' STATEMENT
CEND1	DECA			IS IT WHILE/UNTIL ?
	BNE	CEND2		NO, TRY NEXT
	LBSR	STROUT		OUTPUT
	FCB	$09
	FCC	'LBRA'
	FCB	$09,0
	LBSR	POPD		GET LABLE
	LBSR	WRLCR		OUTPUT
* END CORRESPONDS TO AN 'IF' STATEMENT
WREQP	LBSR	POPD		GET LABLE
WREQU	LBSR	WRLAB		OUTPUT
	LBSR	STROUT
	FCB	$09
	FCC	'EQU'
	FCB	$09,'*',$0D,0
	RTS
* END CORRESPONDS TO A 'SUBROUTINE' STATEMENT
CEND2	DECA			IS THIS IT?
	BNE	CENDB		NO
	LBSR	STROUT		OUTPUT STRING
	FCB	9
	FCC	'RTS'
	FCB	$0D,0		END
	RTS
CENDB	LBSR	ERROR
	FCCZ	'Improper nesting.'
	RTS
* ELSE STATEMENT
ELSE	LDX	CTLSTK
	LDA	,X
	CMPA	#$80
	BNE	CENDB
	LBSR	STROUT
	FCB	$9
	FCC	'LBRA'
	FCB	$9,0
	LDD	1,X
	PSHS	A,B
	LBSR	GETLAB		GET A NEW LABLE
	STD	1,X
	LBSR	WRLCR		OUTPUT EQUATE INSTRUCTION
	PULS	A,B
	BRA	WREQU		GENERATE EQUATE
* GOTO STATEMENT
GOTO	LBSR	STROUT
	FCB	9
	FCC	'LBRA'
	FCB	9,0
GOTO1	LBSR	CPVAR
	LBRA	ENDCR		OUTPUT
* CALL COMMAND
CALL	LBSR	STROUT		OUTPUT STRING
	FCB	9
	FCC	'LBSR'
	FCB	9,0
	BRA	GOTO1
* EXIT COMMAND
EXIT	CLR	BYTE		INDICATE BYTE OPERATIONS
	LBSR	EXPR		GET RETURN CODE
	LBSR	STROUT		OUTPUT
	FCB	$09
	FCC	'TFR'
	FCB	$09
	FCC	'B,A'
	FCB	$0D,9
	FCC	'SSR'
	FCB	9,'0',$0D,0
	RTS
* SUBROUTINES
*
* GET LABLE VALUE
GETLAB	LDD	NXTLAB
	ADDD	#1
	STD	NXTLAB
	RTS
* PUSH A DOUBLE BYTE ON CTRL STACK
PUSHD	PSHS	X
	LDX	CTLSTK
	STD	,--X
	BRA	SAVUSP
PUSHS	PSHS	X
	LDX	CTLSTK
	STA	,-X
	BRA	SAVUSP
POPS	PSHS	X
	LDX	CTLSTK
	LDA	,X+
	BRA	SAVUSP
POPD	PSHS	X
	LDX	CTLSTK
	LDD	,X++
SAVUSP	STX	CTLSTK
	PULS	X,PC
*
* WRITE OPERAND TO INSTRUCTION
WROPR	LBSR	WRTAB		OUTPUT TAB
WRONT	LDA	,U+		GET OPERAND TYPE
	CMPA	#1		CONSTANT?
	BNE	NCNST		NOT A CONSTANT
	LDA	#'#'		INDICATE IMMEDIATE MODE
	LBSR	WROUT		OUTPUT
	LDY	,U++		GET POINTER BACK
	LDA	,Y		GET FIRST CHAR
	CMPA	#'#'		ONE OF THESE?
	BNE	NCNT1
	LEAY	1,Y
NCNT1	LBSR	CPALL		COPY INTO OUTPUT SOURCE
WROK	LBRA	ENDCR		WRITE IT OUT
NCNST	LDY	,U++		GET POINTER
	LBSR	CPALL		COPY IT ALL
	TST	BYTE		BYTE OPERATION?
	BNE	WROK		NO, IT'S OK
	LDY	-2,U		GET POINTER BACK
	LBSR	LOOKUP		LOOK FOR IT
	BITA	#2		WORD?
	BEQ	WROK		IT'S A BYTE VARIABLE
	LBSR	STROUT		OUTPUT
	FCCZ	'+1'		OK
	BRA	WROK		CONTINUE
* WRITE OUT INSTRUCTION
WRINS	PSHS	A,CC,X		SAVE REGS
	BSR	WRTAB		WRITE TAB
	LDX	4,S		GET PC
	BSR	WRSTX		WRITE STRING(X)
	STX	4,S		RESAVE PC
	LDA	#'B'		GET LOW BYTE
	TST	BYTE		IS IT A BYTE OPERATION
	BEQ	WRLST		NO, GO FOR IT
	LDA	#'D'		CHANGE TO D
WRLST	BSR	WROUT		OUTPUT
	PULS	A,CC,X,PC
* WRITE STRING(X). TO OUTPUT FILE
WRSTX	LDA	,X+		GET CHAR
	LBEQ	WRSRTS		DONE
	BSR	WROUT		OUTPUT
	BRA	WRSTX		CONTINUE
* WRITE	STRING TO OUTPUT FILE
STROUT	PSHS	A,X		SAVE X
	LDX	3,S		GET PC
	BSR	WRSTX		OUTPUT STRING(X)
STR2	STX	3,S		RESAVE
	PULS	A,X,PC		GO HOME
* WRITE	A HEX WORD
WRHEXW	TSTA			ZERO HIGH BYTE?
	BEQ	WRHEXZ		NO LEADING ZERO
	BSR	WRHEXB		WRITE A BYTE
WRHEXZ	TFR	B,A		COPY
* WRITE	A HEX BYTE
WRHEXB	PSHS	A		SAVE IT
	LSRA			SHIFT
	LSRA			HIGH
	LSRA			NIBBLE
	LSRA			INTO LOW
	BSR	WRNIB		OUTPUT NIBBLE
	PULS	A		RESTORE A
WRNIB	ANDA	#$0F		GET RID OF HIGH CRAP
	ADDA	#$30		CONVERT TO ASCII
	CMPA	#$39		< '30-39
	BLS	WROUT
	ADDA	#$07		CONVERT TO 'A'-'F'
* WRITE	CHARACTER TO OUTPUT FILE
WROUT	PSHS	U		SAVE
	LDU	#OUTFIL		SET UP PTR
	SSR	61		SEND TO OUTPUT FILE
	PULS	U,PC
WRTAB	LDA	#9
	BRA	WROUT		OUTPUT TAB
WRLCR	BSR	WRLAB		OUTPUT LABLE
	LDA	#$0D
	BRA	WROUT		OUTPUT
* WRITE LABLE VALUE
WRLAB	PSHS	A,B
	LDA	#'_'		LEAD IN
	BSR	WROUT		OUTPUT
	LDA	,S
	BSR	WRHEXW		LABLE VALUE
	PULS	A,B,PC
*
* COPY THIS ELEMENT TO SOURCE
*
CPELEM	SSR	4		SKIP
CPEL1	LDA	,Y+		GET CHAR FROM SOURCE
	CMPA	#$0D		CR?
	BEQ	CPE1		IF SO, QUIT
	CMPA	#','		COMMA?
	BEQ	CPE1		IF SO, QUIT
	BSR	WROUT		OUTPUT TO TO OUTPUT FILE
	CMPA	#$27		QUOTE?
	BNE	CPEL1		NO, CONTINUE
CPE2	LDA	,Y+		GET NEXT
	CMPA	#$0D		CR?
	BEQ	CPE3		INVALID STRING
	BSR	WROUT		WRITE IT
	CMPA	#$27		CLOSING QUOTE?
	BNE	CPE2		NO, KEEP COPYING
	BRA	CPEL1		CONTINUE,
CPE3	BSR	BADSTR		WRITE BAD STRING MESSAGE
CPE1	LEAY	-1,Y		BACKUP TO DELIMITER
	RTS
*
* STRING ON THIS LINE IS INVALID
*
BADSTR	BSR	ERROR		WRITE  ERROR MESSAGE
	FCCZ	'Improper string'
	RTS
*
* WRITE	ERROR MESSAGE
*
ERROR	LDD	ERRCNT
	ADDD	#1
	STD	ERRCNT
	SSR	24		WRITE PRE MESSAGE
	FCCZ	'Line: '
	LDD	LINE
	SSR	26		DISPLAY LINE NUMBER
	SSR	24
	FCCZ	' : '		WRITE POST MESSAGE
	LDX	#INPLIN		POINT TO TEXT
ERR3	LDA	,X+		GET CHAR
	CMPA	#$0D		END OF LINE?
	BEQ	ERR4		IF SO, QUIT/
	SSR	33		DISPLAY
	BRA	ERR3		CONTINUE
ERR4	SSR	24
	FCCZ	' : '
	PSHS	X		SAVE X
	LDX	2,S		GET OLD PC
	SSR	23		DISPLAY
	STX	2,S		RESAVE
	SSR	22		NEW LINE
	LDS	SAVS
	LDU	SAVU
	LBRA	RDINP
*
* GET A	NUMBER FROM THE	INPUT STREAM
*
GETNUM	PSHS	X		SAVE X
	SSR	8		GET NUMBER
	BEQ	NUMOK		NO BAD RETURN CODE
	BSR	ERROR		DISPLAY MESSAGE,
	FCCZ	'Invalid numeric value'
NUMOK	TFR	X,D		COPY IT OVER
	PULS	X,PC
*
* COPY VARIABLE/CONSTANT
*
CPALL	LBSR	SKIP		LOOK FOR DATA
	CMPA	#'$'		OK?
	BEQ	CPV1		IF SO, OK
	BSR	VALSYM		VALID
	BEQ	CPV1		OK TO COPY
	LBRA	SYNTAX		INVALID
*
* COPY A VARIABLE NAME TO THE OUTPUT FILE
*
CPVAR	LBSR	SKIP		GET NEXT
	CMPA	#'A'		VALID VARIABLE?
	LBLO	SYNTAX		NO, IT'S BAD
	CMPA	#'Z'		VALID?
	LBHI	SYNTAX		NO, IT'S BAD
CPV1	LBSR	WROUT		WRITE IT
	LDA	,Y+		GET NEXT
	BSR	VALSYM		VALID SYMBOL?
	BEQ	CPV1		YES, CONTINUE
CPV2	LEAY	-1,Y		BACKUP
	RTS
*
* DETERMINE IF CHAR IN A IS A VALID SYMBOL CHARACTER. (0-9, A-Z)
*
VALSYM	CMPA	#'0'		< '0'?
	BLO	BADS		IF SO, IT'S BAD
	CMPA	#'Z'		> 'Z'?
	BHI	BADS		IF SO, IT'S BAD
	CMPA	#'A'		> 'A'?
	BHS	SYMOK		IT'S OK
	CMPA	#'9'		> '9'
	BHI	BADS		IT'S BAD
SYMOK	ORCC	#$04		SET Z
	RTS
BADS	ANDCC	#$FB		CLEAR Z
	RTS
*
* CREATE A SYMBOL
*
CRSYM	LDX	SYMEND		POINT TO END OF SYMBOL TABLE
	LBSR	SKIP		GET NEXT
	CMPA	#'A'		<'A'
	LBLO	SYNTAX		IT'S INVALID
	CMPA	#'Z'		>'Z'
	LBHI	SYNTAX		INVALID
CRS1	STA	,X+		SAVE IN RAM
	LDA	,Y+		GET NEXT CHAR
	BSR	VALSYM		VALID?
	BEQ	CRS1		IT'S OK
	LDA	-1,X		GET LAST CHAR
	ORA	#$80		SET HIGH BIT
	STA	-1,X		RESAVE
	LEAY	-1,Y		BACKUP TO THIS CHAR
	CLR	,X+		INDICATE NO BITS SET
	CLR	,X+		INDICATE NO BITS SET
	CLR	,X+		INDICATE NO BITS SET
	STX	SYMEND		RESAVE
	CLR	,X		INDICATE END OF TABLE
	LEAX	-3,X		BACKUP
	RTS
*
* LOOKUP SYMBOL	POINTED	TO BY Y
*
LOOKUP	SSR	4		ADVANCE TO SYMBOL
	LDX	#SYMTAB		LOOK AT SYMBOL TABLE
LOK1	LDA	,X		GET CHAR FROM TABLE
	BEQ	NOTFND		SYMBOL WAS NOT FOUND
	PSHS	Y		SAVE IT
LOK2	LDA	,Y+		GET CHAR FROM Y
	BSR	VALSYM		IS IT VALID?
	BNE	LOK3		END OF SYMBOL, DID NOT FIND
	CMPA	,X+		DOES IT MATCH TABLE ENTRY?
	BEQ	LOK2		YES, WE HAVE IT
	ORA	#$80		SET HIGH BIT
	CMPA	,-X		IS THIS IT?
	BEQ	LOK4		THIS MIGHT BE IT
* SYMBOL IN TABLE DID NOT MATCH
LOK3	LDA	,X+		GET CHAR FROM TABLE
	BPL	LOK3		FIND DELIMITER
	LEAX	3,X		SKIP TO NEXT
	PULS	Y		RESTORE Y POINTER
	BRA	LOK1		AND KEEP LOOKING
NOTFND	ANDCC	#$FB		CLEAR ZERO
	RTS
* THIS MIGHT BE	IT
LOK4	LDA	,Y		GET CHAR FROM SYMBOL
	BSR	VALSYM		IS IT A VALID SYMBOL?
	BEQ	LOK3		WASN'T IT, TRY AGAIN
	LEAX	1,X		ADVANCE TO TABLE ENTRY
	LEAS	2,S		RESTORE STACK
	LDA	,X		GET TYPE
	ORCC	#$04		SET Z FLAG
	RTS
*
* LOOK FOR SYMBOL, AND DISPLAY MESSAGE IF NOT FOUND
*
LOOKNF	BSR	LOOKUP		LOOK FOR IT
	BEQ	SYMF		IF WAS FOUND
	LBSR	ERROR		DISPLAY ERROR
	FCCZ	'Unknown symbol'
SYMF	RTS
*
* SKIP TO NEXT NON BLANK
*
SKIP	LDA	,Y+		GET CHAR
	CMPA	#' '		BLANK?
	BEQ	SKIP		CONTINUE
	CMPA	#$0D		CR?
	RTS
*
* DETERMINE TYPE OF TOKEN POINTED TO BY	Y
*
TOKEN	LDA	,Y		GET CHAR
	CMPA	#'$'		NUMBER?
	BEQ	TCON		IF SO, IT'S A CONSTANT
	CMPA	#'#'		ADDRESS?
	BEQ	TCON		IF SO, IT'S ALSO A CONSTANT
	CMPA	#'0'		> 0?
	BLO	TADDR		NOT A CONSTANT
	CMPA	#'9'		< '9'?
	BHI	TADDR		TRY ADDRESS
* TEST FOR CONSTANT VALUE
TCON	LEAY	1,Y		ADVANCE
TCON1	LDA	#$01		CONSTANT VALUE
TNXT	PSHS	A		SAVE VALUE
TNXT1	LDA	,Y+		GET CHAR
	LBSR	VALSYM		VALID SYMBOL?
	BEQ	TNXT1		CONTINUE
	LEAY	-1,Y		BACKUP TO IT
	PULS	A,PC		GO HOME
* TEST FOR VARIABLE VALUE
TADDR	LBSR	VALSYM		VALID SYMBOL 'A-Z'?
	BNE	TOPR		NO, IT'S AN OPERATOR
	LBSR	LOOKNF		WHAT IS IT'S VALUE
	PSHS	CC		IT'S A CONSTANT
	BITA	#2		IS IT A WORD?
	BNE	TOKVAR		IT'S A BYTE VARIABLE
	CLR	BYTE		INDICATE WORD
TOKVAR	LDA	#2		INDICATE VARIABLE
	PULS	CC		RESTORE COND CODES
	BMI	TCON1		CONSTANT
	BRA	TNXT		GO AGAIN
* IT'S AN OPERATOR VALUE
TOPR	LDX	#OPRTAB		POINT TO OPERATOR TABLE
TOP1	LDA	,X		GET BYTE FROM TABLE
	BEQ	NTOP		NOT AN OPERATOR
	PSHS	Y		SAVE Y
TOP2	LDA	,Y+		GET CHAR FROM TABLE
	CMPA	,X+		DOES IT MATCH?
	BEQ	TOP2		CONTINUE
	ORA	#$80		SET HIGH BIT
	CMPA	,-X		MATCH?
	BEQ	TOP3		WE FOUND IT
TOP4	LDA	,X+		GET VAL
	BPL	TOP4		CONTINUE
	LEAX	1,X		ADVANCE TO NEXT
	PULS	Y		RESTORE
	BRA	TOP1		CONTINUE
TOP3	LEAS	2,S		SKIP SAVED Y
	LDA	1,X		GET TOKEN VALUE
	RTS
NTOP	LBSR	SYNTAX		INDICATE ERROR
	LEAS	2,S
	CLRA
	RTS
*
* READ CHARACTER FROM INPUT FILE
*
RDINPF	PSHS	U		SAVE REGS
	LDU	#INPFIL		PT TO INPUT FILE
	SSR	59		READ CHAR
	PULS	U,PC
*
* ASSIGNMENT STATEMENT
*
ASSIGN	PSHS	Y		SAVE IT
	LDA	#$FF
	STA	BYTE		SET WORD FLAG
	LBSR	LOOKUP		DOES IT EXIST?
	BNE	ASI1		NO, GO IT THE HARD WAY
	BITA	#2		IS IT A BYTE?
	BNE	ASI2		NO, IT'S A WORD
	CLR	BYTE		INDICATE BYTE OPERATION
	BRA	ASI2
ASI1	LDA	,Y+		GET CHAR
	LBSR	VALSYM		VALID AS A SYMBOL?
	BEQ	ASI1		CONTINUE
	LEAY	-1,Y		BACKUP TO IT
ASI2	LBSR	SKIP		ADVANCE PAST ANY BLANKS
	CMPA	#'='		DOES IT MATCH?
	LBNE	SYNTAX		NO, IT'S A SYNTAX ERROR
	LBSR	EXPR		GENERATE CODE
	LDY	,S		POINT AT LABLE
	LBSR	LOOKUP		DOES IT EXIST?
	BEQ	SYEXI		SYMBOL EXISTS
	LBSR	CRSYM		CREATE IT
	LDA	#1		SET TYPE TO BYTE
	TST	BYTE		BYTE OPERATION?
	BEQ	TYOK		TYPE IS OK
	LDA	#2		CHANGE TO VARIABLE
TYOK	STA	,X		SET TYPE
SAVSYM	LBSR	WRINS		OUTPUT INSTRUCTION
	FCCZ	'ST'		OUTPUT
	LDA	#9		GET TAB
	LBSR	WROUT		OUTPUT
	PULS	Y		RESTORE VARIABLE POINTER
	LBSR	CPVAR		COPY IN VARIABLE NAME
	LBRA	ENDCR		END
SYEXI	LDA	,X		GET TYPE
	BITA	#2		WORD?
	BEQ	ASSBYT		IT'S A BYTE
	TST	BYTE		BYTE RESULT?
	BNE	SAVSYM		TYPE IS OK
	LBSR	STROUT		OUTPUT STRING
	FCB	9
	FCC	'CLRA'
	FCB	$0D,0
	DEC	BYTE		CONVERT TO WORD STORE
	BRA	SAVSYM		OUTPUT
ASSBYT	CLR	BYTE		INSURE BYTE STORE
	BRA	SAVSYM		GO FOR IT
*
* PARSE	INFIX OPERANDS INTO REVERSE RPN	STACK
*
NEST	LEAY	1,Y		SKIP
DOPARS	LBSR	SKIP		ADVANCE TO NEXT TOKEN
	BEQ	TOK		END OF LINE, QUIT
	CMPA	#')'		END OF SECTION?
	BEQ	TOK		IF SO, QUIT
	CMPA	#','		CLOSING COMMA?
	BEQ	TOK		IF SO, QUIT
	LEAY	-1,Y		BACKUP TO IT
	BSR	GETOK		EVALUATE THIS TOKEN
	BRA	DOPARS		DO IT AGAIN FOR NEXT
* GET NEXT TOKEN SET
GETOK	SSR	4		SKIP TO NEXT TOKEN
	BEQ	TOK		END OF LINE, QUIT
	CMPA	#'('		STARTING BRACE?
	BEQ	NEST		IF SO, NEST IT
	STY	TEMP		SAVE POINTER TO TOKEN
	LBSR	TOKEN		DETERMINE IT'S CLASS
	CMPA	#2		IS IT A CONSTANT OR VARIABLE?
	BLS	TOK1		IF SO, IT'S OK
	PSHS	A		SAVE CLASS
	LBSR	GETOK		GET NEXT TOKEN
TOK2	PULS	A		RESTORE CLASS
	PSHU	A		SAVE ON RPN STACK
TOK	RTS
* VARIABLE OR CONSTANT
TOK1	PSHS	A		SAVE CLASS
	LDD	TEMP		GET POINTER TO TOKEN
	PSHU	A,B		SAVE
	BRA	TOK2		SAVE CLASS
*
* PARSE	LINE, AND GENERATE CODE FOR AN EXPRESSION
*
EXPR	STU	SAVUS		SAVE USP FOR DETERMINATION OF TOP
	BSR	DOPARS		PARSE LINE INTO RPN STACK
* GENERATE CODE	FROM REVERSE RPN STACK
	TFR	U,X		POINT TO STACK SPACE
	STX	USRSTK		POINT TO IT
	BSR	GENCOD		PERFORM CODE GENERATION
	LDU	SAVUS		RESTORE U
	RTS
* GENERATE CODE	FOR EXPRESSION
GENCOD	PSHS	A,B,X		SAVE REGISTERS
	CMPU	SAVUS		ARE WE AT END?
	BHS	PAR4		IF SO, QUIT
	LDA	,U+		GET OPERATOR
	TFR	A,B		COPY TO B
	CMPA	#SNGL		SINGLE OPERATOR?
	BHI	DUBOP		IF SO, WE HAVE IT
	CMPA	#2		IS IT A CONSTANT OF VARIABLE?
	BHI	SNGOP		SINGLE OPERATOR
	STA	,-U		RESTACK
	LBSR	WRINS		WRITE INSTRUCTION
	FCCZ	'LD'
	LBSR	WROPR		OUTPUT OPERAND
	PULS	A,B,X,PC
* SINGLE OPERAND INSTRUCTION
SNGOP	LDA	,U		GET OPERAND
	CMPA	#2		CONSTANT?
	BLS	SNG2		IF SO, IT'S OK
	LBSR	GENCOD		GENERATE CODE FOR IT
	BRA	SNG1		AND FINISH
SNG2	LBSR	WRINS		OUTPUT STRING
	FCCZ	'LD'		OUTPUT A LOAD INSTRUCTION
	LBSR	WROPR		AND INCLUDE OPERAND
SNG1	LDX	#GENTAB		POINT TO TABLE
	ASLB			SHIFT IT
	JSR	[B,X]		PERFORM IT
* TERMINATE
PAR4	PULS	A,B,X,PC	RESTORE REGISTERS
* STACKS ENTIRE OPERAND STRING ON VIRTUAL (X) STACK
STKOP	LDA	,U+		GET OPERAND FROM USER STACK
	STA	,-X		SAVE ON X STACK
	CMPA	#2		CONSTANT OR VARIABLE?
	BLS	STKO1		IF SO, IT'T OK
	CMPA	#SNGL		IS IT A SINGLE OPERTOR?
	BLS	STKO2		YES, ONLY ONE OPERATOR TO STAC
	BSR	STKOP		STACK ANOTHER OPERATOR
STKO2	BRA	STKOP		STACK ANOTHER
STKO1	LDA	,U+		GET ADDRESS
	STA	,-X		STACK
	LDA	,U+		GET LOW ADDRESS
	STA	,-X		STACK
	RTS
* DOUBLE OPERATOR INSTRUCTIONS
DUBOP	LDX	USRSTK		POINT TO VIRTUAL STACK
	PSHS	X		SAVE IT
	BSR	STKOP		STACK OPERAND
	STX	USRSTK		SAVE IT
	LDA	,U		GET OPERAND
	CMPA	#2		CONSTANT OF VARIABLE?
	BLS	DUB1		YES, IT'S OK
	LBSR	GENCOD		GENERATE CODE
	BRA	DUB2		AND CONTINUE
DUB1	LBSR	WRINS		OUTPUT INSTRUCTION
	FCCZ	'LD'		DO AN 'LD' INSTRUCTION
	LBSR	WROPR		OUTPUT OPERAND
DUB2	LDX	USRSTK		POINT TO FAKE STACK
DUB3	CMPX	,S		ARE WE IN RANGE?
	BHS	DUB4		OK
	LDA	,X+		GET BYTE FROM FAKE STACK
	STA	,-U		SAVE ON USER STACK
	BRA	DUB3		CONTINUE
DUB4	PULS	X		SAVE IT
	STX	USRSTK		RESAVE
* LOOK FOR SIMPLE SECOND OPERATOR
	LDA	,U		GET BYTE FROM OPERAND
	CMPA	#2		SIMPLE CONSTANT OF VARIABLE?
	BLS	DUB5		YES, IT'S QUITE SIMPLE
	LBSR	WRINS		OUTPUT INSTRUCTION
	FCC	'PSHS'		PUSH INST
	FCB	9,0		TAB AND END
	LBSR	ENDCR		CLOSE IT
	LBSR	GENCOD		GENERATE CODE FOR SECOND ARG
	LDX	#GENTAB		POINT TO TABLE
	ASLB			SHIFT
	ORCC	#$01		SET CARRY, INDICATE STACK OPERATION
	JSR	[B,X]		DO IT
	PULS	A,B,X,PC	GO HOME
DUB5	LDX	#GENTAB		POINT TO IT
	ASLB			TIMES TWO
	JSR	[B,X]		DO IT
	PULS	A,B,X,PC	GO HOME
* SHIFT RIGHT
CSHR	TST	BYTE
	BEQ	BSHR
	LBSR	STROUT
	FCB	9
	FCC	'LSRA'
	FCB	$0D,9
	FCC	'RORB'
	FCB	$0D,0
	BRA	ESHR
BSHR	LBSR	STROUT
	FCB	9
	FCC	'LSRB'
	FCB	$0D,0
ESHR	RTS
* SHIFT LEFT
CSHL	TST	BYTE
	BEQ	BSHL
	LBSR	STROUT
	FCB	$09
	FCC	'LSLB'
	FCB	$0D,$09
	FCC	'ROLA'
	FCB	$0D,0
	BRA	ESHL
BSHL	LBSR	STROUT
	FCB	$09
	FCC	'LSLB'
	FCB	$0D,0
ESHL	RTS
* COMPLEMENT
CCOM	TST	BYTE
	BEQ	BCOM
	LBSR	STROUT
	FCB	$09
	FCC	'COMA'
	FCB	$0D,$09
	FCC	'COMB'
	FCB	$0D,0
	BRA	ECOM
BCOM	LBSR	STROUT
	FCB	$09
	FCC	'COMB'
	FCB	$0D,0
ECOM	RTS
* INCREMENT
CINC	TST	BYTE
	BEQ	BINC
	LBSR	STROUT
	FCB	$09
	FCC	'ADDD'
	FCB	$09
	FCC	'#1'
	FCB	$0D,0
	BRA	EINC
BINC	LBSR	STROUT
	FCB	$09
	FCC	'INCB'
	FCB	$0D,0
EINC	RTS
* DECREMENT
CDEC	TST	BYTE
	BEQ	BDEC
	LBSR	STROUT
	FCB	$09
	FCC	'SUBD'
	FCB	$09
	FCC	'#1'
	FCB	$0D,0
	BRA	EDEC
BDEC	LBSR	STROUT
	FCB	$09
	FCC	'DECB'
	FCB	$0D,0
EDEC	RTS
*
* DOUBLE OPERAND INSTRUCTIONS
*
* SUBTRACTION
CSUB	LBSR	WRINS		OUTPUT INST
	FCCZ	'SUB'		SUBTRACT
	LBCC	WROPR		IF NOTHING, IT'S OK
	BSR	DSSTK1		PERFORM SUBTRACTION
	LBSR	CCOM		COMPLEMENT IT
	LBRA	CINC		INCREMENT IT
* ADDITION
CADD	LBSR	WRINS		OUTPUT INSTRUCTION
	FCCZ	'ADD'		ADD
DCIF1	LBCC	WROPR		IF NO STACK, DO IT RIGHT
DSSTK1	LBSR	STROUT		OUTPUT STRING
	FCB	$09		TAB
	FCCZ	',S+'		ONE OPERATION
	TST	BYTE		BYTE OPERATIONS
	BEQ	ENDX		OK
	LDA	#'+'		EXTRA PLUS
	LBSR	WROUT		OUTPUT
ENDX	LBRA	ENDCR
* LOGICAL OR
COR	BSR	WRACO		WRITE ACCUMULATOR OPERATION
	FCCZ	'OR'		DO AN OR
	RTS
* LOGICAL AND
CAND	BSR	WRACO
	FCCZ	'AND'
	RTS
* EXCLUSIVE OR
CXOR	BSR	WRACO
	FCCZ	'EOR'
	RTS
*
* WRITE AN ACCUMUALTOR OPERATION
*
WRACO	BCS	WRASTK		ON STACK
	TST	BYTE		BYTE OPERATION?
	BEQ	WRABYT		YES
	LBSR	WRTAB		OUTPUT TAB
	LDX	,S		GET PC
	LBSR	WRSTX		OUTPUT INSTRUCTION
	LBSR	STROUT		OUTPUT STRING
	FCB	'A',9,0		OUTPUT STRING
	PSHS	U		SAVE U
	LDA	,U+		GET OPERAND TYPE
	CMPA	#1		CONSTANT?
	BNE	WRANV		NOT A CONSTANT
	LBSR	STROUT
	FCB	'#','=',0
WRANV	LBSR	NCNST		TOP BYTE IS OK
	PULS	U		RESTORE
WRABYT	LBSR	WRTAB		OUTPUT TAB
	LDX	,S		GET POINTER
	LBSR	WRSTX		CONTINUE
	STX	,S		RESAVE
	LBSR	STROUT		OUTPUT
	FCB	'B',9,0		CONTINUE
	TST	BYTE		BYTE OPERATION?
	BEQ	WRANV1		IF SO, NO SPECIAL CRAP
	LDA	,U		GET TYPE
	CMPA	#2		VARIABLE?
	BNE	WRANV1		NO, SKIP IT
	LDY	1,U		GET ADDRESS
	LBSR	LOOKUP		LOOK FOR IT
	BITA	#2		WORD?
	BEQ	WRANV1		NO
	LBSR	STROUT
	FCCZ	'1+'
WRANV1	LBRA	WRONT		OUTPUT OPERAND
* OPERAND IS ON STACK
WRASTK	TST	BYTE		OK?
	BEQ	WRASTB		BYTE OPERATION
	LBSR	WRTAB		OUTPUT
	LDX	,S		GET POINTER
	LBSR	WRSTX		OUTPUT
	LBSR	STROUT		OUTPUT STRING
	FCB	'A',9		OUTPUT STRING
	FCC	',S+'
	FCB	$0D,0		END OF LINE
WRASTB	LBSR	WRTAB		OUTPUT TAB
	LDX	,S		GET POINTER TO INST
	LBSR	WRSTX		OUTPUT
	STX	,S		SAVE
	LBSR	STROUT		OUTPUT STRING
	FCB	'B',9		OUTPUT STRING
	FCC	',S+'
	FCB	$0D,0		END OF LINE
	RTS
*
* OPERATOR TABLE
*
OPRTAB	FCB	'+','+'+$80,5
	FCB	'-','-'+$80,6
	FCB	'-',':'+$80,7
	FCB	'!','!'+$80,12
	FCB	'<'+$80,3
	FCB	'>'+$80,4
	FCB	'+'+$80,8
	FCB	'-'+$80,9
	FCB	'&'+$80,10
	FCB	'!'+$80,11
	FCB	0
SNGL	EQU	7		HIGEST SINGLE OPERAND OPERATOR
* TABLE OF GENERATION CODE
GENTAB	FDB	SYNTAX		0
	FDB	SYNTAX		1
	FDB	SYNTAX		2
	FDB	CSHL		3
	FDB	CSHR		4
	FDB	CINC		5
	FDB	CDEC		6
	FDB	CCOM		7
	FDB	CADD		8
	FDB	CSUB		9
	FDB	CAND		10
	FDB	COR		11
	FDB	CXOR		12
* RESERVED WORD	TABLE
RESWRD	FCB	$84
	FCC	'CHAR'
	FCB	$84
	FCC	'BYTE'
	FCB	$87
	FCC	'INTEGER'
	FCB	$84
	FCC	'CODE'
	FCB	$84
	FCC	'DATA'
	FCB	$83
	FCC	'ASM'
ENDWRD	FCB	$83
	FCC	'END'
	FCB	$82
	FCC	'IF'
	FCB	$84
	FCC	'ELSE'
	FCB	$85
	FCC	'WHILE'
	FCB	$84
	FCC	'GOTO'
	FCB	$84
	FCC	'CALL'
	FCB	$84
	FCC	'EXIT'
	FCB	$84
	FCC	'SUBROUTINE'
	FCB	$80
*
* HANDLER DATA TABLE
*
HNDLRS	FDB	VARIAB		'CHAR'
	FDB	VARIAB		'BYTE'
	FDB	VARIAB		'INTEGER'
	FDB	CODE		'CODE'
	FDB	DATA		'DATA'
	FDB	ASM		'ASM' COMMAND
	FDB	CEND		'END' STATEMENT
	FDB	CIF		'IF' STATEMENT
	FDB	ELSE		'ELSE' STATEMENT
	FDB	WHILE		'WHILE' STATEMENT
	FDB	GOTO		'GOTO' STATEMENT
	FDB	CALL		'CALL' STATEMENT
	FDB	EXIT		'EXIT' STATEMENT
	FDB	SUBR		'SUBROUTINE' STATEMENT
	FDB	ASSIGN		DEFAULT / UNRECOGNIZED
*
* DATA TYPE TABLE
*
DTAB	FCB	$88
	FCC	'CONSTANT'
	FCB	$80
*
* CONDITIONAL DATA TABLE
*
CONTAB	FCC	'EQNE'
	FCC	'NEEQ'
	FCC	'LTLE'
	FCC	'GTGE'
	FCC	'LELT'
	FCC	'GEGT'
	FCC	'LSLO'
	FCC	'LOLS'
	FCC	'HIHS'
	FCC	'HSHI'
	FCB	0,0
*
* QUALIFIER TABLE
*
QTABLE	FCB	$82
	FCC	'/QUIET'
	FCB	$82
	FCC	'/COMMENT'
	FCB	$82
	FCC	'/SOURCE'
	FCB	$80
QMAX	EQU	3
*
QFLAGS	EQU	*
QUIET	FCB	$FF
COMNT	FCB	$FF
SOURCE	FCB	$FF
*
* LOCAL	VARIABLE DATA SPACE
*
LINE	FDB	0		CURRENT LINE NUMBER
DATADR	FDB	0		DEFAULT DATA ADDRESS
NXTLAB	FDB	0		LABLE VALUES
ERRCNT	FDB	0		ERROR COUNTER
CTLSTK	FDB	CTSP		CONTROL STACK POINTER
*
* RESERVED MEMORY
*
BYTE	RMB	1		INDICATES BYTE/WORD OPERATIONS
SAVS	RMB	2		SAVED SP
SAVU	RMB	2		SAVED UP
SAVUS	RMB	2		SAVED U STACK POINTER
USRSTK	RMB	2		SAVED X STACK POINTER
TEMP	RMB	2		TEMPORARY STORAGE
SYMEND	RMB	2		SYMBOL TABLE ENDING ADDRESS
INPLIN	RMB	128		INPUT LINE BUFFER
INPFIL	RMB	522		INPUT FILE BUFFER
OUTFIL	RMB	522		OUTPUT FILE BUFFER
SYMTAB	EQU	*		SYMBOL TABLE
