LX400   ASM 
;	Centronics-Treiber LX400.KCC
;
;- USER-Kanal 1 (BASIC: #2)
;- Mit Grauwert-Druck
;- f}r KC85/2 bis KC85/4 !
;- verschieblich
;- F}r Modul M021 (Joy+Cen)
;- gleichzeitiger Joystickbetrieb
;  m|glich mit neuem JOYS.KCC
;- Adressen: 0000 04B0 000A
;
;Aufruf:
;-------
;	%LX400	(ohne Ver{nderung)
;	%LX400 p
;
;	mit p=Reaktion auf SHIFT-CLR:
;	0 -> keine Reaktion
;	1 -> Protokollfunktion
;	2 -> Screencopy mit Pseudograf.
;	3 -> Hardcopy klein positiv
;	4 -> Hardcopy klein negativ
;	5 -> Hardcopy s/w positiv
;	6 -> Hardcopy s/w negativ
;	7 -> Hardcopy grau positiv
;	8 -> Hardcopy grau negativ
;
;LX400.ASM		` ml 21.03.93
;---------------------------------------
ARGN	EQU	0B781H
HCADR	EQU	0B799H
STBT	EQU	0B7A2H
CCTL0	EQU	0B7A6H
CCTL1	EQU	0B7A8H
CCTL2	EQU	0B7AAH
CCTL3	EQU	0B7ACH
OUTAB	EQU	0B7B9H
UOUT1	EQU	0B7BEH
VRAM	EQU	0B7CBH
HCPZ	EQU	0B7E1H
PV1	EQU	0F003H
CRT	EQU	00H
UOT1	EQU	02H
WAIT	EQU	14H
ERRM	EQU	19H
MODU	EQU	26H
PADR	EQU	34H
UREL	EQU	0F00FH
;-------
PIOAD	EQU	90H	;PIO A Daten
PIOBD	EQU	91H	;PIO B Daten
PIOAS	EQU	92H	;PIO A Steuer
PIOBS	EQU	93H	;PIO B Steuer
;-------
LF	EQU	0AH
CR	EQU	0DH
ESC	EQU	1BH
;-------
	ORG	0
;
;Initialisierungsdaten PIO-A
;
INTAB:	DB	0CFH	;Bitbetrieb
	DB	7FH	;Bit 7 Ausg.
;
;Initialisierungsdaten PIO-B
;
	DB	0CFH	;Bitbetrieb
	DB	0	;alles Ausg.
	DB	3	;DI
;
	NOP		;frei
;
;Initialisierungswert f}r HCPZ:
;
HCIN:	DB	1	;Protokoll
	;Einstellung:
	;-----------
	;Bit 0	Protokoll ein/aus
	;Bit 1	Screencopy ein/aus
	;Bit 2	Hardcopy ein/aus
	;Bit 3	Zeichen Psedografik/
	;		Druckercode
	;Bit 4	Z.>80H  Druckercode/
	;		Pseudografik
	;Bit 5	mit/ohne Grauwerte
	;Bit 6	Druck positiv/negativ
	;Bit 7	Gro~- / Kleinformat
;
LAST:	DB	0	;letztes Zeich.
;
NULL:	DB	CRT
ZWEI:	DB	UOT1
;-------
START:	LD	HL,HCIN-#-8
	CALL	UREL
	DW	RELAD-#-2
	LD	A,(HL)
	JR	INIT
;-------
	DW	7F7FH
	DB	'LX400'
	DB	1
	LD	A,(ARGN)
	AND	A
	JR	Z,LX4		;0 ARG
	DEC	A
	JR	Z,LX1		;1 ARG
ERR:	CALL	PV1
	DB	ERRM
	RET
LX1:	LD	A,(HCPZ)
	LD	B,18H
	AND	B		;Reset
	LD	B,A		;Option
	LD	A,L		;ARG1
	CP	9
	JR	NC,ERR	;>8 -> ERROR
	AND	A
	JR	Z,LX3	;0 -> keine Fkt.
	SET	0,B
	DEC	A
	JR	Z,LX3	;1 -> Protokoll
	SET	1,B
	DEC	A
	JR	Z,LX3	;2 -> Screencopy
	SET	2,B
	DEC	A
	SRL	A
	JR	NC,LX2
	SET	6,B	;negativ
LX2:	AND	A
	JR	Z,LX3	;3,4 -> HC klein
	SET	7,B	;gro~
	DEC	A
	JR	Z,LX3	;5,6 -> HC s/w
	SET	5,B	;grau
LX3:	LD	A,B
INIT:	LD	(HCPZ),A
LX4:	CALL	UREL		;Pointer
	DW	PTR-#-2		;setzen
	LD	A,(HCPZ)
	BIT	0,A		;aktiv?
	JR	Z,LX5
	LD	HL,HCOPY-#-8
	CALL	UREL
	DW	RELAD-#-2
	LD	(HCADR),HL	;SH-CLR
LX5:	LD	HL,INTAB-#-8
	CALL	UREL
	DW	RELAD-#-2
	DI
	LD	B,2
	LD	C,PIOAS		;Init.
	OTIR			;PIO-A
	LD	B,3
	LD	C,PIOBS		;Init.
	OTIR			;PIO-B
	LD	A,80H		;STROBE
	OUT	(PIOAD),A	;passiv
	EI
	IN	A,(PIOAD)
	BIT	6,A		;BUSY?
	RET	NZ		;ja
	LD	B,6
	CALL	UREL		;Drucker
	DW	PRZK-#-2	;init.
	LD	B,8
	CALL	UREL		;Cancel
	DW	PRZK-#-2
	RET
;-------
;Pointer r}cksetzen, kein Protokoll:
;VR:	HL,DE
;
PTR:	LD	HL,PRINT-#-8
	CALL	UREL
	DW	RELAD-#-2
	LD	(UOUT1),HL
	LD	HL,NULL-#-8	;CRT
	CALL	UREL
	DW	RELAD-#-2
	LD	(OUTAB),HL
	RET
;-------
;Drucken einer Zeichenkette:
;PE:	B	Nummer der Kette
;VR:	HL,DE,B,AF
;
PRZK:	LD	HL,DTAB-#-8
	CALL	UREL
	DW	RELAD-#-2
PRZ1:	LD	A,(HL)
	INC	HL
	CP 	0FFH		;Trennz?
	JR	NZ,PRZ1
	DJNZ	PRZ1
PRZ2:	LD	A,(HL)
	INC	HL
	CP 	0FFH		;Trennz?
	RET	Z
	CALL	UREL
	DW	PRCHR-#-2
	JR	PRZ2
;-------
;Druckerausgabe ein Zeichen:
;
PROTO:	CALL	PV1
	DB	CRT	;erst anzeigen
PRINT:	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL
	LD	L,A
	LD	A,(HCPZ)
	BIT	3,A	;Pseudografik ?
	JR	Z,PRI1	;nein
	LD	A,L
	JR	PRI4
PRI1:	BIT	4,A	;>80H Pseudogr.?
	LD	A,L
	JR	NZ,PRI2	;nein
	CP 	80H
	JR	NC,PRI4		;>7FH
PRI2:	CP 	20H
	JR	C,PRI4		;<20H
	LD	HL,NTAB-#-8
	CALL	UREL
	DW	RELAD-#-2
	LD	B,A
PRI3:	CP 	(HL)
	JR	Z,PRI4	;Pseudografik
	LD	A,(HL)
	INC	HL
	CP 	0
	LD	A,B
	JR	NZ,PRI3
	JR	PRI6	;Druck Zeichen
PRI4:	CP 	20H
	JR	NC,PRI8		;>1FH
	LD	L,A
	LD	A,(STBT)
	BIT	3,A	;ausf}hren ?
	LD	A,L
	JR	NZ,PRI7		;anzeig.
	CP 	9
	JR	NZ,PRI5
	LD	A,20H		;9->20H
	JR	PRI6	;Druck Zeichen
PRI5:	CP	0FH
	JR	NZ,PRI6
	LD	HL,LAST-#-8
	CALL	UREL
	DW	RELAD-#-2
	LD	A,M	;letzt. Zeichen
	CP	ESC
	LD	A,0FH
	JR	Z,PRI6	;ESC+0FH drucken
	POP	AF
	POP	HL
	POP	DE
	POP	BC
	RET
PRI6:	JR	PRI19	;Druck Zeichen
 
;Pseudografikzeichen drucken:
 
PRI7:	CP 	20H
	JR	NC,PRI8		;>1FH
	LD	DE,(CCTL1)
	LD	B,0
	JR	PRI13
PRI8:	CP 	60H
	JR	NC,PRI9		;>5FH
	LD	DE,(CCTL0)
	LD	B,20H
	JR	PRI13
PRI9:	CP 	80H
	JR	NC,PRI10
	LD	DE,(CCTL1)
	LD	B,40H
	JR	PRI13
PRI10:	CP 	0A0H
	JR	NC,PRI11
	LD	DE,(CCTL3)
	LD	B,80H
	JR	PRI13
PRI11:	CP 	0E0H
	JR	NC,PRI12
	LD	DE,(CCTL2)
	LD	B,0A0H
	JR	PRI13
PRI12:	LD	DE,(CCTL3)
	LD	B,0C0H
	JR	PRI13
PRI13:	EX	DE,HL
	LD	DE,8
	SUB	B
	JR	Z,PRI15
PRI14:	ADD	HL,DE
	DEC	A
	JR	NZ,PRI14
PRI15:	LD	DE,0B700H
	LD	BC,8
	LDIR
	LD	B,4		;Init.
	CALL	UREL		;Pseudo-
	DW	PRZK-#-2
	LD	L,80H
PRI16:	LD	DE,0B700H
	LD	B,0
PRI17:	LD	A,(DE)
	AND	L
	JR	Z,PRI18
	SCF
PRI18:	RL 	B
	INC	DE
	LD	A,8
	CP 	E
	JR	NZ,PRI17
	LD	A,B
	CALL	UREL
	DW	PRCHR-#-2
	RRC	L
	BIT	7,L
	JR	Z,PRI16
	XOR	A
PRI19:	CALL	UREL
	DW	PRCHR-#-2
	POP	HL
	POP	DE
	POP	BC
	POP	AF
	RET
;-------
;Ausgabe ein Zeichen zum M021:
;PE:	A	Code
;VR:	-
;
PRCHR:	PUSH	HL
	PUSH	DE
	PUSH	BC
	PUSH	AF
PRC1:	IN	A,(PIOAD)
	BIT	6,A		;BUSY?
	JR	Z,PRC2		;nein
	LD	A,(HCADR+1)
	CP 	80H		;IRM?
	JR	C,PRC1		;nein
	LD	A,1
	CALL	PV1
	DB	WAIT
	JR	PRC1
PRC2:	POP	AF
	PUSH	AF
	OUT	(PIOBD),A	;Zeichen
	LD	HL,LAST-#-8
	CALL	UREL
	DW	RELAD-#-2
	LD	M,A    ;letzt. Zeichen
	XOR	A
	OUT	(PIOAD),A	;STROBE-
	LD	A,80H
	OUT	(PIOAD),A	;Impuls
	POP	AF
	POP	BC
	POP	DE
	POP	HL
	RET
;-------
;Aufruf durch SHIFT-CLR:
;
HCOPY:	PUSH	HL
	PUSH	DE
	PUSH	BC
	PUSH	AF
	EX	AF,AF'
	PUSH	AF
	LD	A,(HCPZ)
	BIT	0,A
	JR	Z,END1B
	BIT	1,A
	JR	NZ,COPY
;-------
;Protokollfunktion:
;
	LD	HL,(OUTAB)
	XOR	A
	OR	(HL)
	JR	Z,PON		;-> ein
	CALL	UREL
	DW	PTR-#-2		;-> aus
	JR	END1B
PON:	LD	HL,PROTO-#-8
	CALL	UREL
	DW	RELAD-#-2
	PUSH	HL
	LD	HL,ZWEI-RX
	CALL	UREL
	DW	RELAD-#-2
RX:	POP	DE
	LD	(UOUT1),DE
	LD	(OUTAB),HL
END1B:	JR	END1
COPY:	BIT	2,A
	JR	NZ,HCPY	;Hardcopy
;-------
;Screencopy:
;
	LD	A,(STBT)
	SET	3,A
	LD	(STBT),A
	LD	HL,0
	LD	D,0E0H
	PUSH	DE
	CALL	PV1
	DB	PADR
	POP	AF
	CP 	D
	LD	HL,0B200H	;KC85/3
	JR	NZ,SCR1
	LD	HL,(VRAM)	;KC85/4
SCR1:	LD	B,20H		;Zeilen
SCR2:	LD	C,28H		;Spalten
SCR3:	LD	A,(HL)
	INC	HL
	AND	A
	JR	NZ,SCR4		;00H
	LD	A,20H
SCR4:	CALL	UREL
	DW	PRINT-#-2
	DEC	C
	JR	NZ,SCR3
	PUSH	BC
	PUSH	HL
	LD	B,3
	CALL	UREL		;CR,LF
	DW	PRZK-#-2
	POP	HL
	POP	BC
	LD	A,(IX+13)	;Taste
	CP 	3		;BRK?
	JR	Z,SCR5
	DJNZ	SCR2
SCR5:	LD	A,(STBT)
	RES	3,A
	LD	(STBT),A
END2:	LD	B,6
	CALL	UREL		;Drucker
	DW	PRZK-#-2
END1:	POP	AF
	EX	AF,AF'
	POP	AF
	POP	BC
	POP	DE
	POP	HL
	RET
HCPY:	BIT	7,A
	JR	NZ,HCGR1	;gro~
;-------
;Hardcopy klein:
;
	LD	H,0	;Pixelzeile 0
HCK1:	PUSH	HL
	LD	B,2
	CALL	UREL
	DW	PRZK-#-2
	LD	B,7
	CALL	UREL
	DW	PRZK-#-2
	POP	HL
	LD	L,0	;Spalte 0
	JR	HCK2
END2B:	JR	END2
HCGR1:	JR	HCGR2
HCK2:	LD	B,8
	PUSH	HL
	LD	DE,0B700H
HCK3:	PUSH	HL
	PUSH	DE
	LD	D,0E0H
	CALL	PV1
	DB	PADR	;Berechnen Padr.
	LD	E,(HL)
	LD	A,D
	CP	0E0H
	JR	NZ,HCK4	;kein KC85/4
	BIT	3,(IX+1)
	JR	NZ,HCK4	;kein hi-res
	LD	A,(IX+1)
	OR	2
	OUT	84H,A	;Pixel
	LD	A,(HL)
	OR	E
	LD	E,A
	LD	A,(IX+1)
	OUT	84H,A	;original
HCK4:	LD	A,E
	POP	DE
	LD	(DE),A
	INC	DE
	POP	HL
	INC	H	;+1 Pixelzeile
	DJNZ	HCK3
	LD	C,8
HCK5:	LD	B,8
	LD	HL,0B700H
HCK6:	RL	(HL)
	RLA
	INC	HL
	DJNZ	HCK6	;Wandlung
	LD	HL,HCPZ
	BIT	6,(HL)	;negativ?
	JR	Z,HCK7
	CPL
HCK7:	CALL	UREL
	DW	PRCHR-#-2	;Druck Z
	DEC	C
	JR	NZ,HCK5
	POP	HL
	INC	L	;+1 Spalte
	LD	A,28H
	CP	L	;Zeilenende ?
	JR	NZ,HCK2
	LD	A,(IX+13)
	CP	3	;Taste BRK ?
	JR	Z,HCK8
	LD	A,H
	ADD	8	;+8 Pixelzeilen
	LD	H,A
	JR	NC,HCK1
HCK8:	LD	B,3
	CALL	UREL
	DW	PRZK-#-2
END2C:	JR	END2B
;-------
;Hardcopy gro~:
;
HCGR2:	LD	B,5		;Drucker
	CALL	UREL		;init.
	DW	PRZK-#-2
	LD	(IX+0),33H
	LD	E,0
HCG1:	LD	D,0FFH
	PUSH	DE
	LD	B,1		;Drucker
	CALL	UREL		;Grafik
	DW	PRZK-#-2
	POP	DE
HCG2:	PUSH	DE
	EX	DE,HL
	LD	D,0E0H
	SRL	L
	EX	AF,AF'
	CALL	PV1
	DB	PADR
	PUSH	DE
	CALL	UREL
	DW	PIX-#-2
	POP	DE
	LD	C,A
	LD	A,(HCPZ)
	BIT	5,A		;grau?
	LD	A,D
	JR	NZ,HCG5
	CP 	0E0H		;KC85/4?
	JR	NZ,HCG3
	BIT	3,(IX+1)	;hi-res?
	JR	NZ,HCG3
	LD	A,(IX+1)
	OR	2
	OUT	84H,A		;Pixel
	PUSH	BC
	CALL	UREL
	DW	PIX-#-2
	POP	BC
	PUSH	AF
	LD	A,(IX+1)
	OUT	84H,A		;origin.
	POP	AF
	OR	C
	LD	C,A
HCG3:	LD	A,(HCPZ)
	BIT	6,A		;invers?
	LD	A,C
	JR	Z,HCG4
	CPL
HCG4:	LD	E,A
	JR	HCG10B
END2D:	JR	END2C
HCG5:	CP 	0E0H		;KC85/4?
	LD	A,(DE)
	LD	B,A
	JR	NZ,HCG8		;KC85/3
	LD	A,(IX+1)
	OR	2		;Pixel
	OUT	84H,A
	AND	8
	JR	NZ,HCG7		;hi-res?
	PUSH	BC
	CALL	UREL
	DW	PIX-#-2
	POP	BC
	LD	E,A
	LD	A,(IX+1)
	OUT	84H,A		;origin.
	LD	A,55H
	AND	E
	PUSH	AF
	LD	A,0AAH
	AND	C
	LD	C,A
	POP	AF
	JR	HCG6
HCG1B:	JR	HCG1
HCG2B:	JR	HCG2
HCG6:	OR	C
	LD	C,A
	LD	A,(HCPZ)
	BIT	6,A		;posit.?
	LD	A,C
	JR	NZ,HCG10
	CPL
	PUSH	AF
	LD	A,E
	CPL
	LD	E,A
	POP	AF
HCG10B:	JR	HCG10
HCG7:	LD	B,(HL)
	LD	A,(IX+1)
	OUT	84H,A		;origin.
	JR	HCG8
END2E:	JR	END2D
HCG1C:	JR	HCG1B
HCG8:	LD	A,(HCPZ)
	BIT	6,A
	LD	A,B
	JR	Z,HCG9
	CPL
HCG9:	LD	B,A
	LD	HL,CTAB-#-8
	CALL	UREL
	DW	RELAD-#-2
	EX	DE,HL
	AND	7
	ADD	A
	ADD	A
	RRC	(IX)
	LD	H,0
	LD	L,A
	ADC	HL,DE
	PUSH	HL
	LD	A,B
	AND	38H
	RRCA
	RRC	(IX)
	LD	H,0
	LD	L,A
	ADC	HL,DE
	LD	A,C
	AND	(HL)
	LD	E,A
	INC	HL
	INC	HL
	LD	A,C
	AND	(HL)
	LD	D,A
	POP	HL
	LD	A,C
	CPL
	AND	(HL)
	OR	E
	LD	E,A
	INC	HL
	INC	HL
	LD	A,C
	CPL
	AND	(HL)
	OR	D
HCG10:	PUSH	AF
	LD	A,E
	CALL	UREL		;Druck
	DW	PRCHR-#-2
	POP	AF
	CALL	UREL		;Druck
	DW	PRCHR-#-2
	POP	DE
	XOR	A
	CP 	D
	JR	NC,HCG11
	DEC	D
	JR	HCG2B
HCG11:	LD	B,2
	PUSH	DE
	CALL	UREL
	DW	PRZK-#-2
	POP	DE
	INC	E
	LD	A,4FH
	CP 	E
	JR	C,END2E
	LD	A,(IX+13)	;Taste
	CP 	3		;BRK?
	JR	NZ,HCG1C
	JR	END2E
;-------
;Pixel zum Ausdruck vorbereiten:
;
PIX:	EX	AF,AF'
	JR	C,PIX1
	RLD
	LD	C,A
	RRD
	JR	PIX2
PIX1:	RRD
	LD	C,A
	RLD
PIX2:	EX	AF,AF'
	LD	B,4
PIX3:	RR 	C
	RRA
	SRA	A
	DJNZ	PIX3
	RET
;-------
;rel. Adresse berechnen:
;PE:	HL	rel. Adresse
;PA:	HL	abs. Adresse
;VR:	HL,DE
;
RELAD:	POP	DE	;rel. Adresse
	PUSH	DE	;berechnen
	ADD	HL,DE
	RET
;-------
	DS	450H-$	;frei
;-------
;Farbrastertabelle:
;
CTAB:	DW	0FFFFH	;Schwarz
	DW	0FFFFH
	DW	0BBEEH	;Blau
	DW	0FFFFH
	DW	0AAAAH	;Rot
	DW	077DDH
	DW	05555H	;Purpur
	DW	0AAAAH
	DW	0AAAAH	;Gr}n
	DW	01144H
	DW	0AAAAH	;T}rkis
	DW	00000H
	DW	02288H	;Gelb
	DW	00000H
	DW	00000H	;Wei~
	DW	00000H
;-------
;Druckersteuerzeichenfolgen:
;
DTAB:	DB	0FFH	;Trennzeichen
	DB	ESC
	DB	'*'	;Grafik
	DB	5	;72 Punkte/"
	DB	0	;512 Sprossen
	DB	2	;(Hardcopy gr.)
;2
	DB	0FFH	;Trennzeichen
	DB	CR	;neue Grafik-
	DB	ESC	;Zeile
	DB	'J'	;Zeilenvorsch.
	DB	24	;24/216"
;3
	DB	0FFH	;Trennzeichen
	DB	CR	;neue Text-
	DB	LF	;Zeile
;4
	DB	0FFH	;Trennzeichen
	DB	ESC
	DB	'*'	;Grafik
	DB	6	;90 Punkte/"
	DB	9	;9 Sprossen
	DB	0	;(Pseudogr.)
;5
	DB	0FFH	;Trennzeichen
	DB	ESC
	DB	'@'	;Druckerinit.
;6
	DB	0FFH	;Trennzeichen
	DB	ESC
	DB	'@'	;Druckerinit.
	DB	ESC
	DB	'l'	;linker Rand:
	DB	10	;10 Zeichen
	DB	ESC
	DB	'R'	;Zeichensatz
	DB	2	;deutsch
;7
	DB	0FFH	;Trennzeichen
	DB	ESC
	DB	'*'	;Grafik
	DB	5	;72 Punkte/"
	DB	64	;320 Sprossen
	DB	1	;(Hardcopy kl.)
;8
	DB	0FFH	;Trennzeichen
	DB	18H	;Cancel
	DB	7	;Bell
;
	DB	0FFH	;Trennzeichen
;-------
	DS	4A0H-$	;frei
;-------
;Tabelle der nicht im Druckerzeichen-
;satz enthaltenen Zeichen:
;
NTAB:	DB	'@'	;40H
	DB	'['	;5BH
	DB	'\'	;5CH
	DB	']'	;5DH
	DB	'`'	;60H
	DB	''	;7FH
	DB	0	;Abschlu~
;----------------------
	DS	4B0H-$	;frei
 
NTA5BH
	DB	'\'	;5CH
	DB	']'	;5DH
	DB	'`'	;60H
	DB	''	;7FH
	DB	0	;Abschlu~
;----------------------
	DS	4B0H-$	;frei
 
NTA