.equ	RAMSTART	0x8000
.equ	RAMEND		0xbfff
.equ	PORT_INT_MASK	0x03
.equ	INT_MASK_ON	0x00
.equ	PORT_INT_TRIG	0x04
.equ	INT_TRIG_ON	0x00
.equ	PORT_BANKB	0x07

	jp	boot

.fill 0x18-$
	jp	boot		; reboot

.fill 0x38-$
	jp	handleInterrupt

.fill 0x53-$
	jp boot
; 0x0056
.db 0xFF, 0xA5, 0xFF

.fill 0x64-$

.inc "err.h"
.inc "ascii.h"
.inc "core.asm"
.inc "str.asm"
.equ	FNT_WIDTH	3
.equ	FNT_HEIGHT	5
.inc "fnt/mgm.asm"
.equ	LCD_RAMSTART	RAMSTART
.inc "ti/lcd.asm"
.equ	KBD_RAMSTART	LCD_RAMEND
.inc "ti/kbd.asm"
.equ	STDIO_RAMSTART	KBD_RAMEND
.equ	STDIO_GETC	kbdGetC
.equ	STDIO_PUTC	lcdPutC
.inc "stdio.asm"

; *** BASIC ***

; RAM space used in different routines for short term processing.
.equ	SCRATCHPAD_SIZE	STDIO_BUFSIZE
.equ	SCRATCHPAD	STDIO_RAMEND
.inc "lib/util.asm"
.inc "lib/ari.asm"
.inc "lib/parse.asm"
.inc "lib/fmt.asm"
.equ	EXPR_PARSE	parseLiteralOrVar
.inc "lib/expr.asm"
.inc "basic/util.asm"
.inc "basic/parse.asm"
.inc "basic/tok.asm"
.equ	VAR_RAMSTART	SCRATCHPAD+SCRATCHPAD_SIZE
.inc "basic/var.asm"
.equ	BUF_RAMSTART	VAR_RAMEND
.inc "basic/buf.asm"
.equ	BAS_RAMSTART	BUF_RAMEND
.inc "basic/main.asm"

.out BAS_RAMEND
boot:
	di
	ld	sp, RAMEND
	im	1

	; enable ON key interrupt
	in	a, (PORT_INT_MASK)
	set	INT_MASK_ON, a
	out	(PORT_INT_MASK), a
	ld	a, 0x80
	out	(PORT_BANKB), a

	ei

	call	lcdOff

	; sleep until we press ON
	halt

main:
	; Fun fact: if I place this line just above basStart like I would
	; normally do, my TI-84+ refuses to validate the binary. But placed
	; here, validation works fine.
	call	basInit
	call	kbdInit
	call	lcdInit
	xor	a
	call	lcdSetCol
	jp	basStart

handleInterrupt:
	di
	push	af

	; did we push the ON button?
	in	a, (PORT_INT_TRIG)
	bit	INT_TRIG_ON, a
	jp	z, .done		; no? we're done

	; yes? acknowledge and boot
	in	a, (PORT_INT_MASK)
	res	INT_MASK_ON, a		; acknowledge interrupt
	out	(PORT_INT_MASK), a

	pop	af
	ei
	jp	main

.done:
	pop	af
	ei
	reti

FNT_DATA:
.bin "fnt/3x5.bin"