print " *** FASTOUT .MAX ***" ; ; **** FASTOUT-Routinen f}r Mode 0, 1 und 2 **** ; * * ; * Andreas Dobbertin 21.10.1988 * ; * * ; * Spezial-Version f}r PC International * ; * Andreas Dobbertin 13.02.1989 * ; * * ; ********************************************** ; ; ; ------ >>> Label-Definitionen <<< ---------------- ; crsroff equ #bb84 ;TXT_CUR_OFF getmode equ #bc11 ;SCR_GET_MODE modeclr equ #bc14 ;SCR_MODE_CLEAR ; ; ------ >>> Internationale Sonderzeichen <<< ------ ; fastout defb %00110000 defb %00001100 defb %01111000 defb %00001100 defb %01111100 defb %11001100 defb %01110110 defb %00000000 ; defb %00111000 defb %01000100 defb %00111000 defb %00000000 defb %00000000 defb %00000000 defb %00000000 defb %00000000 ; defb %00000000 defb %00000000 defb %00111100 defb %01100000 defb %01100000 defb %00111110 defb %00000000 defb %00011100 ; defb %00011110 defb %00110000 defb %00111000 defb %01101100 defb %00111000 defb %00011000 defb %11110000 defb %00000000 ; defb %00001100 defb %00110000 defb %00111100 defb %01100110 defb %01111110 defb %01100000 defb %00111100 defb %00000000 ; defb %00110000 defb %00001100 defb %01100110 defb %01100110 defb %01100110 defb %01100110 defb %00111100 defb %00000000 ; defb %00110000 defb %00001100 defb %00111100 defb %01100110 defb %01111110 defb %01100000 defb %00111100 defb %00000000 ; defb %01100110 defb %00000000 defb %00000000 defb %00000000 defb %00000000 defb %00000000 defb %00000000 defb %00000000 ; defb %01100110 defb %00000000 defb %00011000 defb %00111100 defb %01100110 defb %01111110 defb %01100110 defb %00000000 ; defb %01100110 defb %00000000 defb %00111100 defb %01100110 defb %01100110 defb %01100110 defb %00111100 defb %00000000 ; defb %01100110 defb %00000000 defb %01100110 defb %01100110 defb %01100110 defb %01100110 defb %00111100 defb %00000000 ; defb %01100110 defb %00000000 defb %01111000 defb %00001100 defb %01111100 defb %11001100 defb %01110110 defb %00000000 ; defb %00000000 defb %01100110 defb %00000000 defb %00111100 defb %01100110 defb %01100110 defb %00111100 defb %00000000 ; defb %00000000 defb %01100110 defb %00000000 defb %01100110 defb %01100110 defb %01100110 defb %00111110 defb %00000000 ; defb %00111100 defb %01100110 defb %01100110 defb %01101100 defb %01100110 defb %01100110 defb %01101100 defb %01100000 ; defb %00111100 defb %01100110 defb %01100000 defb %11111000 defb %01100000 defb %01100110 defb %11111110 defb %00000000 ; ; ------ >>> Zeichensatz ins RAM kopieren <<< ------ ; movechr di ld bc,(ga_adr) ;Gate-Array Zustand holen res 2,c ;Kernel-ROM einschalten out (c),c ld hl,#3800 ;Den Zeichensatz aus ld de,#4000 ; dem Kernel-ROM nach ld bc,#0800 ; #4000 - #47FF ldir ; kopieren ld bc,(ga_adr) ;Alten Gate-Array Zustand out (c),c ; wieder herstellen ret ; ; ------ >>> Zeichensatz w{hlen <<< ---------------- ; ; Der als Parameter in Register 'C' angegebene ; internationale Zeichensatz wird angew{hlt. ; ; 'C' = 0 amerikanisch ; 'C' = 1 franz|sisch ; 'C' = 2 deutsch ; 'C' = 3 englisch ; setchar ld a,c ;Parameter -> 'C' call movechr ;Amerik. Char-Set -> #4000 and %00000011 ;Amerik. Zeichensatz ? ret z ;Ja, dann fertig ; ld hl,chrset1 ;Dan Anfang der Tabelle srchset cp (hl) ; des gew}nschten inc hl ; Zeichensatz suchen jr nz,srchset ; modify ld a,(hl) ;Zu {ndernden Char -> 'A' cp #04 ;Tabellenende erreicht ? ret c ;Ja, dann fertig ld d,#08 ;Start RAM-Zeichensatz / 8 ld e,a ex de,hl add hl,hl ;Die Adresse der zu add hl,hl ; {ndernden Matrix add hl,hl ; im Zeichensatz ex de,hl ; errechnen -> 'DE' inc hl push hl ;Tabellenzeiger merken ld l,(hl) ;Zeiger auf neue Matrix ld h,fastout/256 ld bc,#0008 ;8 Byte pro Char ldir ;Matrix ersetzen pop hl ;Tabellenzeiger -> 'HL' inc hl ;Zeiger erh|hen und das jr modify ; n{chste Zeichen {ndern ; ; ------ >>> Modifikationstabellen <<< ------------- ; ; Die folgenden Tabellen geben die Abweichungen der ; einzelnen internationalen Zeichens{tze vom Standard ; Zeichensatz (amerikanisch) an. Je zwei Byte sind ; einem Zeichen zugeordnet. Das erste Byte ist der ; ASCII-Wert des zu {ndernden Zeichens, das zweite ; Byte ist das Low-Byte eines Zeigers auf die neue ; Bit-Map. Das High-Byte des Zeigers ist immer #48. ; chrset1 defb #01 defb #40,#00 ;Franz|sisch defb #5b,#08 defb #5c,#10 defb #5d,#18 defb #7b,#20 defb #7c,#28 defb #7d,#30 defb #7e,#38 ; chrset2 defb #02 defb #40,#18 ;Deutsch defb #5b,#40 defb #5c,#48 defb #5d,#50 defb #7b,#58 defb #7c,#60 defb #7d,#68 defb #7e,#70 ; chrset3 defb #03 defb #23,#78 ;Englisch ; defb #00 ;Ende der Tabelle ; ; ------ >>> neue MODE-Routine <<< ----------------- ; newmode call getmode ;Aktuellen Mode holen ld hl,fast_0 ;Zeiger auf MODE 0 Routine jr c,newout ;Springe wenn Mode 0 ld hl,fast_1 ;Zeiger auf MODE 1 Routine jr z,newout ;Springe wenn MODE 1 ld hl,fast_2 ;Zeiger auf MODE 2 Routine newout ld (wr_char+1),hl jp modeclr ; ; ------ >>> neue Ausgabe-Routine <<< -------------- ; sendcrt ld hl,crsrflg ;Zeiger auf CRSRFLG-> 'HL' ld a,(hl) ;Ist der Cursor z.Zt. or a ; sichtbar ? call z,crsroff ;Ja, dann ausschalten ld (hl),#ff ;Cursor-Zustand merken ; patch01 ld hl,#b2b8 ld a,c ;Zeichen -> 'A' cp #20 ;Ist es ein Steuerzeichen? ld a,(hl) ;Parameteranzahl -> 'A' jr c,control ;Springe wenn CTRL-Code or a ;Sind Parameter im Puffer? jr nz,control ;Ja, dann springe ; patch02 ld a,(#b28e) ;VDU-Flag patch03 and a ;Screen disabled ? ret z ;Ja, dann zur}ck push bc ;Zeichen merken call chkcrsr ;Cursorpos. pr}fen pop bc ;Zeichen wieder -> 'C' patch04 ld hl,(#b285) ;Cursorpos. -> 'HL' inc h ;Cursorspalte erh|hen patch05 ld (#b285),hl ;Neue Cursorpos. merken dec h ;Alte Cusorspalte -> 'H' ld a,c ;Zeichen wieder -> 'A' wr_char jp $-$ ;Zur Zeichenausgaberoutine ; control cp #0a ;Schon maximale L{nge ? jr nc,flshbuf ;Dann Puffer l|schen ; inc a ;Anzahl der Zeichen -> 'A' ld b,a ;Anzahl der Zeichen im ld (hl),b ; Puffer erhoehen add a,l ;Aktuelle Puffer- ld l,a ; Adresse -> 'HL' ld (hl),c ;Zeichen in den Puffer patch06 ld a,(#b2b9) ;Das zugeh|rige Steuer- ld e,a ; zeichen -> 'E' ld d,#00 patch07 ld hl,#b2c3 add hl,de add hl,de add hl,de ld a,(hl) ;Zahl der Parameter -> 'A' and #0f ;Zahl isolieren cp b ;Schon genug Parameter ? ret nc ;Nein, dann zur}ck inc hl ;Zeiger auf Zieladresse ld e,(hl) inc hl ld d,(hl) ;Zieladresse -> 'DE' patch08 ld hl,#b2b9 ;Zeiger auf Puffer ld a,c ;Letzter Parameter -> 'A' call jp_tode ;Zieladresse anspringen flshbuf xor a ;Anzahl der Zeichen patch09 ld (#b2b8),a ; im Puffer nullen chkcrsr rst 1,#91ab ;Cursorposition }berpr}fen ; jp_tode rst 1,#8016 ;Zieladresse anspringen ; ; ------ >>> FAST-Routine Mode 2 <<< --------------- ; fast_2 ld b,0 ld c,l ;Zeile -> 'BC' ld d,b ld e,h ;Spalte -> 'DE' ld h,b ;Zeile -> 'HL' add hl,hl add hl,hl add hl,bc add hl,hl add hl,hl add hl,hl ;In HL steht jetzt add hl,hl ; Zeile * 80 add hl,de ;Spalte noch addieren ; patch10 ld bc,(#b1c9) ;Zu dieser Adresse den add hl,bc ; Screen-Offset addieren ex de,hl ;Screen-Adr. -> 'HL' ; ld h,#08 ;Start RAM-Zeichensatz / 8 ld l,a ;Zeichen -> 'L' add hl,hl ; * 2 add hl,hl ; * 4 add hl,hl ; * 8 ; patch11 ld a,(#b290) ld c,a ;Invers-Maske -> 'C' ; patch12 ld a,(#b1cb) ;Screen-Start -> 'A' add a,d and %11000111 ; ; 'HL' zeigt jetzt auf die entsprechende Stelle im ; Zeichensatz, 'AE' zeigt auf die erste Bildschirm- ; speicheradresse und in Register 'C' steht die ; Invers-Maske ( #00 oder #FF ). ; ld b,8 ;8 Bytes pro Zeichen loop_1 ld d,a ;Screenstart-High -> 'D' ld a,(hl) ;Ein Byte holen xor c ld (de),a ;und auf den Bildschirm ld a,d ;'HL' auf die n{chste add a,#08 ; Zeile erh|hen (+ #0800) inc hl djnz loop_1 ;8 Zeilen pro Zeichen ; ret ; ; ------ >>> FAST-Routine Mode 1 <<< --------------- ; fast_1 ld b,0 ld c,l ;Zeile -> 'BC' add hl,hl ld d,b ld e,h ;Spalte * 2 -> 'DE' ld h,b ;Zeile * 2 -> 'HL' add hl,hl add hl,bc add hl,hl add hl,hl add hl,hl ;In HL steht jetzt add hl,hl ; Zeile * 80 add hl,de ;Spalte * 2 addieren ; patch13 ld bc,(#b1c9) ;Zu dieser Adresse den add hl,bc ; Screen-Offset addieren ex de,hl ;Screen-Adr. -> 'DE' ; ld h,#08 ;Start RAM-Zeichensatz / 8 ld l,a ;Zeichen -> 'HL' add hl,hl ; * 2 add hl,hl ; * 4 add hl,hl ; * 8 ; patch14 ld a,(#b1cb) ;Screen-Start -> 'A' add a,d and %11000111 ;Screenstart-High -> 'A' ; ; 'HL' zeigt jetzt auf die entsprechende Stelle im ; Zeichensatz und 'AE' zeigt auf die erste Bild- ; schirmspeicheradresse. ; ld b,8 ;Bytes/Zeichen -> 'B' loop_2 ld d,a ;Screenstart-High -> 'D' push hl ;Zeichensatz-Zeiger merken push bc ld a,(hl) ;Zeichensatz-Byte holen ld hl,selfmod+1 ld (hl),a ; und in 2 H{lften teilen rld ; (2. H{lfte -> PATCH1+1 ) patch15 ld hl,(#b28f) ;PEN & PAPER holen ld b,a ;1.Matrix in 'B' merken cpl and h ;PAPER-Bits setzen ld c,a ;PAPER-Maske in 'C' merken ld a,b ;1.Matrix wieder -> 'A' and l ;PEN-Bits setzen und mit or c ; PAPER-Bits verkn}pfen ld (de),a ;1.Byte auf den Bildschirm inc de selfmod ld a,$-$ ld b,a ;2.Matrix in 'B' merken cpl and h ;PAPER-Bits setzen ld c,a ;PAPER-Maske in 'C' merken ld a,b ;2.Matrix wieder -> 'A' and l ;PEN-Bits setzen und mit or c ; PAPER-Bits verkn}pfen ld (de),a ;2.Byte auf den Bildschirm pop bc ;Schleifenz{hler -> 'B' pop hl ;Zeichensatz-Zeiger wieder inc hl ; holen und erh|hen dec de ld a,d ;'DE' auf die n{chste add a,#08 ; Zeile erh|hen (+ #0800) djnz loop_2 ;8 Zeilen pro Zeichen ; ret ; ; ------ >>> FAST-Routine Mode 0 <<< --------------- ; fast_0 ld b,0 ld c,l ;Zeile -> 'BC' add hl,hl add hl,hl ld d,b ld e,h ;Spalte * 4 -> 'DE' ld h,b ;Zeile * 4 -> 'HL' add hl,bc add hl,hl add hl,hl add hl,hl ;In HL steht jetzt add hl,hl ; Zeile * 80 add hl,de ;Spalte * 4 addieren ; patch16 ld bc,(#b1c9) ;Zu dieser Adresse den add hl,bc ; Screen-Offset addieren ex de,hl ;Screen-Adr. -> 'DE' ; ld h,#08 ;Start RAM-Zeichensatz / 8 ld l,a ;Zeichen -> 'HL' add hl,hl ; * 2 add hl,hl ; * 4 add hl,hl ; * 8 ; patch17 ld a,(#b1cb) ;Screen-Start -> 'A' add a,d and %11000111 ;Screenstart-High -> 'A' ld d,a ;Screenstart-High -> 'D' ; ; 'HL' zeigt jetzt auf die entsprechende Stelle im ; Zeichensatz und 'DE' zeigt auf die erste Bild- ; schirmspeicheradresse. ; ld b,#08 ;Bytes/Zeichen -> 'B' prloop1 push bc ;Schleifenz{hler merken push hl ;Zeichensatz-Zeiger merken ld c,(hl) ;Zeichensatz-Byte -> 'C' scf ;End-Flag setzen prloop2 rl c jr z,xfast_0 sbc a,a ;#00 oder #FF -> 'A' or %01010101 ;#55 oder #FF -> 'A' sla c jr c,patch18 and %10101010 ;#00 oder #AA -> 'A' patch18 ld hl,(#b28f) ;PEN & PAPER holen ld b,a ;Matrix in 'B' merken cpl and h ;PAPER-Bits setzen ld h,a ;PAPER-Bits in 'H' merken ld a,b ;Matrix wieder -> 'A' and l ;PEN-Bits setzen und mit or h ; PAPER-Bits verkn}pfen ld (de),a ;Byte auf den Bildschirm inc de jr prloop2 ; xfast_0 ld hl,#07fc add hl,de ;'DE' auf die n{chste ex de,hl ; Zeile erh|hen (+ #0800) pop hl ;Zeichensatz-Zeiger wieder inc hl ; holen und erh|hen pop bc ;Schleifenz{hler -> 'B' djnz prloop1 ;8 Zeilen pro Zeichen ; ret