
;==========================================;
;== Source To Descriptions Interface GUI ==;
;==========================================;

#define bcall(label) RST 28h \ .dw label
#define bjump(label) call 50h \ .dw label

#include "ti83plus.inc"
#include "mirage.inc"
#include "mirgui.inc"

tempcoords      = GUIsaferam1+0    ;(2)    Holds the Coordinates for Options Cursor.
tempgoodprog    = GUIsaferam1+2    ;(2)    Temporary Pointer for the Current Good Program.
firstgoodprog   = GUIsaferam1+4    ;(2)    Pointer to the First Valid Program of the List.
lastgoodprog    = GUIsaferam1+6    ;(2)    Pointer to the Last Valid Program of the List.

GUI_Flags       = GUIsaferam1+8    ;(2)    Holds the states of any bits used as flags.
                                   ;       Bit 7 = 1 if Currently Paging, 0 otherwise.
                                   ;       Bit 6 = 1 if Program Is Being Deleted, " ".
	.org $9d93
	.db $BB,$6D
	.db $C9,$02
	.db 2,24,"Prog  Descriptions",0

Desc_Interface_Start:
	ld de, 2*256+10
	ld (cursorcoords), de
	ld a, 1
	ld (curprognum), a
	ld (topprognum), a
	ld hl, $0001
	ld (cur_element), hl
Desc_Restart_Interface:
	bcall(_grbufclr)
	call Find_Num_Good_Progs
	or a
	jr z, No_Good_Progs_Cont
	call Get_Curgoodprog_Ptr
	ld a, (topprognum)
	ld b, a
	call Skip_Forward_B_From_Top
	ld (topgoodprog), hl
	ld a, (numgoodprogs)
	cp 8
	jr c, Get_Max_Elem_Cont1
	sub 6
	jr Get_Max_Elem_Cont2
Get_Max_Elem_Cont1:
	ld a, 1
Get_Max_Elem_Cont2:
	ld h, 0
	ld l, a
	ld (max_elements), hl
Find_Pointers:
	ld hl, $0000
	call getnextgoodprog
	ld (firstgoodprog), hl
Find_1st_Lst_Cur_GPs_Loop:
	call getnextgoodprog
	jr z, Find_1st_Lst_Cur_GPs_Loop
	ld (lastgoodprog), hl
No_Good_Progs_Cont:
	call Put_MirageOS_Header
	ld hl, Plotsscreen+(55*12)
	call Invert_1_Line
	ld hl, Plotsscreen+(63*12)
	call Invert_1_Line
	ld hl, 88*256+9
	ld b, 32
	call Put_ScrollBar
	call Initial_Scrollbar
	ld hl, 0*256+9
	ld de, 0*256+62
	call fastlineb
	ld hl, 95*256+56
	ld de, 95*256+62
	call fastlineb
	call Put_Folder_Name_Top
	ld a, 59
	ld l, 57
	call Put_Size_Graphic
	ld hl, 34*256+55
	ld de, 34*256+62
	call fastlineb
Redraw_Descriptions_List:
	ld hl, Plotsscreen+120
	ld b, 43
Clear_Desc_Area_Lp1:
	push bc
	ld (hl), %10000000
	inc hl
	ld d, h
	ld e, l
	inc de
	ld bc, 9
	ld (hl), 0
	LDIR
	inc hl
	inc hl
	pop bc
	DJNZ Clear_Desc_Area_Lp1
	ld a, (numgoodprogs)
	or a
	jp z, Desc_No_Good_Programs
	cp 8
	jr c, Desc_Less_Than_8
	ld a, 7
Desc_Less_Than_8:
	ld b, a
	ld hl, (topgoodprog)
	ld a, 10-6		;10-6 because the first is at 10, but inc coords first.
	ld (tempcoords), a
Desc_Put_Descriptions_Loop:
	push bc
	push hl
	call getinfo
	ld a, (tempcoords)
	add a, 6
	ld (tempcoords), a
	ld d, a
	ld e, 3
	ld hl, ramdesc
	call setvputs
	pop hl
	call getnextgoodprog
	jr nz, Abort_Put_Descriptions
	pop bc
	DJNZ Desc_Put_Descriptions_Loop
	jr Desc_Cursor_After_Scroll
Abort_Put_Descriptions:
	pop bc
Desc_Cursor_After_Scroll:
	ld hl, (max_elements)
	ld de, 1
	call cphlde
	call nz, Update_Scrollbar
Desc_Cursor_Sequence:
	call Desc_XOR_Cursor
Desc_Cursor_Sequence_No_XOR:
	ld hl, GUI_Flags
	RES 7, (hl)
	call Desc_Put_Curprog_Info
	call fastcopy
Desc_Cursor_Getkey_Loop:
	bcall(_getcsc)
	cp $04
	jr z, Desc_Cursor_Up			; UP = Cursor Up / Scroll Up
	cp $01
	jr z, Desc_Cursor_Down			; DOWN = Cursor Down / Scroll Down
	cp $32
	jp z, Desc_Page_Up				; TRACE = Page Up, Jump 7 Entries
	cp $31
	jp z, Desc_Page_Down			; GRAPH = Page Down, Jump 7 Entries
	cp $36
	jp z, Desc_Run_Program			; ENTER = Execute Current Program
;	cp $38
;	jp z, Desc_Delete_Program		; DEL = Delete Highlighted Program
	cp $09
	jp z, Desc_Run_Program			; 2ND = Execute Current Program
	cp $28
	jr z, Desc_Call_Folder_Menu		; X VAR = Goto Folders Menu
	cp $30
	jr z, Desc_To_Options_Screen	; ALPHA = Goto Options Sequence
	cp $2A
	jr z, Desc_Move_GUI_Prog		; STO = Move Current Prog to New Folder

	call General_Key_Routine		; MODE = Exit, (+) = Inc, (-) = Dec Contrast
	jr Desc_Cursor_Getkey_Loop

Desc_Call_Folder_Menu:
	call Folder_Menu_Start
	jr Goto_Start_After_Folders
Desc_To_Options_Screen:
	call Options_screen
	jp Desc_Restart_Interface
Desc_Move_GUI_Prog:
	call Move_GUI_Prog
Goto_Start_After_Folders:
	jp Desc_Interface_Start

Ret_Getkey_Check_Page:
	call Check_Paging_Flag
	jr z, Desc_Cursor_Getkey_Loop
	xor a
	ret	

Desc_Cursor_Up:
	ld hl, (curgoodprog)
	call getprevgoodprog
	jr nz, Ret_Getkey_Check_Page
	ld (curgoodprog), hl
	ld hl, curprognum
	dec (hl)
	call Desc_XOR_Cursor
	ld a, (cursorcoords)
	cp 10
	jr z, Desc_Scroll_Up
	sub 6
	ld (cursorcoords), a
	call Check_Paging_Flag
	ret nz
	jp Desc_Cursor_Sequence

Desc_Cursor_Down:
	ld hl, (curgoodprog)
	call getnextgoodprog
	jr nz, Ret_Getkey_Check_Page
	ld (curgoodprog), hl
	ld hl, curprognum
	inc (hl)
	call Desc_XOR_Cursor
	ld a, (cursorcoords)
	cp 46
	jr z, Desc_Scroll_Down
	add a, 6
	ld (cursorcoords), a
	call Check_Paging_Flag
	ret nz
	jp Desc_Cursor_Sequence

Desc_Scroll_Up:
	call Decrease_Cur_Element
	ld hl, (topgoodprog)
	call getprevgoodprog
	ld (topgoodprog), hl
	ld hl, topprognum
	dec (hl)
	ld hl, Plotsscreen+550
	ld de, Plotsscreen+622
	ld b, 35
Desc_Scroll_Up_Loop1:
	ld c, 11
Desc_Scroll_Up_Loop2:
	ld a, (hl)
	ld (de), a
	dec de
	dec hl
	dec c
	jr nz, Desc_Scroll_Up_Loop2
	dec hl
	dec de
	DJNZ Desc_Scroll_Up_Loop1
	ld hl, Plotsscreen+132
	ld b, 5
	xor a
Desc_Clear_Txt_Scroll_Up:
	ld c, 11
Desc_Clear_Txt_Up_Loop1:
	ld (hl), a
	inc hl
	dec c
	jr nz, Desc_Clear_Txt_Up_Loop1
	inc hl
	DJNZ Desc_Clear_Txt_Scroll_Up
	ld hl, 0*256+11
	ld de, 0*256+15
	call fastlineb
	ld hl, (curgoodprog)
	call getinfo
	ld de, 10*256+3
	ld hl, ramdesc
	call setvputs
	jp Desc_Cursor_After_Scroll

Desc_Scroll_Down:
	call Increase_Cur_Element
	ld hl, (topgoodprog)
	call getnextgoodprog
	ld (topgoodprog), hl
	ld hl, topprognum
	inc (hl)
	ld hl, Plotsscreen+192
	ld de, Plotsscreen+120
	ld b, 37
Desc_Scroll_Down_Loop1:
	ld c, 11
Desc_Scroll_Down_Loop2:
	ld a, (hl)
	ld (de), a
	inc de
	inc hl
	dec c
	jr nz, Desc_Scroll_Down_Loop2
	inc hl
	inc de
	DJNZ Desc_Scroll_Down_Loop1
	ld hl, Plotsscreen+564
	ld b, 5
	xor a
Desc_Clear_Txt_Scroll_Down:
	ld c, 11
Desc_Clear_Txt_Down_Loop1:
	ld (hl), a
	inc hl
	dec c
	jr nz, Desc_Clear_Txt_Down_Loop1
	inc hl
	DJNZ Desc_Clear_Txt_Scroll_Down
	ld hl, 0*256+47
	ld de, 0*256+51
	call fastlineb
	ld hl, (curgoodprog)
	call getinfo
	ld de, 46*256+3
	ld hl, ramdesc
	call setvputs
	jp Desc_Cursor_After_Scroll

Check_Paging_Flag:
	ld hl, GUI_Flags
	BIT 7, (hl)
	ret

Clear_Key_Ret_Cur_Seq:
	ld hl, $8440
	ld (hl), 0
	jp Desc_Cursor_Sequence_No_XOR

Desc_Page_Up:
	ld hl, (firstgoodprog)
	ld de, (curgoodprog)
	call cphlde
	jr z, Clear_Key_Ret_Cur_Seq
	ld hl, GUI_Flags
	SET 7, (hl)
	ld a, (cursorcoords)
	cp 10
	jr z, Cont_Page_Up
Page_Up_Loop1:
	ld a, (cursorcoords)
	cp 10
	jr z, Clear_Key_Ret_Cur_Seq
	call Desc_Cursor_Up
	call nz, Desc_XOR_Cursor
	jr Page_Up_Loop1
Cont_Page_Up:
	ld b, 6
Page_Up_Loop2:
	push bc
	call Decrease_Cur_Element
	ld hl, (curgoodprog)
	call getprevgoodprog
	jr nz, Finish_Paging
	ld (curgoodprog), hl
	ld (topgoodprog), hl
	ld hl, topprognum
	dec (hl)
	ld hl, curprognum
	dec (hl)
	pop bc
	DJNZ Page_Up_Loop2
	jr Finish_Paging2

Desc_Page_Down:
	ld hl, GUI_Flags
	SET 7, (hl)
	ld a, (cursorcoords)
	cp 46
	jr z, Cont_Page_Down
Page_Down_Loop1:
	ld hl, (lastgoodprog)
	ld de, (curgoodprog)
	call cphlde
	jr z, Clear_Key_Ret_Cur_Seq
	ld a, (cursorcoords)
	cp 46
	jr z, Clear_Key_Ret_Cur_Seq
	call Desc_Cursor_Down
	call nz, Desc_XOR_Cursor
	jr Page_Down_Loop1
Cont_Page_Down:
	ld b, 6
Page_Down_Loop2:
	push bc
	call Increase_Cur_Element
	ld hl, (curgoodprog)
	call getnextgoodprog
	jr nz, Finish_Paging
	ld (curgoodprog), hl
	ld hl, (topgoodprog)
	call getnextgoodprog
	ld (topgoodprog), hl
	ld hl, topprognum
	inc (hl)
	ld hl, curprognum
	inc (hl)
	pop bc
	DJNZ Page_Down_Loop2
Finish_Paging2:
	ld hl, $8440
	ld (hl), 0
	jp Redraw_Descriptions_List
Finish_Paging:
	pop bc
	jr Finish_Paging2

Desc_Put_Curprog_Info:
	ld hl, 6*256+56
	ld de, 32*256+61
	xor a
	call FilledRectangle
	ld hl, (curgoodprog)
	call getinfo
	ld de, (ramsize)
	push de
	ld de, 56*256+2
	ld hl, OP2
	call setvputs
;	Size in DE, but put it into BC
	pop bc
;	DE = Coordinates to put Size Value
	ld de, 56*256+91
	ld a, 5
	jp Right_Align_Value

Desc_XOR_Cursor:
	ld hl, (cursorcoords)
	ld d, 87
	ld a, 6
	add a, l
	ld e, a
	ld a, 2
	jp FilledRectangle

Desc_Run_Program:
	ld hl, scroll_vars
	ld de, save_scr_vars
	push hl
	push de
	ld bc, 11
	LDIR
	ld hl, (curgoodprog)
	call runprog
	pop hl
	pop de
	ld bc, 11
	LDIR
	jp Desc_Restart_Interface	

;Desc_Delete_Program:
;	ld hl, GUI_Flags
;	BIT 6, (hl)
;	jp nz, Desc_Cursor_Getkey_Loop
;	ld hl, (curgoodprog)
;	push hl
;	ld de, (lastgoodprog)
;	call cphlde
;	jr nz, Finish_Delete_Program
;Delete_Last_Program:
;	ld a, (numgoodprogs)
;	dec a
;	jr z, Finish_Delete_Program
;	ld hl, GUI_Flags
;	SET 7, (hl)
;	push hl
;	call Desc_Cursor_Up	;This Wont Scroll Since Its Last,
;	pop hl				;   Only Needs to Move Up Cursor.
;	RES 7, (hl)
;Finish_Delete_Program:
;	pop hl
;	call delprog
;	call Decrease_Cur_Element
;	ld hl, GUI_Flags
;	SET 6, (hl)
;	jp Desc_Restart_Int_After_Del

None_Text:
	.db "None",0
No_Progs_Text:
	.db "This Folder Is Empty",0

Desc_No_Good_Programs:
	ld de, 56*256+91
	ld bc, $0000
	call Right_Align_Value
	ld de, 56*256+10
	ld hl, None_Text
	call setvputs
	ld hl, No_Progs_Text
	ld de, 27*256+11
	call setvputs
	call ifastcopy
Desc_No_Progs_Getkey_Loop:
	bcall(_getcsc)
	cp $09
	jr z, No_Progs_Call_Folder_Menu		; ENTER = Execute Current Program
	cp $36
	jr z, No_Progs_Call_Folder_Menu		; 2ND = Execute Current Program
	cp $28
	jr z, No_Progs_Call_Folder_Menu		; X VAR = Goto Folders Menu
	cp $30
	jp z, Desc_To_Options_Screen		; ALPHA = Goto The Options Screen

	call General_Key_Routine			; MODE = Exit, (+) = Inc, (-) = Dec Contrast
	jr Desc_No_Progs_Getkey_Loop

No_Progs_Call_Folder_Menu:
	jp Desc_Call_Folder_Menu

.end
