;
; Ullrich von Bassewitz, 06.08.1998
;
; char cgetc (void);
;

	.export		_cgetc
        .constructor    initcgetc
        .destructor     donecgetc

	.import		cursor

	.include	"c128.inc"

;--------------------------------------------------------------------------

_cgetc:	lda	KEY_COUNT 	; Get number of characters
	bne	L2	  	; Jump if there are already chars waiting

; Switch on the cursor if needed

	lda	cursor
       	beq	L1
        jsr     CURS_SET        ; Set cursor to current position
	jsr	CURS_ON
	jmp	L2
L1:    	lda	#$01
	jsr	CURS_OFF
L2:    	lda	KEY_COUNT	; Check characters again
	beq	L2
	jsr	CURS_OFF	; Switch cursor off, if characters available

       	jsr	KBDREAD		; Read char and return in A
	ldx	#0
	rts

;--------------------------------------------------------------------------
; Module constructor/destructor

.bss
keyvec:	.res	2

.code
initcgetc:

; Save the old vector

	lda	KeyStoreVec
	sta	keyvec
	lda	KeyStoreVec+1
	sta	keyvec+1

; Set the new vector. I can only hope that this works for other C128
; versions...

	lda	#<$C6B7
	ldx	#>$C6B7

SetVec:	sei
	sta	KeyStoreVec
	stx	KeyStoreVec+1
	cli
	rts

donecgetc:
        lda     #$00
        sta     SCROLL
	lda	keyvec
	ldx	keyvec+1
	bne	SetVec