DataMuseum.dk

Presents historical artifacts from the history of:

Zilog MCZ Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦cd0b6de39⟧ TextFile

    Length: 4575 (0x11df)
    Types: TextFile
    Names: »PRINTER.S«

Derivation

└─⟦efdad4bc9⟧ Bits:30006812 8" ZilogMCZ floppy NThun_0014 (OPERATIVSYSTEM DRIVE.0)
    └─ ⟦this⟧ »PRINTER.S« 

TextFile

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