;
;  PRINT.ASM
;
;  PRINT THE GENERATED CODE/SOURCE LINE
;
PRINT	JSR	CLEAR
;
	LDX	#2
	LDA	ISVAL
	BMI	NOADDR
	BNE	VALADR
;
	LDA	PC+1
	JSR	PRHEX
	LDA	PC
	JMP	LSTHLF
;
VALADR	LDA	VALUE+1
	JSR	PRHEX
	LDA	VALUE
LSTHLF	JSR	PRHEX
;
NOADDR	LDA	LEN
	STA	TEMP
	BEQ	NODATA
	LDA	MODE
	BMI	NODATA
	JSR	PROBJT	;PRINT 1 TO 6 BYTES OF OBJECT CODE
NODATA	LDX	#20
	JSR	PRSRC
;
	LDA	ADRERR
	STA	PRBUF
	CMP	#' '
	BEQ	PRINTQ
;
	LDX	#LOGDEV
	JSR	DOPRINT		;LOG ERRORS TO THE SCREEN
;
	INC	ERRCNT
	BNE	PRINTQ		;AND COUNT THEM
	INC	ERRCNT+1
;
PRINTQ	LDA	ICMD-2+PRUNIT
	BMI	LOKXIT
;
EXCODE	JSR	LIST
	BMI	LINXIT
	LDA	MODE
	BMI	LOKXIT
	LDA	TEMP
	BEQ	LINXIT
	JSR	CLEAR
	JSR	PROBJT
	LDA	#EOL
	STA	PRBUF,X
	JMP	EXCODE
;
LOKXIT	LDA	#0
LINXIT	RTS
;
;  PRINT A FORMATTED LINE TO LISTING DEVICE
;
LIST	LDA	CURLINE
	INC	CURLINE
	CMP	LPP		;NUMBER OF LINES/PAGE
	BCC	NONEWP
	LDA	#' '
	STA	PAGE+3		;BLANK OUT PAGE NO.
	STA	PAGE+2
	STA	PAGE+1
	LDA	#0
	STA	CURLINE		;START OF NEW PAGE
	INC	CURPAGE
	BNE	PAGEOK
	INC	CURPAGE+1
PAGEOK	LDA	CURPAGE
	STA	FR0
	LDA	CURPAGE+1
	STA	FR0+1
	JSR	IFP
	JSR	FASCII		;CONVERT TO ASCII STRING
	LDY	#$FF
PGCPLP	INY
	LDA	(INBUFF),Y
	STA	PAGE,Y		;COPY TO HEADING BUFFER
	BPL	PGCPLP
	AND	#$7F
	STA	PAGE,Y
;
	LDX	#PRUNIT
	LDA	#11		;PRINT MULTIPLE LINES
	STA	ICMD,X
	LDA	#LOW[TTLINE]
	STA	IBUF,X
	LDA	#HIGH[TTLINE]
	STA	IBUF+1,X
	LDA	TTLLEN
	STA	ILEN,X
	LDA	#0
	STA	ILEN+1
	JSR	CIOV		;WRITE TITLE LINE
;
NONEWP	LDX	#PRUNIT
DOPRINT	LDA	#LOW[PRBUF]
	STA	IBUF,X
	LDA	#HIGH[PRBUF]
	STA	IBUF+1,X
;
	LDA	#9
	STA	ICMD,X		;PRINT A LINE ENDING WITH EOL
	LDA	#81
	STA	ILEN,X
	LDA	#0
	STA	ILEN+1,X
	JMP	CIOV
;
;  CONVERT NUMBER TO HEX IN PRINT LINE
;
PRHEX	PHA
	LSR	A
	LSR	A
	LSR	A
	LSR	A
	SED
	SEC
	SBC	#9+1
	ADC	#'9'+1
	STA	PRBUF,X
	INX
	PLA
	AND	#$0F
	SEC
	SBC	#9+1
	ADC	#'9'+1
	CLD
	STA	PRBUF,X
	INX
	RTS
;
;  CLEAR THE PRINT LINE
;
CLEAR	LDX	#0
CLLP	LDA	#' '
	STA	PRBUF,X
	INX
	CPX	#80
	BCC	CLLP
	LDA	#EOL
	STA	PRBUF,X
	RTS
;
;  PRINT SOURCE LINE
;
PRSRC	LDY	#0
PRSCP	LDA	(TEXTP),Y
	CMP	#TAB
	BNE	STINBF
;
	TXA
	LDX	#NTABS
NXTTAB	DEX
	CMP	TABTAB,X
	BCC	NXTTAB
	LDA	TABTAB+1,X
	TAX
	BCS	PRBMPY
STINBF	STA	PRBUF,X
	CMP	#EOL
	BEQ	GOTEOL
	INX
PRBMPY	INY
	CPX	#80
	BCC	PRSCP
GOTEOL	RTS
;
TABTAB	DB	0,2,7,20,29
	DB	35,43,51,59,67
	DB	72,73,74,75,76
	DB	77,78,79
NTABS	=	*-TABTAB
;
;  PRINT OUT A CHUNK OF OBJECT CODE
;
PROBJT	LDX	#7
	LDY	#0
	STY	TEMP+1
OBJPRL	LDA	OPCODE,Y
	JSR	PRHEX
	DEC	TEMP
	BEQ	HEXIT
	INC	TEMP+1
	LDY	TEMP+1
	CPY	#6
	BNE	OBJPRL
;
LDOUTB	LDA	DATBUF-1+6,Y
	STA	OPCODE-1,Y
	DEY
	BNE	LDOUTB
;
PRNX6	LDA	DATBUF+6,Y
	STA	DATBUF,Y
	INY
	CPY	TEMP
	BCC	PRNX6
;
HEXIT	RTS
;
;  OBJECT.OBJ
;
;  PUT CONTENTS OF THE DATA BUFFER INTO THE OBJECT FILE
;
DATOBJ	LDY	PASSNO
	BNE	NOOBJG
	JSR	OBJSET
DOLOOP	LDA	DATBUF,X
	JSR	WRTBYTE		;PUT EACH BYTE INTO THE BUFFER
	INX
	CPX	LEN		;DONE?
	BNE	DOLOOP
	STY	OBJPTR
NOOBJG	RTS
;
;  PUT THE CONTENTS OF THE MACHINE CODE BUFFER INTO THE OBJECT FILE
;
CODOBJ	LDY	PASSNO
	BNE	NOOBJG
	JSR	OBJSET
CODELP	LDA	OPCODE,X
	JSR	WRTBYTE
	INX
	CPX	LEN
	BNE	CODELP
	STY	OBJPTR
	RTS
;
;  INSURE THE PC AGREES WITH THE LOCATION BEING LOADED
;
OBJSET	LDY	OBJPTR
	BEQ	NEWSET		;IF NOTHING IN BUFFER
	TYA
	CLC
	ADC	OBJBUF
	LDX	OBJBUF+1	;ELSE COMPARE BUF ADDR AND PC
	BCC	NOBX
	INX
NOBX	CMP	PC
	BNE	NOTSET
	CPX	PC+1
	BEQ	SETXIT		;IF NEXT BYTE ADDR MATCHES PC
NOTSET	JSR	WRTOBJ
;
NEWSET	LDA	PC
	STA	OBJBUF
	LDA	PC+1
	STA	OBJBUF+1
SETXIT	LDX	#0
WRTXIT	RTS
;
;  WRITE A BYTE TO THE OBJECT FILE BUFFER
;
WRTBYTE	STA	OBJBUF+4,Y
	INY
	BNE	WRTXIT		;IF NOT THE END OF THE BUFFER
;
;  WRITE A BLOCK OF OBJECT TEXT IN OBJBUF
;
WRTOBJ	STX	LOWP+1
	DEY
	TYA
	PHA
	LDX	OBJBUF+1
	CLC
	ADC	OBJBUF
	STA	OBJBUF+2
	BCC	WRTEQL
	INX
WRTEQL	STX	OBJBUF+3
	LDX	#OBUNIT
	SEC
	PLA
	ADC	#4
	STA	ILEN,X
	LDA	#1
	BCS	ZEROPB
	LDA	#0
ZEROPB	STA	ILEN+1,X
	JSR	CIOV
	BMI	OBJERR
	LDA	OBJBUF+3
	STA	OBJBUF+1
	LDY	OBJBUF+2
	INY
	STY	OBJBUF
	BNE	WRTOUT
	INC	OBJBUF+1
WRTOUT	LDX	LOWP+1
	LDY	#0
	RTS
;
OBJERR	BRK
	NOP
	JMP	($000A)
;
;  INPUT.ASM
;
;  PROMPT FOR COMMAND INPUT
;
PROMPT	PLA
	STA	LOWP
	PLA
	STA	LOWP+1
PRETRY	LDA	#11
	STA	ICMD
	LDY	#1
	LDX	#0
	STX	ILEN
	STX	ILEN+1
PMTLP	LDA	(LOWP),Y
	BEQ	PMTEND
	INY
	STY	TEMP
	JSR	CIOV
	LDY	TEMP
	BNE	PMTLP
;
PMTEND	INY
	LDA	(LOWP),Y
	STA	HIGHP
	INY
	LDA	(LOWP),Y
	STA	HIGHP+1
	STY	TEMP
	LDA	#5
	STA	ICMD
	LDA	#FNSIZE-2
	STA	ILEN
	LDA	#0
	STA	ILEN+1
	LDA	#LOW[FNBUF]
	STA	IBUF
	LDA	#HIGH[FNBUF]
	STA	IBUF+1
	JSR	CIOV
	BMI	PRETRY
	JSR	BLDFNB
	LDY	#$FF
CPFNLP	INY
	LDA	FNBUF,Y
	STA	(HIGHP),Y
	BPL	CPFNLP
	CLC
	LDA	TEMP
	ADC	LOWP
	STA	TEMP
	LDA	LOWP+1
	ADC	#0
	PHA
	LDA	TEMP
	PHA
	RTS
;
BLDFNB	LDX	#0
	LDY	#0
	STX	TEMP+1
	LDA	FNBUF
	BPL	BLDFNE
	DEY
KEEPNM	INY
	LDA	INF,Y
	STA	FNBUF,Y
	BMI	NOTDFLT
	CMP	#'.'
	BNE	KEEPNM
NOTDFLT	LDA	#EOL
	STA	FNBUF,Y
	LDY	#0
	BEQ	BLDFNE
;
BLDFNL	CMP	#':'
	BNE	BLDFCP
	DEX
BLDFCP	CMP	#'.'
	BNE	BLDFND
	DEC	TEMP+1
BLDFND	INY
BLDFNE	LDA	FNBUF,Y
	BPL	BLDFNL
	LDA	TEMP+1
	BNE	GOTEXT
	LDA	#'.'
	STA	FNBUF,Y
	INY
	LDA	EXTTXT
	STA	FNBUF,Y
	INY
	LDA	EXTTXT+1
	STA	FNBUF,Y
	INY
	LDA	EXTTXT+2
	STA	FNBUF,Y
	INY
	LDA	#EOL
	STA	FNBUF,Y
GOTEXT	TXA
	BNE	GOTPFX
SHFTBF	LDA	FNBUF,Y
	STA	FNBUF+2,Y
	DEY
	BPL	SHFTBF
	LDA	#'D'
	STA	FNBUF
	LDA	#':'
	STA	FNBUF+1
GOTPFX	RTS
;
;  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
