	TITLE	'6502/65C02 ASSEMBLER'
	SUBTTL	'SOURCE = A65.MAC, 6/24/84'
;
; Copyright (C) 1984, 1986 by Charles Marslett
;                             WORDMARK Systems
; All rights reserved.        2705 Pinewood Dr.
;                             Garland, TX 75042
;
; Permission granted to copy, modify or execute
; this program for noncommercial purposes only.
;
PRUNIT	=	$10	;LIST OUTPUT IOCB
OBUNIT	=	$20	;OBJECT FILE IOCB
INUNIT	=	$30	;SOURCE FILE IOCB
	LIST	I
;
	INCLUDE	D2:ASMDEF.MAC
;
	ORG	$2000	;END OF RESIDENT MYDOS 3.316
OPERS	DS	50	;EXPRESSION STACKS
OPNDL	DS	50
OPNDH	DS	50
;
TEXTBF	DS	LINLEN
OBJBUF	DS	BUFLEN
PRBUF	DS	PRTLEN+2
;
START	LDA	#TTLSIZE
	STA	TTLLEN
	LDX	#$FF
	STX	CURLINE
	INX
	STX	CURPAGE
	STX	CURPAGE+1
	STX	TTLFLG
	LDA	#59	;DEFAULT LINES/PAGE
	STA	LPP
	LDA	#'A'
	STA	EXTTXT
	LDA	#'S'
	STA	EXTTXT+1
	LDA	#'M'
	STA	EXTTXT+2
	JSR	PROMPT
	DB	'Source file = ',0
	DW	INF
;
	LDA	#'O'
	STA	EXTTXT
	LDA	#'B'
	STA	EXTTXT+1
	LDA	#'J'
	STA	EXTTXT+2
	JSR	PROMPT
	DB	'Object file = ',0
	DW	OUTF
;
	LDA	#'L'
	STA	EXTTXT
	LDA	#'S'
	STA	EXTTXT+1
	LDA	#'T'
	STA	EXTTXT+2
	JSR	PROMPT
	DB	'List file = ',0
	DW	PRF
;
	LDA	#1		;FIRST PASS IS 1
	STA	PASSNO		;SECOND PASS IS 0
;
	LDA	#LOW[SYMTAB]
	STA	ENDSTAB
	LDA	#HIGH[SYMTAB]
	STA	ENDSTAB+1
	LDX	#$FF
	STX	SYMTAB
;
	LDA	PRF+2
	CMP	#'-'
	BEQ	NOPRNT
	LDX	#PRUNIT
	LDA	#LOW[PRF]
	LDY	#HIGH[PRF]
	JSR	OPNOUT
	BMI	ABORT
;
NOPRNT	LDA	#'A'
	STA	EXTTXT
	LDA	#'S'
	STA	EXTTXT+1
	LDA	#'M'
	STA	EXTTXT+2
;
PASSLP	LDA	#0
	STA	ENDFLG
	STA	ENTPTF
	STA	INIFLG
	LDX	#INUNIT
	STX	FILE
	LDA	#LOW[INF]
	LDY	#HIGH[INF]
	JSR	OPENIN
	BMI	ABORT
;
LOOP	LDA	#$00
	STA	SFLGS
	STA	LABEL
	JSR	READLN
	BMI	CKEOF
	JSR	GENCODE		;GENERATE CODE/DO DIRECTIVE
	JSR	ADDSYM		;IF LABEL DEFINED, ADD TO SYM/TAB
	LDA	PASSNO
	BNE	NOPLIN		;IF NOT PASS 2, SKIP PRINTING
	LDA	ICMD-2+PRUNIT
	BMI	NOPLIN
	JSR	PRINT		;LIST LINE TO PRINTER
	BMI	ABORT
NOPLIN	LDA	ENDFLG
	BNE	ASDONE
;
	CLC
	LDA	LEN
	ADC	PC
	STA	PC
	LDA	LEN+1
	ADC	PC+1
	STA	PC+1
	JMP	LOOP
;
ABORT	LDX	FILE
CLINFS	JSR	CLOSEF
	TXA
	SEC
	SBC	#$10
	TAX
	CPX	#INUNIT
	BCS	CLINFS
	BCC	ABXIT
;
CKEOF	CPY	#136		;IS THIS EOF?
	BNE	ABORT		;IF SO, THEN TREAT AS 'END'
ASDONE	LDX	FILE
	JSR	CLOSEF
	CPX	#INUNIT
	BNE	ENDINCL
	DEC	PASSNO
	BPL	PASS2
ABXIT	JMP	ASMXIT		;ASSEMBLY DONE, GO WRAP UP!
;
PASS2	LDX	#OBUNIT
	LDA	#LOW[OUTF]
	LDY	#HIGH[OUTF]
	JSR	OPNOUT
	BMI	ABORT
;
	LDA	#$FF
	STA	OBJBUF
	STA	OBJBUF+1
	LDA	#2
	STA	ILEN,X
	LDA	#0
	STA	ILEN+1,X
	STA	OBJPTR		;NO DATA IN BUFFER YET (LEN=0)
	LDA	#11
	STA	ICMD,X
	LDA	#LOW[OBJBUF]
	STA	IBUF,X
	LDA	#HIGH[OBJBUF]
	STA	IBUF+1,X
	JSR	CIOV
	BMI	ABORT
	JMP	PASSLP
;
ENDINCL	TXA
	SBC	#$10
	STA	FILE
	LDA	ENDFLG
	BNE	ASDONE
	JMP	LOOP
;
ASMXIT	LDA	ENTPTF
	BEQ	NOENTV
	LDX	#2
	LDA	#LOW[RUNVEC]
	STA	PC
	LDA	#HIGH[RUNVEC]
	STA	PC+1
	LDX	#2
	LDA	INIFLG
	BEQ	VECT2
	LDX	#4
	LDA	INIPT
	STA	OPCODE+2
	LDA	INIPT+1
	STA	OPCODE+3
;
VECT2	LDA	ENTPT
	STA	OPCODE
	LDA	ENTPT+1
	STA	OPCODE+1
	JMP	WRVECT
;
NOENTV	LDA	INIFLG
	BEQ	NOINIV
	LDA	INIPT
	STA	OPCODE
	LDA	INIPT+1
	STA	OPCODE+1
	LDA	#LOW[INIVEC]
	STA	PC
	LDA	#HIGH[INIVEC]
	STA	PC+1
	LDX	#2
WRVECT	STX	LEN
	JSR	CODOBJ+4
	LDX	#VECLL
CPYVL	LDA	VECLIN-1,X
	STA	TEXTBF-1,X
	DEX
	BNE	CPYVL
	JSR	PRINT		;PRINT VECTOR CODE LINE
NOINIV	LDY	OBJPTR
	BEQ	NOOBJB
	JSR	WRTOBJ
NOOBJB	LDX	#OBUNIT
	JSR	CLOSEF
	LDA	ICMD-2+PRUNIT
	BMI	NOPSYM
	LDA	#' '
	STA	PRBUF
	LDA	#EOL
	STA	PRBUF+1
	JSR	LIST
	JSR	PRSTAB		;PRINT SYMBOL TABLE
	LDX	#PRUNIT
	JSR	CLOSEF
NOPSYM	JMP	(DOSVEC)	;AND RETURN TO DOS
;
VECLIN	DB	'<<< RUN/INIT VECTORS >>>',$9B
VECLL	=	*-VECLIN
;
	INCLUDE	D2:OPCODE.MAC
	INCLUDE	D2:DATA.MAC
	INCLUDE	D2:DIREC.MAC
	INCLUDE	D2:EXPR.MAC
	INCLUDE	D2:SYMBOLS.MAC
	INCLUDE	D2:PRINT.MAC
	INCLUDE	D2:OBJECT.MAC
	INCLUDE	D2:INPUT.MAC
;
;  CLOSE A FILE
;
CLOSEF	LDA	#12
	STA	ICMD,X
	JMP	CIOV
;
;  OPEN A FILE FOR INPUT
;
OPENIN	STY	TEMP
	PHA
	JSR	CLOSEF
	LDA	#4
DOPEN	STA	IAUX,X
	PLA
	STA	IBUF,X
	LDA	TEMP
	STA	IBUF+1,X
	LDA	#3
	STA	ICMD,X
	JMP	CIOV		;OPEN INPUT FILE
;
;  OPEN LIST OR OBJECT FILE
;
OPNOUT	STY	TEMP
	PHA
	LDA	#12
	STA	ICMD,X
	JSR	CIOV
	LDA	#8
	BNE	DOPEN
;
;  READ A LINE INTO THE TEXT BUFFER
;  AND INITIALIZE THE TEXT POINTERS
;
READLN	LDX	FILE		;READ SELECTED FILE
	LDA	#5
	STA	ICMD,X
	LDA	#LINLEN
	STA	ILEN,X
	LDA	#0
	STA	ILEN+1,X
	STA	TXTPTR
	LDA	#LOW[TEXTBF]
	STA	IBUF,X
	STA	TEXTP
	LDA	#HIGH[TEXTBF]
	STA	IBUF+1,X
	STA	TEXTP+1
	JSR	CIOV
	LDA	ILEN,X
	TAX
	LDA	#EOL
	STA	TEXTBF,X
	TYA
	RTS
;
TTLINE	DB	$0C	;FORMFEED
TITLE	DB	'                              '
	DB	'                              ',' Page '
PAGE	DB	'     ',EOL
SUBTTL	DB	'                              '
	DB	'                              ','   (C) 1984',EOL
	DB	'                              '
	DB	'                         ','WORDMARK Systems',EOL
TTLSIZE	=	*-TTLINE
;
;  NON-ZERO PAGE RAM
;
CURLINE	DS	1
LPP	DS	1
CURPAGE	DS	2
TTLLEN	DS	1
TTLFLG	DS	1
ENDFLG	DS	1
ENTPTF	DS	1
INIFLG	DS	1
ENTPT	DS	2
INIPT	DS	2
EXTTXT	DS	3
INF	DS	FNSIZE
	DS	1
OUTF	DS	FNSIZE
	DS	1
PRF	DS	FNSIZE
	DS	1
DATBUF	DS	STRMAX
	DS	6
FNBUF	DS	FNSIZE
	DS	2
LABEL	DS	SYMSIZ
	DS	2
;
SYMTAB	END	START
