Compucolor.org – Virtual Media

Listing of file='PRNMST.SRC;01' on disk='vmedia/source_1-sector.ccvf'

;TITLE:		ASSEMBLER UPGRADE V3.81

;PURPOSE:	TO BE APPENDED TO THE COMPUCOLOR ASSEMBLER TO
;		FACILITATE OUTPUT TO THE PRINTER AND PRINTING
;		A SYMBOL TABLE

;AUTHOR:	JAMES C. MINOR
;		39 BRYN MAWR ROAD
;		ROCHESTER, NEW YORK 14624
;		716-343-1989
;
;	THE NEXT FIVE ADDRESSES ARE FOR V6.78 SOFTWARE
;	CHANGE THEM AND YOU SHOULD BE ABLE TO RUN WITH
;	V8.79 SOFTWARE (THOUGH I'VE NEVER TRIED IT).

CRLF	EQU	338BH
LO	EQU	3392H
LBYT	EQU	339BH
OSTR	EQU	33F4H
WATL	EQU	3429H

LOFL	EQU	81F9H
CRATE	EQU	81E2H
ASMSTR	EQU	8200H
INBUF	EQU	8D20H
CI	EQU	8D40H
INSP	EQU	9C6CH
SMSTRT	EQU	9D10H
ENDPTR	EQU	9CA4H

CLEAR	EQU	  0
SETFG	EQU	  1

SCRTCH	EQU	  3

NULL	EQU	  0
TAB	EQU	  9
LF	EQU	 10
FF	EQU	 12
CR	EQU	 13
GREEN	EQU	 18
YELLOW	EQU	 19
CYAN	EQU	 22
WHITE	EQU	 23
FGON	EQU	 29
SPACE	EQU	 32
ENDSTR	EQU	239

SYSOUT	EQU	  0
ADRLNG	EQU	  4
MAXSYM	EQU	  5
MAXTAB	EQU	  8
SEROUT	EQU	 14
CNTRL	EQU	60H
ASCII	EQU	7FH


ORG	8DEEH

	JMP	PRNMST
	JMP	SYMPRT
	JMP	PRNOUT
	JMP	LOTAB

PRNMST:	;PRINT MASTER ROUTINE

	LXI	H,PRNFLG;CLEAR THE PRINTFLAG...
	XRA	A	;WHICH ALSO DOUBLES AS...
	MOV	M,A	;THE BAUD RATE

PRNSET:	LXI	H, MSG03;ASK FOR SCREEN OR PRINTER
	CALL	OSTR
	CALL	CI	;READ ANSWER
	CALL	LO	;ECHO IT ON SCREEN
	CPI	'S'	;SCREEN ?
	JZ	PRNRET	;YES. GIVE PROMPT AND EXIT
	CPI	'P'	;SHOULD BE A P(RINT)
	JNZ	PRNSET	;IF NOT, TRY AGAIN


BAUDIN:	LXI	H, MSG04;PRINTER WANTED. WHAT BAUD ?
	CALL	OSTR
	CALL	CI	;READ BAUD NUMBER
	CALL	LO	;ECHO TO SCREEN
	STA	PRNFLG	;STORE IT

PRNRET: LXI	H, MSG05;GIVE FILE PROMPT
	CALL	OSTR
	LXI	H, INBUF;THE "PATCHED OVER" INSTRUCTION
	RET

MSG03:	DB	CR,LF,LF,FGON,YELLOW
	DB	'LIST FILE TO ',CYAN,'S',YELLOW,'CREEN '
	DB	'OR ',CYAN,'P',YELLOW,'RINTER ? ',CYAN,ENDSTR

MSG04:	DB	CR,LF,YELLOW,'BAUD RATE (',CYAN
	DB	'1-7',YELLOW,') = ? ',CYAN,ENDSTR

MSG05:	DB	CR,LF,LF,GREEN,'PROMPT ',WHITE,'AND '
	DB	YELLOW,'<OPTIONAL> ',CYAN,'RESPONSES',WHITE,':'
	DB	CR,LF,LF,GREEN,'>',CYAN,'ASM "FILE SPECIFIER"'
	DB	YELLOW,'<',CYAN,'/E',YELLOW,'> <',CYAN
	DB	'TO ',YELLOW,'<',CYAN,'CD',YELLOW,'>',WHITE
	DB	'X',CYAN,':',YELLOW,'>',GREEN,CR,LF,LF,ENDSTR


PRNOUT:	;SEND OUTPUT TO PRINTER, IF APPROPRIATE

	LDA 	PRNFLG
	ANA	A
	JZ	OUTRET
	LXI	H, LOFL
	MVI	M, SEROUT
	LXI	H, CRATE
	ANI	7	;CONVERT PRNFLG FROM ASCII TO DECIMAL
	MOV	B,A
	MVI	A, 1

ROTAT:	DCR	B	;CONVERT...
	JZ	BAUDST	;	DECIMAL...
	RLC		;		BAUDRATE...
	JMP	ROTAT	;			TO BINARY

BAUDST:	MOV	M,A
	OUT	5	;SET THE BAUDRATE ON THE TMS 5501

	XRA	A
	STA 	CHARCO
	STA	SPCFLG

OUTRET:	LHLD	ASMSTR+3 ;INSERT "PATCHED" OVER LINE
	RET

LOTAB:	;LO WITH TAB INSERTION

	PUSH	H
	MOV	B,A	;SAVE CHARACTER
	LDA 	PRNFLG
	ANA	A	;IS OUTPUT TO PRINTER?
	JZ	CHRPRT	;NO LET SCREEN ROUTINE HANDLE TABS
	MOV	A,B
	ANI	CNTRL	;ARE THESE CONTROL CHARACTERS?
	JNZ	INCCHR	;NO. THEY ARE PRINTED OUTPUT
	MOV	A,B	;RECALL CHARACTER
	CPI	TAB	;IS IT A TAB?
	JZ	SETSPC	;YES. START INSERTING SPACES
	CPI	CR	;NO. IS IT A CARRIAGE RETURN?
	JNZ	CHRPRT	;NO. PASS IT ON TO OUTPUT
	LXI	H,CHARCO;YES. RESET CHARCO
	MVI	M,CLEAR
	JMP	CHRPRT	;NOW PROCESS CARRIAGE RETURN

SETSPC:	LXI	H,SPCFLG;SET FLAG TO GENERATE SPACE
	MVI	M,SETFG
	MVI	B,NULL	;DON'T PRINT TAB
	JMP	CHRTST	;REENTER CHARACTER PROCESSING MAINLINE

INCCHR:	LXI	H,CHARCO
	INR	M

CHRTST:	LXI	H,CHARCO
	MOV	A,M
	CPI	MAXTAB	;REACHED MAXIMUM TAB?
	JNZ	SPCTST	;NO. CONTINUE
	XRA	A	;YES...
	MOV	M,A	;RESET CHARCO
	LXI	H,SPCFLG
	MOV	M,A

SPCTST:	LDA	SPCFLG
	CPI	SETFG	;IS FLAG ON?
	JNZ	CHRPRT	;NO. CONTINUE
	MVI	A,SPACE
	CALL	LO	;PRINT SPACE
	JMP	INCCHR	;LOOP BACK FOR POSSIBLY MORE SPACES

CHRPRT: MOV	A,B	;RESTORE CHARACTER (FOR SCREEN)
	POP	H	;RESTORE "PATCHED-
	CALL	LO	;		OVER" CODE
	RET

SYMPRT:	;PRINT THE SYMBOL TABLE

	LDA	PRNFLG	;TEST FOR PRINTER OUTPUT
	ANA	A
	JZ	RESTOR	;OUTPUT TO SCREEN. EXIT
	LXI	H,LOFL	;GET BACK TO...
	MVI	M,SYSOUT;   SCREEN OUTPUT
	LXI	H,MSG06	;ASK IF SYMBOL TABLE WANTED
	CALL	OSTR

	LXI	H,INBUF	;CLEAR COUNTER FOR...
	MVI	M,0	;   FOLLOWING CI

	CALL	CI	;READ ANSWER
	PUSH	PSW
	CALL	LO	;ECHO ON SCREEN
	CALL	CRLF
	CALL	CRLF
	POP	PSW
	CPI	'Y'
	JNZ	RESTOR	;IF NOT WANTED EXIT
	LXI	H,LOFL	;IF WANTED SET OUTPUT...
	MVI	M,SEROUT;	BACK TO PRINTER
	MVI	A, CLEAR
	STA	FINFLG	;CLEAR "FINISHED" FLAG
	STA	PRNCNT	;CLEAR PRINT COUNTER
	STA	CHARCO	;CLEAR TAB ROUTINE CHARACTER COUNTER
	LXI	H, TITLE
	CALL	OSTR	;PRINT THE TITLE

SYM1:	CALL	SCAN	;FIND LOWEST ALPHA IN SYMBOL TABLE
	LDA	FINFLG
	CPI	SETFG	;WAS THAT THE LAST SYMBOL?
	JNZ	SYM2
	MVI	A, FF	;YES. PRINT FORMFEED AND EXIT
	CALL	LOTAB
	JMP	RESTOR

SYM2:	CALL	PRINT	;PRINT THE SYMBOL AND ADDRESS
	LHLD	PTR
	MVI	M,SCRTCH;"REMOVE" SYMBOL FROM LIST
	LXI	H,PRNCNT
	INR	M	;INCREMENT THE PRINT COUNTER
	MOV	A,M
	CPI	5	;ARE THERE 5 SYMBOLS ON THIS LINE?
	JZ	SYM3	;ZERO=YES
	MVI	A, TAB	;NO. PRINT TAB
	CALL	LOTAB
	JMP	SYM1

SYM3:	LXI	H,PRNCNT;CLEAR PRINT COUNTER
	XRA	A
	MOV	M,A
	MVI	A, CR	;SKIP TO NEXT LINE
	CALL	LOTAB
	MVI	A, LF
	CALL	LOTAB
	JMP	SYM1	;CONTINUE PRINTING ON NEW LINE

RESTOR:	LXI	H,LOFL	;SET THE OUTPUT FLAG...
	MVI	M,SYSOUT;TO SYSTEM MODE
	MVI	B,0	;TELL FCS THERE'S NO ERROR
	LHLD	INSP	;THE "PATCHED-OVER" INSTRUCTION
	RET

MSG06:	DB	CR,LF,LF,YELLOW,'DO YOU WANT A SYMBOL '
	DB	'TABLE PRINTED ? (',CYAN,'Y',YELLOW,'='
	DB	CYAN,'Y',YELLOW,'ES) ',CYAN,ENDSTR

TITLE:	DB	FF,CR,'SYMBOL TABLE:',CR,LF,LF
	DB	237,MAXSYM,'SYMBOL  VALUE   ',238,CR,LF
	DB	237,MAXSYM,'------  -----   ',238,CR,LF
	DB	ENDSTR

PRINT:	;PRINT THE ASSEMBLY NAME AND ADDRESS GIVEN IN (PTR)

	LHLD	PTR	;SET HL TO FIRST CHARACTER ADDRESS
PRN1:	MOV	A,M	;FETCH THE CHARACTER
	CPI	ASCII	;IS IT ABOVE ASCII RANGE?
	JNC	PRN2	;I.E. IS IT SPECIAL (LAST) SYM CHARACTER
	CALL	LOTAB	;NO. PRINT CHARACTER
	INX	H	;MOVE POINTER TO NEXT CHARACTER IN...
	JMP	PRN1	;SYMBOL AND TRY AGAIN

PRN2:	ANI	ASCII	;IT IS LAST CHARACTER. REMOVE FLAG
	CALL	LOTAB	;PRINT IT
	MVI	A, TAB	;PRINT TAB
	CALL	LOTAB
	INX	H	;MOVE POINTER TO...
	INX	H	;ADDRESS LOW BYTE
	PUSH	H	;SAVE LOW BYTE
	INX	H	;POINT TO HIGH BYTE
	MOV	A,M	;GET HIGH BYTE
	CALL	LBYT	;PRINT HIGH BYTE AS TWO HEX CHAR.
	POP	H	;GET LOW BYTE POINTER
	MOV	A,M	;GET LOW BYTE
	CALL	LBYT	;PRINT LOW BYTE AS TWO HEX CHAR.
	MVI	A,'H'
	CALL	LOTAB	;PRINT "H" AFTER HEX VALUE

	LXI	H, CHARCO ;UPDATE TAB CHARACTER COUNTER:
	MVI	A, ADRLNG
	ADD	M
	CPI	MAXTAB	;REACHED MAXIMUM LENGTH?
	JC	PRN3	;NO. STORE AND RETURN
	SUI	MAXTAB	;YES. RESET

PRN3:	MOV	M,A	;UPDATED CHARCO
	RET

SCAN:	;SCAN THE TABLE FOR THE LOWEST ALPHA LEGAL SYMBOL

	LXI	H, SMSTRT ;START AT THE TABLE BEGINNING
	MOV	A,M	;FETCH THE FIRST CHARACTER
	CPI	SCRTCH	;IS THE SYMBOL "SCRATCHED"?
	JZ	SCAN0	;YES. GET VALID POINTER
	ANA	A	;NO. ARE WE AT TABLE END? ...
	JZ	SCAN1	;I.E. WAS THE TABLE EMPTY?
	JMP	SCAN2	;NO. THE FIRST ENTRY IS VALID

SCAN0:	CALL	FNDPTR	;FIRST ENTRY SCRATCHED. GET VALID PTR.
	JNZ	SCAN2

SCAN1:	MVI	A, SETFG ;WE HAVE EXHAUSTED THE TABLE...
	STA	FINFLG	;NOTIFY THE CALLING ROUTINE
	RET

SCAN2:	SHLD	PTR	;PUT FIRST VALUE IN "PTR"

SCAN3:	CALL	FNDPTR	;FIND THE NEXT POINTER (KEEP IN HL)
	SHLD	NXTPTR	;AND STORE IN "NXTPTR"
	RZ		;IF NO POINTER FOUND, RETURN
	CALL	COMPAR	;PUT THE ALPHANUMERIC SMALLER...
			;POINTER IN "PTR"
	JMP	SCAN3	;REPEAT UNTIL TABLE EXHAUSTED

COMPAR:	;START WITH OLD SYMBOL TABLE POINTER IN "PTR"
	;ALSO HAVE NEW SYMBOL POINTER IN HL AND "NXTPTR"
	;PUT THE SMALLEST (ALPHA) SYMBOL POINTER IN "PTR"
	;AND LEAVE (NXTPTR) UNCHANGED
	;LEAVE HL WITH (NXTPTR)

	PUSH	H	;SAVE NXTPTR
	LHLD	PTR	;FETCH PTR
	MOV	E,L	;AND PASS...
	MOV	D,H	;	ON TO DE
	POP	H	;RECOVER NXTPTR
COMP1:	MOV	A,M	;FETCH (NXTPTR)
	ANI	ASCII	;STRIP OFF ANY SPECIAL INDICATORS
	MOV	B,A	;AND STORE IN B
	LDAX	D	;FETCH (PTR)
	ANI	ASCII	;STRIP OFF ANY SPECIAL INDICATOR
	INX	H	;PREPARE TO LOOP...
	INX	D	;TO NEXT CHARACTER
	CMP	B
	JZ	COMP1	;IF MATCH, LOOK AT NEXT CHARACTER
	LHLD	NXTPTR	;LEAVE HL WITH (NXTPTR)
	RC		;(PTR) HAD THE SMALLEST VALUE
	SHLD	PTR	;(NXTPTR) HAD THE SMALLEST VALUE
	RET

FNDPTR:	;FIND THE POINTER TO THE NEXT SYMBOL
	;ENTER WITH HL=CURRENT POINTER
	;EXIT WITH HL=POINTER TO NEXT SYMBOL
	;ZERO FLAG SET IF NO LEGAL POINTER FOUND

	MOV	A,M
	INX	H
	CPI	ASCII
	JC	FNDPTR	;FOUND LAST CHARACTER IN SYMBOL?
	INX	H	;YES. STEP...
	INX	H	;	TO NEXT...
	INX	H	;		SYMBOL
	MOV	A,M	;GET NEW SYMBOL'S FIRST CHARACTER
	CPI	CLEAR	;IS IT PAST LAST SYMBOL (=>0)?
	RZ		;YES.
	MOV	A,M	;NO.
	CPI	SCRTCH	;IS IT A PREVIOUSLY PRINTED CHARACTER?
	JZ	FNDPTR	;YES. KEEP LOOKING.
	RET		;NO. RETURN WITH NEW VALUE


CHARCO:	DS	1
SPCFLG:	DS	1
PRNFLG:	DS	1

;NOTE- IBUF (THE .SRC FILE INPUT BUFFER) STARTS AT 90EEH AND AS
;      A RESULT, THE PRECEEDING CODE MUST END BEFORE THAT.
;      THE FOLLOWING RAM IS NOT USED UNTIL AFTER WE ARE THROUGH
;      WITH IBUF AND SO MAY EXTEND INTO IT, IF NECESSARY.

FINFLG:	DS	1
PRNCNT:	DS	1
PTR:	DS	2
NXTPTR:	DS	2

	END	PRNMST