.Z80
;************************************
;* DINCOPY+ VERSION 1.1             *   
;*     (C) 1987 BY MICHAEL LUTZ     *                       
;*                                  *
;* FUER CP/M PLUS  IM SOUND BUFFER  *                          
;* AUFRUF DURCH                     *
;*          DINCOPY (Installation)  *
;*          [CTRL] [9] (Hardcopy)   *
;************************************
;
	ORG	0100H
;
ADDR	EQU	0b220H	     ; Lage der Routine im Sound Buffer
ADDR1	EQU	0B200H	     ; Lage der Installatiosroutine im Sound Buffer
;
BDOS 	EQU	00005H	     ; Bdos Einsprung
FIRM 	EQU	0FC5AH	     ; Firmware Einsprung
ADDFAST EQU	0BCE3H	     ; New Frame Fly Back
GETKEY 	EQU	0BB1EH	     ; Tastaturabfrage
GRAINIT EQU	0BBBAH	     ; Grafikmodus einschalten
GETPAP 	EQU	0BBE7H	     ; Paperfarbe feststellen
TESTPIX EQU	0BBF0H	     ; Pixeltest am Bildschirm
BUSY 	EQU	0BD2EH	     ; Drucker empfangsbereit?
SEND 	EQU	0BD2BH	     ; Zeichen drucken
;
INIT:
	LD	BC,0001	     ; Bank 1 auf Bank 0
	CALL	0FC57H	     ; Kopieren vorbereiten
	LD	DE,START     ; Quelle auf DE
	LD	BC,ENDE1-START;Laenge auf BC
	LD	HL,ADDR	     ; Ziel   auf HL
	CALL	0FC4BH	     ; Code kopieren
	LD	BC,0001	     ; Bank 1 auf Bank 0
	CALL	0FC57H	     ; Kopieren vorbereiten
	LD	DE,BEGIN     ; Quelle auf DE
	LD	BC,END-BEGIN ; Laenge auf BC
	LD	HL,ADDR1     ; Ziel auf HL
	CALL	0FC4BH	     ; Code kopieren
	CALL	FIRM	     ; Installationsroutine in Bank 0
	DEFW	ADDR1	     ; auf Adresse 0B200H aufrufen
	LD	DE,LOGON$    ; 
	LD	C,009H	     ; 
	CALL	BDOS	     ; Einschaltmeldung ausgeben
	RET		     ; Zurueck ins CP/M
;
LOGON$:	DEFW	00A0DH
	DEFB	'DINCOPY V1.2 INSTALLED - Use CTRL '
	DEFB	'> 9 < for Hardcopy '
	DEFW	00A0DH   
	DEFB	'$'
;
BEGIN:	DI		     ; Interrupts ausschalten
	LD	HL,ADDR	     ; Adresse der einzuhaengenden Routine auf HL
	CALL	ADDFAST	     ; in Fast Ticker einhaengen
	EI		     ; Interrupts wieder zulassen
	RET		     ; zurueck zu Initialisierung in Bank 1
END:
START:
	.PHASE  ADDR
TICKB:	DEFW	0000H
EVBLOCK:DEFW	0000H
	DEFB	00H
	DEFB	81H
	DEFW	CENTRAL
STEUER:	DEFB	00DH,00AH,01BH; CR & LF
	DEFB	041H,007H,01BH; 4/72 Zoll Vorschub
	DEFB	04BH,000H,002H; Doppelte Dichte / 800 Punkte 
;
CENTRAL:LD	A,33	     ; Pruefe 9 Taste
	CALL	GETKEY	     ;
	RET	Z	     ; nein, dann Rueckkehr
	BIT	7,C	     ; Pruefe CTRL Taste
	CALL	NZ,BUSY	     ; Drucker bereit ?
	RET	Z	     ; 
	RET	C	     ; falls nicht, dann Rueckkehr
;
DINCOP:	CALL	GRAINIT	     ; Grafikmodus initialisieren
	CALL	GETPAP	     ; Paperfarbe speichern
	LD	I,A	     ; 
;
	LD	DE,644	     ; x:=644
DMARK1: LD	B,009H	     ; Steuerzeichenfolge an Drucker
	LD	HL,STEUER    ; senden
DLOOP1:	LD	A,(HL)	     ;
	CALL	PRINT        ; 
	INC	HL	     ;
	DJNZ	DLOOP1	     ; 
;
	LD	HL,400	     ; Y:=400
DMARK2: PUSH	DE	     ; X-Hauptposition sichern
	DEC	DE	     ;
	LD	BC,00700H    ; Schleifenzaehler = 7, Transbyte = 0          
;
DMARK3: PUSH	HL	     ; Y-Position sichern
	PUSH	DE	     ; X-Hilfsposition sichern
	PUSH	BC	     ; Schleifenzaehler und Transbyte sichern
	CALL	TESTPIX	     ; Pixeltest 
	POP	BC
	LD	D,A	     ;
	LD	A,I	     ; 
	CP	D	     ; Paper = Pixel ?
	SCF		     ;
	JR	NZ,DMARK4    ; 
	AND	A	     ;
DMARK4: RL	C	     ;
	POP	DE	     ;
	POP	HL	     ;
	DEC	DE	     ; x-hilf:=x-hilf-1
	DJNZ	DMARK3	     ;
;
	LD	A,C	     ;
	CALL	PRINT        ;
	CALL	PRINT        ;
	POP	DE	     ; X-Position holen
	DEC	HL	     ;
	DEC	HL	     ;
	SUB	A	     ; Vergleichsoperation, da 16-Bit
	CP	L	     ; Dekrementierung Flags nicht beeinflusst
	JR	NZ,DMARK2    ; 
	CP	H	     ;
	JR	NZ,DMARK2    ;                
;
	LD	B,112	     ; Fuellbytes ausgeben
DLOOP2:	CALL	PRINT        ;
	DJNZ	DLOOP2	     ;        
;
	LD	B,007H	     ;
DLOOP3:	DEC	DE	     ; X-Position-7
	DJNZ	DLOOP3	     ; 
	CP	E	     ; Vergleichsoperation
	JR	NZ,DMARK1    ; 
	CP	D	     ;
	JR	NZ,DMARK1    ;
;
	LD	A,01BH	     ; Drucker neu initialisieren
	CALL	PRINT        ;
EDINCOP:LD	A,040H	     ;
	CALL	PRINT
	RET
;        
PRINT:	CALL	BUSY	     ; UP Drucker bereit und Ausgabe
	JR	C,PRINT	     ; 
	CALL	SEND	     ;
	RET		     ;
ENDE:	
.DEPHASE
ENDE1:
	END	INIT	     
P Drucker bereit und Ausg