;****************************************************************
;       PROM BASED QUME LINE PRINTER CHARACTER PRINT ROUTINE
;****************************************************************
;
;       THIS ROUTINE IS PUT IN PROM AT 0FA00H BECAUSE THERE
;       WAS NO ROOM FOR IT IN THE BIOS AREA IN TRACK 1 OF
;       A SYSTEM DISK.
;
;       MICHAEL J. KARAS
;       MICRO RESOURCES
;       2468 HANSEN CT.
;       SIMI VALLEY, CA 93065
;       (805) 527-7922
;
;****************************************************************
;
; WRITE A CHARACTER TO QUME PRINTER DEVICE.
;
;
;
;
;SET PARAMETERS FOR ASSEMBLY
;
LENHGT  EQU     132             ;PRINTER LINE LENGTH
QUME1   EQU     31H             ;FIRST DATA PORT
QUME2   EQU     QUME1+2         ;SECOND DATA PORT
;
;
;SET TO BASE OF PROM
;
       ORG     0FA00H
;
;
LIST:
       MOV     A,C     ;GET CHAR PASSED FROM BDOS
       PUSH    H
       PUSH    D
       PUSH    PSW
       CPI     20H     ;IS CHAR A SPACE
       LDA     LPTPOS  ;GET CHAR POS
       JM      CONTCH  ;IF IT'S A CONTROL CHAR, GO
       JZ      QSPACE  ;IF IT'S A SPACE, GO DO IT
       CALL    QMOVE   ;IT'S PRINTABLE, MOVE CARRIAGE
       POP     PSW     ;GET CHAR BACK
       PUSH    PSW
       ADD     A       ;SHIFT CHAR LEFT ONE BIT
       CMA             ;ADJUST FOR ACTIVE LOW DATA
       OUT     QUME1   ;SEND TO LATCH
       CALL    WAIT
       MVI     A,0DFH  ;SET CHAR STROBE
       OUT     QUME2
       ORI     20H
       OUT     QUME2   ;RESET CHAR STROBE
       LDA     LPTPOS  ;GET CURR CHAR POS
       LXI     H,LPTLEN        ;GET ADDR OF LENHGT
       CMP     M       ;END OF CARRIAGE?
       JNZ     ENDQME  ;NO, RETURN
QELN:   MVI     C,0DH   ;YES, DO CR
       CALL    LIST    ;PRINT IT (SORT OF)
       JMP     QLF     ;DO LF
;
CONTCH: POP     PSW     ;GET CHAR
       PUSH    PSW
       CPI     09H     ;IS IT A TAB?
       CZ      QTAB    ;YES, GO
       CPI     0DH     ;IS IT A CR?
       JZ      QCR     ;YES, GO
       CPI     0AH     ;IS IT A LF?
       JZ      QLF     ;YES, GO
       CPI     0CH     ;IS IT A FF?
       JZ      QFF     ;YES, GO
ENDQME: POP     PSW     ;ELSE CLEAR STACK
       POP     D
       POP     H
       RET             ;RETURN TO BDOS
;
QSPACE: INR     A       ;INC CHAR POS
       LXI     H,LPTLEN        ;CHK FOR END OF LINE
       CMP     M
       JZ      QELN    ;IF SO,DO CRLF
       STA     LPTPOS  ;ELSE STORE NEW POS
       LXI     D,000CH ;GET CHAR INCREMENT
       LHLD    QMOV    ;GET MOVE VALUE
       DAD     D       ;ADD CHAR INC TO MOVE VAL
       SHLD    QMOV    ;STORE NEW MOVE VALUE
       JMP     ENDQME
;
QMOVE:  INR     A       ;INC CHAR POS
       STA     LPTPOS  ;STORE IT
       LXI     D,000CH ;GET CHAR INCREMENT
       LHLD    QMOV    ;GET CURRENT MOVE DISTANCE
       DAD     D       ;ADD INC TO MOVE
       XCHG
       LHLD    QPOS    ;GET CURR QUME POS
       DAD     D       ;ADD THIS MOVE TO POSITION
       SHLD    QPOS    ;SAVE IT
QBAK:   CALL    WAIT    ;WAIT FOR BUFFER READY
       MOV     A,E     ;OUTPUT MOVE COMMAND
       CMA
       OUT     QUME1
       MOV     A,D
       CMA
       OUT     QUME2
       XRI     40H     ;SET CARRIAGE STROBE BIT
       OUT     QUME2
       ORI     40H     ;RESET CAR. STROBE BIT
       OUT     QUME2
       LXI     H,0000
       SHLD    QMOV    ;ZERO MOVE COUNTER
       RET
;
QCR:    ;QUME CARRIAGE RETURN
       LHLD    QPOS
       MOV     A,H
       ORI     08H
       MOV     H,A
       XCHG
       CALL    QBAK
       SHLD    QPOS
       MOV     A,H
       STA     LPTPOS
       JMP     ENDQME
;
QLF:    ;QUME LINEFEED
       LXI     H,0010H
       CALL    WAIT
       MOV     A,L
       CMA
       OUT     QUME1
       MOV     A,H
       CMA
       OUT     QUME2
       XRI     80H
       OUT     QUME2
       ORI     80H
       OUT     QUME2
       JMP     ENDQME
;
QFF:    ;QUME FORMFEED
       CALL    WAIT
       MVI     A,0DAH
       OUT     37H
       MVI     A,0FAH
       OUT     37H
       JMP     ENDQME
;
QTAB:   ;QUME TAB
       MVI     C,20H
       CALL    LIST
       LDA     LPTPOS
       ANI     07H
       JNZ     QTAB
       RET
;
WAIT:   ;WAIT FOR QUME BUFFER READY
       IN      35H
       XRI     80H
       ANI     90H
       JZ      WAIT
       RET
;
;
;SETUP BUFFER AREA FOR PLACEMENT OF PRINTER PARAMETERS
;IN TOP OF RAM
;
       ORG     0BFF0H
;
LPTPOS: DB      00      ;CURRENT PRINT POS
LPTLEN: DB      LENHGT  ;CURRENT LINE LENGTH
QMOV:   DW      00      ;CARRIAGE MOVE INCREMENT
QPOS:   DW      00      ;CURRENT CARRIAGE COUNT
;
;       END