;*****************************************************************************/
; 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::
		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::
		inc		a
		jp	0xBB72	; TXT SET ROW

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

.globl _gotoxy

_gotoxy::
		ld h,a
		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		a,h
		dec a
		ret

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

.globl _wherey

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


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

; INPUT: A = x, L = y, char on stack

.globl _cputcxy

_cputcxy::
		LD H,A ; HL = cursor position
		inc h
		inc l
		call	0xBB75	; TXT SET CURSOR

	pop de ; Return value
	dec sp
	pop af ;  character to print
	push de ; Put return value back on stack

		jp	0xbb5d

; void cputsn(const char *str, unsigned char len);
; INPUT: str is in HL, len is on the stack
.globl _cputsn

_cputsn::
	pop de ; RV
	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$

.globl	_bordercolor

_bordercolor::

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

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

.globl _cclear

_cclear::	
		ld		b,a
		ld		c,#0x020 ; White space
		jr chlineloop$

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

.globl	_chline

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

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

.globl _chlinexy

_chlinexy::
		POP DE ; RV
		dec sp
		POP BC ; Length in B, C is unimportant
		PUSH DE ; Put return value back on stack

		LD H, A ; HL = XY
		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,a
		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 cvlinexy (unsigned char x, unsigned char y, unsigned char length);
; Same as "gotoxy (x, y); cvline (length);"

; INPUT: A = Y, L = X, length on stack

.globl _cvlinexy

_cvlinexy::	
		POP DE ; RV
		dec sp

		LD H, A ; HL = XY

		POP BC ; Length
		PUSH DE ; Put return value back on stack

		inc 		h
		inc 		l
		jr docvline$

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

; INPUT: HL = X ptr, DE = Y ptr
.globl _screensize

_screensize::
		ld		a,#40    ; X Size
		ld		(hl),a

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

		ret
