;Command Prompt Interface
; Dan Englender
;Feel free to use any of this code, but please give me credit.

cpflags	=	$22
listtype	=	1
supress	=	2
#define	numcmdtab	(cmdtabend-cmdtab)/3+1
#include	"ti83plus.inc"
#include	"mirage.inc"
#include	"mirgui.inc"
#define	temp	savesscreen
	.org	$9d93
	.db	$BB,$6D
	.db	$C9,$02
	.db	$01,24,"Command Prompt",0

startcmd:
	res	fastinfo,(iy+mirflags)

	bcall(_grbufclr)
	bcall(_clrlcdfull)
	ld	hl,0
	ld	(pencol),hl
	ld	hl,cmdwelcome
	call	putsline
cmdloop:
	call	fastcopys
	ld	a,'<'
	call	vputa
	call	curfoldname
	ld	hl,op1
	call	vputsc
	ld	a,'>'
	call	vputa
cmdloopc:
	ld	b,1
	ld	c,34
	ld	hl,temp
	call	gettextv
	call	fastcopys
	ld	hl,cmdtab
	ld	b,numcmdtab
	ld	a,(temp)
	ld	de,3

getcmdloop:
	cp	(hl)
	jr	z,runcmd
	add	hl,de
	djnz	getcmdloop
badcommand:
	jp	cmdloopc
runcmd:
	ld	a,numcmdtab+1
	sub	b
	push	hl
	ld	hl,texttab
	ld	b,a
	xor	a
runcmdl:
	push	bc
	ld	b,1
	cpir
	pop	bc
	djnz	runcmdl
	call	vputsc
	call	disp3spaces
	pop	hl
	inc	hl
	bcall(_ldhlind)
	jp	(hl)


cmoveall:
	call	input8op1f
	jp	nz,cfnoexist
	ld	c,a
	ld	a,(curfold)
	ld	b,a
	call	moveall
	ld	hl,cmovealletxt
	call	putsline
	jp	cmdloop
cfoldd:
	call	input8op1f
	jp	nz,cfnoexist
	push	af
	ld	hl,cfoldddtxt
	call	putsline
	ld	hl,delsuretxt
	call	putsline
	pop	af
	ld	b,a
cfolddl:
	bcall(_getcsc)
	cp	$2c
	jp	z,cmdloop
	cp	$22
	jr	nz,cfolddl
	ld	a,b
	call	delfolder

	ld	hl,cfolddetxt
	jr	nz,cfolddydel
	ld	hl,cfolddnodeltxt
cfolddydel:
	call	putsline
	jp	cmdloop

cmove:
	call	input8op1
	jp	c,cerrnofind

	call	isgoodprog

	jp	nz,cerrbadprog
	ld	(temp),hl
	call	vnewline
	ld	hl,cdispftxt
	call	vputscmd
	ld	a,':'
	call	vputa
	call	disp3spaces
	call	input8op1f
	jr	nz,cfnoexist
	ld	hl,(temp)
	dec	hl
	ld	(hl),a
	ld	hl,cmovedetxt
	call	putsline
	jp	cmdloop

cfold:
	call	input8op1f
	jr	nz,cfnoexist
	ld	(curfold),a
	jp	cmdloop
cfnoexist:
;	call	vnewline
	ld	hl,cfoldnoexisttxt
	call	putsline
	jp	cmdloop
cdispf:
	ld	hl,cdispftxt
	jp	vputscmd
cdispprogtype:
	ld	hl,cgetinfotypemtxt
	bit	0,b
	call	nz,cgetinfobasic
	bit	1,b
	call	nz,cgetinfoion
	bit	5,b
	call	nz,cgetinfocrash
	call	vputscmd
	ret
cnfold:
	ld	a,(numfolds)
	cp	9
	jr	nz,cnfoldnotmax
	call	vnewline
	ld	hl,cfoldtoomanytxt
	call	putsline
	jp	cmdloop
cnfoldnotmax:
	call	input8op1f
	call	createfolder
	jr	z,cnfolda
	ld	hl,cfoldctxt
cfoldc
	call	putsline
	jp	cmdloop
cnfolda:
	ld	hl,cfoldatxt
	jr	cfoldc
cgetinfo:
	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
	call	getinfo
	push	bc
	call	vnewline

	ld	hl,ramdesc
	call	putsline
	ld	hl,cgetinfotypetxt
	call	vputscmd
	pop	bc
	push	bc
	call	cdispprogtype
	call	vnewline
	ld	hl,chidtxt
	pop	bc
	push	bc
	bit	4,b
	call	nz,putsline
	pop	bc
	ld	hl,cgetinfoarctxt
	push	bc
	bit	3,b
	call	nz,putsline
	pop	bc
	ld	hl,cgetinfoprottxt
	bit	2,b
	call	nz,putsline
	ld	hl,cgetinfosizetxt
	call	vputscmd

	ld	hl,(ramsize)
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	set	textwrite,(iy+sgrflags)
	ld	a,5
	bcall(_dispop1a)
	res	textwrite,(iy+sgrflags)
	call	vnewline
	jp	cmdloop
cgetinfobasic:
	ld	hl,cgetinfotypebtxt
	ret
cgetinfoion:
	ld	hl,cgetinfotypeitxt
	ret
cgetinfocrash:
	ld	hl,cgetinfotypectxt
	ret
cerrinvalidcommand:
	ld	hl,cinvalidcmdtxt
	call	putsline
	jp	cmdloop
clist:
	ld	b,1
	ld	hl,temp
	ld	c,32
	call	gettextv
	call	vnewline
	ld	hl,temp
	ld	a,(hl)
;	ld	hl,(progptr)
	ld	hl,0
	cp	'P'
	jr	z,clistp
	cp	'F'
	jr	z,clistf

	jp	cerrinvalidcommand

clistnext:
	bit	listtype,(iy+cpflags)
	jp	nz,getnextgoodprog
	ld	a,(xdir)
	dec	a
	call	nextfolder
	jr	z,clnnz
	cp	a
	ret
clnnz:
	inc	a
	ret
clistgetinfo:
	bit	listtype,(iy+cpflags)
	jr	z,clgif
	call	getinfo
	ld	hl,op2
	bit	4,b
	ret	z
	xor	a
	cpir
	dec	hl
	ld	(hl),'('
	inc	hl
	ld	(hl),'H'
	inc	hl
	ld	(hl),')'
	inc	hl
	ld	(hl),0
	ld	hl,op2
	ret
clgif:
	ld	a,(xdir)
	call	curfoldnamea
	ld	hl,op1
	ret
clistp:
	set	listtype,(iy+cpflags)
	xor	a
	ld	(xdir),a
	call	getnextgoodprog
	jr	nz,noprogs
	call	clistc
	jp	cmdloop
clistf:
	res	listtype,(iy+cpflags)
	xor	a
	ld	(xdir),a
	call	clistc
	jp	cmdloop
noprogs:
	call	clistaend
	jp	cmdloop
clistc:


clistploop:
	ld	b,8
clistpl2:
	push	bc
	
	push	hl
	call	clistgetinfo
	call	vputscmd
	ld	a,48
	ld	(pencol),a
	bit	listtype,(iy+cpflags)
	call	z,cdispf
	bit	listtype,(iy+cpflags)
	jr	z,notdpd
	pop	hl
	push	hl
	call	getinfo
	call	cdispprogtype
	

notdpd:
	ld	hl,xdir
	inc	(hl)
	call	vnewline
	pop	hl
	call	clistnext
	jr	nz,clistpend
	pop	bc
	djnz	clistpl2
	push	hl
	ld	hl,clistpctxt
	call	vputscmd
clistpl3:
	bcall(_getcsc)
	or	a
	jr	z,clistpl3
	call	vnewline
	pop	hl
	jr	clistploop
clistpend:
	pop	bc
;	jr	clistaend
	

clistaend:

	ld	hl,clistdonetxt
	call	vputscmd
	call	disp3spaces
	ld	a,(xdir)
	bcall(_setxxop1)
	ld	a,3
	set	textwrite,(iy+sgrflags)
	bcall(_dispop1a)
	res	textwrite,(iy+sgrflags)
	call	disp3spaces
	ld	hl,clistfilestxt
	bit	listtype,(iy+cpflags)
	jr	nz,clistnc
	ld	hl,clistfoldstxt
clistnc:
	jp	putsline
	


clock:

	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
	ld	a,3
	xor	(hl)
	ld	(hl),a
	call	vnewline
	ld	hl,clockdonetxt
	call	putsline
	jp	cmdloop
cquit:
	call	vnewline
	ld	hl,delsuretxt
	call	putsline
cquitloop:
	bcall(_getcsc)
	cp	$2c
	jp	z,cmdloop
	cp	$22
	ret	z
	jr	cquitloop
cerrbadprog:
	call	vnewline
	ld	hl,cerrbadprogtxt
	call	putsline
	jp	cmdloop
cerrnofind:
	call	vnewline
	ld	hl,cerrnofindtxt
	call	putsline
	jp	cmdloop
cdel:
	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
	ld	(temp),hl
	call	vnewline
	ld	hl,delsuretxt
	call	putsline
cdelloop:
	bcall(_getcsc)
	cp	$2c
	jp	z,cmdloop
	cp	$22
	jr	nz,cdelloop
	ld	hl,deldonetxt
	call	putsline
	ld	hl,(temp)
	call	delprog
	jp	cmdloop
csend:
	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
        call    sendprog
	push	af
	call	vnewline
	pop	af
	jp	nz,csendfail
	ld	hl,csendgoodtxt
	call	putsline
	jp	cmdloop
csendfail:
	ld	hl,csendfailedtxt
	call	putsline
	jp	cmdloop

crun:
	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
	call	runprog
	set	plotloc,(iy+plotflags)
	bcall(_grbufclr)
	bcall(_clrlcdfull)
	ld	hl,0
	ld	(pencol),hl
	jp	cmdloop
coptions:
	ld	de,savesscreen
	ld	hl,plotsscreen
	ld	bc,768
	ldir
	ld	hl,(pencol)
	push	hl
	set	textwrite,(iy+sgrflags)
	call	options_screen
	pop	hl
	ld	(pencol),hl
	ld	de,plotsscreen
	ld	hl,savesscreen
	ld	bc,768
	ldir
	call	vnewline
	jp	cmdloop
chide:
	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
	call	hideprog
	push	af
	call	vnewline
	pop	af
	ld	hl,chiddentxt
	jr	c,chideok
	ld	hl,cnohiddentxt
chideok
	call	putsline
	jp	cmdloop
carc:
	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
	call	arcprog
	call	vnewline
	ld	hl,carcedtxt
	call	putsline
	jp	cmdloop
	
csleep:
	ld	a,1
	out	(3),a
	ei
	halt
	call	vnewline
	jp	cmdloop
crename:
	call	input8op1
	jp	c,cerrnofind
	call	isgoodprog
	jp	nz,cerrbadprog
	push	hl
	call	vnewline
	ld	hl,cprognewnametxt
	call	vputsc
	call	disp3spaces
	call	input8op1
	pop	hl
	call	renameprog
	push	af
	call	vnewline
	pop	af
	jr	nc,renamefail
	ld	hl,cprogrenamedtxt
	call	putsline
	jp	cmdloop
renamefail:
	ld	hl,crenamefailtxt
	call	putsline
	jp	cmdloop
crenfold:
	call	input8op1f
	jp	nz,cfnoexist
	push	af
	ld	hl,cnewnametxt
	call	vputsc
	call	input8op1f
	pop	af
	call	renamefolder
	jr	z,renfoldfail
	ld	hl,cfoldrenamedtxt
	call	putsline
	jp	cmdloop
renfoldfail:
	ld	hl,crenfoldfailtxt
	call	putsline
	jp	cmdloop
	

cmdtab:
			;command table
			;letter,text addr,code addr
	.db	"V"
	.dw	cmoveall
	.db	"W"
	.dw	cfoldd
	.db	"M"
	.dw	cmove
	.db	"F"
	.dw	cfold
	.db	"N"
	.dw	cnfold
	.db	"L"
	.dw	clist
	.db	"I"
	.dw	cgetinfo
	.db	"P"
	.dw	clock
	.db	"Q"
	.dw	cquit
	.db	"R"
	.dw	crun
	.db	"D"
	.dw	cdel
	.db	"S"
	.dw	csleep
	.db	"O"
	.dw	coptions
	.db	"H"
	.dw	chide
	.db	"A"
	.dw	carc
	.db	"X"
	.dw	csend
	.db	"C"
	.dw	crename
	.db	"E"
	.dw	crenfold
cmdtabend:
texttab:
	.db	0
cmovealltxt:
	.db	"MoveAll",0
cfolddtxt:
	.db	"DelFold",0
cmovetxt:
	.db	"Move",0
cfoldtxt:
	.db	"Folder",0
cnfoldtxt:
	.db	"NewFold",0
clisttxt:
	.db	"List",0

cinfotxt:
	.db	"Info",0
clocktxt:
	.db	"Protect",0
cquittxt:
	.db	"Quit",0
cruntxt:
	.db	"Run",0
cdeltxt:
	.db	"Delete",0
csendtxt:
	.db	"Sleep",0
coptionstxt:
	.db	"Options",0
chidetxt:
	.db	"Hide",0
carctxt:
	.db	"Archive",0
cxmit:
	.db	"Xmit",0
crenametxt:
	.db	"Rename",0
crenfoldtxt:
	.db	"RenFold",0
cmdwelcome:
	.db	"Welcome To MirageOS",0
cerrbadprogtxt:
	.db	2,"not compatible",0
cerrnofindtxt:
	.db	2,"not found",0
delsuretxt:
	.db	"Are you sure? Y/N",0
deldonetxt:
	.db	2,"Deleted",0
clockdonetxt:
	.db	2,"(Un)Protected",0
cinvalidcmdtxt:
	.db	"Invalid Command",0
cfoldrenamedtxt:
	.db	1,"Renamed",0
cprogrenamedtxt:
	.db	2,"Renamed",0
crenfoldfailtxt:
crenamefailtxt:
	.db	"Can",$27,"t Rename",0
cnewnametxt:
cprognewnametxt:
	.db	"New Name:",0
clistdonetxt:
	.db	"Found:",0
clistfilestxt:
	.db	"Programs",0
clistfoldstxt:
	.db	"Folders",0
clistpctxt:
	.db	"Press any key to continue",0
cgetinfotypetxt:
	.db	"Type: ",0
cgetinfotypeitxt:
	.db	"Ion",0
cgetinfotypebtxt:
	.db	"BASIC",0
cgetinfotypectxt:
	.db	"(Cr)ASH",0
cgetinfotypemtxt:
	.db	"MirageOS",0
cgetinfosizetxt:
	.db	"Size: ",0

cgetinfoprottxt:
	.db	"Protected",0
cprogramstxt:
	.db	"Program ",0
cfolderstxt:
cdispftxt:
	.db	"Folder ",0
cfoldatxt:
	.db	1,"Already Exists",0
cfoldctxt:
	.db	1,"Created",0
cfoldnoexisttxt:
	.db	1,"Does not Exist",0
cmovedetxt:
	.db	2,"Moved",0
cfolddetxt:
	.db	1,"Deleted",0
cfolddnodeltxt:
	.db	1,"Can Not be Deleted",0
cfoldddtxt:
	.db	"This Will Del Progs in Fold",0
cfoldtoomanytxt:
	.db	"Too Many Folders",0
cmovealletxt:
	.db	"Programs Moved",0
csendfailedtxt:
	.db	"Link Error",0
csendgoodtxt:
	.db	2,"Sent",0
carcedtxt:
	.db	2,"(Un)"
cgetinfoarctxt:
	.db	"Archived",0
chiddentxt:
	.db	2,"(Un)"
chidtxt:
	.db	"Hidden",0
cnohiddentxt:
	.db	2,"Already Exists",0
cero:
	.db	0
input8op1f:
	ld	b,8
	ld	hl,op1
	ld	c,32
	call	gettextv
	call	vnewline
	jp	existfold
putsline:
	call	vputscmd
	jp	vnewline
vputscmd:
	ld	a,(hl)
	push	hl
	ld	hl,cero
	ld	d,(hl)
	ld	e,d
	dec	a
	jr	nz,vputscmdn1
	ld	hl,cfolderstxt
	inc	de
vputscmdn1:
	dec	a
	jr	nz,vputscmdn2
	ld	hl,cprogramstxt
	inc	de
vputscmdn2:
	push	de
	call	vputsc
	pop	de
	pop	hl
	add	hl,de
	jp	vputsc

input8op1:

	ld	b,8
	ld	hl,op1+1
	ld	c,32
	call	gettextv
	ld	hl,op1
	ld	(hl),5
	bcall(_op1toop6)
	bcall(_chkfindsym)
	ret	nc
	call	chacknpop
	ret	nc

	ld	a,(op1+1)
	sub	64
	ld	(op1+1),a
	bcall(_chkfindsym)
	ret	nc
	call	chacknpop
	ret	nc
	bcall(_op6toop1)
	scf
	ret
chacknpop:
	bcall(_pushrealo1)
	ld	hl,op1+2
	ld	b,6
chacknpopl:

	ld	a,(hl)
	cp	'A'
	jr	c,chacknpopld
	cp	'Z'+1
	jr	nc,chacknpopld
	add	a,32
	ld	(hl),a
chacknpopld:
	inc	hl
	djnz	chacknpopl
	bcall(_chkfindsym)
	push	af
	jr	nc,chacknpopdone
	pop	af

	ld	hl,op1+7
	ld	de,op1+8
	ld	bc,7
	lddr
	ld	a,$DC
	ld	(op1+1),a
	bcall(_chkfindsym)
	push	af
	jr	nc,chacknpopdone
	pop	af


	ld	a,28
	ld	(op1+1),a
	bcall(_chkfindsym)


	push	af
chacknpopdone:
	push	hl
	bcall(_poprealo1)
	pop	hl
	pop	af
	ret
disp3spaces:
	push	af
	ld	a,' '
	call	vputa
	ld	a,' '
	call	vputa
	ld	a,' '
	call	vputa
	pop	af
	ret
	
