.pl72
.po8
;**************************************************************
; CONSOLAUSGABE
;**************************************************************

CONOUT:
	sspd	consp
	lxi	sp,constk
	push	psw
	lda @cbnk 
	sta conoubnk
	xra a
	call ?bnksl
	lhld	curs
	lda	curmer
	ora	a
	JRNZ	NOCLR		; --> Cursor war nicht gesetzt
	mov	a,m
	xri	80h		; Ruecksetzen Cursor
	mov	m,a
noclr:
	lda	farmer
	ora	a
	jnz	faraus
	LDA	ESCMER		; WAR ESC-FOLGE ?
	ORA	A
	JRZ	NOESC		; -> NEIN
	DCR	A
	STA	ESCMER
	JRZ	ESC2		; -> 2.BYTE DER ESC-FOLGE
	LXI	H,babanf		; BEHANDLUNG 1.BYTE DER ESC-FO.
	MOV	A,C		; ALS ZEILENANGABE
	ANI	7FH
	ORA	A
	JRZ	SETCUR
	CPI	18H
	JRC	ESC11
	LXI	H,babanf
	JR	SETCUR
ESC11:	MOV	B,A
	LXI	D,00a0H
ESC12:	DAD	D
	DJNZ	ESC12
	JR	SETCUR
ESC2:	MOV	A,C		; BEHANDLUNG 2.BYTE DER ESC-FO.
	ANI	7FH		; ALS SPALTENANGABE
	CPI	50H
	LXI	D,009eH
	JRNC	ESC22
ESC21:	add	a
	MOV	E,A
ESC22:	DAD	D
	JR	SETCUR
NOESC:
	MOV	A,C		; AUSWERTUNG STEUERZEICHEN
	cpi	0c0h
	jrc	nospez
	cpi	0e0h
	jrnc	nospez
	ani	1fh
	jr	zeiums1
nospez:Š	CPI	7FH
	jrnc	crtcrtl
	CPI	20H
	JRC	CRTCRTL
CRTZEI:
	mov	b,a
	lda	zeisat
	ora	a
	jrz	noums
	mov	a,b
	cpi	7eh
	jrz	zeiums
	ani	0dfh
	cpi	5bh
	jrc	noums
	cpi	5eh
	jrnc	noums
zeiums:
	ani	1fh
	bit	5,b
	jrnz	zeiums1
	sui	3
zeiums1:
	mov	b,a
noums:
eizeium:
	mvi	c,0ffh
	mvi	a,0ffh
	sta	eizeium+1
	lda	invmer
	ora	b	
	ana	c
	MOV	c,A		; ZEICHEN AUF BILDSCHIRM
	lda	csfabr
	mov	b,a
	shld	cur$pos
	sbcd	0
cur$pos equ $-2
	CALL	CRTCRI
;
SETCUR:
	lda	curmer
	ora	a
	jrnz	noset		; --> Cursor nicht setzen
	mov	a,m
	xri	80h		; Setzen Cursor
	mov	m,a
noset:
	SHLD	CURS		; Cursorposition merken

	mvi	a,1
	sta	babstr
	lda conoubnk
	call ?bnksl
	POP	PSW
	lspd	consp
	RET

;**************************************************************
; Vereinbarungen
;**************************************************************Š

dma	equ	43h
dmaadr	equ	45h
dmastr	equ	44h

;
CRTCRTL:			; STEUERZEICHEN AUSWERTEN
	lxi	d,setcur
	push	d
	cpi	7fh
	jz	crtdch
	CPI	0DH
	JZ	CRTCR
	CPI	0AH
	JZ	CRTLF
	CPI	15H
	JZ	CRTCRI
	CPI	08H
	JZ	CRTCLE
	CPI	0CH
	JZ	CRTFF
	CPI	01H
	JZ	CRTHOM
	CPI	14H
	JZ	CRTDRB
	CPI	18H
	JZ	CRTDZE
	CPI	16H
	JZ	CRTDCZ
	CPI	1AH
	JZ	CRTCHO
	CPI	1BH
	JZ	CRTESC
	cpi	82h
	jz	curson
	cpi	83h
	jz	cursof
	cpi	84h
	jz	inveon
	cpi	85h
	jz	inveof
	cpi	8fh
	jz	farein
	cpi	0f0h
	jz	ascii
	cpi	0f1h
	jz	ascii
	cpi	0f2h
	jz	german
	cpi	0f3h
	jz	german
	cpi	08eh
	jz	eizeis
	cpi	7
	jz	bell
	ret
;	pop	d
;	JMP	SETCUR
CRTDCH:	mvi	m,' '		; DEL
CRTCLE:	DCX	H		; BACKSPACEŠ	dcx	h
	MOV	A,H
	cpi high(babanf-0100h)
;	CPI	0efh
	RNZ
	INX	H
	inx	h
	RET
CRTFF:	LXI	H,babanf		; FORM FEED
	LXI	D,babanf+0002H
	LXI	B,0efeH
	mvi	m,' '
	inx	h
	lda	csfabr
	mov	m,a
	dcx	h
	LDIR
CRTHOM:	LXI	H,babanf		; HOME POSITION
	RET
CRTLF:	LXI	D,00a0H		; LINE FEED
	DAD	D
	MOV	A,H
	cpi high(babanf+0f00h)
;	CPI	0ffH
;	RNZ
;	MOV	A,L
;	CPI	80H
	RC
	DSBC	DE		; SBC HL,DE
	JR	CRTPO1
CRTCRI:	INX	H		; NAECHSTE KURSORPOSITION
	inx	h
	MOV	A,H		; WENN NOETIG BILD ROLLEN
	cpi high(babanf+0f00h)
;	CPI	0ffH
;	RNZ
;	MOV	A,L
;	CPI	80H
	RC
	LXI	H,babanf+0e60H
CRTPO1:	PUSH	H
	lxi	b,0e60h
	LXI	H,babanf+00a0H
	LXI	D,babanf
	LDIR
	lda	csfabr
	MVI	B,50H
CRTPO2:	DCX	H
	MOV	M,A
	dcx	h
	mvi	m,' '
	DJNZ	CRTPO2
	POP	H
	RET
CRTCR:	MOV	B,H		; CARRIAGE RETURN
	MOV	C,L
	LXI	H,babanf+0f00H
	LXI	D,00a0H
	ORA	A
CRTCR1:	DSBC	DE		; SBC HL,DE
	PUSH	HŠ	DSBC	BC		; SBC HL,BC
	POP	H
	RZ
	JRNC	CRTCR1
	RET
CRTESC:	MVI	A,02H		; BEHANDLUNG ESC-FOLGE
	STA	ESCMER		; BEGINNEN
	RET
CRTDRB:	XCHG			; LOESCHEN AB CURSOR BIS
	LXI	H,babanf+0efeH		; BILDENDE
	DSBC	DE		; SBC HL,DE
crtdr0:	MOV	B,H
	MOV	C,L
CRTDR1:	MOV	H,D
	MOV	L,E
	INX	D
	inx	d
	MVI	M,' '
	inx	h
	lda	csfabr
	mov	m,a
	dcx	h
	LDIR
crtdr2:	LHLD	CURS
	RET
CRTDZE:	CALL	CRTCR		; LOESCHEN KURSORZEILE UND
				; SETZEN KURSOR AN ZEILEN-
				; ANFANG
CRTDCZ:				; LOESCHEN AB KURSORPOSITION    
                               	; BIS ZEILENENDE		
	push h ! call crtcr
	LXI D,00a0H ! DAD D ! pop d ! ORA A
	DSBC DE
	jrz crtdr2
	jr crtdr0
CRTCHO:				; KURSOR EINE ZEILE HOCH
	LXI D,00a0H
	DSBC DE
	mvi a,high(babanf-0100h)
;	mvi a,0efh
	cmp h ! rc
	LHLD CURS ! RET
curson:
	xra a
cursof:
	sta curmer ! ret
inveof:
	xra a ! sta invmer ! ret
inveon:
	mvi a,80h ! sta invmer ! ret
ascii:
	xra a
german:
	sta zeisat ! ret
eizeis:
	mvi a,1fh ! sta eizeium+1 ! ret
farein:
	mvi a,2 ! sta farmer ! ret
faraus:
	dcr a ! sta farmer
	jrz far2Š	mov a,c ! sta csfabr
	jmp setcur
far2:
	mov a,c ! sta csrafr ! out 41h
	jmp setcur
bell:
	mvi a,5 ! out 58h
	mvi a,80h ! out 58h
	lxi b,4000h
bell1:	dcx b ! mov a,b ! ora c
	jrnz bell1
	mvi a,3 ! out 58h
	jmp setcur

CURS:	DW	babanf
ESCMER:	db	0
farmer:	db	0
curmer:	db	0
invmer:	db	0
zeisat:	db	0
csfabr:	db	17h
csrafr:	db	01h
csctrr:	db	0
stfabr:	db	07h
babstr: db	0
conoubnk: db	0
constak:
	ds	32
constk:
consp:	ds	2

ENDIF


;**************************************************************
; CONSOLAUSGABE
;**************************************************************

CONOUT:	LXI	H,00FFH		; CLEAR CURSOR
	CALL	SETCU3
	LHLD	CURS
	INR	H
	DCR	H
	JRNZ	CON1
	MVI	H,0F8H		; SETZEN KURSOR AUF BILDANFANG
	MVI	M,' '
	SHLD	CURS
CON1:
	PUSH	PSW
	LDA	ESCMER		; WAR ESC-FOLGE ?
	ORA	A
	JRZ	NOESC		; -> NEIN
	DCR	A
	STA	ESCMER
	JRZ	ESC2		; -> 2.BYTE DER ESC-FOLGE
	LXI	H,0F800H	; BEHANDLUNG 1.BYTE DER ESC-FO.
	MOV	A,C		; ALS ZEILENANGABE
	ANI	7FH
	ORA	A
	JRZ	SETCUR
	CPI	18H
	JRC	ESC11
	LXI	H,0F800H
	JR	SETCUR
ESC11:	MOV	B,A
	LXI	D,0050H
ESC12:	DAD	D
	DJNZ	ESC12
	JR	SETCUR
ESC2:	MOV	A,C		; BEHANDLUNG 2.BYTE DER ESC-FO.
	ANI	7FH		; ALS SPALTENANGABE
	CPI	50H
	LXI	D,004FH
	JRNC	ESC22
ESC21:	MOV	E,A
ESC22:	DAD	D
	JR	SETCUR
NOESC:
	MOV	A,C		; AUSWERTUNG STEUERZEICHEN

;	ani	7fh

	CPI	7FH
	JRNC	CRTCRTL
	CPI	20H
	JRC	CRTCRTL
CRTZEI:
	mov	c,a		; Zeichen retten
	lda	zeiums
	ora	a
	mov	a,c
	jrz	noums
	cpi	5bh
	jrc	noumsŠ	cpi	5eh
	jrc	ums
	cpi	7bh
	jrc	noums
ums:
	sui	60h		; Grossbuchstaben
	jrnc	fert
	adi	1dh		; Kleinbuchstaben	
noums:
fert:
	MOV	M,A		; ZEICHEN AUF BILDSCHIRM
	CALL	CRTCRI
;
SETCUR:
	SHLD	CURS
	LDA	CURMER
	ORA	A
	JRNZ	NOSET
	CALL	SETCUS
NOSET:	POP	PSW
	RET
;
SETCUS:
	XRA	A
	LXI	D,0F800H
	DSBC	DE		; SBC HL,DE
	MVI	C,0
	LXI	D,50H
SETCU1:
	DSBC	DE		; SBC HL,DE
	JRC	SETCU2
	INR	A
	JR	SETCU1
SETCU2:
	DAD	D
	MOV	H,A
SETCU3:
	MVI	A,80H		; CURSOR SETZEN
	OUT	CRTBEF
	MOV	A,L		; SPALTE
	OUT	CRTPAR
	MOV	A,H		; ZEILE
	OUT	CRTPAR
	RET

CRTCRTL:
	LXI	D,SETCUR
	PUSH	D
	CPI	7FH
	JZ	CRTDCH
	CPI	0DH		; STEUERZEICHEN AUSWERTEN
	JZ	CRTCR
	CPI	0AH
	JZ	CRTLF
	CPI	15H
	JZ	CRTCRI
	CPI	08H
	JZ	CRTCLE
	CPI	0CH
	JZ	CRTFF
	CPI	01HŠ	JZ	CRTHOM
	CPI	14H
	JZ	CRTDRB
	CPI	18H
	JZ	CRTDZE
	CPI	16H
	JZ	CRTDCZ
	CPI	1AH
	JZ	CRTCHO
	CPI	1BH
	JZ	CRTESC
	CPI	82H
	JZ	CURSON
	CPI	83H
	JZ	CURSOF
	CPI	0EH
	JZ	ZEISAT1
	CPI	0FH
	JZ	ZEISAT2
;	cpi	1ch		; Zeichensatzumschaltung
;	jz	setzeiums
	RET
CRTDCH:	MVI	M,' '		; DEL
CRTCLE:	DCX	H		; BACKSPACE
	MOV	A,H
	CPI	0F7H
	RNZ
	INX	H
	RET
CRTFF:	LXI	H,0F800H	; FORM FEED
	MVI	M,' '
	LXI	D,0F801H
	LXI	B,077FH
	LDIR
CRTHOM:	LXI	H,0F800H	; HOME POSITION
	RET
CRTLF:	LXI	D,0050H		; LINE FEED
	DAD	D
	MOV	A,H
	CPI	0FFH
	RNZ
	MOV	A,L
	CPI	80H
	RC
	DSBC	DE		; SBC HL,DE
	JR	CRTPO1
CRTCRI:	INX	H		; NAECHSTE KURSORPOSITION
	MOV	A,H		; WENN NOETIG BILD ROLLEN
	CPI	0FFH
	RNZ
	MOV	A,L
	CPI	80H
	RC
	LXI	H,0FF30H
CRTPO1:	PUSH	H
	LXI	B,0730H
	LXI	H,0F850H
	LXI	D,0F800H
	LDIR
	MVI	A,' '
	MVI	B,50HŠCRTPO2:	DCX	H
	MOV	M,A
	DJNZ	CRTPO2
	POP	H
	RET
CRTCR:	MOV	B,H		; CARRIAGE RETURN
	MOV	C,L
	LXI	H,0FF80H
	LXI	D,0050H
	ORA	A
CRTCR1:	DSBC	DE		; SBC HL,DE
	PUSH	H
	DSBC	BC		; SBC HL,BC
	POP	H
	RZ
	JRNC	CRTCR1
	RET

CRTESC:	MVI	A,02H		; BEHANDLUNG ESC-FOLGE
	STA	ESCMER		; BEGINNEN
	RET
CURSON:	XRA	A
CURSOF:	STA	CURMER
	RET
ZEISAT1:
	XRA	A
	JR	ZEISAT
ZEISAT2:
	MVI	A,40H
ZEISAT:
;	ADI	3EH
;	OUT	CRTBWS
;	RET
;setzeiums:
;	lda	zeiums
;	xri	0ffh
	sta	zeiums
	ret
CRTDRB:	XCHG			; LOESCHEN AB CURSOR BIS
	LXI	H,0FF7FH	; BILDENDE
	DSBC	DE		; SBC HL,DE
CRTDR0:	MOV	B,H
	MOV	C,L
CRTDR1:	MOV	H,D
	MOV	L,E
	INX	D
	MVI	M,' '
	LDIR
CRTDR2:	LHLD	CURS
	RET

CRTDZE:	CALL	CRTCR		; LOESCHEN KURSORZEILE UND
				; SETZEN KURSOR AN ZEILEN-
				; ANFANG
CRTDCZ:	PUSH	H
	CALL	CRTCR
	LXI	D,0050H		; LOESCHEN AB KURSORPOSITION
	DAD	D		; BIS ZEILENENDE
	POP	D
	ORA	A
	DSBC	DEŠ	JRZ	CRTDR2
	JR	CRTDR0
CRTCHO:	LXI	D,0050H		; KURSOR EINE ZEILE HOCH
	DSBC	DE
	MVI	A,0F7H
	CMP	H
	RC
	LHLD	CURS
	RET

CURS:	DW	0F800H		; KURSORMERKER
ESCMER:	DB	0		; ESC - MERKER
CURMER:	DB	0		; Kursordarst.-merker
zeiums:	db	0

ENDIF
