[comp.sys.atari.8bit] An Atari Assembler: A65

chasm@killer.DALLAS.TX.US (Charles Marslett) (06/24/89)

#	This is a shell archive (Part 1 of 3)
#
#	It contains 6 source files that contain the source
#	code for the A65 (NON-macro) assembler.
#
#	Run it through the Bourne shell "sh" or an unshar program.
#	The remaining files when put on a single diskette in the
#	default disk drive can then be assembled to generate a new
#	copy of the A65 assembler.
#
#	The documentation and executable binary files follow.
#
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:   Shell Archiver
#	Run the following text with /bin/sh to create:
#	a65.asm
#	asm1.asm
#	asm2.asm
#	asm3.asm
#	asm4.asm
#	asm5.asm
# This archive created: Fri Jun 23 20:23:34 1989
sed 's/^X//' << \SHAR_EOF > a65.asm
X	TITLE	'6502/65C02 ASSEMBLER'
X	SUBTTL	'SOURCE = A65.ASM, 6/24/84, 6/16/89'
X;
X; Copyright (C) 1984, 1986, 1989 by Charles Marslett
X;                             WORDMARK Systems
X; All rights reserved.        2705 Pinewood Dr.
X;                             Garland, TX 75042
X;
X; Permission granted to copy, modify or execute
X; this program for noncommercial purposes only.
X;
XLOGDEV	=	$00	;LOG (SCREEN) IOCB
XPRUNIT	=	$10	;LIST OUTPUT IOCB
XOBUNIT	=	$20	;OBJECT FILE IOCB
XINUNIT	=	$30	;SOURCE FILE IOCB
X	LIST	I
X;
X;  PARAMETERS OF THE ASSEMBLER
X;
XSYMSIZ	=	11	;MAX NUMBER OF CHARACTERS IN A SYMBOL
XFNSIZE	=	18	;MAX LENGTH OF A FILE NAME STRING
XSTRMAX	=	120	;MAX LENGTH OF QUOTED STRING
XLINLEN	=	100	;MAX LENGTH OF AN INPUT LINE
XPRTLEN	=	80	;PRINT LINE WIDTH
XBUFLEN	=	256+6	;MAX SIZE OUTPUT RECORD
XCWIDTH	=	SYMSIZ+9
X;
XTAB	=	$7F
XEOL	=	$9B
X;
X;  REGISTERS ON ZERO PAGE
X;
XDOSVEC	=	$0A
X;
X	ORG	$0080
XTEXTP	DS	2	;ADDRESS OF TEXT BUFFER
XTABPTR	DS	2	;ADDRESS OF OPCODE ENTRY
XENDSTAB	DS	2	;ADDRESS OF END OF SYMTAB
XPASSNO	DS	1	;CURRENT ASSEMBLER PASS
XOPCODE	DS	1	;OPCODE VALUE
XVALUE	DS	2	;VALUE OF OPERAND
XSECVAL	DS	2
XOPER	DS	1
XSVAL	DS	2	;SYMBOL VALUE
XSFLGS	DS	1	;SYMBOL FLAGS
X			; BIT 7=UNDEFINED
X			; BIT 6=GLOBAL
X			; BIT 5=0
X			; BIT 4=0
X			; BIT 3=FORWARD REFERENCE (IN GETVAL)
X			; BIT 2-1=ORG COUNT
X			; BIT 0=UNUSED
XSLEN	DS	1
XPARENS	DS	1
XTEMP	DS	2	;GENERAL TEMPORARIES
XCNT	=	TEMP
XMODE	DS	1	;ADDRESSING MODE OFFSET
XISVAL	DS	1	;FLAG (NONZERO -> LABEL=VALUE)
XLEN	DS	2	;LENGTH OF CURRENT INSTRUCTION
XADRERR	DS	1	;ADDRESS ERROR FIELD
XTXTPTR	DS	1	;CURRENT TEXT BYTE OFFSET
XOBJPTR	DS	1	;NEXT BYTE IN OBJECT BUFFER
XFILE	DS	1	;IOCB USED CURRENTLY FOR INPUT
XSYMBOL	DS	SYMSIZ	;RESERVE 9 BYTES FOR THE SYMBOL
X	DS	1
XPC	DS	2	;CURRENT VALUE OF *
XHIGHP	DS	2
XLOWP	DS	2
XOPRSP	DS	1	;OPERATOR STACK POINTER
XOPDSP	DS	1	;OPERAND STACK POINTER
XFUNC	DS	1	;HIGH/LOW FUNCTION FLAG
X;
XCURLINE	DS	1
XLPP	DS	1
XCURPAGE	DS	2
XTTLLEN	DS	1
XTTLFLG	DS	1
XENDFLG	DS	1
XENTPTF	DS	1
XINIFLG	DS	1
XFWDREF	DS	1
X;
XFR0	=	$D4
XFR1	=	$E0
XINBUFF	=	$F3
X;
XRUNVEC	=	$02E0
XINIVEC	=	$02E2
XINIORG	=	$02E7	;BASE LOAD ADDRESS IS IN THIS WORD
X;
X	ORG	$0340
X	DS	2
XICMD	DS	1
XISTAT	DS	1
XIBUF	DS	2
X	DS	2
XILEN	DS	2
XIAUX	DS	2
X	DS	2
X	DS	2
X;
XFASCII	=	$D8E6
XIFP	=	$D9AA
XCIOV	=	$E456
X;
X	ORG	$2180	;END OF RESIDENT MYDOS (4.51 IS ACTUALLY AT 1F80)
XOPERS	DS	50	;EXPRESSION STACKS
XOPNDL	DS	50
XOPNDH	DS	50
X;
XTEXTBF	DS	LINLEN
XOBJBUF	DS	BUFLEN
XPRBUF	DS	PRTLEN+2
X;
XSTART	LDA	#TTLSIZE
X	STA	TTLLEN
X	LDX	#$FF
X	STX	CURLINE
X	INX
X	STX	CURPAGE
X	STX	CURPAGE+1
X	STX	TTLFLG
X	LDA	#59	;DEFAULT LINES/PAGE
X	STA	LPP
X	LDA	#'A'
X	STA	EXTTXT
X	LDA	#'S'
X	STA	EXTTXT+1
X	LDA	#'M'
X	STA	EXTTXT+2
X	JSR	PROMPT
X	DB	'Source file = ',0
X	DW	INF
X;
X	LDA	#'O'
X	STA	EXTTXT
X	LDA	#'B'
X	STA	EXTTXT+1
X	LDA	#'J'
X	STA	EXTTXT+2
X	JSR	PROMPT
X	DB	'Object file = ',0
X	DW	OUTF
X;
X	LDA	#'L'
X	STA	EXTTXT
X	LDA	#'S'
X	STA	EXTTXT+1
X	LDA	#'T'
X	STA	EXTTXT+2
X	JSR	PROMPT
X	DB	'List file = ',0
X	DW	PRF
X;
X	LDA	#1		;FIRST PASS IS 1
X	STA	PASSNO		;SECOND PASS IS 0
X;
X	LDA	#LOW[SYMTAB]
X	STA	ENDSTAB
X	LDA	#HIGH[SYMTAB]
X	STA	ENDSTAB+1
X	LDX	#$FF
X	STX	SYMTAB
X;
X	LDA	PRF+2
X	CMP	#'-'
X	BEQ	NOPRNT
X	LDX	#PRUNIT
X	LDA	#LOW[PRF]
X	LDY	#HIGH[PRF]
X	JSR	OPNOUT
X	BMI	ABORT
X;
XNOPRNT	LDA	#'A'
X	STA	EXTTXT
X	LDA	#'S'
X	STA	EXTTXT+1
X	LDA	#'M'
X	STA	EXTTXT+2
X;
XPASSLP	LDA	#0
X	STA	ENDFLG
X	STA	ENTPTF
X	STA	INIFLG
X	STA	ERRCNT
X	STA	ERRCNT+1
X	LDA	INIORG		;INITIALIZE THE STARTING ADDRESS
X	STA	PC
X	LDA	INIORG+1
X	STA	PC+1
X	LDX	#INUNIT
X	STX	FILE
X	LDA	#LOW[INF]
X	LDY	#HIGH[INF]
X	JSR	OPENIN
X	BMI	ABORT
X;
XLOOP	LDA	#$00
X	STA	SFLGS
X	STA	LABEL
X	JSR	READLN
X	BMI	CKEOF
X	JSR	GENCODE		;GENERATE CODE/DO DIRECTIVE
X	JSR	ADDSYM		;IF LABEL DEFINED, ADD TO SYM/TAB
X	LDA	PASSNO
X	BNE	NOPLIN		;IF NOT PASS 2, SKIP PRINTING
X	LDA	ADRERR
X	CMP	#' '		;ERRORS?
X	BNE	FORCEPR		;IF SO, FORCE PRINTING
X	LDA	ICMD-2+PRUNIT
X	BMI	NOPLIN
XFORCEPR	JSR	PRINT		;LIST LINE TO PRINTER
X	BMI	ABORT
XNOPLIN	LDA	ENDFLG
X	BNE	ASDONE
X;
X	CLC
X	LDA	LEN
X	ADC	PC
X	STA	PC
X	LDA	LEN+1
X	ADC	PC+1
X	STA	PC+1
X	JMP	LOOP
X;
XABORT	LDX	FILE
XCLINFS	JSR	CLOSEF
X	TXA
X	SEC
X	SBC	#$10
X	TAX
X	CPX	#INUNIT
X	BCS	CLINFS
X	BCC	ABXIT
X;
XCKEOF	CPY	#136		;IS THIS EOF?
X	BNE	ABORT		;IF SO, THEN TREAT AS 'END'
XASDONE	LDX	FILE
X	JSR	CLOSEF
X	CPX	#INUNIT
X	BNE	ENDINCL
X;
X; CHECK FOR END OF PASS
X;
XPASSCK	DEC	PASSNO
X	BPL	PASS2
XABXIT	JMP	ASMXIT		;ASSEMBLY DONE, GO WRAP UP!
X;
XPASS2	LDY	#LOW[SYMTAB]
X	LDA	#HIGH[SYMTAB]
X	STA	TABPTR+1
X	LDA	#0
X	STA	TABPTR
X	BEQ	NEXTSET		;THIS SHOULD BRANCH ALWAYS!
X;
XSETFREF	INY
X	BNE	NEXTSET
X	INC	TABPTR+1
XNEXTSET	LDA 	TABPTR+1
X	CPY	ENDSTAB
X	SBC	ENDSTAB+1
X	BCS	FREFXT
X;
X	LDA	(TABPTR),Y
X	BPL	SETFREF		;IF THE FIRST BYTE OF A SYMBOL
X	ORA	#$04		;SET FORWARD REFERENCE FLAG
X	STA	(TABPTR),Y
X;;;;	JSR	DEBUG1		;Print them out as we mark them!
X	BNE	SETFREF		;JUMP ALWAYS!
X;
XENDINCL	TXA
X	SBC	#$10
X	STA	FILE
X	LDA	ENDFLG
X	BNE	ASDONE
X	JMP	LOOP
X;
X;  ALL SYMBOLS MARKED FWD REF (GO ON TO THE REAL WORK)
X;
XFREFXT	LDX	#OBUNIT
X	LDA	#LOW[OUTF]
X	LDY	#HIGH[OUTF]
X	JSR	OPNOUT
X	BMI	TOABRT
X;
X	LDA	#$FF
X	STA	OBJBUF
X	STA	OBJBUF+1
X	LDA	#2
X	STA	ILEN,X
X	LDA	#0
X	STA	ILEN+1,X
X	STA	OBJPTR		;NO DATA IN BUFFER YET (LEN=0)
X	LDA	#11
X	STA	ICMD,X
X	LDA	#LOW[OBJBUF]
X	STA	IBUF,X
X	LDA	#HIGH[OBJBUF]
X	STA	IBUF+1,X
X	JSR	CIOV
X	BMI	TOABRT
X	JMP	PASSLP
XTOABRT	JMP	ABORT
X;
XASMXIT	LDA	ENTPTF
X	BEQ	NOENTV
X	LDX	#2
X	LDA	#LOW[RUNVEC]
X	STA	PC
X	LDA	#HIGH[RUNVEC]
X	STA	PC+1
X	LDX	#2
X	LDA	INIFLG
X	BEQ	VECT2
X	LDX	#4
X	LDA	INIPT
X	STA	OPCODE+2
X	LDA	INIPT+1
X	STA	OPCODE+3
X;
XVECT2	LDA	ENTPT
X	STA	OPCODE
X	LDA	ENTPT+1
X	STA	OPCODE+1
X	JMP	WRVECT
X;
XNOENTV	LDA	INIFLG
X	BEQ	NOINIV
X	LDA	INIPT
X	STA	OPCODE
X	LDA	INIPT+1
X	STA	OPCODE+1
X	LDA	#LOW[INIVEC]
X	STA	PC
X	LDA	#HIGH[INIVEC]
X	STA	PC+1
X	LDX	#2
XWRVECT	STX	LEN
X	JSR	CODOBJ+4
X	LDX	#VECLL
XCPYVL	LDA	VECLIN-1,X
X	STA	TEXTBF-1,X
X	DEX
X	BNE	CPYVL
X	JSR	PRINT		;PRINT VECTOR CODE LINE
XNOINIV	LDY	OBJPTR
X	BEQ	NOOBJB
X	JSR	WRTOBJ
XNOOBJB	LDX	#OBUNIT
X	JSR	CLOSEF
X	LDA	ICMD-2+PRUNIT
X	BMI	NOPSYM
X	LDA	#' '
X	STA	PRBUF
X	LDA	#EOL
X	STA	PRBUF+1
X	JSR	LIST
X	JSR	PRSTAB		;PRINT SYMBOL TABLE
X	LDX	#PRUNIT
X	JSR	CLOSEF
XNOPSYM	LDA	ERRCNT
X	STA	PC
X	ORA	ERRCNT+1	;IF ANY ERRORS, WAIT FOR A KEY
X	BEQ	NOERRS
X;
X	LDA	ERRCNT+1
X	STA	PC+1
X	LDX	#0
X	STX	LEN
X	LDX	#ERRLL
XCPYEL	LDA	ERRTOT-1,X
X	STA	TEXTBF-1,X
X	DEX
X	BNE	CPYEL
X	JSR	PRINT		;PRINT VECTOR CODE LINE
X	JSR	PROMPT		;WAIT FOR A KEY
X	DB	'Press [RETURN] to continue',0
X	DW	INF
X;
XNOERRS	JMP	(DOSVEC)	;AND RETURN TO DOS
X;
XVECLIN	DB	'<<< RUN/INIT VECTORS >>>',EOL
XVECLL	=	*-VECLIN
XERRTOT	DB	'<<< ERRORS OCCURRED >>>',EOL
XERRLL	=	*-ERRTOT
X;
X	INCLUDE	D:ASM1.ASM
X;
X	INCLUDE	D:ASM2.ASM
X;
X	INCLUDE	D:ASM3.ASM
X;
X	INCLUDE	D:ASM4.ASM
X;
X	INCLUDE	D:ASM5.ASM
X;
XTTLINE	DB	$0C	;FORMFEED
XTITLE	DB	'                              '
X	DB	'                              ',' Page '
XPAGE	DB	'     ',EOL
XSUBTTL	DB	'                              '
X	DB	'                              ','   (C) 1984',EOL
X	DB	'                              '
X	DB	'                         ','WORDMARK Systems',EOL
XTTLSIZE	=	*-TTLINE
X;
X;  NON-ZERO PAGE RAM
X;
XENTPT	DS	2
XINIPT	DS	2
XERRCNT	DS	2		;NUMBER OF ERRORS REPORTED
X;
XEXTTXT	DS	3
X;
XINF	DS	FNSIZE
X	DS	1
XOUTF	DS	FNSIZE
X	DS	1
XPRF	DS	FNSIZE
X	DS	1
XDATBUF	DS	STRMAX
X	DS	6
XFNBUF	DS	FNSIZE
X	DS	2
XLABEL	DS	SYMSIZ
X	DS	2
X;
XSYMTAB	END	START
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > asm1.asm
X;
X;
X;  OPCODE TABLE AND OPERAND EVALUATION ROUTINES
X;
X; BYTE 0, BASE OPCODE VALUE: BITS 7-3 RIGHT SHIFTED 1 BIT (BIT2 ALWAYS 0)
X; BYTE 1, CODE IDENTIFYING VALID OPERAND MODES
X;
X;  0 -- NO OPERAND ALLOWED
X;  1 -- RELATIVE ADDRESSING
X;  2 -- XIND, ZP, IMM, ABS, INDY, ZPIND, ZPX, ABSY, ABSX
X;  3 -- ZP, IMM, ABS
X;  4 -- ZP, ACC, ABS, ZPX, ABSX
X;  5 -- XIND, ZP, ABS, INDY, ZPIND, ZPX, ABSY, ABSX
X;  6 -- ZP, ABS, ZPYSP
X;  7 -- ZP, ABS, ZPX, ABSX (DEC, INC)
X;  8 -- ZP, ABS, ZPX
X;  9 -- ZP, ABS (BIT)
X; 10 -- ABS, ABSIND (JMP)
X; 11 -- (JSR)
X; 12 -- ZP, IMM, ABS, ZPYSP, ABSYSP
X; 13 -- ZP, IMM, ABS, ZPX, ABSX
X;
X;  DEFINE MODES
X;
XXIND	=	$00
XZP	=	$04
XACC	=	$08
XIMM	=	$08
XABS	=	$0C
XINDY	=	$10
XZPIND	=	$11
XZPX	=	$14
XABSY	=	$18
XABSX	=	$1C
X;
XOPS	DB	$B1,$02,'ADC'
X	DB	$91,$02,'AND'
X	DB	$82,$04,'ASL'
X	DB	$C8,$01,'BCC'
X	DB	$D8,$01,'BCS'
X	DB	$F8,$01,'BEQ'
X	DB	$90,$09,'BIT'
X	DB	$98,$01,'BMI'
X	DB	$E8,$01,'BNE'
X	DB	$88,$01,'BPL'
X	DB	$C0,$01,'BRA'
X	DB	$80,$00,'BRK'
X	DB	$A8,$01,'BVC'
X	DB	$B8,$01,'BVS'
X	DB	$8C,$00,'CLC'
X	DB	$EC,$00,'CLD'
X	DB	$AC,$00,'CLI'
X	DB	$DC,$00,'CLV'
X	DB	$E1,$02,'CMP'
X	DB	$F0,$03,'CPX'
X	DB	$E0,$03,'CPY'
X	DB	$FF,$49,'DB'
X	DB	$FF,$4A,'DC'
X	DB	$E2,$07,'DEC'
X	DB	$E6,$00,'DEX'
X	DB	$C4,$00,'DEY'
X	DB	$FF,$43,'DS'
X	DB	$FF,$48,'DW'
X	DB	$FF,$42,'END'
X	DB	$A1,$02,'EOR'
XEQCODE	DB	$FF,$41,'EQU'
X	DB	$FF,$45,'INCLUDE'
X	DB	$F2,$07,'INC'
X	DB	$F4,$00,'INX'
X	DB	$E4,$00,'INY'
X	DB	$A0,$0A,'JMP'
X	DB	$8C,$0B,'JSR'	;VERY FUNNY OPCODE (ABNORMAL)
X	DB	$D1,$02,'LDA'
X	DB	$D2,$0C,'LDX'
X	DB	$D0,$0D,'LDY'
X	DB	$FF,$44,'LIST'
X	DB	$A2,$04,'LSR'
X	DB	$FF,$4C,'MACRO'
X	DB	$FF,$4D,'MEND'
X	DB	$F6,$00,'NOP'
X	DB	$81,$02,'ORA'
X	DB	$FF,$40,'ORG'
X	DB	$FF,$4B,'PAGE'
X	DB	$A4,$00,'PHA'
X	DB	$84,$00,'PHP'
X	DB	$B4,$00,'PLA'
X	DB	$94,$00,'PLP'
X	DB	$92,$04,'ROL'
X	DB	$B2,$04,'ROR'
X	DB	$A0,$00,'RTI'
X	DB	$B0,$00,'RTS'
X	DB	$F1,$02,'SBC'
X	DB	$9C,$00,'SEC'
X	DB	$FC,$00,'SED'
X	DB	$BC,$00,'SEI'
X	DB	$C1,$05,'STA'
X	DB	$C2,$06,'STX'
X	DB	$C0,$08,'STY'
X	DB	$FF,$47,'SUBTTL'
X	DB	$D6,$00,'TAX'
X	DB	$D4,$00,'TAY'
X	DB	$FF,$46,'TITLE'
X	DB	$DE,$00,'TSX'
X	DB	$C6,$00,'TXA'
X	DB	$CE,$00,'TXS'
X	DB	$CC,$00,'TYA'
XENDOPS	DB	$FF,$FF
X;
XNOTHG	LDA	LABEL
X	BNE	LABONL
XCOMMNT	LDA	#$80
X	STA	ISVAL
XLABONL	CLC
X	RTS
X;
XGENCODE	LDY	#0
X	JSR	GETSYM		;LABEL?
X	LDA	SYMBOL
X	BEQ	NOLBL		;NO DO OPCODE THEN
X	LDX	#SYMSIZ+1
XSAVLAB	LDA	SYMBOL-1,X
X	STA	LABEL-1,X
X	DEX
X	BNE	SAVLAB
X;
XNOLBL	JSR	NXTFLD		;NEXT, SKIP OVER TO OPCODE
X	LDA	#0
X	STA	ISVAL
X	STA	MODE
X	STA	LEN
X	STA	LEN+1
X	LDA	#' '
X	STA	ADRERR
X	JSR	NXTFLD
X	CMP	#';'		;COMMENT?
X	BEQ	NOTHG
X	TAX
X	BMI	NOTHG
X	CMP	#'='
X	BNE	NOTEQ
X	LDA	#LOW[EQCODE]
X	STA	TABPTR
X	LDA	#HIGH[EQCODE]
X	STA	TABPTR+1
X	INY
X	JSR	NXTFLD
X	STY	TXTPTR
X	JMP	SPCLOP
X;
XNOTEQ	JSR	GETSYM
X	JSR	NXTFLD
X	STY	TXTPTR
X;
X	LDA	#LOW[OPS-1]
X	STA	TABPTR
X	LDA	#HIGH[OPS-1]
X	STA	TABPTR+1
X	LDY	#0
XFINDOP	INY
X	LDA	(TABPTR),Y
X	BPL	FINDOP
X	CLC
X	TYA
X	ADC	TABPTR
X	STA	TABPTR
X	LDA	#0
X	ADC	TABPTR+1
X	STA	TABPTR+1
X	LDY	#1
X	LDA	(TABPTR),Y
X	BMI	NOTOPC		;IF NO MATCH IN THE TABLE
X	LDX	#$FF
X;
XOPCPL	INY
X	INX
X	LDA	SYMBOL,X
X	BEQ	TSTEM		;END OF SYMBOL, END OF TABENT?
X	CMP	#$7B
X	BCS	DOCOMP
X	CMP	#$61
X	BCC	DOCOMP
X	SBC	#$20
XDOCOMP	CMP	(TABPTR),Y
X	BNE	FINDOP
X	BEQ	OPCPL
X;
XNOTOPC	LDA	#'O'
X	STA	ADRERR
X	LDA	#$EA		;3 NOP INSTRUCTIONS
X	STA	OPCODE
X	STA	VALUE
X	STA	VALUE+1
X	LDA	#3
X	STA	LEN
X	LDY	#0		;CC=ZERO, PLUS (ERROR)
X	RTS
X;
XTSTEM	LDA	(TABPTR),Y
X	BPL	FINDOP		;NOT END OF TABLE ENTRY, NO MATCH
X;
XSPCLOP	LDY	#0
X	LDA	(TABPTR),Y
X	STA	OPCODE
X	INY
X	INC	LEN
X	LDA	(TABPTR),Y
X	BEQ	OPNDOK
X	LDY	TXTPTR
X	CMP	#$40
X	BCC	MACHCD		;IF 6502 INSTRUCTION
X	JMP	ASSDIR
X;
XMACHCD	JSR	RDOPND
X	STY	TXTPTR
X	BCC	OPNDOK
X	LDA	#'E'
X	STA	ADRERR
XOPNDOK	LDA	OPCODE
X	AND	#$FC
X	CLC
X	ADC	OPCODE
X	CLC
X	ADC	MODE
X	STA	OPCODE
X	JMP	CODOBJ
X;
X;  ESTABLISH MODE FROM SYNTAX OF OPERAND
X;
XRELJMP	JSR	EVALAB		;EVALUATE ADDRESS
X	CLC
X	LDA	VALUE
X	SBC	PC
X	STA	VALUE
X	BNE	GRELV
X	DEC	VALUE+1
XGRELV	LDA	VALUE+1
X	SBC	PC+1
X	STA	VALUE+1
X	DEC	VALUE
X;
X	LDA	VALUE
X	ASL	A
X	LDA	VALUE+1
X	ADC	#0
X	BEQ	RRELV
X	LDA	#' '
X	CMP	ADRERR
X	BCC	RRELV
X	LDA	#'V'
X	STA	ADRERR
XRRELV	CLC
X	RTS
X;
XJMPGRP	LDA	(TEXTP),Y
X	CMP	#'('
X	BNE	JABS
X	LDA	#$2C	;MODE OFFSET = 2C
X	STA	MODE
X	INY
X	JSR	EVALAB
X	DEY
X	LDA	(TEXTP),Y
X	CMP	#')'
X	BNE	SMERR
X	JMP	SMXIT
X;
XJABS	JSR	EVALAB
X	JMP	SMABS
X;
XACCREF	LDA	#1
X	STA	LEN
X	BNE	ACCJ
X;
XJSUB	JSR	EVALAB
XACCJ	LDA	#ACC
X	JMP	SMRET
X;
XABSOPD	JMP	ZPOPNOK
X;
XRDOPND	INC	LEN
X	CMP	#1		;IF RELATIVE BRANCH, SPECIAL
X	BEQ	RELJMP
X	INC	LEN
X	CMP	#$0A		;IF JUMP, ONLY ABS AND ABSIND ARE ALLOWED
X	BEQ	JMPGRP
X	CMP	#$0B
X	BEQ	JSUB
X	TAX			;SAVE FOR FUTURE REF.
X	STA	MODE
X	LDA	(TEXTP),Y
X	CPX	#$04		;ACC OPERAND ALLOWED?
X	BNE	NOACC		;NO, THEN "A" IS NOT SPECIAL
X	CMP	#'a'
X	BEQ	ISACC
X	CMP	#'A'
X	BNE	NOACC
XISACC	INY
X	LDA	(TEXTP),Y
X	CMP	#'0'
X	BCC	ACCREF
X	CMP	#'z'+1
X	BCS	ACCREF
X	DEY
X	BCC	GOTACH
XNOACC	CMP	#'#'
X	BEQ	SMIMM
X	CMP	#'('
X	BEQ	SMIND
XGOTACH	JSR	EVALAB		;EVALUATE ABSOLUTE OPERAND
X	DEY
X	LDA	FWDREF		;FORWARD REFERENCES ARE ALWAYS 16-BIT
X	ORA	VALUE+1
X	BNE	ABS16
X	LDA	ADRERR
X	CMP	#' '
X	BEQ	ABSOPD
XABS16	LDA	(TEXTP),Y
X	CMP	#','
X	BNE	SMABS
X	JSR	NEXTCHR		;GET NEXT CHAR (INY) AND FORCE UPPER CASE
X	CMP	#'Y'
X	BEQ	SMAY
X	CMP	#'X'
X	BEQ	SMAX
XSMERR	SEC			;ELSE, ERROR
X	RTS
X;
XSMIND	DEC	LEN
X	INY
X	JSR	EVALAB
X	LDA	VALUE+1
X	BNE	SMERR
X	DEY
X	LDA	(TEXTP),Y
X	CMP	#','
X	BEQ	SMINX
X	CMP	#')'
X	BNE	SMERR
X	INY
X	LDA	(TEXTP),Y
X	CMP	#','
X	BNE	SZI
X	JSR	NEXTCHR		;GET NEXT CHAR (INY) AND FORCE UPPER CASE
X	CMP	#'Y'
X	BNE	SMERR
X	LDA	#INDY
X	DB	$2C		;BIT [ADDR16] (SKIP 2 BYTES)
X;
XSMABS	LDA	#ABS
X	DB	$2C		;BIT [ADDR16] (SKIP 2 BYTES)
X;
XSMAX	LDA	#ABSX
X	JMP	SMRET
X;
XSMZPY	CMP	#'Y'
XTSMERR	BNE	SMERR
X	LDX	MODE
X	CPX	#$03
X	BEQ	ZPYSP
X	CPX	#$0C
X	BEQ	ZPYSP
X	CPX	#$06
X	BEQ	ZPYSP
X;
XSMAY	LDA	#3
X	STA	LEN
X	LDX	MODE
X	CPX	#$0C
X	BEQ	SMAX
X	LDA	#ABSY
X	BNE	SMRET
X;
XSMIMM	DEC	LEN
X	INY
X	JSR	EVALAB
X	LDA	VALUE+1
X	BEQ	SMIMOK
X	LDA	VALUE
X	BPL	SMIMBD
X	INC	VALUE+1
X	BEQ	SMIMOK
XSMIMBD	LDA	#' '
X	CMP	ADRERR
X	BCC	SMIMOK
X	LDA	#'V'
X	STA	ADRERR
XSMIMOK	LDX	MODE
X	CPX	#$03
X	BEQ	XYIMM
X	CPX	#$06
X	BEQ	XYIMM
X	CPX	#$08
X	BEQ	XYIMM
X	CPX	#$0C
X	BEQ	XYIMM
X	CPX	#$0D
X	BEQ	XYIMM
X	LDA	#IMM
X	BNE	SMRET
X;
XSMINX	JSR	NEXTCHR		;GET NEXT CHAR (INY) AND FORCE UPPER CASE
X	CMP	#'X'
X	BNE	TSMERR
X	INY
X	LDA	(TEXTP),Y
X	CMP	#')'
X	BNE	TSMERR
XXYIMM	LDA	#XIND
XSMRET	STA	MODE
XSMXIT	CLC
X	RTS
X;
XSZI	LDA	#ZPIND
X	BNE	SMRET
X;
XZPYSP	LDA	#ZPX
X	BNE	SMRET
X;
XSMZP	LDA	#ZP
X	BNE	SMRET
X;
XZPOPNOK	DEC	LEN
X	LDA	(TEXTP),Y
X	CMP	#','
X	BNE	SMZP
X	JSR	NEXTCHR		;GET NEXT CHAR (INY) AND FORCE UPPER CASE
X	CMP	#'X'
X	BEQ	ZPYSP
X	JMP	SMZPY
X;
XNEXTCHR	INY
X	LDA	(TEXTP),Y
X	CMP	#$7B
X	BCS	CHROK
X	CMP	#$61
X	BCC	CHROK
X	SBC	#$20
XCHROK	RTS
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > asm2.asm
X;
X;  MACRO.ASM
X;
XDOMACRO	RTS
XDOMEND	RTS
X;
X;  DATA.ASM
X;
XDSETUP	LDY	#STRMAX
X	LDA	#' '
XCLRSTR	STA	DATBUF-1,Y
X	DEY
X	BNE	CLRSTR
X	LDY	TXTPTR
X	RTS
X;
XDEFWP	JSR	DSETUP
XDEFWPL	JSR	EVALAB
X	LDA	VALUE
X	LDX	LEN
X	STA	DATBUF,X
X	INX
X	LDA	VALUE+1
X	STA	DATBUF,X
X	INX
X	STX	LEN
X	DEY
X	LDA	(TEXTP),Y
X	INY
X	CMP	#','
X	BEQ	DEFWPL
X	BNE	EXITWS
X;
XGETTTL	JSR	DSETUP
X	LDA	#2
X	BNE	TTLS
XGETSTL	JSR	DSETUP
X	LDA	#1
XTTLS	BIT	TTLFLG
X	BEQ	DOTTL
X	LDX	PASSNO
X	BNE	IGNTTL
XDOTTL	TAX
X	LDA	TTLCODE,X
X	ORA	TTLFLG
X	STA	TTLFLG
X	BNE	DEFBPE
X;
XDEFCOP	JSR	DSETUP
X	LDA	#$80
X	BMI	DEFBEN
X;
XDEFBP	JSR	DSETUP
XDEFBPE	LDA	#0
XDEFBEN	STA	MODE
X	LDX	#0
XDEFBLP	LDA	(TEXTP),Y
X	CMP	#$27	;STARTING QUOTE?
X	BEQ	QTSTR
X	CPX	#STRMAX
X	BCS	TOLONG
X	CMP	#EOL
X	BEQ	TOLONG
X	JSR	EVALAB
X	LDA	VALUE
X	LDX	LEN
X	STA	DATBUF,X
X	INX
X	DEY
XENDBS	STX	LEN
X	LDA	MODE
X	ORA	DATBUF-1,X		;SET THE HIGH BIT OF THE LAST CHAR
X	STA	DATBUF-1,X
X	LDA	(TEXTP),Y
X	INY
X	CMP	#','
X	BEQ	DEFBLP
XEXITBS	BIT	TTLFLG
X	BMI	LDTITL
X	BVS	LDSTTL
XEXITWS	LDX	#6
XCPYTXT	LDA	DATBUF-1,X
X	STA	OPCODE-1,X
X	DEX
X	BNE	CPYTXT
X	STX	MODE
X	JSR	DATOBJ
XIGNTTL	CLC
X	RTS
X;
XQTSTR	INY
X	LDA	(TEXTP),Y
X	CMP	#$27	;END QUOTE?
X	BEQ	CLQUOT
X	CMP	#EOL
X	BEQ	TOLONG
X	STA	DATBUF,X
X	INX
X	CPX	#STRMAX
X	BCC	QTSTR
X;
XTOLONG	LDA	#'S'
X	STA	ADRERR
X	DEY			;INSURE WE SEE EOL LATER
X;
XCLQUOT	INY
X	BNE	ENDBS
X;
XLDTITL	LDX	#60
XLDTITA	LDA	DATBUF-1,X
X	STA	TITLE-1,X
X	DEX
X	BNE	LDTITA
XTTLXIT	STX	LEN
X	LDA	#$80
X	STA	ISVAL
X	LDA	TTLFLG
X	AND	#3
X	STA	TTLFLG
X	RTS
X;
XLDSTTL	LDX	#60
XLDSTTA	LDA	DATBUF-1,X
X	STA	SUBTTL-1,X
X	DEX
X	BNE	LDSTTA
X	BEQ	TTLXIT
X;
XDOEJECT	JSR	DSETUP
X	LDA	CURLINE
X	BEQ	ALREADY
X	LDA	#$FF
X	STA	CURLINE		;FORCE A PAGE EJECT
XALREADY	JSR	IFARG
X	BCC	NOARG
X	JSR	EVALAB
X	LDA	VALUE+1
X	BNE	TERROR
X	LDA	VALUE
X	BMI	TERROR
X	STA	LPP
XNOARG	CLC
X	RTS
X;
XIFARG	JSR	NXTFLD
X	CMP	#EOL
X	BEQ	NOARG
X	CMP	#';'
X	BEQ	NOARG
X;
XTERROR	SEC
X	RTS
X;
XTTLCODE	=	*-1
X	DB	$41,$82
X;
X;  DIREC.ASM
X;
X;  HANDLE ASSEMBLER DIRECTIVES (Byte 2 of opcode table > 0x40)
X;
XASSDIR	DEC	LEN
X	AND	#$3F
X	CMP	#DIRTBH-DIRTBL
X	TAX
X	LDA	DIRTBH,X
X	PHA
X	LDA	DIRTBL,X
X	PHA
X	RTS
X
XDIRTBL	DB	LOW[ASSORG-1]
X	DB	LOW[ASSEQU-1]
X	DB	LOW[ASSEND-1]
X	DB	LOW[ASSDEFS-1]
X	DB	LOW[ASSLIST-1]
X	DB	LOW[ASSINCL-1]
X	DB	LOW[GETTTL-1]
X	DB	LOW[GETSTL-1]
X	DB	LOW[DEFWP-1]
X	DB	LOW[DEFBP-1]
X	DB	LOW[DEFCOP-1]
X	DB	LOW[DOEJECT-1]
X	DB	LOW[DOMACRO-1]
X	DB	LOW[DOMEND-1]
X
XDIRTBH	DB	HIGH[ASSORG-1]
X	DB	HIGH[ASSEQU-1]
X	DB	HIGH[ASSEND-1]
X	DB	HIGH[ASSDEFS-1]
X	DB	HIGH[ASSLIST-1]
X	DB	HIGH[ASSINCL-1]
X	DB	HIGH[GETTTL-1]
X	DB	HIGH[GETSTL-1]
X	DB	HIGH[DEFWP-1]
X	DB	HIGH[DEFBP-1]
X	DB	HIGH[DEFCOP-1]
X	DB	HIGH[DOEJECT-1]
X	DB	HIGH[DOMACRO-1]
X	DB	HIGH[DOMEND-1]
X;
XASSORG	JSR	EVALAB
X	LDA	VALUE
X	LDX	PC
X	STA	PC
X	STX	VALUE
X	LDA	VALUE+1
X	LDX	PC+1
X	STA	PC+1
X	STX	VALUE+1
X	INC	ISVAL
X	RTS
X;
XASSEQU	JSR	EVALAB
X	INC	ISVAL
X	RTS
X;
XASSEND	LDA	(TEXTP),Y
X	CMP	#';'
X	BEQ	NOENDV
X	CMP	#EOL
X	BEQ	NOENDV
X	JSR	EVALAB
X	DEY
X	LDA	(TEXTP),Y
X	INY
X	CMP	#','
X	BNE	RUNEND
X	LDA	VALUE
X	STA	INIPT
X	LDA	VALUE+1
X	STA	INIPT+1
X	DEC	INIFLG
X	BNE	ASSEND
X;
XRUNEND	LDA	VALUE
X	STA	ENTPT
X	LDA	VALUE+1
X	STA	ENTPT+1
X	DEC	ENTPTF
XNOENDV	DEC	ENDFLG
X	RTS
X;
XASSDEFS	JSR	EVALAB
X	LDA	VALUE
X	STA	LEN
X	LDA	VALUE+1
X	STA	LEN+1
X	LDA	#$FF
X	STA	MODE
X	RTS
X;
XBMPFIL	STX	FILE
XCMTXIT	JMP	COMMNT
X;
XASSINCL	LDX	#0
XASSINL	LDA	(TEXTP),Y
X	CMP	#'z'+1
X	BCS	ICLXIT
X	CMP	#'.'
X	BCC	ICLXIT
X	STA	FNBUF,X
X	INY
X	INX
X	CPX	#FNSIZE
X	BNE	ASSINL
X;
XICLXIT	LDA	#EOL
X	STA	FNBUF,X
X	JSR	BLDFNB
X	CLC
X	LDA	FILE
X	ADC	#$10
X	BMI	TMINCF
X	TAX
X	LDA	#LOW[FNBUF]
X	LDY	#HIGH[FNBUF]
X	JSR	OPENIN
X	BPL	BMPFIL
X;
XTMINCF	LDA	#'I'
X	STA	ADRERR
X	BNE	CMTXIT
X;
XASSLIST	EQU	CMTXIT	;NOT IMPLEMENTED YET
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > asm3.asm
X;
X;  EXPR.ASM
X;
X;  PROVIDE FOR EXPRESSIONS IN OPERANDS
X;
XMUL16	LDA	OPNDL-1,X
X	STA	SECVAL
X	LDA	OPNDH-1,X
X	STA	SECVAL+1
X	LDA	OPNDH-2,X
X	PHA
X	LDA	OPNDL-2,X
X	TAX
X	LDA	#0
X	STA	VALUE
X	STA	VALUE+1
X	LDA	#8
X	STA	CNT
X	PLA
XML0	JSR	MUL1
X	DEC	CNT
X	BNE	ML0
X;
X	LDA	#8
X	STA	CNT
X	TXA
XML1	JSR	MUL1
X	DEC	CNT
X	BNE	ML1
X	RTS
X;
XMUL1	ASL	VALUE
X	ROL	VALUE+1
XMUL0	ASL	A
X	BCC	MEX
X	PHA
X	CLC
X	LDA	VALUE
X	ADC	SECVAL
X	STA	VALUE
X	LDA	VALUE+1
X	ADC	SECVAL+1
X	STA	VALUE+1
X	PLA
XMEX	RTS
X;
XDIV16	LDA	OPNDL-1,X
X	STA	SECVAL
X	LDA	OPNDH-1,X
X	STA	SECVAL+1
X	LDA	OPNDL-2,X
X	PHA
X	LDA	OPNDH-2,X
X	TAX
X	LDA	#0
X	STA	VALUE
X	STA	VALUE+1
X	LDA	#-16
X	STA	CNT
X	PLA
XGETSIZ	BIT	SECVAL+1
X	BMI	DODVS
X	ASL	SECVAL
X	ROL	SECVAL+1
X	INC	CNT
X	BNE	GETSIZ
X	RTS
X;
XDODVS	PHA
X	LDA	CNT
X	AND	#$0F
X	STA	CNT
X	PLA
XCMP16	CPX	SECVAL+1
X	BNE	CMPX
X	CMP	SECVAL
XCMPX	PHP
X	ROL	VALUE
X	ROL	VALUE+1
X	PLP
X	BCC	NOSUB
X	SBC	SECVAL
X	PHA
X	TXA
X	SBC	SECVAL+1
X	TAX
X	PLA
XNOSUB	LSR	SECVAL+1
X	ROR	SECVAL
X	DEC	CNT
X	BPL	CMP16
X	RTS
X;
XDOADD	CLC
X	LDA	OPNDL-2,X
X	ADC	OPNDL-1,X
X	STA	OPNDL-2,X
X	LDA	OPNDH-2,X
X	ADC	OPNDH-1,X
X	STA	OPNDH-2,X
X	JMP	DOOPXB
X;
XDOSUB	SEC
X	LDA	OPNDL-2,X
X	SBC	OPNDL-1,X
X	STA	OPNDL-2,X
X	LDA	OPNDH-2,X
X	SBC	OPNDH-1,X
X	STA	OPNDH-2,X
X	JMP	DOOPXB
X;
XDONEG	SEC
X	LDA	#0
X	SBC	OPNDL-1,X
X	STA	OPNDL-1,X
X	LDA	#0
X	SBC	OPNDH-1,X
X	STA	OPNDH-1,X
X	JMP	DOOPXU
X;
XDOOP	LDX	OPDSP
X	CMP	#'+'
X	BEQ	DOADD
X	CMP	#'-'
X	BEQ	DOSUB
X	CMP	#'!'
X	BEQ	DONEG
X	CMP	#'*'
X	BEQ	DOMUL
X	CMP	#'/'
X	BEQ	DODIV
X	CMP	#'%'
X	BEQ	DOMOD
X	CMP	#'&'
X	BEQ	DOAND
X	CMP	#'|'
X	BEQ	DOOR
X	BNE	DOOPXU
X;
XDOOPCX	LDX	OPDSP
X	LDA	VALUE
X	STA	OPNDL-2,X
X	LDA	VALUE+1
X	STA	OPNDH-2,X
XDOOPXB	DEC	OPDSP
XDOOPXU	DEC	OPRSP
X	LDX	OPRSP
X	LDA	OPERS+1,X
X	CLC
X	RTS
X;
XDOMUL	JSR	MUL16
X	JMP	DOOPCX
X;
XDODIV	JSR	DIV16
X	JMP	DOOPCX
X;
XDOMOD	JSR	DIV16
X	PHA
X	TXA
X	LDX	OPDSP
X	STA	OPNDH-2,X
X	PLA
X	STA	OPNDL-2,X
X	JMP	DOOPXB
X;
XDOAND	LDA	OPNDL-2,X
X	AND	OPNDL-1,X
X	STA	OPNDL-2,X
X	LDA	OPNDH-2,X
X	AND	OPNDH-1,X
X	STA	OPNDH-2,X
X	JMP	DOOPXB
X;
XDOOR	LDA	OPNDL-2,X
X	ORA	OPNDL-1,X
X	STA	OPNDL-2,X
X	LDA	OPNDH-2,X
X	ORA	OPNDH-1,X
X	STA	OPNDH-2,X
X	JMP	DOOPXB
X;
X;  SYMBOLIC FUNCTION TESTS
X;
XLTEST	LDA	SYMBOL
X	CMP	#'L'
X	BNE	NOTM
X	LDA	SYMBOL+1
X	CMP	#'O'
X	BNE	NOTM
X	LDA	SYMBOL+2
X	BEQ	TMATCH
X	CMP	#'W'
X	BNE	NOTM
X	LDA	SYMBOL+3
X	BNE	NOTM
X;
XTMATCH	SEC
X	RTS			;CY=1
X;
XHTEST	LDA	SYMBOL
X	CMP	#'H'
X	BNE	NOTM
X	LDA	SYMBOL+1
X	CMP	#'I'
X	BNE	NOTM
X	LDA	SYMBOL+2
X	BEQ	TMATCH
X	CMP	#'G'
X	BNE	NOTM
X	LDA	SYMBOL+3
X	CMP	#'H'
X	BNE	NOTM
X	LDA	SYMBOL+4
X	BEQ	TMATCH
XNOTM	CLC
X	RTS
X;
XDOFUN	LDX	OPDSP
X	LDA	FUNC
X	CMP	#'H'
X	BNE	SAVLO
X	LDA	OPNDH-1,X
X	STA	OPNDL-1,X
XSAVLO	LDA	#0
X	STA	OPNDH-1,X
X	BEQ	UNEXIT
X;
XLOWFUN	LDA	#'L'
X	BNE	LFXIT
X;
XHIGHFUN	LDA	#'H'
XLFXIT	STA	FUNC
X	LDA	(TEXTP),Y
X	CMP	#'['
X	BNE	NOBMP
X	INY
XNOBMP	LDA	#'@'
X	BNE	PUSHOP
X;
XCKPAREN	LDA	(TEXTP),Y
X	INY
X	CMP	#'-'		;UNARY MINUS?
X	BEQ	PSHCOM
X	CMP	#'['
X	BEQ	PUSHOP
XRETERR	SEC
X	RTS			;ELSE, EXPRESSION ERROR!
X;
XPSHCOM	LDA	#'!'		;UNARY MINUS ON STACK
XPUSHOP	LDX	OPRSP
X	STA	OPERS,X		;PUT NEW OPERATOR ON STACK
X	INC	OPRSP
X	JMP	EVAL
X;
XUNEST	LDX	OPRSP
X	BEQ	RETERR
X	LDA	OPERS-1,X
X	CMP	#'['
X	BEQ	UNEXIT
X	CMP	#'@'
X	BEQ	DOFUN
X	JSR	DOOP
X	BCC	UNEST
X	RTS
X;
XUNEXIT	DEC	OPRSP
X	JMP	GETOPR
X;
XEVALAB	LDA	#0
X	STA	OPRSP
X	STA	OPDSP		;CLEAR EVALUATION STACKS
X	STA	FWDREF		;AND FORWARD REF. FLAG
X	JSR	NXTFLD
XEVAL	STY	TXTPTR
X	JSR	GETSYM
X	JSR	HTEST
X	BCS	HIGHFUN
X	JSR	LTEST
X	BCS	LOWFUN
X	LDY	TXTPTR		;NOT A SYMBOLIC FUNCTION
X	JSR	PRIMRY
X	BCS	CKPAREN
X	LDX	OPDSP
X	LDA	VALUE
X	STA	OPNDL,X
X	LDA	VALUE+1
X	STA	OPNDH,X
X	INC	OPDSP
X;
XGETOPR	LDA	(TEXTP),Y
X	INY
X	CMP	#'-'
X	BEQ	ADDSUB
X	CMP	#'+'
X	BEQ	ADDSUB
X	CMP	#'*'
X	BEQ	MULDIV
X	CMP	#'/'
X	BEQ	MULDIV
X	CMP	#'%'
X	BEQ	MULDIV
X	CMP	#'&'
X	BEQ	ANDOP
X	CMP	#'|'
X	BEQ	OROP
X	CMP	#']'
X	BEQ	UNEST
XWRPUP	LDX	OPRSP
X	BEQ	EVDON
X	LDA	OPERS-1,X
X	CMP	#'['
X	BEQ	EVDON
X	JSR	DOOP
X	BCC	WRPUP
X	RTS
X;
XEVDON	CLC
X	DEC	OPDSP
X	BEQ	EVNXIT
X	SEC
XEVNXIT	LDA	OPNDL
X	STA	VALUE
X	LDA	OPNDH
X	STA	VALUE+1
X	RTS
X;
XADDSUB	LDX	OPRSP
X	STA	OPERS,X		;IF WE NEED TO DO IT NOW
X	BEQ	EXIT
X	LDA	OPERS-1,X
X	CMP	#'['
X	BEQ	EXIT
X	CMP	#'@'
X	BEQ	EXIT
X	JSR	DOOP
X	BCC	ADDSUB
X	RTS
X;
XANDOP	LDX	OPRSP
X	STA	OPERS,X
X	BEQ	EXIT
X	LDA	OPERS-1,X
X	CMP	#'!'
X	BNE	EXIT
X	JSR	DOOP
X	BCC	ANDOP
X	RTS
X;
XEXIT	INC	OPRSP
X	JMP	EVAL
X;
XMULDIV	LDX	OPRSP
X	STA	OPERS,X
X	BEQ	EXIT
X	LDA	OPERS-1,X
X	CMP	#'+'
X	BEQ	EXIT
X	CMP	#'-'
X	BEQ	EXIT
X	CMP	#'['
X	BEQ	EXIT
X	CMP	#'@'
X	BEQ	EXIT
X	JSR	DOOP
X	BCC	MULDIV
X	RTS
X;
XOROP	LDX	OPRSP
X	STA	OPERS,X
X	BEQ	EXIT
X	LDA	OPERS-1,X
X	CMP	#'!'
X	BEQ	ORDOOP
X	CMP	#'&'
X	BNE	EXIT
XORDOOP	JSR	DOOP
X	BCC	OROP
X	RTS
X;
XEVLSYM	STY	TXTPTR
X	JSR	FIND		;GET SYMBOL FROM TABLE
X	BCS	UNDFSM		;IF SYMBOL UNDEFINED
X;
X	JSR	GETVAL
X;
X	LDA	SFLGS
X	AND	#$08		;PROPOGATE FORWARD REFERENCES
X	ORA	FWDREF		;NOTE THAT THE FLAG IS IN BIT 3 NOW
X	STA	FWDREF		;(BIT 2 IN THE SYMBOL TABLE)
X;
X	BIT	SFLGS
X	BMI	UNDFSM
X	LDA	SVAL
X	STA	VALUE
X	LDA	SVAL+1
X	STA	VALUE+1
XEVSXIT	LDY	TXTPTR
X	CLC
X	RTS
X;
XUNDFSM	LDA	#'U'
X	STA	ADRERR
X	BNE	EVSXIT
X;
X;  EVALUATE AN OPERAND EXPRESSION
X;
XPRIMRY	LDA	#0
X	STA	VALUE
X	STA	VALUE+1
X	STA	SYMBOL
X	JSR	GETSYM
X	LDA	SYMBOL
X	BNE	EVLSYM		;IF A SYMBOL WAS FOUND
X	LDA	(TEXTP),Y
X	CMP	#'$'
X	BNE	NOTHEX
XHEXCVL	INY
X	LDA	(TEXTP),Y
X	CMP	#'f'+1
X	BCS	ENDEXP
X	CMP	#'a'
X	BCC	NLCHD
X	SBC	#'a'-10
X	BCS	HEXDGT
X;
XNLCHD	CMP	#'F'+1
X	BCS	ENDEXP
X	CMP	#'A'
X	BCC	NUCHD
X	SBC	#'A'-10
X	BCS	HEXDGT
X;
XNUCHD	CMP	#'9'+1
X	BCS	ENDEXP
X	CMP	#'0'
X	BCC	ENDEXP
X	SBC	#'0'
XHEXDGT	ASL	VALUE
X	ROL	VALUE+1
X	ASL	VALUE
X	ROL	VALUE+1
X	ASL	VALUE
X	ROL	VALUE+1
X	ASL	VALUE
X	ROL	VALUE+1
X	ORA	VALUE
X	STA	VALUE
X	JMP	HEXCVL
X;
XENDEXP	CLC
X	RTS
X;
XNOPRIM	SEC
X	RTS
X;
XNOTHEX	CMP	#'%'
X	BEQ	ISBIN
X	CMP	#'@'
X	BEQ	ISOCT
X	CMP	#'*'
X	BEQ	ISPC
X	CMP	#$27	;QUOTED CHARACTERS
X	BEQ	ISQSTR
X	CMP	#'9'+1
X	BCS	NOPRIM
X	CMP	#'0'
X	BCC	NOPRIM
XDECCVL	CMP	#'9'+1
X	BCS	ENDEXP
X	CMP	#'0'
X	BCC	ENDEXP
X	SBC	#'0'
X	PHA
X	ASL	VALUE
X	ROL	VALUE+1
X	LDA	VALUE+1
X	STA	TEMP
X	LDA	VALUE
X	ASL	A
X	ROL	TEMP
X	ASL	A
X	ROL	TEMP
X	CLC
X	ADC	VALUE
X	STA	VALUE
X	LDA	TEMP
X	ADC	VALUE+1
X	STA	VALUE+1
X	CLC
X	PLA
X	ADC	VALUE
X	STA	VALUE
X	LDA	#0
X	ADC	VALUE+1
X	STA	VALUE+1
X	INY
X	LDA	(TEXTP),Y
X	JMP	DECCVL
X;
XISBIN	INY
X	LDA	(TEXTP),Y
X	CMP	#'0'
X	BCC	ENDEXP
X	CMP	#'1'
X	BCC	SHFTBN
X	BNE	ENDEXP
XSHFTBN	ROL	VALUE
X	ROL	VALUE+1
X	JMP	ISBIN
X;
XISOCT	INY
X	LDA	(TEXTP),Y
X	CMP	#'7'+1
XENDOCT	BCS	ENDEXP
X	CMP	#'0'
XND2OCT	BCC	ENDEXP
X	SBC	#'0'
X	ASL	VALUE
X	ROL	VALUE+1
X	ASL	VALUE
X	ROL	VALUE+1
X	ASL	VALUE
X	ROL	VALUE+1
X	ORA	VALUE
X	STA	VALUE
X	JMP	ISOCT
X;
XISPC	INY
X	LDA	PC
X	STA	VALUE
X	LDA	PC+1
X	STA	VALUE+1
X	BCS	ENDOCT
X;
XISQSTR	INY
X	LDA	(TEXTP),Y
X	INY
X	CMP	#$27
X	BEQ	ENDOCT
X	CMP	#EOL
X	BEQ	STRERR
X	STA	VALUE
X	LDA	(TEXTP),Y
X	INY
X	CMP	#$27
X	BEQ	ENDOCT
X	CMP	#EOL
X	BEQ	STRERR
X	STA	VALUE+1
X	LDA	(TEXTP),Y
X	INY
X	CMP	#$27
X	BEQ	ENDOCT
XSTRERR	LDA	#'S'
X	STA	ADRERR
X	JMP	ENDEXP
X;
XGETSYM	LDX	#0
XGSYMLP	LDA	(TEXTP),Y
XGSLP1	CMP	#'A'
X	BCC	ENDOPC
X	CMP	#'Z'+1
X	BCC	STCHAR
X	CMP	#'_'		;ALLOW UNDERSCORES IN SYMBOLS
X	BEQ	STCHAR
X	CMP	#'a'
X	BCC	ENDOPC
X	CMP	#'z'+1
X	BCS	ENDOPC
XSTCHAR	INY
X	CPX	#SYMSIZ		;ALLOW 8 CHAR SYMBOLS
X	BCS	GSYMLP
X	STA	SYMBOL,X
X	INX
X	LDA	(TEXTP),Y
X	CMP	#'9'+1
X	BCS	GSLP1
X	CMP	#'0'
X	BCS	STCHAR
X;
XENDOPC	LDA	#0
X	INX
X	STA	SYMBOL-1,X
X	RTS
X;
XSKPTXT	LDA	(TEXTP),Y
X	CMP	#EOL
X	BEQ	SKXIT
X	CMP	#' '
X	BEQ	SKXIT
X	CMP	#TAB
X	BNE	SKPTXT
X
XSKIPF	INY
XNXTFLD	LDA	(TEXTP),Y
X	CMP	#' '
X	BEQ	SKIPF
X	CMP	#TAB
X	BEQ	SKIPF
XSKXIT	RTS
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > asm4.asm
X;
X;  SYMBOLS.ASM
X;
X;  SYMBOL TABLE FORMAT:
X;
X; BYTE 0: FLAGS AND BITS 8 AND 0 OF VALUE
X;         BIT 7 -- ALWAYS 1
X;         BIT 6 -- UNDEFINED
X;         BIT 5 -- GLOBAL
X;         BIT 4 -- VALUE BIT 8
X;         BIT 3 -- VALUE BIT 0
X;	  BIT 2 -- FORWARD REFERENCE FLAG
X;         BITS 1-0 -- ORIGIN NUMBER
X;
X; BYTE 1: BITS 7-1 OF VALUE
X;
X; BYTE 2: BITS 15-9 OF VALUE
X;
X;  PRINT THE SYMBOL TABLE
X;
XPRTABE	RTS
X;
XPRSTAB	LDA	#LOW[SYMTAB]
X	STA	TABPTR
X	LDA	#HIGH[SYMTAB]
X	STA	TABPTR+1
XPRTALN	JSR	CLEAR
X	LDA	#0
XPRTABL	STA	TXTPTR
X	LDA	TABPTR+1
X	LDX	TABPTR
X	CPX	ENDSTAB
X	SBC	ENDSTAB+1
X	BCS	PRTABE
X	JSR	GETVAL
X	LDX	TXTPTR
X	LDA	SVAL+1
X	JSR	PRHEX
X	LDA	SVAL
X	JSR	PRHEX
X	INX
X	BIT	SFLGS
X	BPL	SYMDFD
X	LDA	#'U'
X	STA	PRBUF,X
XSYMDFD	INX
X	LDA	#'L'
X	BVC	SYMLCL
X	LDA	#'E'
XSYMLCL	STA	PRBUF,X
X	LDA	#' '
X	LDY	#2
XSYMNLP	INX
X	INY
X	STA	PRBUF,X
X	LDA	(TABPTR),Y
X	BPL	SYMNLP
X	STX	TXTPTR
X	CLC
X	TYA
X	ADC	TABPTR
X	STA	TABPTR
X	LDA	#0
X	ADC	TABPTR+1
X	STA	TABPTR+1
X	LDA	#0
XNXTCOL	CLC
X	ADC	#CWIDTH
X	CMP	TXTPTR
X	BCC	NXTCOL
X	CMP	#PRTLEN-CWIDTH
X	BCC	PRTABL
X	LDA	#EOL
X	STA	PRBUF+1,X
X	JSR	LIST
X	JMP	PRTALN
X;
X;  ADD A SYMBOL AND VALUE TO THE SYMBOL TABLE
X;
XADDSYM	LDA	LABEL
X	BEQ	NOSYM
X	LDX	VALUE
X	LDY	VALUE+1
X	LDA	ISVAL
X	BNE	USEVAL
X	LDX	PC
X	LDY	PC+1
XUSEVAL	STX	SVAL
X	STY	SVAL+1
X;
X	LDX	#2
XFESYM	INX
X	LDA	LABEL-3,X
X	STA	SYMBOL-3,X
X	BNE	FESYM
X	STX	SLEN
X	JSR	FIND
X	BCC	OLDSYM
X	LDA	ENDSTAB+1
X	STA	TEMP+1
X	LDY	ENDSTAB		;POINT TO END OF SYMBOL TABLE
XCPFS1	STY	TEMP
X	LDY	#0
X	LDA	(TEMP),Y	;AND MAKE ROOM FOR
X	LDY	SLEN		;NEW ENTRY OF SLEN BYTES
X	STA	(TEMP),Y
X	LDY	TEMP
X	BNE	DECFS1
X	DEC	TEMP+1
XDECFS1	DEY
XFSNDCK	LDA	TEMP+1		;START OF NEW SYMBOL?
X	CPY	TABPTR
X	SBC	TABPTR+1
X	BCS	CPFS1		;NO, MOVE ANOTHER BYTE
X;
X	LDA	SLEN
X	TAY
X	ADC	ENDSTAB		;POINT TO END OF
X	STA	ENDSTAB		;LONGER SYMBOL TABLE
X	LDA	#0
X	ADC	ENDSTAB+1
X	STA	ENDSTAB+1
XNEWTXT	DEY
X	LDA	SYMBOL-3,Y
X	STA	(TABPTR),Y
X	CPY	#3
X	BNE	NEWTXT
X;
X;  SAVE VALUE AND FLAGS IN SYMBOL TABLE ENTRY
X;
XPUTVAL	LDA	SVAL+1
X	LSR	A
X	PHP
X	LDY	#2
X	STA	(TABPTR),Y
X	LDA	SVAL
X	LSR	A
X	DEY
X	STA	(TABPTR),Y
X	DEY
X	TYA
X	ROR	A
X	PLP
X	ROR	A
X	LSR	A
X	LSR	A
X	ORA	SFLGS
X	SEC
X	ROR	A
X	STA	(TABPTR),Y
XNOSYM	RTS
X;
X;  CLEAR THE FORWARD REFERENCE FLAG
X;
XOLDSYM	LDY	#0
X	LDA	(TABPTR),Y
X	AND	#$FB		;CLEAR BIT 2 (FORWARD REF. FLAG)
X	CMP	(TABPTR),Y
X	BEQ	DUPSYM
X	STA	(TABPTR),Y
X	RTS
X;
XDUPSYM	LDA	#'D'		;ERROR ON SECOND DEFINITION
X	STA	ADRERR
X	RTS
X;
X;  RECOVER VALUE AND FLAGS FROM SYMBOL TABLE ENTRY
X;
XGETVAL	LDY	#0
X	LDA	(TABPTR),Y	;GET FLAGS
X	ASL	A
X	PHA
X	AND	#$CE		;EXTRACT FLAGS
X	STA	SFLGS		;AND SAVE THEM
X	PLA
X	ASL	A
X	ASL	A
X	ASL	A		;SAVE BIT 8 IN CY
X	PHP
X	ASL	A		;PUT BIT 0 INTO CY
X	INY
X	LDA	(TABPTR),Y
X	ROL	A		;MERGE BITS 0 AND 1-7
X	STA	SVAL
X	PLP
X	INY
X	LDA	(TABPTR),Y
X	ROL	A		;MERGE BITS 8 AND 9-15
X	STA	SVAL+1
XSYMFND	RTS
X;
X;  FIND LOCATION FOR A SYMBOL IN THE TABLE
X;
XFIND	LDX	ENDSTAB
X	STX	HIGHP
X	LDA	ENDSTAB+1
X	STA	HIGHP+1
X	LDX	#LOW[SYMTAB]
X	STX	LOWP
X	LDA	#HIGH[SYMTAB]
X	STA	LOWP+1
X	STA	TABPTR+1
X	STX	TABPTR
X;
X	CPX	HIGHP
X	SBC	HIGHP+1
X	BCS	SNFND
X;
XHALVE	SEC
X	LDA	HIGHP
X	ADC	LOWP
X	STA	TABPTR
X	LDA	HIGHP+1
X	ADC	LOWP+1
X	ROR	A
X	ROR	TABPTR
X	STA	TABPTR+1
X	LDY	#0
X	LDA	(TABPTR),Y
X	BMI	GSTRT		;FOUND START OF A SYMBOL
XNOT1ST	LDA	TABPTR
X	BNE	FBKUP
X	DEC	TABPTR+1
XFBKUP	DEC	TABPTR
X	LDA	(TABPTR),Y
X	BPL	NOT1ST
X;
XGSTRT	LDY	#3
XFCHRLP	LDA	(TABPTR),Y
X	BMI	MTCHOK
X	CMP	SYMBOL-3,Y		;MATCH?
X	BCC	FADVC1		;TABLE ENT. < SYMBOL
X	BNE	FBKUP1		;TABLE ENT. > SYMBOL
X	INY
X	BCS	FCHRLP
X;
XMTCHOK	CLC
X	LDA	SYMBOL-3,Y
X	BEQ	SYMFND		;SYMBOL FOUND (CY=0)
X	BNE	FADVC2
X;
XFADVC1	INY
XFADVC2	LDA	(TABPTR),Y
X	BPL	FADVC1
X	CLC
X	TYA
X	ADC	TABPTR
X	LDY	TABPTR+1
X	BCC	FADVNI
X	INY
XFADVNI	CPY	HIGHP+1
X	BCC	FADVC3
X	CMP	HIGHP
X	BCC	FADVC3
X	STA	TABPTR		;SYMBOL NOT FOUND (CY=1)
X	STY	TABPTR+1
XSNFND	RTS
X;
XFADVC3	STY	LOWP+1
X	STA	LOWP
X	BCC	HALVE
X;
XFBKUP1	LDA	LOWP
X	CMP	TABPTR
X	LDA	LOWP+1
X	SBC	TABPTR+1
X	BCS	SNFND		;SYMBOL NOT FOUND (CY=1)
X	LDA	TABPTR
X	STA	HIGHP
X	LDA	TABPTR+1
X	STA	HIGHP+1
X	BCC	HALVE
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > asm5.asm
X;
X;  PRINT.ASM
X;
X;  PRINT THE GENERATED CODE/SOURCE LINE
X;
XPRINT	JSR	CLEAR
X;
X	LDX	#2
X	LDA	ISVAL
X	BMI	NOADDR
X	BNE	VALADR
X;
X	LDA	PC+1
X	JSR	PRHEX
X	LDA	PC
X	JMP	LSTHLF
X;
XVALADR	LDA	VALUE+1
X	JSR	PRHEX
X	LDA	VALUE
XLSTHLF	JSR	PRHEX
X;
XNOADDR	LDA	LEN
X	STA	TEMP
X	BEQ	NODATA
X	LDA	MODE
X	BMI	NODATA
X	JSR	PROBJT	;PRINT 1 TO 6 BYTES OF OBJECT CODE
XNODATA	LDX	#20
X	JSR	PRSRC
X;
X	LDA	ADRERR
X	STA	PRBUF
X	CMP	#' '
X	BEQ	PRINTQ
X;
X	LDX	#LOGDEV
X	JSR	DOPRINT		;LOG ERRORS TO THE SCREEN
X;
X	INC	ERRCNT
X	BNE	PRINTQ		;AND COUNT THEM
X	INC	ERRCNT+1
X;
XPRINTQ	LDA	ICMD-2+PRUNIT
X	BMI	LOKXIT
X;
XEXCODE	JSR	LIST
X	BMI	LINXIT
X	LDA	MODE
X	BMI	LOKXIT
X	LDA	TEMP
X	BEQ	LINXIT
X	JSR	CLEAR
X	JSR	PROBJT
X	LDA	#EOL
X	STA	PRBUF,X
X	JMP	EXCODE
X;
XLOKXIT	LDA	#0
XLINXIT	RTS
X;
X;  PRINT A FORMATTED LINE TO LISTING DEVICE
X;
XLIST	LDA	CURLINE
X	INC	CURLINE
X	CMP	LPP		;NUMBER OF LINES/PAGE
X	BCC	NONEWP
X	LDA	#' '
X	STA	PAGE+3		;BLANK OUT PAGE NO.
X	STA	PAGE+2
X	STA	PAGE+1
X	LDA	#0
X	STA	CURLINE		;START OF NEW PAGE
X	INC	CURPAGE
X	BNE	PAGEOK
X	INC	CURPAGE+1
XPAGEOK	LDA	CURPAGE
X	STA	FR0
X	LDA	CURPAGE+1
X	STA	FR0+1
X	JSR	IFP
X	JSR	FASCII		;CONVERT TO ASCII STRING
X	LDY	#$FF
XPGCPLP	INY
X	LDA	(INBUFF),Y
X	STA	PAGE,Y		;COPY TO HEADING BUFFER
X	BPL	PGCPLP
X	AND	#$7F
X	STA	PAGE,Y
X;
X	LDX	#PRUNIT
X	LDA	#11		;PRINT MULTIPLE LINES
X	STA	ICMD,X
X	LDA	#LOW[TTLINE]
X	STA	IBUF,X
X	LDA	#HIGH[TTLINE]
X	STA	IBUF+1,X
X	LDA	TTLLEN
X	STA	ILEN,X
X	LDA	#0
X	STA	ILEN+1
X	JSR	CIOV		;WRITE TITLE LINE
X;
XNONEWP	LDX	#PRUNIT
XDOPRINT	LDA	#LOW[PRBUF]
X	STA	IBUF,X
X	LDA	#HIGH[PRBUF]
X	STA	IBUF+1,X
X;
X	LDA	#9
X	STA	ICMD,X		;PRINT A LINE ENDING WITH EOL
X	LDA	#81
X	STA	ILEN,X
X	LDA	#0
X	STA	ILEN+1,X
X	JMP	CIOV
X;
X;  CONVERT NUMBER TO HEX IN PRINT LINE
X;
XPRHEX	PHA
X	LSR	A
X	LSR	A
X	LSR	A
X	LSR	A
X	SED
X	SEC
X	SBC	#9+1
X	ADC	#'9'+1
X	STA	PRBUF,X
X	INX
X	PLA
X	AND	#$0F
X	SEC
X	SBC	#9+1
X	ADC	#'9'+1
X	CLD
X	STA	PRBUF,X
X	INX
X	RTS
X;
X;  CLEAR THE PRINT LINE
X;
XCLEAR	LDX	#0
XCLLP	LDA	#' '
X	STA	PRBUF,X
X	INX
X	CPX	#80
X	BCC	CLLP
X	LDA	#EOL
X	STA	PRBUF,X
X	RTS
X;
X;  PRINT SOURCE LINE
X;
XPRSRC	LDY	#0
XPRSCP	LDA	(TEXTP),Y
X	CMP	#TAB
X	BNE	STINBF
X;
X	TXA
X	LDX	#NTABS
XNXTTAB	DEX
X	CMP	TABTAB,X
X	BCC	NXTTAB
X	LDA	TABTAB+1,X
X	TAX
X	BCS	PRBMPY
XSTINBF	STA	PRBUF,X
X	CMP	#EOL
X	BEQ	GOTEOL
X	INX
XPRBMPY	INY
X	CPX	#80
X	BCC	PRSCP
XGOTEOL	RTS
X;
XTABTAB	DB	0,2,7,20,29
X	DB	35,43,51,59,67
X	DB	72,73,74,75,76
X	DB	77,78,79
XNTABS	=	*-TABTAB
X;
X;  PRINT OUT A CHUNK OF OBJECT CODE
X;
XPROBJT	LDX	#7
X	LDY	#0
X	STY	TEMP+1
XOBJPRL	LDA	OPCODE,Y
X	JSR	PRHEX
X	DEC	TEMP
X	BEQ	HEXIT
X	INC	TEMP+1
X	LDY	TEMP+1
X	CPY	#6
X	BNE	OBJPRL
X;
XLDOUTB	LDA	DATBUF-1+6,Y
X	STA	OPCODE-1,Y
X	DEY
X	BNE	LDOUTB
X;
XPRNX6	LDA	DATBUF+6,Y
X	STA	DATBUF,Y
X	INY
X	CPY	TEMP
X	BCC	PRNX6
X;
XHEXIT	RTS
X;
X;  OBJECT.OBJ
X;
X;  PUT CONTENTS OF THE DATA BUFFER INTO THE OBJECT FILE
X;
XDATOBJ	LDY	PASSNO
X	BNE	NOOBJG
X	JSR	OBJSET
XDOLOOP	LDA	DATBUF,X
X	JSR	WRTBYTE		;PUT EACH BYTE INTO THE BUFFER
X	INX
X	CPX	LEN		;DONE?
X	BNE	DOLOOP
X	STY	OBJPTR
XNOOBJG	RTS
X;
X;  PUT THE CONTENTS OF THE MACHINE CODE BUFFER INTO THE OBJECT FILE
X;
XCODOBJ	LDY	PASSNO
X	BNE	NOOBJG
X	JSR	OBJSET
XCODELP	LDA	OPCODE,X
X	JSR	WRTBYTE
X	INX
X	CPX	LEN
X	BNE	CODELP
X	STY	OBJPTR
X	RTS
X;
X;  INSURE THE PC AGREES WITH THE LOCATION BEING LOADED
X;
XOBJSET	LDY	OBJPTR
X	BEQ	NEWSET		;IF NOTHING IN BUFFER
X	TYA
X	CLC
X	ADC	OBJBUF
X	LDX	OBJBUF+1	;ELSE COMPARE BUF ADDR AND PC
X	BCC	NOBX
X	INX
XNOBX	CMP	PC
X	BNE	NOTSET
X	CPX	PC+1
X	BEQ	SETXIT		;IF NEXT BYTE ADDR MATCHES PC
XNOTSET	JSR	WRTOBJ
X;
XNEWSET	LDA	PC
X	STA	OBJBUF
X	LDA	PC+1
X	STA	OBJBUF+1
XSETXIT	LDX	#0
XWRTXIT	RTS
X;
X;  WRITE A BYTE TO THE OBJECT FILE BUFFER
X;
XWRTBYTE	STA	OBJBUF+4,Y
X	INY
X	BNE	WRTXIT		;IF NOT THE END OF THE BUFFER
X;
X;  WRITE A BLOCK OF OBJECT TEXT IN OBJBUF
X;
XWRTOBJ	STX	LOWP+1
X	DEY
X	TYA
X	PHA
X	LDX	OBJBUF+1
X	CLC
X	ADC	OBJBUF
X	STA	OBJBUF+2
X	BCC	WRTEQL
X	INX
XWRTEQL	STX	OBJBUF+3
X	LDX	#OBUNIT
X	SEC
X	PLA
X	ADC	#4
X	STA	ILEN,X
X	LDA	#1
X	BCS	ZEROPB
X	LDA	#0
XZEROPB	STA	ILEN+1,X
X	JSR	CIOV
X	BMI	OBJERR
X	LDA	OBJBUF+3
X	STA	OBJBUF+1
X	LDY	OBJBUF+2
X	INY
X	STY	OBJBUF
X	BNE	WRTOUT
X	INC	OBJBUF+1
XWRTOUT	LDX	LOWP+1
X	LDY	#0
X	RTS
X;
XOBJERR	BRK
X	NOP
X	JMP	($000A)
X;
X;  INPUT.ASM
X;
X;  PROMPT FOR COMMAND INPUT
X;
XPROMPT	PLA
X	STA	LOWP
X	PLA
X	STA	LOWP+1
XPRETRY	LDA	#11
X	STA	ICMD
X	LDY	#1
X	LDX	#0
X	STX	ILEN
X	STX	ILEN+1
XPMTLP	LDA	(LOWP),Y
X	BEQ	PMTEND
X	INY
X	STY	TEMP
X	JSR	CIOV
X	LDY	TEMP
X	BNE	PMTLP
X;
XPMTEND	INY
X	LDA	(LOWP),Y
X	STA	HIGHP
X	INY
X	LDA	(LOWP),Y
X	STA	HIGHP+1
X	STY	TEMP
X	LDA	#5
X	STA	ICMD
X	LDA	#FNSIZE-2
X	STA	ILEN
X	LDA	#0
X	STA	ILEN+1
X	LDA	#LOW[FNBUF]
X	STA	IBUF
X	LDA	#HIGH[FNBUF]
X	STA	IBUF+1
X	JSR	CIOV
X	BMI	PRETRY
X	JSR	BLDFNB
X	LDY	#$FF
XCPFNLP	INY
X	LDA	FNBUF,Y
X	STA	(HIGHP),Y
X	BPL	CPFNLP
X	CLC
X	LDA	TEMP
X	ADC	LOWP
X	STA	TEMP
X	LDA	LOWP+1
X	ADC	#0
X	PHA
X	LDA	TEMP
X	PHA
X	RTS
X;
XBLDFNB	LDX	#0
X	LDY	#0
X	STX	TEMP+1
X	LDA	FNBUF
X	BPL	BLDFNE
X	DEY
XKEEPNM	INY
X	LDA	INF,Y
X	STA	FNBUF,Y
X	BMI	NOTDFLT
X	CMP	#'.'
X	BNE	KEEPNM
XNOTDFLT	LDA	#EOL
X	STA	FNBUF,Y
X	LDY	#0
X	BEQ	BLDFNE
X;
XBLDFNL	CMP	#':'
X	BNE	BLDFCP
X	DEX
XBLDFCP	CMP	#'.'
X	BNE	BLDFND
X	DEC	TEMP+1
XBLDFND	INY
XBLDFNE	LDA	FNBUF,Y
X	BPL	BLDFNL
X	LDA	TEMP+1
X	BNE	GOTEXT
X	LDA	#'.'
X	STA	FNBUF,Y
X	INY
X	LDA	EXTTXT
X	STA	FNBUF,Y
X	INY
X	LDA	EXTTXT+1
X	STA	FNBUF,Y
X	INY
X	LDA	EXTTXT+2
X	STA	FNBUF,Y
X	INY
X	LDA	#EOL
X	STA	FNBUF,Y
XGOTEXT	TXA
X	BNE	GOTPFX
XSHFTBF	LDA	FNBUF,Y
X	STA	FNBUF+2,Y
X	DEY
X	BPL	SHFTBF
X	LDA	#'D'
X	STA	FNBUF
X	LDA	#':'
X	STA	FNBUF+1
XGOTPFX	RTS
X;
X;  CLOSE A FILE
X;
XCLOSEF	LDA	#12
X	STA	ICMD,X
X	JMP	CIOV
X;
X;  OPEN A FILE FOR INPUT
X;
XOPENIN	STY	TEMP
X	PHA
X	JSR	CLOSEF
X	LDA	#4
XDOPEN	STA	IAUX,X
X	PLA
X	STA	IBUF,X
X	LDA	TEMP
X	STA	IBUF+1,X
X	LDA	#3
X	STA	ICMD,X
X	JMP	CIOV		;OPEN INPUT FILE
X;
X;  OPEN LIST OR OBJECT FILE
X;
XOPNOUT	STY	TEMP
X	PHA
X	LDA	#12
X	STA	ICMD,X
X	JSR	CIOV
X	LDA	#8
X	BNE	DOPEN
X;
X;  READ A LINE INTO THE TEXT BUFFER
X;  AND INITIALIZE THE TEXT POINTERS
X;
XREADLN	LDX	FILE		;READ SELECTED FILE
X	LDA	#5
X	STA	ICMD,X
X	LDA	#LINLEN
X	STA	ILEN,X
X	LDA	#0
X	STA	ILEN+1,X
X	STA	TXTPTR
X	LDA	#LOW[TEXTBF]
X	STA	IBUF,X
X	STA	TEXTP
X	LDA	#HIGH[TEXTBF]
X	STA	IBUF+1,X
X	STA	TEXTP+1
X	JSR	CIOV
X	LDA	ILEN,X
X	TAX
X	LDA	#EOL
X	STA	TEXTBF,X
X	TYA
X	RTS
SHAR_EOF
#	End of shell archive
exit 0
===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm@killer.dallas.tx.us

chasm@killer.DALLAS.TX.US (Charles Marslett) (06/24/89)

#	This is a shell archive (Part 2 of 3)
#
#	It contains the documentation (what little there is)
#	for the A65 (NON-macro) assembler.
#
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:   Shell Archiver
#	Run the following text with /bin/sh to create:
#	a65.doc
# This archive created: Fri Jun 23 20:31:09 1989
sed 's/^X//' << \SHAR_EOF > a65.doc
X
X
X                    A65 (A very simple 6502 assembler)
X
X                                   by
X                             Charles Marslett
X                             Wordmark Systems
X
X
XThe A65 assembler is modeled after the Atari MACRO Assembler (AMAC) that
Xwas distributed by APX along with the MEDIT editor and the DDT debugger.
XThe most significant thing about it is that the source files cannot contain
Xline numbers (so editors that use line numbers must be able to write an
Xunnumbered output file).  A second characteristic is that it is a disk-to-
Xdisk assembler (the source must be in a disk (or cassette) file and the
Xobject cannot be inserted directly into memory.
X
XThe assembler is run from the DOS menu using the 'L' command, and prompts
Xyou for the source file name, the object file name and the listing file
Xname:  a RETURN in response to the object and listing prompts will cause
Xthe assembler to generate files on the same drive with extensions '.OBJ'
Xand '.LST' using the same file name as the source file.  If no '.' appears
Xin the source file name, '.ASM' is its assumed extension.  A listing can
Xbe printed directly by specifying 'P:' as the list file or dumped to the
Xscreen by specifying 'E:'.  A '-' disables the listing if you do not want
Xone.
X
XA start at implementing support for the 65C02 opcodes is in the code, but
Xwhat is there has not been tested very thouroughly and most of the opcodes
Xand addressing modes are not in place yet.  Otherwise, the machine
Xinstructions are as any other standard 6502 assembler would expect.
XExpressions can include +, -, * and / operators as well as HIGH[] and LOW[]
Xfunctions to extract the high and low bytes of 16-bit numbers.  Brackets,
X[ and ], may be used to group terms in an expression if necessary.  Symbols
Xmay have up to 11 characters, including upper and lower case letters,
Xunderscores and numbers.  Symbols must start with an underscore or letter,
Xand case is significant except for the predefined assembler opcodes and the
Xregister names A, X and Y.
X
XThe machine opcodes recognized are:
X
X   ADC, AND, ASL, BCC, BCS, BEQ, BIT, BMI, BNE, BPL, BRA (65C02 only),
X   BRK, BVC, BVS, CLC, CLD, CLI, CLV, CMP, CPX, CPY, DEC, DEX, DEY,
X   EOR, INC, INX, INY, JMP, JSR, LDA, LDX, LDY, LSR, NOP, ORA, PHA,
X   PHP, PLA, PLP, ROL, ROR, RTI, RTS, SBC, SEC, SED, SEI, STA, STX,
X   STY, TAX, TAY, TSX, TXA, TXS, TYA
X
XThe assembler directives are:
X
XDB      defines a byte, in decimal (12), hex ($0C), octal (@14) or binary
X        (%00001100) and may also be a character string (enclosed in quotes)
XDC      defines a byte, as above, but with the high bit set (if defining a
X        string, only on the last byte of the string)
XDW      defines a word, low byte first, as if an indirect pointer
XDS      allocates a number of bytes without storing any data in them
X
XORG     sets the location counter to a fixed address
X*=      same as ORG
XEQU     defines a symbol to have a specific value
X=       same as EQU
X
X
X
X
X
X
X
X
XINCLUDE causes the file specified to be inserted at this point in the
X        assembly (can be nested if the DOS supports sufficient numbers
X        of files open at once -- the object, list and source files are
X        kept open at all times, and each level of nested includes requires
X        one more open file.  MYDOS and Atari DOS 2 allow 3 normally, which
X        does not allow a listing and include files.  If set to 5, the
X        assembler could generate a listing and handle 1 level of nested
X        includes)
XTITLE   specifies the first title line
XSUBTTL  allows entering a second title line
XPAGE    causes the assembler to go to the top of th next listing page
X
XEND     terminates the program and specifies INIT and RUN addresses
X
XLIST    a stub for future expansion
XMACRO   another stub (does nothing, not even generate an error)
XMEND    another stub
X
XOctal numbers, EQU, *=, and INIT and RUN addresses may have bugs in them --
Xgood luck.  Most of the rest has been debugged reasonably well.
X
XThe END statement can have the following forms:
X
X        END             no RUN or INIT vectors generated at all
X        END  ADDR       ADDR is the RUN entry point
X        END  ADDR,      ADDR is the INIT entry point (no RUN vector)
X        END  INIT,RUN   both vectors specified
X
X(This is what I call minimum documentation, I will add to it as questions
Xare asked)
X
X                        Charles Marslett
X                        8/21/85
X
X
X
XChanges since the first release:
X
XThe assembler now behaves more reasonably when a forward reference is
Xencountered (it used to just generate junque quietly!) -- forward references
Xare forced to 16-bit values if possible, otherwise A65 assumes you know what
Xyou are doing, and assumes it will be an 8-bit value when it is defined.
X
XThe assembler allows upper and lower case symbols, and it is case sensitive.
XIt still ignores case, however, when handling the directives and machine
Xopcodes as well as the register names ("A", "X" and "Y").  Underscores are
Xalso allow in symbols and are treated as letters (makes C people happy!).
XSymbols may also be up to 11 characters long (rather than 8 as before).
X
XThe initial load address is the HIMEM value from DOS (the lowest possible
Xload address) rather than a random value left over in memory.
X
XErrors are marked in the listing file (as before) but they are also echoed
Xto the screen, and the total number of errors (in HEX) are reported at the
Xend of the assembly.  If any errors occur, the automatic return to the DOS
Xprompt is delayed until the [RETURN] key is pressed to give you an opportunity
Xto note any (unexpected) errors reported.
X
X
X
X
X
X
X
X
X
XFinally, some errors that were previously accepted (and generated bad code)
Xare now caught and flagged as errors). These included multiply defined
Xsymbols and some invalid addressing modes.
X
X                        Charles Marslett
X                        6/16/89
SHAR_EOF
#	End of shell archive
exit 0
===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm@killer.dallas.tx.us

chasm@killer.DALLAS.TX.US (Charles Marslett) (06/24/89)

This is NOT a shell archive (Part 3 of 3).

Rather it is a uuencoded executable binary of the MYDOS A65 assembler.
Remove the lines up to and including the "cut here" line on the front and
remove any lines following the "end" or "size" line, depending on your
uudecoder's preferences, then feed the resulting UUENCODEd file into
UUDECODE (YAU, etc.) to generate a binary executable copy of A65.

----cut here-----cut here-----cut here-----cut here----#
begin 666 a65
V___2(]$DJ=F%M:+_AK'HAK.&M(:VJ3N%LJE!C0`VJ5.-`3:I38T"-B#G,U-O=7)C92!F:6QE!
V(#T@``,VJ4^-`#:I0HT!-JE*C0(V(.<S3V)J96-T(&9I;&4@/2``%C:I3(T`-JE3C0$VJ52-T
V`C8@YS-,:7-T(&9I;&4@/2``*3:I`86&J=N%A*DVA86B_X[;-JTK-LDM\`NB$*DIH#8@XS0P5
V;JE!C0`VJ5.-`3:I38T"-JD`A;>%N(6YC?XUC?\UK><"A:BMZ`*%J:(PAINI`Z`V(,<T,#JIB
V`(6/C<XV(/(T,#X@UB<@I3"EAM`0I9C)(-`%K5`#,`4@UC$P%*6WT"08I99EJ-(DT26%J*676
V9:F%J4RC)*:;(+\TBCCI$*K@,+#TD!'`B-#LIIL@OS3@,-`JQH80`TQI):#;J3:%@ZD`A8+PZ
V!<C0`N:#I8/$A.6%L!:Q@A#O"021@M#IBND0A9NEM]#$3*,DHB"I%J`V(.,T,"NI_XUZ(HU[;
V(JD"G4@#J0"=20.%FJD+G4(#J7J=1`.I(IU%`R!6Y#`#3'XD3-TDI;CP*:("J>"%J*D"A:FB&
V`J6Y\`RB!*W\-86)K?TUA8JM^C6%AZW[-86(3*XEI;GP)ZW\-86'K?TUA8BIXH6HJ0*%J:("-
VAI8@8C.B&;TJ)IT5(LK0]R#6,:2:\`,@GS.B(""_-*U0`S`5TB71)JD@C8`CJ9N-@2,@0#(@P
V-C"B$""_-*W^-86H#?\U\#>M_S6%J:(`AI:B&+U#)IT5(LK0]R#6,2#G,U!R97-S(%M21515;
V4DY=('1O(&-O;G1I;G5E``,V;`H`/#P\(%)53B])3DE4(%9%0U1/4E,@/CX^FSP\/"!%4E)/G
V4E,@3T-#55)2140@/CX^F[$"041#D0)!3D2"!$%33,@!0D-#V`%"0U/X`4)%49`)0DE4F`%"^
V34GH`4).18@!0E!,P`%"4D&``$)22Z@!0E9#N`%"5E.,`$-,0^P`0TQ$K`!#3$G<`$-,5N$"=
V0TU0\`-#4%C@`T-06?])1$+_2D1#X@=$14/2)M$GY@!$15C$`$1%6?]#1%/_2$17_T)%3D2AQ
V`D5/4O]!15%5_T5)3D-,541%\@=)3D/T`$E.6.0`24Y9H`I*35","TI34M$"3$1!T@Q,1%C0V
V#4Q$6?]$3$E35*($3%-2_TQ-04-23_]-345.1/8`3D]0@0)/4D'_0$]21_]+4$%'1:0`4$A!,
VA`!02%"T`%!,090`4$Q0D@123TRR!%)/4J``4E1)L`!25%/Q`E-"0YP`4T5#_`!3142\`%-%/
V2<$%4U1!P@935%C`"%-46?]'4U5"5%1,U@!405C4`%1!6?]&5$E43$7>`%136,8`5%A!S@!4H
V6%/,`%190?__K<XVT`2I@-(GT2B%E1A@H``@ZR^EG/`*H@RUFYW--LK0^"`J,*D`A96%E(66+
VA9>I((68("HPR3OPRJHPQ\D]T!&I[H6"J2:%@\@@*C"$F4QQ*"#K+R`J,(29J5N%@JDFA8.@.
V`,BQ@A#[&)AE@H6"J0!E@X6#H`&Q@C`8HO_(Z+6<\"/)>[`&R6&0`ND@T8+0T_#JJ4^%F*GJ%
VA8>%B(6)J0.%EJ``8+&"$+J@`+&"A8?(YI:Q@O`4I)G)0)`#3"8K(/LHA)F0!*E%A9BEARG\+
V&&6'&&64A8=,7C,@V2T8I8CEJ(6(T`+&B:6)Y:F%B<:(I8@*I8EI`/`*J2#%F)`$J5:%F!A@2
VL8#)*-`2TBC1*:DLA93((-DMB+&`R2G0<DSK*2#9+4Q[*:D!A9;0`R#9+:D(3.DI3/DIYI;)W
V`?"@YI;)"O#%R0OPY:J%E+&`X`30%LEA\`3)0=`.R+&`R3"0Q\E[L,.(D`C)(_!UR2CP(R#9P
V+8BEN@6)T`:EF,D@\+:Q@,DLT#,@"RK)6?!&R5CP*SA@QI;((-DMI8G0](BQ@,DL\'/)*=#IF
VR+&`R2S0?"`+*LE9T-NI$"RI#"RI'$SI*<E9T,RFE.`#\&3@#/!@X`;P7*D#A9:FE.`,\-^I'
V&-!&QI;((-DMI8GP$J6($`3FB?`*J2#%F)`$J5:%F*:4X`/P(N`&\![@"/`:X`SP%N#2*=$J%
V#?`2J0C0$"`+*LE8T*7(L8#)*=">J0"%E!A@J1'0^*D4T/2I!-#PQI:Q@,DLT/0@"RK)6/#IC
V3(,IR+&`R7NP!LEAD`+I(&!@8*!XJ2"9.S:(T/JDF6`@&RH@V2VEB*:6G3PVZ*6)G3PVZ(:66
VB+&`R,DL\.707R`;*JD"T`4@&RJI`22V\`2FAM!:JKTC*P6VA;;0"B`;*JF`,`4@&RJI`(64!
VH@"Q@,DG\#S@>+!+R9OP1R#9+:6(II:=/#;HB(:6I90=.S:=.S:Q@,C)+/#5)+8P+G!$H@:]@
V.S:5ALK0^(:4($DS&&#(L8#))_`1R9OP")T\-NC@>)#MJ5.%F(C(T-(JT2N]HCR].S:=(37*5
VT/>&EJF`A96EMBD#A;9@HCR].S:=:37*T/?PYB`;*J6Q\`2I_X6Q(!<KD`T@V2VEB=`3I8@P6
V#X6R&&`@*C#)F_#WR3OP\SA@08+&EBD_R0ZJO40K2+TV*TA@46=MG[&T1TXG;&7W&!DK*RLK.
V*RLJ*BHJ*BHJ*B#9+:6(IJB%J(:(I8FFJ86IAHGFE6`@V2WFE6"Q@,D[\"G)F_`E(-DMB+&`^
VR,DLT`ZEB(W\-:6)C?TUQKG0W:6(C?HUI8F-^S7&N,:W8"#9+:6(A9:EB867J?^%E&"&FTS0D
V)Z(`L8#)>[`-R2Z0"9VZ-LCHX!+0[:F;G;HV(%$TTBO1+!BEFVD0,`JJJ;J@-B#'-!#-J4F%$
VF-#)O;$AA8J]XR&%B[WB(4B]L"&JJ0"%B(6)J0B%DF@@&BS&DM#YJ0B%DHH@&BS&DM#Y8`:(B
V)HD*D`](&*6(98J%B*6)98N%B6A@O;$AA8J]XR&%B[VP(4B]XB&JJ0"%B(6)J?"%DF@DBS`)(
V!HHFB^:2T/1@2*62*0^%DFCDB]`"Q8H()H@FB2B0".6*2(KEBZIH1HMFBL:2$.)@&+VP(7VQ*
V(9VP(;WB(7WC(9WB(4SR+#B]L"']L2&=L"&]XB']XR&=XB%,\BPXJ0#]L2&=L2&I`/WC(9WCQ
V(4ST+*:OR2OPNLDM\,S)(?#>R2K2+-$M\"G)+_`KR27P+<DF\#K)?/!+T`ZFKZ6(G;`AI8F="
VXB'&K\:NIJZ]@2$88"#I*TSF+"`Q+$SF+"`Q+$B*IJ^=XB%HG;`A3/(LO;`A/;$AG;`AO>(A3
V/>,AG>(A3/(LO;`A';$AG;`AO>(A'>,AG>(A3/(LI9S)3-`RI9W)3]`LI9[P",E7T"2EG]`@2
V.&"EG,E(T!BEG<E)T!*EGO#NR4?0"J6?R4C0!*6@\.`88*:OI;#)2-`&O>,AG;$AJ0"=XR'P$
V0:E,T`*I2(6PL8#)6]`!R*E`T`^Q@,C)+?`&R5OP!#A@J2&FKIV`(>:N3.0MIJ[P[KU_(<E;Y
V\`K)0/"P(,(LD-(MT2[L8,:N3`@NJ0"%KH6OA;H@*C"$F2#K+R!>+;"I($0ML*"DF2#>+K"L+
VIJ^EB)VR(:6)G>0AYJ^Q@,C)+?`^R2OP.LDJ\&?)+_!CR27P7\DF\$+)?/!WR5WPE*:N\`V]I
V?R')6_`&(,(LD/!@&,:O\`$XK;(AA8BMY"&%B6"FKIV`(?`EO7\AR5OP'LE`\!H@PBR0Z6"FA
VKIV`(?`-O7\AR2'0!B#"+)#M8.:N3.0MIJZ=@"'P]+U_(<DK\.W)+?#IR5OPY<E`\.$@PBR0&
VX6"FKIV`(?#4O7\AR2'P!,DFT,D@PBR0Z6"$F2!-,;`;("\QI8\I"`6ZA;HDCS`,I8V%B*6.+
VTB[1+X6)I)D88*E5A9C0]JD`A8B%B86<(.LOI9S0R;&`R2300,BQ@,EGL#7)89`$Z5>P%LE'M
VL"G)09`$Z3>P"LDZL!W),)`9Z3`&B":)!H@FB0:()HD&B":)!8B%B$SS+AA@.&#))?!,R4#P*
V7,DJ\'C))_!_R3JPZLDPD.;).K#@R3"0W.DP2`:()HFEB862I8@*)I(*)I(898B%B*6298F%J
VB1AH98B%B*D`98F%B<BQ@$Q++\BQ@,DPD*7),9`"T)\FB":)3(,OR+&`R3BPD<DPD(WI,`:(<
V)HD&B":)!H@FB06(A8A,ER_(I:B%B*6IA8FPVLBQ@,C))_#2R9OP%H6(L8#2+]$PR,DG\,7)P
VF_`)A8FQ@,C))_"XJ5.%F$PO+Z(`L8#)09`BR5N0#,E?\`C)89`6R7NP$LC@"[#EE9SHL8#)6
V.K#>R3"P[JD`Z)6;8+&`R9OP$\D@\`_)?]#RR+&`R2#P^<E_\/5@8*G;A8*I-H6#(-,RJ0"%'
VF:6#IH+DA.6%L.8@+S&FF:6.(+8RI8T@MC+H)(\0!:E5G8`CZ*E,4`*I19V`(ZD@H`+HR)V`(
V([&"$/>&F1B898*%@JD`98.%@ZD`&&D4Q9F0^<D\D*FIFYV!(R!`,DP^,*W.-O!RIHBDB:65/
VT`2FJ*2IAHV$CJ("Z+W+-I69T/B&D"!-,9!2I86%DZ2$A-(PT3&2H`"QDJ20D9*DDM`"QI.(1
VI9/$@N6#L.>ED*AEA(6$J0!EA86%B+F9`)&"P`/0]J6.2@B@`I&"I8U*B)&"B)AJ*&I*2@6/T
V.&J1@F"@`+&"*?O1@O`#D8)@J42%F&"@`+&""D@ISH6/:`H*"@@*R+&"*H6-*,BQ@BJ%CF"F4
VA(:JI86%JZ+;AJRI-H6MA8.&@N2JY:NP5#BEJF6LA8*EJV6M:F:"A8.@`+&",`RE@M`"QH/&R
V@K&"$/2@`[&",`K9F0"0#=`LR+#R&+F9`/"MT`'(L8(0^QB898*D@Y`!R,2KD`G%JI`%A8*$*
V@V"$K86LD*6EK,6"I:WE@[#OI8*%JJ6#TC'1,H6KD)$@TS*B`J65,!;0"J6I(+8RI:A,\C&E:
VB2"V,J6((+8RI9:%DO`'I90P`R`<,Z(4(.4RI9B-@"/)(/`-H@`@FC+N_C70`^[_-:U0`S`;9
V($`R,!BEE#`2I9+P$"#3,B`<,ZF;G8`C3"(RJ0!@I;'FL<6RD%"I((UG-8UF-8UE-:D`A;'F7
VL]`"YK2ELX74I;2%U2"JV2#FV*#_R+'SF60U$/@I?YED-:(0J0N=0@.I(9U$`ZDUG44#I;6=3
V2`.I`(U)`R!6Y*(0J8"=1`.I(YU%`ZD)G4(#J5&=2`.I`)U)`TQ6Y$A*2DI*^#CI"FDZG8`C;
VZ&@I#SCI"FDZV)V`(^C2,M$S8*(`J2"=@"/HX%"0]JF;G8`C8*``L8#)?]`/BJ(2RMT*,Y#Z/
VO0LSJK`(G8`CR9OP!NC(X%"0WF```@<4'2,K,SM#2$E*2TQ-3D^B!Z``A).YAP`@MC+&DO`<&
VYI.DD\`&T.ZY03:9A@"(T/>Y0C:9/#;(Q)*0]6"DAM`0('(SO3PV()DSZ.26T/6$FF"DAM#[5
V('(SM8<@F3/HY);0]H2:8*2:\!:8&&UZ(JY[(I`!Z,6HT`3DJ?`-()\SI:B->B*EJ8U[(J(`A
V8)E^(LC0^8:MB)A(KGLB&&UZ(HU\(I`!Z(Y](J(@.&AI!)U(`ZD!L`*I`)U)`R!6Y#`7K7TB4
VC7LBK-(ST31\(LB,>B+0`^Y[(J:MH`!@`.IL"@!HA:QHA:VI"XU"`Z`!H@".2`..20.QK/`*%
VR(22(%;DI)+0\LBQK(6JR+&LA:N$DJD%C4(#J1"-2`.I`(U)`ZFZC40#J3:-10,@5N0PN2!1A
V-*#_R+FZ-I&J$/@8I9)EK(62I:UI`$BEDDA@H@"@`(:3K;HV$".(R+D#-IFZ-C`$R2[0\ZF;(
VF;HVH`#P#,DZT`'*R2[0`L:3R+FZ-A#OI9/0(*DNF;HVR*T`-IFZ-LBM`3:9NC;(K0(VF;HV\
VR*F;F;HVBM`3N;HVF;PVB!#WJ42-NC:I.HV[-F"I#)U"`TQ6Y(222""_-*D$G4H#TC31-6B=F
V1`.EDIU%`ZD#G4(#3%;DA))(J0R=0@,@5N2I"-#=IINI!9U"`ZEDG4@#J0"=20.%F:D6G40#]
VA8"I(IU%`X6!(%;DO4@#JJF;G18BF&`,("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@D
V("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(%!A9V4@("`@("";("`@("`@("`@("`@X
V("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@*$,IT
V(#$Y.#2;("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("#2-?DU("`@("`@("`@("`@&
B("`@("`@("`@("!73U)$34%22R!3>7-T96USF^`"X0+2(P``T
``
end
size 4732
===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm@killer.dallas.tx.us