;
; Maciej 'YTM/Elysium' Witkowiak
;
; 27.10.2001
; 06.03.2002

; void cputcxy (unsigned char x, unsigned char y, char c);
; void cputc (char c);

	    .export _cputcxy, _cputc, update_cursor

	    .import _gotoxy, fixcursor
	    .import popa
	    .import xsize,ysize
	    .importzp cursor_x, cursor_y, cursor_c, cursor_r

	    .include "../inc/const.inc"
	    .include "../inc/geossym.inc"
	    .include "../inc/jumptab.inc"

_cputcxy:
	pha	    		; Save C
	jsr	popa		; Get Y
	jsr	_gotoxy		; Set cursor, drop x
	pla			; Restore C

; Plot a character - also used as internal function

_cputc:
	tax			; save character
; some characters are not safe for PutChar
	cmp	#$20
	bcs	L1
	cmp	#CR
	beq	do_cr
	cmp	#LF
	beq	do_lf
	cmp	#$1d
	bne	L00
	ldx	#BACKSPACE
	sec
	bcs	L2
L00:	cmp	#ESC_GRAPHICS
	beq	L0
	cmp	#ESC_RULER
	beq	L0
	cmp	#GOTOX
	beq	L0
	cmp	#GOTOY
	beq	L0
	cmp	#GOTOXY
	beq	L0
	cmp	#NEWCARDSET
	beq	L0
	cmp	#$1e
	bne	L1
L0:	rts

L1:	clc
L2:	php
	lda	cursor_x
	sta 	r11L
	lda	cursor_x+1
	sta	r11H
	lda	cursor_y
	sta	r1H
	txa
	jsr	PutChar
	plp
	bcs	update_cursor

	inc	cursor_c
	lda	cursor_c
	cmp	xsize			; hit right margin?
	bne	update_cursor
	lda	#0			; yes - do cr+lf
	sta	cursor_c
do_lf:	inc	cursor_r
	lda	cursor_r
	cmp	ysize			; hit bottom margin?
	bne	update_cursor
	dec	cursor_r		; yes - stay in the last line

update_cursor:
	jsr 	fixcursor
	lda	cursor_x
	sta	r4L
	lda	cursor_x+1
	sta	r4H
	lda	cursor_y
	sec
	sbc	curHeight
	sta	r5L
	lda	#1		; update cursor prompt position
	sta	r3L
	jmp	PosSprite

do_cr:	lda	#0
	sta	cursor_c
	beq	update_cursor