|
|
DataMuseum.dkPresents historical artifacts from the history of: Zilog MCZ Floppy Disks |
This is an automatic "excavation" of a thematic subset of
Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 4575 (0x11df)
Types: TextFile
Names: »PRINTER.S«
└─⟦efdad4bc9⟧ Bits:30006812 8" ZilogMCZ floppy NThun_0014 (OPERATIVSYSTEM DRIVE.0)
└─⟦this⟧ »PRINTER.S«
*H RIO LINE PRINTER DRIVER (CENTRONICS)
;
; CENTRONICS LINE PRINTER DRIVER
; THIS ROUTINE DRIVES THE CENTRONICS
; LINE PRINTER. IT IS CALLED
; WITH A PARAMETER VECTOR POINTED
; TO BY IY.
;
;
; THIS DRIVER SUPPORTS TABS
; AND TRUNCATES LINES LONGER THAN
; THE MAXIMUN LENGTH DETERMINED
; BY (LINLEN)
;
GLOBAL CNTLP
EXTERNAL PRTCNT SYSTEM
EXTERNAL LINVAR
JR CNTLP
DEFM 'DATE:790201.1'
;
;
CNTLP:
LD A,(IY+1) ;INTERPRET REQUEST
CP ASSIGN+2
JP C,LPINIT ;INITIALIZE OR ASSIGN
CP OPEN ;OPEN - JUST RETURN
JP Z,OPCOMP
CP CLOSE ;CLOSE - JUST RETURN
JP Z,OPCOMP
CP WASCII ;WRITE ASCII - PRINT
JR Z,CNT1
CP WBIN ;WRITE BINARY - PRINT
JR Z,CNT1
LD (IY+10),BADOP ;ANYTHING ELSE - BAD REQUEST
RET
CNT1:
LD IX,CURSOR ;INITIALIZE IX
CALL WAITB
LD L,(IY+2); GET DATA ADDRESS
LD H,(IY+3);
LD B,(IY+5); MAXIMUM LINE LENGTH
LD C,(IY+4);
LD A,B
OR C
JP Z,OPCOMP
OUTLP:
LD A,ASCICR ;TERMINATOR CHARACTER
CP (HL);
JR NC,ENDL;
LD (PCHAR),A ;PRINTABLE CHARACTER OUTPUT
INC (IX)
CALL OUTI;
JR NZ,OUTLP
XOR A
LD (PCHAR),A ;SET PRINT CHAR FLAG BACK TO 0
JP OPCOMP ;DONE
ENDL:
JR NZ,ENDL1 ;NOT A CR
CALL OUTI ;OUTPUT CR
EX AF,AF' ;SAVE FLAGS
LD A,(PCHAR) ;HAS A PRINTABLE CHAR BEEN OUTPUT
AND A
JR NZ,NOLF ;YES - DONT OUTPUT LF
CALL WAITB ;WAIT FOR BUSY FLAG
PUSH BC
LD BC,PRTCNT+1 ;GET PORT VALUE
LD A,ASCILF
OUT (C),A
POP BC
CALL STROBE ;STROBE LF
NOLF:
XOR A
LD (IX),A ;RESET CURSOR POSITION
LD (PCHAR),A ;RESET PR CHAR FLAG
EX AF,AF' ;RESTORE FLAG
JR Z,OPCOMP ;BC=0 RETURN
LD A,(IY+1) ;WAS REQUEST ASCII OR BIN
CP WASCII
JP Z,OPCOMP ;ASCII - RETURN
JP NOCR ;BINARY - CONTINUE
ENDL1:
; ***** TAB FEATURE ********
LD A,TAB ;CHECK FOR TAB
CP (HL)
JR NZ,T3 ;NO - OUTPUT CHAR
DEC BC ;DECREMENT ONCE FOR TAB
;DO THE TABBING
EXX ;SAVE WORK REGISTERS
LD DE,(CURSOR)
LD HL,DRUMLBD ;GET DRUM LOWER BOUND
ADD HL,DE ;-> CURRENT POSITION IN DRUM
LD D,H
LD E,L
T1:
CALL WAITB
LD A,20H
PUSH BC
LD BC,PRTCNT+1 ;GET PORT ADDRESS
OUT (C),A ;OUTPUT A SPACE
POP BC
CALL STROBE
INC (IX) ;MOVE THE CURSOR
LD A,(LINLEN) ;IS LINE TOO LONG
SUB (IX)
JR C,T15
INC HL
LD A,(HL) ;DRUM CHARACTER
CP 0 ;IS DRUM CHARACTER A ZERO?
JR Z,T1 ;YES =>LOOP
T15:
;NO => TAB CHARACTER
;EXIT T1 LOOP
EXX
LD A,B
OR C
JR Z,OPCOMP ;RET IF END OF COUNT
INC HL
EX AF,AF'
JP OUTLP
T3:
;****** END OF TAB FEATURE
CALL OUTI ;OUTPUT CHAR
JP Z,OPCOMP ;RETURN IF BC=0;
NOCR:
CALL WAITB ;BINARY - CONTINUE
LD A,ASCICR;
JP OUTLP ;CONTINUE
;
OPCOMP:
LD (IY+10),80H
XOR A
RET
OUTI:
LD A,(HL)
BIT 4,(IY+1) ;ASCII OR BINARY WRITE?
JR NZ,OUTA ;ASCII - DONT CHECK FOR EOF
CP EOF
RET Z
OUTA:
LD D,A ;SAVE A
LD A,(LINLEN) ;MAX LINE LENGTH
SUB (IX)
LD A,D
JR NC,OUTB ;LENGTH OK
CP ASCICR ;TOO LONG - OUTPUT CR
JR NZ,OUTC
OUTB:
PUSH BC
LD BC,PRTCNT+1
OUT (C),A
POP BC
CALL STROBE ;STROBE PRINTER
OUTC:
INC HL
DEC BC
LD A,B
OR C
RET
;
LPINIT:; INITIALIZE PIO FOR LP CONTROL
LD BC,PRTCNT+3
LD A,0FH; SET CHANNEL B TO DATA OUTPUT
OUT (C),A;
LD A,07; SET TO NO INTERRUPT
OUT (C),A;
DEC C
OUT (C),A;
LD A,0CFH; SET CHANNEL A TO CONTROL
OUT (C),A;
LD A,3CH; SET DIRECTION
OUT (C),A;
DEC C
DEC C
LD A,1
OUT (C),A;
SET 1,A ;INPUT PRIME - NOT COMPAT WITH TALLY
OUT (C),A
LD IX,CURSOR ;INITIALIZE
XOR A
LD (IX),A ;TABS
LD (PCHAR),A ;NO PRINTABLE CHARACTERS
PUSH IY ;SAVE RQ VECTOR PTR
LD IY,DRMVEC ;PREPARE TO READ STATUS
CALL SYSTEM ;FROM CONIN
LD A,(IY+10) ;RETURN SAME COMPLETION
POP IY ;
LD (IY+10),A ;
RET ;OPERATION COMPLETE
WAITB:; WAIT FOR BUSY FLAG
PUSH BC
LD BC,PRTCNT
IN A,(C); TEST BUSY FLAG
POP BC
BIT BUSY,A;
JR NZ,WAITB;
RET;
STROBE:
PUSH AF;
LD A,2 ;DROP STROBE LINE
PUSH BC
LD BC,PRTCNT
OUT (C),A;
LD A,3
OUT (C),A;
POP BC
POP AF;
RET;
DRMVEC: DEFB 1 ;CONIN
DEFB 40H;READ STATUS REQUEST
DEFW DRUM
DEFW 139
DEFW 0
DEFW 0
DEFB 0
DEFW 0
ASCICR EQU 0DH
ASCILF EQU 0AH
BUSY EQU 4
STRB EQU 0
BADOP EQU 0C1H
WASCII EQU 10H
WBIN EQU 0EH
OPEN EQU 04H
CLOSE EQU 06H
EOF EQU 0FFH
ASSIGN EQU 02H
TAB EQU 09H
CURSOR DEFW 0
LINWID DEFW LINVAR ;LINE LENGTH FROM EQUATES
LINLEN EQU $-2 ;FILE TRANSFORMED TO BYTE
PCHAR DEFB 0
DRUMLBD EQU $+5
DRUM DEFS 139
END
;
;
;