	.Z80
	aseg
	
wboot	equ	0000h		; Warmbooteinsprung
biosad	equ	wboot+1		; Adresse des BIOS+3
bdos	equ	0005h		; BDOS-Einsprung
conio	equ	06h		; BDOS-Funktion DIREKT I/O
printer	equ	05h		; BDOS-Funktion Druckerausgabe
strout	equ	09h		; BDOS-Funktion Stringausgabe
prstat	equ	0Fh		; BIOS-Funktion Druckerstatus
input	equ	0FFh		; Wert f}r Eingabe bei DIREKT I/O
text	equ	0080h		; Puffer f}r Eingabezeile

null	equ	00h		; Darstellung von ASCII-
backsp	equ	08h		; Zeichen und Steuerzeichen
tab	equ	09h		; f}r den Drucker und den
lf	equ	0Ah		; Bildschirm
cr	equ	0Dh		; Au~erdem Pr}fgrenzen f}r
esc	equ	1Bh		; die Eingabe von
blank	equ	20h		; Werten }ber die Tastatur.
del	equ	7Fh
chrset	equ	'R'		; Drucker: Zeichensatz w{hlen
deutsch	equ	02h		; Drucker: Wert f}r den deutschen
length	equ	'C'		; Drucker: Papierl{nge angeben

	org	0100H

	ld	hl,text		; Parameteradresse laden
	ld	a,(hl)		; Parameterl{nge holen
	or	a		; Zeichensatznr. angegeben?
	ld	a,deutsch	; deutschen annehmen
	jr	z,german	; wenn nicht dann deutsch
nospc:	inc	hl		; sonst Blanks und
	ld	a,(hl)		; Tabs }berlesen
	cp	tab		; ist es ein Tabulatorschritt
	jr	z,nospc		; dann }berlesen
	cp	blank		; sonst auf Blank pr}fen
	jr	z,nospc		; und auch diese }berlesen
	sub	'0'		; Wert korrigieren 0 <= x <= 8
	jr	c,fehler	; Wert < '0' dann Fehler
	cp	9		; Wert > '8'?
	jr	nc,fehler	; dann Fehler
german:	ld	(text),a	; Wert retten
	call	busy		; Drucker bereit?
	ld	e,esc		; Steuercode vorbereiten
	call	drucke		; und auf Drucker ausgeben
	ld	e,chrset	; Internationalen Zeichensatz
	call	drucke		; auf Drucker selektieren
	ld	a,(text)	; Wert holen
	ld	e,a		; und zur Selektion auf
	call	drucke		; Drucker ausgeben
	ld	e,esc		; Steuercode vorbereiten
	call	drucke		; und auf Drucker ausgeben
	ld	e,length	; zum Setzen der Papierl{nge
	call	drucke		; Steuercode ausgeben
	ld	e,null		; zum setzen in Zoll/Inch
	call	drucke		; auf Drucker ausgeben
	ld	e,12		; 12 Zoll Papier
	call	drucke		; und ausgeben
	ld	de,text1	; ersten Text
	ld	c,strout	; der Meldung
	call	bdos		; ausgeben
	ld	a,(text)	; Zeichensatznr. holen
	ld	hl,text2	; Bezeichnungen der Zeichens{tze
	or	a		; erster Zeichensatz?
	jr	z,ausgab	; dann ausgeben
	ld	b,a		; Schleifenwert laden
noend:	ld	a,(hl)		; Zeichen holen
	inc	hl		; Zeiger erh|hen
	cp	'$'		; ist es das Ende des Textes?
	jr	nz,noend	; nein, dann weitersuchen
	djnz	noend		; sooft wie f}r richtigen Text n|tig
ausgab:	ex	de,hl		; Adresse --> DE
	ld	c,strout	; damit der Text ausgegeben
	call	bdos		; werden kann
	ld	de,text3	; letzten Text adressieren,
	ld	c,strout	; auch diesen ausgeben
	jp	bdos		; und zur}ck zum CCP

bios:	push	de		; DE retten f}r allg.
	dec	a		; Funktionnr. erniedrigen wg. WBOOT
	ld	e,a		; BIOS-Routine
	ld	d,0		; BIOS-Funktionsnr. nach DE
	ld	hl,(biosad)	; BIOS-Adresse nach HL
	add	hl,de		; BIOS-Funktionsnummer
	add	hl,de		; mit drei multiplizieren
	add	hl,de		; und zu HL addieren
	pop	de		; DE holen, da m|gl. Parameter
	jp	(hl)		; ins BIOS springen

fehler:	ld	de,errtxt	; Fehlertext
	ld	c,strout	; als Meldung
	jp	bdos		; ausgeben und Return

drucke:	ld	c,printer	; Druckerroutine
	jp	bdos		; ansprechen und E drucken

busy:	push	hl		; erst mal alle Register
	push	de		; HL, DE, BC und AF
	push	bc		; auf den Stack
	push	af		; retten
warte:	ld	a,prstat	; Druckerstatus
	call	bios		; }ber BIOS abfragen
	or	a		; war Drucker bereit?
	push	af		; Druckerstatus retten
	call	z,isbusy	; Meldung ausgeben
	pop	af		; Druckerstatus holen
	jr	z,warte		; war nicht bereit dann warten
	pop	af		; jetzt wieder alle Register
	pop	bc		; AF, BC, DE und HL
	pop	de		; vom Stack
	pop	hl		; holen
	ret			; Drucker bereit, R}ckkehr

isbusy:	ld	de,drkerr	; Fehlertext f}r Drucker
	ld	c,strout	; als Meldung
	call	bdos		; ausgeben
antw:	ld	c,conio		; direkte Ein-/Ausgabe
	ld	e,backsp	; Cursor ein Schritt zur}ck
	call	bdos		; auf dem Bildschirm
	call	getkey		; Zeichen von Tastatur einlesen
	push	af		; Zeichen merken
	ld	c,conio		; sonst Zeichen mit
	ld	e,a		; direkter Ein-/Ausgabe
	call	bdos		; }ber BDOS ausgeben
	pop	af		; Zeichen wieder holen
	and	5fh		; nur Gro~buchstaben
	cp	'N'		; keine Wiederholung?
	jp	z,wboot		; bei keiner Wdh. WBOOT
	cp	'J'		; Wiederholung gew}nscht?
	jr	nz,antw		; sonst neue Eingabe
	ld	de,crlf		; neue Zeile anw{hlen
	ld	c,strout	; als Meldung
	jp	bdos		; }ber BDOS ausgeben und zur}ck

getkey:	ld	c,conio		; direkte Ein-/Ausgabe
	ld	e,input		; f}r Zeichen einlesen
	call	bdos		; von der Tastatur
	or	a		; kein Zeichen erhalten?
	jr	z,getkey	; dann weiter versuchen
	cp	blank		; wenn Steuerzeichen, dann
	jr	c,getkey	; weiter versuchen
	cp	del		; Zeichen gr|~er 7EH?
	jr	nc,getkey	; dann weiter versuchen
	ret			; sonst o.k., R}ckkehr

errtxt:	db	'Parameterfehler!',cr,lf
	db	'Routine nur ohne bzw. mit Werten zwischen 0 und 8 aufrufen!'
crlf:	db	cr,lf,'$'
drkerr:	db	'Der Drucker ist nicht bereit, weiter versuchen (J/N)?  $'
text1:	db	cr,lf,'Der Drucker ist nun auf den $'
text2:	db	'amerikanischen ASCII-$'
	db	'franzoesischen $'
	db	'deutschen $'
	db	'englischen ASCII-$'
	db	'daenischen $'
	db	'schwedischen $'
	db	'italienischen $'
	db	'spanischen $'
	db	'japanischen $'
text3:	db	'Zeichensatz eingestellt',cr,lf
	db	'und verarbeitet 12 Zoll Papier (72 Zeilen).',cr,lf,'$'

	end
