Listing of file='PRTCHR.MAC;13' on disk='vmedia/printer_pkg_src-sideB-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; PRTCHR - PRINTER DRIVER ; ; 1. USES CLEAR-TO-SEND PROTOCOL ; 2. EXPANDS TABS ; 3. COUNTS CHARS ON LINE ; 4. COUNTS LINES ON PAGE ; 5. REPLACES CONTROL CHRS AND INVALID CODES ; 6. REMOVES 'DEL' ; 7. PRINTS HEADER MESSAGE ; ; VALUES ON ENTRY: ; A REG - CHARACTER TO PRINT AND DISPLAY ; ; DESTROYS: ; NOTHING ; ; REQD ROUTINES: ; EXTRN OSTR,CO,SAVE EXTRN TXSER EXTRN NEWLIN,NEWPAG EXTRN WAIT ; ; PARAMETERS IN MAIN PROGRAM: ; EXTRN LINLEN,PAGLEN,DELTIM ; ; OTHER PARAMETERS: ; EXTRN CHRCNT,LINCNT ; ; EQUATES ; TAB EQU 9 LF EQU 10 FF EQU 12 CR EQU 13 SPACE EQU 32 DEL EQU 127 ENTRY PRTCHR PRTCHR: CALL SAVE ;SAVE ALL REGS CPI SPACE ;CHECK FOR CONTROL CHRS JC CHKCC CPI DEL ;SEE IF DELETE CHR OR JC COUNT ; INVALID ASCII JNZ HIBIT MVI A,'#' ;DEL PRINTS AS '#' COUNT: CALL SEND ;SEND IT LXI H,CHRCNT ;ONE MORE CHAR ON THIS LINE INR M ;COUNT IT LDA LINLEN ;MAX LINE SIZE CMP M ;OUR COUNT JM CRLF ;FORCE LF IF LINLEN EXCEEDED JZ CRLF RET HIBIT: MOV B,A ;MSB OF CHR IS SET LDA LINLEN ;SEE IF "ESCAPE" SEQUENCE MOV C,A ; WILL FIT ON CURRENT LINE LDA CHRCNT INR A ;ALLOW FOR 4 CHR SEQUENCE, INR A ; EVEN THOUGH IT MAY ONLY INR A ; BE 3 CHRS. INR A SUB C CP CRLF MVI A,'[' ;PRINT [X] (WHERE X IS THE CHR) CALL PRTCHR ; TO INDICATE THAT IT IS MOV A,B ; NOT VALID ASCII ANI 7FH ;REMOVE MSB CPI SPACE JNC OK ;CONTROL CHARACTERS ALWAYS GET CALL CTLCHR ; SUBTITUTED, EVEN CR, LF, JMP RGTBRK ; FF ETC. TO AVOID SURPRISES OK: CALL PRTCHR RGTBRK: MVI A,']' CALL PRTCHR RET CHKCC: CPI CR ;CARRIAGE RETURN IS OK JNZ CHKFF CALL SEND ;DON'T COUNT CR IN LINE LENGTH LDA DELTIM ;WAIT WHILE PRINT HEAD MOVES ADD A ;MULTIPLY DELAY TIME BY 4 ADD A CALL WAIT RET CHKFF: CPI FF ;FORM FEED? JNZ CHKTAB CALL NEWPAG RET CHKTAB: CPI TAB ;SEE IF TAB JNZ CHKLF CALL TABOUT ;SEND BLANKS FOR DUMB PRINTERS RET CHKLF: CPI LF ;LF? END OF LINE JNZ CTLCHR CALL NEWLIN RET CTLCHR: MOV B,A ;IT IS A CONTROL CHR LDA LINLEN ;SEE IF ENOUGH SPACE ON THE MOV C,A ; CURRENT LINE FOR THE LDA CHRCNT ; "ESCAPE" SEQUENCE INR A INR A SUB C CP CRLF MVI A,'^' ;PRINT ^X (WHERE X IS THE CHR) CALL PRTCHR ; TO INDICATE THAT IT IS MOV A,B ; A CONTROL CHR ADI '@' CALL PRTCHR RET ;.............................................................. ; ENTRY CRLF CRLF: MVI A,CR ;SEND CR CALL PRTCHR MVI A,LF ;SEND LF, RESET CHR COUNT, CALL PRTCHR ; TEST FOR END OF PAGE, AND RET ; ALL THAT GOOD STUFF ;.............................................................. ; ENTRY TABOUT TABOUT: MVI A,' ' ;SEND SPACES CALL PRTCHR LDA CHRCNT ;TILL CHRCNT = EVEN ANI 7 ; MULTIPLE OF 8 JNZ TABOUT RET ;.............................................................. ; ; SEND SINGLE CHARACTER WITH ECHO TO SCREEN ; ; VALUES ON ENTRY: ; A REG - CHARACTER TO PRINT AND DISPLAY ; ; DESTROYS: ; E REG ONLY ; ENTRY SEND SEND: PUSH PSW ;SAVE CHAR MOV E,A ;E FOR SERVICE ROUTINE CALL TXSER ;TEST CLEAR-TO-SEND THEN SEND POP PSW ;GET CHAR BACK CALL CO ;DISPLAY IT RET END