.Z80
;
;************************************
;*  SCRCOPY+ VERSION 1.1            *   
;*      (C) 1987 BY MICHAEL LUTZ    *                       
;*                                  *
;* FUER CP/M PLUS  IM SOUND BUFFER  *
;* AUFRUF DURCH			    *
;*          SCRCOPY (Installation)  *
;*          [CTRL] [8] (Hardcopy)   *
;************************************
;
	ORG	0100H
;
ADDR	EQU	0B2B0H	     ; 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	     ; Zeichen vom Bildschirm lesen
GETMODE EQU	0BC17H	     ; Modetest
GETCHAR	EQU	0BB60H	     ; Zeichen vom Bildschirm lesen
GETCUR	EQU	0BB78H	     ; Cursorposition feststellen
SETCUR	EQU	0BB75H	     ; Cursor positionieren
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	'SCRCOPY V1.1 INSTALLED- Use CTRL '
	DEFB	'> 8 < for Texthardcopy'
	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	00000H	     ; Kettungspointer     
EVBLOCK:DEFW	00000H	     ; Kettung Pending Queue 
	DEFB	000H	     ; Counter
	DEFB	081H	     ; Klasse                
	DEFW	CENTRAL      ; Adresse der Routine
;
CENTRAL:LD	A,40	     ; Pruefe 8-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 
;       
SCRCOP:	CALL	GETMODE	     ; Zeilen und Spaltenanzahl feststellen
	CALL	GETCUR	     ; Cursorposition feststellen 
	EX	DE,HL	     ; und in DE speichern
	LD	L,001H	     ; Zeile = 1
SLOOP2:	LD	H,001H	     ; Spalte = 1 
SLOOP1:	PUSH	HL	     ;
	CALL	SETCUR	     ; Cursor setzen
	CALL	GETCHAR	     ; Zeichen vom Bildschirm lesen
	JR	NC,smark1    ;
	CP	07FH	     ; Zeichen druckbar ?
	JR	C,smark2     ;
smark1: LD	A,020H	     ; Falls ungueltig Space ausgeben
smark2: CALL	PRINT        ; Zeichen drucken 
	POP	HL	     ; Zaehlregister vom Stack
	LD	A,B	     ; 
	CP	H	     ; mit maximaler Spaltenanzahl vergleichen
	INC	H	     ; Spalte = Spalte + 1
	JR	NC,SLOOP1    ;          
	LD	A,00DH	     ; CR & LF ausgeben
	CALL	PRINT        ;
	LD	A,00AH	     ;
	CALL	PRINT        ;
	LD	A,C	     ; 
	CP	L	     ; mit maximaler Zeilenanzahl vergleichen
	INC	L	     ; Zeile = Zeile + 1
	JR	NC,SLOOP2     ; 
	EX	DE,HL	     ; alte Cursorposition holen
	CALL	SETCUR	     ; und  restaurieren
ESCRCOP:RET		     ; Ende Texthardcopy
;
PRINT:	CALL	BUSY	     ; UP Drucker bereit und Ausgabe
	JR	C,PRINT	     ;
	CALL	SEND	     ;
	RET		     ;
ENDE:	
.DEPHASE
ENDE1:
	END	INIT	
   ; UP Drucker berei