; Copyright 2000, by Michael Vincent. All rights reserved.
;
; I'm typing this 01-09-2001 and all I can say is I hope this works! :)
;
.nolist
#include "asm.inc"
#include "ion.inc"
.list
#define tempbyte saferam1
#define smallinputmax saferam1+1
#define smallinputlen saferam1+2
#define entry saferam1+3
.org $9D93
	.db $BB,$6D
	ret
	jr nc,start
title:	.db "SuperCAS v0.1",0
start:
	set fullscrndraw,(iy+apiflg4)
	bcall(_clrscrnfull)
	bcall(_homeup)
	ld hl,title
	bcall(_puts)
	bcall(_newline)
	bcall(_newline)
	ld hl,author
	bcall(_puts)
	call Pause
	bcall(_clrscrnfull)
	;Main screen here
mainscrndraw:
	bcall(_clrscrnfull)
	ld hl,0
	ld (pencol),hl
	ld hl,helpshow
	bcall(_vputs)
	ld h,2
	ld bc,7
	ld de,95*256+7
	bcall(_iline)
	ld bc,19*256+6
	ld de,19*256
	bcall(_iline)
	ld b,38
	ld d,b
	bcall(_iline)
	ld b,57
	ld d,b
	bcall(_iline)
	ld b,76
	ld d,b
	bcall(_iline)
	ld hl,57*256+2
	ld (pencol),hl
	ld hl,MainScreen
	bcall(_vputs)
	ld de,57*256+22
	ld (pencol),de
	bcall(_vputs)
mainloop:
	ei \ halt
	bcall(_getcsc)
	or a
	jr z,mainloop
	cp skMode
	ret z
	cp skYequ
	jr z,CalculusScreen
	cp skWindow
	jr z,TrigScreen
	jr mainloop
	ret
TrigScreen:
	jp start
CalculusScreen:
	bcall(_clrscrnfull)
	ld hl,0
	ld (pencol),hl
	ld hl,CalculusTitle
	bcall(_vputs)
	ld hl,20*256
	ld (pencol),hl
	ld hl,entry
	ld b,20
	call InputText
	ld hl,entry
	ld de,calcstr_lim
	ld b,4
	call CompareStrings
	jr z,Calculus_Limit
	jp mainscrndraw
nocomma:
	ld hl,27*256
	ld (pencol),hl
	ld hl,errormessage2
	bcall(_vputs)
	call Pause
	jp mainscrndraw
nocloseparenthesis:
	ld hl,27*256
	ld (pencol),hl
	ld hl,errormessage
	bcall(_vputs)
	call Pause
	jp mainscrndraw
Calculus_Limit:
	ld hl,entry
	ld a,(smallinputlen)
	ld c,a
	ld a,')'
	ld b,0
	cpir
	jr nz,nocloseparenthesis
	ld hl,entry
	ld a,(smallinputlen)
	ld c,a
	ld a,','
	ld b,0
	cpir
	jr nz,nocomma
	ld hl,entry
	ld a,(smallinputlen)
	ld c,a
	ld a,'x'
	ld b,0
	cpir
	jr nz,noxinlimit

	jp mainscrndraw
noxinlimit:
	ld hl,entry
	ld a,(smallinputlen)
	ld c,a
	ld a,','
	ld b,0
	cpir
	xor a
	dec hl
	ld (hl),a
	ld hl,entry
	ld a,(smallinputlen)
	ld e,a
	ld d,0
	xor a
	add hl,de
	dec hl
	ld (hl),a
	ld hl,30*256
	ld (pencol),hl
	ld hl,calcstr_lim_label
	bcall(_vputs)
	ld hl,entry+4
	bcall(_vputs)
	ld hl,calcstr_lim_label3
	bcall(_vputs)
	ld hl,entry+4
	bcall(_vputs)
	ld hl,36*256
	ld (pencol),hl
	ld hl,calcstr_lim_label2
	bcall(_vputs)
	ld hl,entry
	ld a,(smallinputlen)
	ld c,a
	ld b,0
	ld a,$00
	cpir
	bcall(_vputs)
	call Pause
	jp mainscrndraw
Pause:
	ei \ halt
	bcall(_getcsc)
	or a
	jr z,Pause
	ret
CompareStrings:
	ld c,(hl)
	ld a,(de)
	cp c
	jr nz,stringsdontmatch
	inc hl
	inc de
	djnz CompareStrings
	xor a
	ret
stringsdontmatch:
	ld a,1
	or a
	ret
InputText:
	set plotloc,(iy+plotflags)
	xor a
	ld (smallinputlen),a
	ld a,b
	ld (smallinputmax),a
	ld a,(pencol)
	ld (tempbyte),a
	push hl
	call XORSmallCursor
	pop ix
smallinputloop:
	ei \ halt
	bcall(_getcsc)
	or a
	jr z,smallinputloop
	cp skEnter
	jp z,smallinputdone
	cp skClear
	jr z,smallinputrestart
	ld d,0
	ld e,a
	in a,(4)
	bit 3,a
	jr z,altkeyboard
	ld hl,chartable-10
	jr consmalli
altkeyboard:
	ld hl,chartable2-10
consmalli:
	add hl,de
	ld a,(hl)
	or a
	jr z,smallinputLoop
	ld (ix),a
	inc ix
	push ix
	push af
	call XORSmallCursor
	pop af
	bcall(_vputmap)
	call XORSmallCursor
	pop ix
	ld hl,smallinputlen
	inc (hl)
	ld a,(smallinputmax)
	ld b,a
	ld a,(smallinputlen)
	cp b
	jr nz,smallinputloop
smallinputdone:
	call XORSmallCursor
	res onInterrupt,(iy+onFlags)
	ret
smallinputrestart:
	ld a,(smallinputlen)
	or a
	jp z,smallinputloop
	call XORSmallCursor
	ld a,(smallinputlen)
	ld b,a
simovbackix:
	dec ix
	djnz simovbackix
	ld a,(tempbyte)
	ld b,a
	ld a,(pencol)
	sub b
	ld a,b
	ld (pencol),a
	push ix
siclrloop:
	ld a,$20
	push bc
	bcall(_vputmap)
	pop bc
	djnz siclrloop
	pop ix
	ld a,(tempbyte)
	ld (pencol),a
	call XORSmallCursor
	xor a
	ld (smallinputlen),a
	jp smallinputloop
XORSmallCursor:
	push ix
	ld a,(penrow)
	ld b,a
	ld a,63
	sub b
	ld c,a
	sub 5
	ld e,a
	ld a,(pencol)
	ld b,a
	ld d,b
	ld h,2
	bcall(_iline)
	pop ix
	ret
	.db 0,0,0,0,0,0,0,0,0,0,0
chartable:
	.db 0,"wrmh",0
	.db 0,0,0,"vqlg",0,0,0,"zupkfc"
	.db 0,0,"ytojebx",0,"xsnida"
	.db 0,0,0,0,0,0,0,0,0,0,0,0
	.db 0,0,0,0,0,0,0,0
chartable2:
	.db "+","-","*","/",$5e,0
	.db 0,$1a,"369)",0,0,0,".258(",0,0
	.db 0,"0147,",0,0,0,0,0,0,0,$12,$11
	.db 0,0,0,0,0,0,0,0,0,0,0,0
	.db 0,0,0,0,0,0,0,0
author:
	.db "Michael Vincent",0
helpshow:
	.db "(C) 2001, Michael Vincent.",0
MainScreen:
	.db "Calc",0
	.db "Trig",0
CalculusTitle:
	.db "Calculus Functions",0
calcstr_lim:
	.db "lim("
errormessage:
	.db "ERROR: PARENTHESIS",0
errormessage2:
	.db "ERROR: COMMA",0
calcstr_lim_label:
	.db "lim ",0
calcstr_lim_label2:
	.db "x",$1c,0
calcstr_lim_label3:
	.db " = ",0
.end

