;*****************************************************************************/
; CONIO.S - Amstrad CPC version of the Contiki conio.h (derived from
;borland C) ; To use with the Small Devices C Compiler ; ; 2003 H. Hansen
;*****************************************************************************/

;; contiki uses coordinates between 0..width-1, 0..height-1
;; cpc uses coordinates between 1..width, 1..height


; void clrscr (void);
; Clear the whole screen and put the cursor into the top left corner 
; TESTED

.globl _clrscr	
		.area _CODE

_clrscr::
		ld		a,#1
		call 	0xBC0E	; SCR SET MODE

		; BACKGROUND
		XOR A
		LD BC,#0x0D0D ; GREY
		CALL 0xBC32 ; SCR SET INK

		; BORDERS
		LD A,#1
		LD BC,#0x0e0e ; BLUE
		CALL 0xBC32 ; SCR SET INK

		; WIDGETS
		LD A,#2
		LD BC,#0x1a1a ; WHITE
		CALL 0xBC32 ; SCR SET INK

		; FOCUS
		LD A,#3
		LD BC,#0x0000 ; BLACK
		CALL 0xBC32 ; SCR SET INK

		LD DE,#255
		LD HL,#0xbe80
		jp 0xbbab ; TXT SET M TABLE


; void gotox (unsigned char x);
; Set the cursor to the specified X position, leave the Y position untouched 

.globl _gotox

_gotox::
		ld a,l
		inc a
		jp	0xBB6F	; TXT SET COLUMN

; void gotoy (unsigned char y);
; Set the cursor to the specified Y position, leave the X position untouched

.globl _gotoy

_gotoy::
		ld a,l
		inc		a
		jp	0xBB72	; TXT SET ROW

; void gotoyx (unsigned char y, unsigned char x)
; Set the cursor to the specified position 

.globl _gotoyx

_gotoyx::
		pop de
		pop hl
		push de

		inc h
		inc l
		jp	0xBB75	; TXT SET CURSOR

; unsigned char wherex (void);
; Return the X position of the cursor 

.globl _wherex

_wherex::
		call	0xBB78	; TXT GET CURSOR
		ld		l,h
		dec l
		ret

; unsigned char wherey (void);
; Return the Y position of the cursor 

.globl _wherey

_wherey::
		call	0xBB78	; TXT GET CURSOR
		dec l
		ret


; void cputc (char c);
; Output one character at the current cursor position

.globl _cputc

_cputc::
		ld a,l
		jp		0xbb5d	; TXT OUTPUT


; void cputcxy (unsigned char x, unsigned char y, char c)
; Same as "gotoxy (x, y); cputc (c);"

.globl _cputcyx

_cputcyx::
	pop de ; RV
	pop hl ; XY

		inc h
		inc l
		call	0xBB75	; TXT SET CURSOR

	dec sp
	pop af ;  C
	push de

		jp	0xbb5d

; void cputsn(const char *str, unsigned char len);
.globl _cputsn

_cputsn::
	pop de ; RV
	pop hl ; str
	dec sp
	pop bc ; len
	push de

cputsn$:
	LD A,(HL)
	INC HL
	OR A
	RET Z
	PUSH HL
	PUSH BC
	CALL 0xBB5D
	POP BC
	POP HL
	DJNZ cputsn$
	RET

; void cputs (const char* s);
; Output a NUL terminated string at the current cursor position 
; TESTED

.globl _cputs

_cputs::
cputs$:
		ld		a,(hl)
		inc hl
		or a
		ret		z
		push hl
		call	0xbb5d
		pop hl
		jr		cputs$

; void textcolor (unsigned char color);
; Set the color for text output.
.globl	_textcolor

_textcolor::
		ld		a,l
		jp	0xBB90	; TXT SET PEN


; void bgcolor (unsigned char color);
; Set the color for the background. */
.globl	_bgcolor

_bgcolor::	
		ld		a,l
		jp	0xBB96   ; TXT SET PAPER

; void bordercolor (unsigned char color);
; Set the color for the border.

.globl	_bordercolor

_bordercolor::

		ld		b,l
		ld c,l
		jp	0xBC38   ; SCR SET BORDER

; void chline (unsigned char length);
; Output a horizontal line with the given length starting at the current
; cursor position.

.globl	_chline

_chline::	
		ld		b,l
dochline$:
		ld c,#0x09a
chlineloop$:
		push bc
		ld a,c
		call	0xbb5d
		pop bc
		djnz    chlineloop$
		ret

; void chlineyx (unsigned char y, unsigned char x, unsigned char length);
; Same as "gotoxy (y, x); chline (length);"
; TESTED

.globl _chlineyx

_chlineyx::

		POP DE ; RV
		POP HL ; XY
		DEC SP
		POP BC ; L
		PUSH DE

		inc h
		inc l
		call	0xBB75
		jr dochline$

; void cvline (unsigned char length);
; Output a vertical line with the given length at the current cursor
; position.

.globl _cvline

_cvline::	
		ld		b,l
		call	0xBB78  ; TXT GET CURSOR
docvline$:
cvloop$:
		push hl
		push bc
		call	0xBB75 ; TXT SET CURSOR
		ld a,#0x095
		call	0xbb5d
		pop bc
		pop hl
		inc l
		djnz	cvloop$
		ret

; void cvlineyx (unsigned char y, unsigned char x, unsigned char length);
; Same as "gotoyx (y, x); cvline (length);"

.globl _cvlineyx

_cvlineyx::	
		POP DE ; RV
		POP HL ; XY
		DEC SP
		POP BC ; L.
		PUSH DE

		inc 		h
		inc 		l
		jr docvline$

; void cclear (unsigned char length);
; Clear part of a line (write length spaces).

.globl _cclear

_cclear::	
		ld		b,l
		ld		c,#0x020 ; White space
cclearloop$:
		push bc
		ld a,c
		call	0xbb5d
		pop bc
		djnz	cclearloop$
		ret

; void screensize (unsigned char* x, unsigned char* y);
; Return the current screen size.

.globl _screensize

_screensize::
		pop hl ; RV
		pop de ; ptr1

		ld		a,#40    ; X Size
		ld		(de),a

		pop de ; ptr2
		ld		a,#25    ; Y Size
		ld		(de),a

		push de
		push de

		jp (hl)

