.z80
.radix 16
aseg

bank_0	equ	07fc1
bank_1	equ	07fc2
romcall equ     0fdca
txtout  equ	0bb5ah

	org	0100h

        di
	ld	hl,fast_anf
	ld	de,0c000h
	ld	bc,fast_end-fast_dob
	ldir
	push	de
	ld	hl,copy
	ld	bc,copy_end-copy
	ldir
	pop	hl
	call	jphl
	call	romcall
	dw	fast_ini
	jp	0

jphl:	jp	(hl)

copy:	ld	bc,bank_0
	out	(c),c
	ld	a,(ctl_tab+3*019h)
	cp	1
	jr	z,copy_out
	ld	hl,0c000h
	ld	de,fast_dob
	ld	bc,fast_end-fast_dob
	ldir
copy_out:
	ld	bc,bank_1
	out	(c),c
	ret
copy_end:
fast_anf:

fast_dob equ 04900h

	.phase	fast_dob

; **** FASTOUT-Routinen f}r Mode 0, 1 und 2 ****
; *                                            *
; *       Andreas Dobbertin   21.10.1988       *
; *                                            *
; * erweitert mit Routinen von Helmut Tischer  *
; * fuer Darstellung von Textattributen und    *
; * VT52-Emulation                             *
; * 15.12.89 Robert Steindl                    *
; *                                            *
; **********************************************
;

;
; ------ >>>  Label-Definitionen  <<< ----------------
;
getmode equ   0bc11       ;SCR_GET_MODE
modeclr equ   0bc14       ;SCR_MODE_CLEAR

TXT_WIN_ENABLE	EQU	0BB66H
TXT_GET_WINDOW	EQU	0BB69H
TXT_CLEAR_WINDO	EQU	0BB6CH
TXT_SET_COLUMN	EQU	0BB6FH
TXT_SET_CURSOR	EQU	0BB75H
TXT_GET_CURSOR	EQU	0BB78H
SCR_SET_OFFSET	EQU	0BC05H
SCR_GET_LOCATIO	EQU	0BC0BH
SCR_SET_MODE	EQU	0BC0EH
SCR_CHAR_POSITI	EQU	0BC1AH
SCR_NEXT_LINE	EQU	0BC26H
SCR_SOFTWARE_RO	EQU	0BC50H
MC_WAIT_FLYBACK EQU     0BD19H
TXT_DRAW_CURSOR	EQU	0BDCDH
TXT_UNDRAW_CURS	EQU	0BDD0H

ctl_cnt	equ	0b2b8h
akt_ctl	equ	0b2b9h
ctl_tab	equ	0b2c3h
vdu_flg equ	0b28eh
pen_pap	equ	0b28fh
curlin	equ	0b285h
scr_off	equ	0b1c9h
base_hi	equ	0b1cbh
cur_tst	equ	091abh

;
; ------ >>>  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: di
	 nop
	 nop
	 nop
crsrflg: ld    hl,$-$     ;Zeiger auf CRSRFLG-> 'HL'
        ld    a,(hl)      ;Ist der Cursor z.Zt.
        or    a           ; sichtbar ?
        call  z,0bb84     ;Ja, dann ausschalten
        ld    (hl),0ff    ;Cursor-Zustand merken
;
patch01: ld    hl,ctl_cnt ;Zeichen in Control-Buffer
        ld    a,c         ;Zeichen -> 'A'
        cp    020         ;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,(vdu_flg)   ;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,(curlin)  ;Cursorpos. -> 'HL'
        inc   h           ;Cursorspalte erh|hen
patch05: ld    (curlin),hl  ;Neue Cursorpos. merken
        dec   h           ;Alte Cusorspalte -> 'H'
        ld    a,c         ;Zeichen wieder -> 'A'
wr_char: jp    $-$         ;Zur Zeichenausgaberoutine
;
control: cp    00a         ;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,(akt_ctl)   ;Das zugeh|rige Steuer-
        ld    e,a         ; zeichen -> 'E'
        ld    d,000
patch07: ld    hl,ctl_tab
        add   hl,de
        add   hl,de
        add   hl,de
        ld    a,(hl)      ;Zahl der Parameter -> 'A'
        and   00f         ;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,akt_ctl    ;Zeiger auf Puffer
        ld    a,c         ;Letzter Parameter -> 'A'
        call  jp_tode     ;Zieladresse anspringen
flshbuf: xor   a           ;Anzahl der Zeichen
patch09: ld    (ctl_cnt),a   ; im Puffer nullen
chkcrsr: rst   08
         dw    cur_tst     ;Cursorposition }berpr}fen
;
jp_tode: rst   08
         dw    08016     ;Zieladresse anspringen

;
; ------ >>>  FAST-Routine Mode 2  <<< ---------------
;
;Ausgabe erfolgt beschleunigt in durch VIDATT angegebener Darstellung.
;Wahlweise sind deutsche Sonderzeichen m|glich
; Bit 0 -> Durchgestrichen
; Bit 1 -> Invertiert
; Bit 2 -> gerastert (halbhell)
; Bit 3 -> Unterstrichen
; Bit 4 -> Tiefgestellt
; Bit 5 -> Hochgestellt
; Bit 6 -> Fettschrift
; Bit 7 -> Kursiv



;######	Zeichen in A an Spalte H Zeile L anzeigen
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,(scr_off)  ;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
;
patch12: ld    a,(base_hi)   ;Screen-Start -> 'A'
        add   a,d
        and   0c7
	ld	d,a
	ex	de,hl
;
; 'DE' zeigt jetzt auf die entsprechende Stelle im
; Zeichensatz, 'HL' zeigt auf die erste Bildschirm-
; speicheradresse 
;

;######	Zeichen ausgeben DE:= Charaktermatrix, HL:=Screenadresse
;(vidatt): Bit0=Durchgestrichen, Bit1=Invers, Bit2=gerastert
;Bit3=Unterstrichen, Bit4=Tief, Bit5=Hoch, Bit6=Fett, Bit7=Kursiv

	ld a,(vidatt)
	ld c,a		;Video-Attribut
	and 0FDh	;nichts au~er Invers?
	ld a,c
	jp z,tinvers
	push hl

	ex de,hl	;HL := Zeichenmatrix
	ld de,tbuffer	;DE := 8 Byte Puffer
	and 30h
	jr nz,tshift
	ld bc,8		;Matrix f}r weitere Mainpulationen in Puffer
	ldir
	jr tnoshif
tshift:	sub 10h		;Matrix in Puffer und dabei komprimieren
	jr nz,tnotief
	ld (de),a	;Voraussetzung: A = 0
	inc de
	ld (de),a
	inc de
	call tkompr	;Tiefstellen
	jr tnoshif
tnotief:sub 10h
	jr nz,tnohoch
	call tkompr	;Hochstellen
	ld (de),a	;Voraussetzung: A = 0
	inc de
	ld (de),a
	jr tnoshif
tnohoch:xor a
	ld (de),a
	inc de
	call tkompr	;Hoch + Tiefstellen = zentrieren
	ld (de),a
tnoshif:ld a,(vidatt)
	ld c,a

	and 0C0h	;Fett oder Kursiv verwendet?
	ld a,c
	jr z,tnofeku
	add a,a
	jr nc,tnokur
	ld hl,tbuffer	;Kursive Darstellung
	srl (hl)	;3 Rasterzeilen nach rechts rutschen
	inc hl
	srl (hl)
	inc hl
	srl (hl)
	ld hl,tbuffer+6	;3 Rasterzeilen bleiben
	sla (hl)	;2 Rasterzeilen nach links rutschen
	inc hl
	sla (hl)
tnokur:	add a,a
	jr nc,tnofett
	ld hl,tbuffer	;Fettschrift einschalten
	ld b,4
tf2:	ld a,(hl)
	add a,a
	or (hl)
	ld (hl),a
	inc hl
	ld a,(hl)
	add a,a
	or (hl)
	ld (hl),a
	inc hl
	djnz tf2
tnofett:ld a,c

tnofeku:and 09		;Unterstreichen oder Durchstreichen
	jr z,tnoduun
	ld a,0FFh
	bit 0,c
	jr z,tnodu
	ld (tbuffer+3),a	;Durchstreichen
tnodu:	bit 3,c
	jr z,tnoduun
	ld (tbuffer+7),a	;Unterstreichen

tnoduun:bit 2,c
	jr z,tlatt
	ld hl,tbuffer		;Rastern
	ld bc,0455h		;Schleifenz{hler + Raster
tras:	ld a,c
	and (hl)
	ld (hl),a
	inc hl
	ld a,c
	rrca			;Raster invertieren -> Schachbrett
	and (hl)
	ld (hl),a
	inc hl
	djnz tras

tlatt:	pop hl			;HL := Bildschirmadresse
	ld de,tbuffer		;DE := Zeichenmatrix
	ld a,(vidatt)		;A := Invers-Attribut
tinvers:and 02			;Zeichen auf Bildschirm darstellen
	jr z,tpos
	ld a,0FFh
tpos:	ld c,a			;C := Invers-Maske
	ex de,hl		;HL := Tbuffer
	ld a,d			;AE := Bildscirmadresse
	ld b,8			;8 Byte pro Zeichen
tpos2:	ld d,a
	ld a,(hl)
	xor c
	ld (de),a
	ld a,d
	add a,8
	inc hl
	djnz tpos2
	ret

;******	Matrix in Puffer kopieren und dabei komprimieren
tkompr:	ldi
	inc hl
	ldi
	ldi
	inc hl
	ldi
	ldi
	ldi
	ret

tbuffer:ds 8		;8 Bytes Raum f}r aktuelle Zeichenmatrix

;================================================================
;
; ------ >>>  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,(scr_off)  ;Zu dieser Adresse den
        add   hl,bc       ; Screen-Offset addieren
        ex    de,hl       ;Screen-Adr. -> 'DE'
;
        ld    h,008       ;Start RAM-Zeichensatz / 8
        ld    l,a         ;Zeichen -> 'HL'
        add   hl,hl       ; * 2
        add   hl,hl       ; * 4
        add   hl,hl       ; * 8
;
patch14: ld    a,(base_hi)   ;Screen-Start -> 'A'
        add   a,d
        and   0c7h         ;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,(pen_pap)  ;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,008       ; Zeile erh|hen (+ 00800)
        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,(scr_off)  ;Zu dieser Adresse den
        add   hl,bc       ; Screen-Offset addieren
        ex    de,hl       ;Screen-Adr. -> 'DE'
;
        ld    h,008       ;Start RAM-Zeichensatz / 8
        ld    l,a         ;Zeichen -> 'HL'
        add   hl,hl       ; * 2
        add   hl,hl       ; * 4
        add   hl,hl       ; * 8
;
patch17: ld    a,(base_hi)   ;Screen-Start -> 'A'
        add   a,d
        and   0C7h        ;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,008       ;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         ;000 oder 0FF -> 'A'
        or    055h        ;055 oder 0FF -> 'A'
        sla   c
        jr    c,patch18
	and	0aah	  ;0aa oder 000 -> 'A'
patch18: ld    hl,(pen_pap)  ;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,007fc
        add   hl,de       ;'DE' auf die n{chste
        ex    de,hl       ; Zeile erh|hen (+ 00800)
        pop   hl          ;Zeichensatz-Zeiger wieder
        inc   hl          ; holen und erh|hen
        pop   bc          ;Schleifenz{hler -> 'B'
        djnz  prloop1     ;8 Zeilen pro Zeichen
;
        ret

;die wichtigsten Steurzeichen eines Heath/Zenith/VT52-Terminals:
; ESC 'Y' (Zeile+32) (Spalte+32)	;Cursorpositionieren
; ESC 'L'	;Zeile einf}gen und Rest nach unten rollen
; ESC 'M'	;Zeile l|schen und Rest nach oben rollen
; ESC 'q'	;Inverse Darstellung auschalten
; ESC 'p'	;Inverse Darstellung einschalten
; ESC 'K'	;bis zum Zeilenende l|schen
; ESC 'J'	;bis zum Bildschirmende l|schen
; ESC 'E'	;Bildschirm l|schen (+ 24 Zeilen)
; ESC 'H'      	;Cursor Home

; EM (Video-Attribut)	;Zeichendarstellung ausw{hlen
; ESC 'R'	;Unterstreichen einschalten
; ESC 'U'	;Untersrteichen ausschalten
; ESC 'a'	;Schriftarten Master Control (entspricht ^Y)

locbuf:	db 0
vidatt:	db 0

esctst:	inc hl
	ld b,0
	ld a,(hl)		;ESC-Parameter holen
	cp 'Y'	;locate		;?ESC 'Y'
	jp z,curloc		;!dann Cursor positionieren
	cp 'L'	;insline	;ESC 'L'
	jr z,xinsdel		;dann Zeile einf}gen/l|schen B=0 -> einfuegen
	cp 'q'	;ivoff		;ESC 'q'?
	jr z,ivset		;dann Invers ein/aus B=0 -> ein
	dec b
	cp 'M'	;delline	;ESC 'M'
xinsdel:jp z,insdel		;dann Zeile einf}gen/l|schen B=255 -> loeschen
	cp 'p'	;ivon		;ESC 'p'?
	jr z,ivset		;dann Invers ein/aus B=255 -> aus
	cp 'K'	;eraeol		;ESC 'K'?
clrelp:	jp z,$-$
	cp 'J'  ;eraeos		;ESC 'J'?
clresp: jp z,$-$
	cp 'E'	;clrscr		;ESC 'E'
	jr z,clearall
     	cp 'H'  ;home
	jr z,home
	cp 'a'  ;Master Control
	jr z,setvid_2
	cp 'R'  ;ulon
	jr z,ulon
	cp 'U'  ;uloff
	jr z,uloff
	ret

setvid:	inc hl
	ld a,(hl)
	jr pap4

setvid_2:
	ld hl,sendcrt+1
	ld (hl),0c3h
	ld de,do_esc_a
	inc hl
	ld (hl),e
	inc hl
	ld (hl),d
	ret

do_esc_a:
	ld hl,sendcrt+1
	xor a
	ld b,3
do_esc_a_1:
	ld (hl),a
	inc hl
	djnz do_esc_a_1
	ld a,c
	jr pap4

home:   ld hl,0101h
	jp txt_set_cursor

ulon:   ld a,(vidatt)
	or 8			;Bit 3 setzen fuer unterstreichen
	jr pap4

uloff:	ld a,(vidatt)
	and 0f7h		;Bit 3 loeschen
	jr pap4

turn:	ld a,(vidatt)
	xor 02
	jr pap4

ivset:	ld a,b
	jr pap3

pen:	inc hl
	ld a,(hl)
	xor 01
	jr pap2

paper:	inc hl
	ld a,(hl)
pap2:	add a,a
pap3:	and 02
	ld b,a
	ld a,(vidatt)
	and 0FDh
	or b
pap4:	ld (vidatt),a
	ret

clearall:
        jp modeclr

curloc:	ld hl,sendcrt+1
     	ld (hl),0c3h
	inc hl
	ld de,parcnt
	ld (hl),e
	inc hl
	ld (hl),d
        ld hl,locbuf
	ld (hl),0
	ret

parcnt: ld hl,locbuf
	inc (hl)
	dec (hl)
	jr nz,exec
	ld (hl),c
	ret
exec:   ld a,c
	sub 01fh
	ld d,a
	ld a,(hl)
	ld (hl),0
	sub 01fh
	ld e,a
txtoup: ld hl,sendcrt+1
	xor a
	ld b,3
txtoup_2:
	ld (hl),a
	inc hl
	djnz txtoup_2
	ex de,hl
	jp txt_set_cursor


insdel:	call txt_undraw_curs	;Register B gibt scroll-Richtung an
	call txt_get_cursor
	dec l
	ld c,l
	call txt_get_window	;Register BC bleibt unver{ndert
	ld l,c
	xor a			;call txt_get_paper!call scr_ink_encode
	call scr_software_ro
	call txt_draw_cursor
	ld a,1
	jp txt_set_column



;================================================================
.radix 10

;******	Steuerzeichentabelle erweitern:
;Rudiment{re Heath/Zenith-Simulation
fast_ini:
        ld    c,0ffh       ;#FF => BASIC-ROM
        call  0b915h       ;Rechner-Typ ermitteln
        ld    a,h
        cp    01         ;Ist es ein CPC 464 ?
	jr    c,ini_464
	ld    a,(0b763h+3*25)
	jr    f_ini
ini_464:ld a,(ctl_tab+3*25)	;^Y bereits eingetragen?
f_ini:	cp 1
	ret z
;
; ------ >>>  BIOS-Routinen an DOS anpassen  <<< -----
;
; Diese Routine ermittelt die DOS-abh{ngige Adressen,
; an denen der Inhalt von BC' (Gate-Array Zustand),
; der original Interrupt-Entry und das Cursor-Flag
; abgelegt sind und patcht somit DOS-abh{ngig die
; BIOS-Routinen.
;
        ld    hl,(2504h)  ;Warmstart-Adr. -> 'HL'
        inc   hl
	call  ld_hlhl     ;CALL-BIOS (RAM) -> 'HL'
        inc   hl
        call  ld_hlhl     ;CALL-BIOS (ROM) -> 'HL'
search: ld    a,(hl)      ;Die CALL-BIOS Routine im
        inc   hl          ; ROM nach dem Byte #4B
        cp    4bh         ; druchsuchen. Dahinter
        jr    nz,search   ; steht die BC'-Adresse
        inc   hl          ; Adresse ermitteln
        inc   hl          ; in der die original
        inc   hl          ; Interrupt-Entry
        inc   hl          ; Adresse abgelegt
        call  ld_hlhl     ; ist
        inc   hl
        inc   hl
        call  ld_hlhl     ;'HL' zeigt jetzt auf die
        push  hl          ; System-Variable ORIGINT
;        call  ld_hlhl     ;Orig. INT-Entry -> 'HL'
;        ld    (origint+1),hl
;
        pop   de          ;Zeiger auf ORIGINT-> 'DE'
        ld    hl,-0ad3eh
        add   hl,de       ;Pr}fen, ob ORIGINT bei
        ld    a,h         ; #AD3E/F liegt
        or    l
        ld    hl,0003    ;Ja, dann steht das Cursor
        jr    z,cflgadr   ; Flag 3, sonst 4 (X-VDOS)
        inc   l           ; Byte hinter ORIGINT
cflgadr:add   hl,de       ;Zeiger auf CRSRFLG-> 'HL'
        ld    (crsrflg+1),hl
;
;
; ------ >>>  FAST-Routine einbinden  <<< ------------
;
; Der Indirection 'NEWMODE' ab #BDEB wird auf eine
; eigene Routine umgelenkt. Beim n{chsten MODE-Wechsel
; ( im BOOT-Sector ) wird die FAST-Routine aktiviert.
;
     	ld    hl,0a80h		;Dobbertin BIOS-Routinen
do_search:
	ld    a,0b0h		;suchen nach BEB0
search_on:
	cpi
	jr    nz,search_on
	ld    a,0beh		;Highbyte von BEB0
	cp    (hl)		; gefunden ?
	jr    nz,do_search	;nein, dann weitersuchen
	inc   hl
        ld    bc,sendcrt
	ld    (hl),c    	;neue Routine eintragen
        inc   hl
        ld    (hl),b
	ld    de,8
	add    hl,de
	ld    (hl),c
        inc   hl
        ld    (hl),b

        ld    hl,newmode  ;Neue MODE-Routine
        ld    (0bdech),hl  ; einh{ngen
        ld    c,0ffh       ;#FF => BASIC-ROM
        call  0b915h       ;Rechner-Typ ermitteln
        ld    a,h
        cp    01         ;Ist es ein CPC 464 ?
        jr    c,init_on    ;Ja, dann fertig
;
        ld    hl,091a3h    ;CPC 664 Cursor-Validate
        jr    z,cpc_664   ;Springe wenn CPC 664
        ld    l,0a7h       ;CPC 6128 Cursor-Validate
cpc_664:ld    (chkcrsr+1),hl
;
     	ld    hl,0b763h   ;Steuerzeichentabelle
	ld    (init_on+1),hl
        ld    hl,ptchtbl  ;Bei CPC 664/6128 erst die
        ld    de,patch01  ; FAST-Routine angepassen
;
patcher:ld    a,(hl)      ;N{chsten Offset holen
        cp    0ffh        ;Ist schon alles gepatcht?
        jr    z,init_on   ;Ja, dann weiter im Text
        inc   hl
        add   a,e
        ld    e,a
        adc   a,d
        sub   e
        ld    d,a
        ld    bc,0002
        ldir
        jr    patcher


init_on:ld de,ctl_tab		;Adresse Steuerzeichentabelle
	ld hl,3*14
	add hl,de
	ld (hl),1
	inc hl
	ld bc,paper
	ld (hl),c
	inc hl
	ld (hl),b
	ld hl,3*15
	add hl,de
	ld (hl),1
	inc hl
	ld bc,pen
	ld (hl),c
	inc hl
	ld (hl),b
	ld hl,3*24
	add hl,de
	ld (hl),0
	inc hl
	ld bc,turn
	ld (hl),c
	inc hl
	ld (hl),b
	ld hl,3*25		;^Y
	add hl,de
	ld (hl),1
	inc hl
	ld bc,setvid
	ld (hl),c
	inc hl
	ld (hl),b
	ld hl,3*27		;esc
	add hl,de		;HL -> Tabellensatz ESC
	ld (hl),1		;Ein Parameter
	inc hl
	ld bc,esctst		;Adresse der ESC-Routine
	ld (hl),c
	inc hl
	ld (hl),b		;in Tabellensatz eintragen
	ld hl,18*3+1		;Adresse des Pointers auf CLREOL-Routine
	add hl,de
	ld c,(hl)
	inc hl
	ld b,(hl)
	ld (clrelp+1),bc	;alte CLREOL-Routine in Erweiterung Eintragen
	ld hl,20*3+1		;Adresse des Pointers auf CLREOS-Routine
	add hl,de
	ld c,(hl)
	inc hl
	ld b,(hl)
	ld (clresp+1),bc	;alte CLREOS-Routine in Erweiterung eintragen
	call newmode
	call home
	ld hl,message
out_on:	ld a,(hl)
	cp 0ffh
	ret z
	push hl
	call txtout
	pop hl
	inc hl
	jr out_on

message:db	0dh,0ah,'Video-Routinen und VT52-Emulation installiert !'
	db	0dh,0ah,07h,0ffh

ld_hlhl:ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ex	de,hl
	ret
;
; ------ >>>  Patch-Tabelle f}r CPC 664/6128  <<< ----
;
ptchtbl:defb  01
        defw  0b758h
        defb  patch02-patch01-2
        defw  0b72eh
        defb  patch03-patch02-3
        defw  0f8a7h      ;AND A, RET M
        defb  patch04-patch03-1
        defw  0b726h
        defb  patch05-patch04-2
        defw  0b726h
        defb  patch06-patch05-2
        defw  0b759h
        defb  patch07-patch06-2
        defw  0b763h
        defb  patch08-patch07-2
        defw  0b759h
        defb  patch09-patch08-2
        defw  0b758h
        defb  patch10-patch09-1
        defw  0b7c4h
        defb  patch12-patch10-3
        defw  0b7c6h
        defb  patch13-patch12-1
        defw  0b7c4h
        defb  patch14-patch13-3
        defw  0b7c6h
        defb  patch15-patch14-2
        defw  0b72fh
        defb  patch16-patch15-1
        defw  0b7c4h
        defb  patch17-patch16-3
        defw  0b7c6h
        defb  patch18-patch17-2
        defw  0b72fh
;
        defb  0ffh        ;Ende der Patch-Tabelle

fast_end:
	.dephase
	end
