; Konsolausgabe fuer CPMLDR
; ist als letztes File zu binden
; Version 1.1 fuer MC80
; 30.04.89

	maclib z80

	maclib ports

	public	conout,conini,loaend


;**************************************************************
; CONSOLAUSGABE
;**************************************************************

CONOUT:
	sspd	consp
	lxi	sp,constk

	push	psw
	lhld	curs
	lda	curmer
	ora	a
	JRNZ	NOCLR		; --> Cursor war nicht gesetzt
	mov	a,m
	xri	80h		; Ruecksetzen Cursor
	mov	m,a
noclr:	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
	CPI	7FH
	jrnc	crtcrtl
	CPI	20H
	JRC	CRTCRTL
CRTZEI:
	mov	b,a
	lda	invmer
	ora	b	
	MOV	M,A		; ZEICHEN AUF BILDSCHIRM
	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
	POP	PSW

	lspd	consp

	RET
;
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
	pop	d
	JMP	SETCUR
CRTDCH:	mvi	m,' '		; DEL
CRTCLE:	DCX	H		; BACKSPACE
	MOV	A,H
	CPI	0f7H
	RNZ
	INX	H
	RET
CRTFF:	LXI	H,0f800h		; FORM FEED
	LXI	D,0f801H
	LXI	B,077FH
	mvi	m,' '
	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
	lda	csctrr
	ori	2
	di
	out	csctr
	LDIR
	ani	0fdh
	out	csctr
	ei
	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
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
curson:	xra	a
cursof:	sta	curmer
	ret
inveof:	xra	a
	sta	invmer
	ret
inveon:	mvi	a,80h
	sta	invmer
	ret

CURS:	DW	0f800h
ESCMER:	db	0
curmer:	db	0ffh	; Kursor aus
invmer:	db	0
csfabr:	db	0
csrafr:	db	0
csctrr:	db	0
stfabr:	db	07h

	ds	32
constk:
consp:	ds	2

;**************************************************************
; CONSOL-INIT
;**************************************************************

conini:
	mvi	a,17h		; weisse Schrift auf blau
	OUT	csfab
	rrc
	rrc
	rrc
	rrc
	OUT	csraf
	xra	a
	out	csctr
	LXI	H,0f800h	; und Bildschirm Loeschen
	LXI	B,780H
BSL1:	MVI	M,' '
	INX	H
	DCX	B
	MOV	A,B
	ORA	C
	JRNZ	BSL1

	mvi	a,07h		; Statuszeile schwarz
	out	csfab
	MVI	B,59
	MVI	C,0
bslz:	MOV	M,C	
	INX	H
	DJNZ	BSLZ
	XCHG
	LXI	H,STATTEXT
	LXI	B,STATTEXTL
	LDIR	
	mvi	a,17h		; weisse Schrift auf blau
	out	csfab
	ret


STATTEXT:
	DB	'  00:00:00           '
STATTEXTL	EQU $-STATTEXT

loaend:

	end
