	.list
#include "ion2.inc"
#include "keys.inc"
sam	.equ	sram
;Labels are stored in Apd Ram.
nextsearch	=sam	;2 bytes
nameloc		=sam+2	;2 bytes
namelength	=sam+4	;1 byte
layers		=sam+5	;1 byte
height		=sam+6	;1 byte
width		=sam+7	;1 byte
size		=sam+8	;2 bytes
layer1loc	=sam+10	;2 bytes
layer2loc	=sam+12	;2 bytes
layer3loc	=sam+14	;2 bytes
curX		=sam+16	;1 byte

	.nolist
#ifdef TI83P	
	.org Progstart-2
	.db $BB,$6D
#else
	.org Progstart
#endif
	ret
	jr nc,start
	.db "Greyscale Image Veiwer",0
start:
	ld hl,(vat)
	ld (nextsearch),hl
	jp find
disptitle:
	bcall(_cleargbuf)
	bcall(_clrscr)
	ld a,0
	ld l,0
	ld bc,$010C
	ld ix,line
	call ionLargeSprite
	ld a,0
	ld l,1
	ld bc,$010C
	ld ix,line
	call ionLargeSprite
	ld a,0
	ld l,2
	ld bc,$010C
	ld ix,line
	call ionLargeSprite
	ld a,0
	ld l,3
	ld bc,$010C
	ld ix,line
	call ionLargeSprite
	ld a,0
	ld l,4
	ld bc,$010C
	ld ix,line
	call ionLargeSprite
	ld a,0
	ld l,5
	ld bc,$010C
	ld ix,line
	call ionLargeSprite
	call ionFastCopy
	set textInverse,(iy+textflags)
	ld hl,title
	ld de,$0009
	ld (pencol),de
	bcall(_vputs)
	res textInverse,(iy+textflags)
	ld hl,plotsscreen
	bcall(_savedisp)
	ld a,0
	ld l,6
	ld bc,$010C
	ld ix,line
	call ionLargeSprite
	call ionFastCopy
	ret
dispname:
	ld de,$1200
	ld (pencol),de
	ld hl,by
	bcall(_vputs)
	ld de,$0A00
	ld (pencol),de
	ld hl,name
	bcall(_vputs)
	ld de,$0A14
	ld hl,colon
	ld (pencol),de
	bcall(_vputs)
	ld de,$0A17
	ld (pencol),de
	ld hl,(nameloc)
	bcall(_vputs)
	ld de,$3300
	ld (pencol),de
	ld hl,veiw
	bcall(_vputs)
	ld de,$3328
	ld (pencol),de
	ld hl,enter
	bcall(_vputs)
	ld de,$2D00
	ld (pencol),de
	ld hl,quit
	bcall(_vputs)
	ld de,$3900
	ld (pencol),de
	ld hl,select
	bcall(_vputs)
	ld de,$2D28
	ld (pencol),de
	ld hl,clear
	bcall(_vputs)
	ld de,$3928
	ld (pencol),de
	ld hl,mode
	bcall(_vputs)
	ret
find:
	ld hl,(nextsearch)
	ld ix,picdetect
	call ionDetect
	jp nz,fail
	jp z,found
fail:
	ld hl,(vat)
	ld (nextsearch),hl
	ld hl,(nextsearch)
	ld ix,picdetect
	call ionDetect
	ret nz
	jp z,found
found:
	ld (nextsearch),de
	inc hl
	ld a,(hl)
	ld (namelength),a
	inc hl
	ld (nameloc),hl
	ld a,(namelength)
	ld d,$00
	ld e,a
	add hl,de
	ld a,(hl)
	ld (layers),a
	inc hl
	ld a,(hl)
	ld (height),a
	inc hl
	ld a,(hl)
	ld (width),a
	inc hl
	ld a,(hl)
	ld d,a
	inc hl
	ld a,(hl)
	ld e,a
	push hl
	push de
	pop hl
	ld (size),hl
	pop hl
	inc hl
	ld (layer1loc),hl
	ld (layer2loc),hl
	ld (layer3loc),hl
	ld a,(layers)
	cp 1
	jp z,menu
	ld a,(layers)
	cp 2
	call z,twolayers
	ld a,(layers)
	cp 3
	call z,threelayers
	jp menu
twolayers:
	ld a,(size)
	ld d,a
	ld a,(size+1)
	ld e,a
	ld hl,(layer1loc)
	add hl,de
	ld (layer2loc),hl
	ld (layer3loc),hl
	ret
threelayers:
	ld a,(size)
	ld d,a
	ld a,(size+1)
	ld e,a
	ld hl,(layer1loc)
	add hl,de
	ld (layer2loc),hl
	add hl,de
	ld (layer3loc),hl
	ret
menu:
	call disptitle
	call dispname
	ei
	ld a,$00
	halt
	halt
	halt
	halt
	halt
	jp wait
wait:
	bcall(_getcsc)
	cp $0F
	jp z,done
	cp $09
	jp z,dispimage
	cp $37
	jp z,find
	jp wait
dispimage:
	bcall(_cleargbuf)
	bcall(_copygbuf)
	ld a,(layers)
	cp 1
	jp z,onelayer
	cp 2
	jp z,imageloop_2
	cp 3
	jp z,imageloop_3
	jp menu
onelayer:
	ld hl,(layer1loc)
	call to_screen
	bcall(_getkey)
	jp menu
imageloop_2:
	ld hl,(layer1loc)
	call to_screen
	nop
	nop
	ld hl,(layer2loc)
	call to_screen
	ld hl,(layer2loc)
	call to_screen
	ld a,$FF
	out (1),a
	ld a,$FD
	out (1),a
	in a,(1)
	cp $BF
	jp z,menu
	jp imageloop_2
imageloop_3:
	ld hl,(layer1loc)
	call to_screen
	ld hl,(layer2loc)
	call to_screen
	ld hl,(layer2loc)
	call to_screen
	ld hl,(layer3loc)
	call to_screen
	ld hl,(layer3loc)
	call to_screen
	ld hl,(layer3loc)
	call to_screen
	ld hl,(layer3loc)
	call to_screen
	ld a,$FF
	out (1),a
	ld a,$FD
	out (1),a
	in a,(1)
	cp $BF
	jp z,menu
	jp imageloop_3
done:
	bcall(_cleargbuf)
	bcall(_clrscr)
	ret

to_screen:
	di
	ld a,(height)
	ld b,a
	ld a,$07
	out ($10),a
	ld a,$7F

loop1:
	ld e,b
	inc a
	ld d,a
	call lcd_busy
	out ($10),a
	ld a,$20
	call lcd_busy
	out ($10),a
	ld a,(width)
	ld b,a
	ld c,$11
loop2:
	call lcd_busy
	outi
	jp nz,loop2
;
; row done
;

	ld b,e
	ld a,d
	djnz loop1

	ld a,$05
	call lcd_busy
	out ($10),a
	ei
	ret

lcd_busy:
	neg
	nop
	nop
	neg
	ret

picdetect:	.db "GPicV0.1",0
title:	.db "Greyscal","e Image ","Viewer",0
quit:	.db "Exit/Menu",0
name:	.db "Name",0
veiw:	.db "View Image",0
colon:	.db ":",0
select:	.db "Next Image",0
mode:	.db ": Mode",0
clear:	.db ": Clear",0
enter:	.db ": Enter",0
by:	.db "By Paul Marks",0
line:
	.db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
.end