.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