;****************************************************************
; 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