; ; "BID" ; ; A bidirectional, logic seeking printer ; driver for use with North Star software. ; ; Written by: Joe Maguire June 1981 ; P. O. Box 3742 DT ; Anchorage, AK 99510 ; ; Notes: ; ; * This listing as shown is tailored for the ; Spinwriter serial printer but by changing the ; TAB codes and the COUT routine it could be ; used for any bidirectional printer which does ; not contain its own "smart" logic. ; * The driver receives characters to be printed ; ; * The driver contains logic which strips all ; unecessary blanks from the line before sending ; it to the printer. TAB codes are substituted ; to position the print head properly. This ; significantly speeds up printing, particularly ; when using low baud rates for communication. ; ORG 0F000H ; WRITE MOV A,B Required for NorthStar PUSH PSW PUSH B PUSH D PUSH H ; ; Check for special keys ; CPI 0DH ;Carriage return? JZ PRINT ;if so CPI 0AH ;Linefeed? JZ LINEF CPI 20H ;Any CTRL characters? JC STFWD ;Set forward print ; PUSH PSW LDA EOLINE INR A STA EOLINE POP PSW W1 LHLD TXTPT MOV M,A INX H MVI M,0 ;Set end mark SHLD TXTPT ;Store buffer ptr ; EXIT POP H ;Get H POP D POP B POP PSW RET ; ; Process the linefeed ; LINEF CALL COUT JMP EXIT ; ; ESCAPE SEQUENCE; MUST PRINT FORWARD ; STFWD STA GRFICS JMP W1 ; ; THIS ROUTINE DETERMINES THE DIRECTION, THE COLUMN, ; AND THE MODE IN WHICH THE PRINT HEAD WILL MOVE ; PRINT LDA GRFICS ORA A JNZ MFWRD LXI H,BUFFER+1 MVI D,0 MVI A,' ' P1 CMP M JNZ P2 INR D INX H JMP P1 P2 MOV A,M ORA A JZ CLRBUF DCX H MVI M,0 MOV A,D STA BOLINE ; LHLD TXTPT LDA EOLINE MOV D,A MVI A,' ' P3 DCX H DCR D CMP M JNZ P4 JMP P3 P4 INX H MVI M,0 MOV A,D STA EOLINE SHLD TXTPT ; ; DETERMINE WHETHER TO PRINT FWRD OR BKWRD ; LDA HDPOS PUSH PSW LXI H,BOLINE SUB M CM ABSVAL MOV B,A INX H POP PSW SUB M CM ABSVAL SUB B JP MFWRD ; ; MOVE BACKWARDS ; MBWRD LDA EOLINE CALL TAB MVI A,1BH CALL COUT MVI A,'<' CALL COUT LDA BOLINE ORA A JZ MB1 DCR A MB1 STA HDPOS LXI D,0FFFFH LHLD TXTPT JMP PRLINE ; ; MOVE FORWARD ; MFWRD LDA BOLINE LXI D,0 MOV E,A CALL TAB MVI A,1BH CALL COUT MVI A,'>' CALL COUT LDA EOLINE INR A STA HDPOS LXI H,BUFFER DAD D LXI D,1 ; ; NOW PRINT THE BUFFER ; PRLINE DAD D MOV A,M ORA A JZ CLRBUF CALL COUT JMP PRLINE ; CLRBUF LXI H,BUFFER+1 SHLD TXTPT XRA A STA EOLINE STA BOLINE STA GRFICS STA BUFFER+1 JMP EXIT ; ; PUT HEAD AT PROPER COLUMN POSITION ; TAB PUSH PSW MVI A,1BH CALL COUT POP PSW PUSH PSW ANI 0E0H RLC RLC RLC ADI 50H CALL COUT POP PSW ANI 1FH ADI 40H CALL COUT RET ; ABSVAL CMA INR A RET ; ; THIS IS THE CHARACTER OUT ROUTINE ; IT CHECKS FOR A SPINTERM BUFFER FULL ; AND IT CHECKS FOR THE UART TBE ; COUT PUSH PSW IN 0F8H ANI 0A0H CPI 0A0H JZ COUT+1 POP PSW OUT 0F9H RET ; ; THE FOLLOWING HAS TO RESIDE IN RAM ; GRFICS DB 0 HDPOS DB 0 BOLINE DB 0 EOLINE DB 0 TXTPT DW BUFFER+1 BUFFER DW 0 ; END ;