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