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