!*! Updated on 16-Dec-92 at 1:30 AM by James A. Jarboe I V; edit time: 0:10:03
!****************************************************************************
!
! SCROLL.BAS - Shows usage of a fancy ESP screen scrolling box.
!
!****************************************************************************
! Uses:
!      TOOLBZ.SBR  -> On AMUS Network
!      TOOLBZ.BSI  -> On AMUS Network
!      SCROLL.SCR  -> On AMUS Network
!      SCROLA.SCR  -> On AMUS Network
!
++include SYSSTD.BSI		! Include Standard ESP stuff
++include TOOLBZ.BSI		! Include TOOLBZ.SBR values.

MAP1 SCV(20), S, 20
	SCV(01) = "One"
	SCV(02) = "Two"
	SCV(03) = "Three"
	SCV(04) = "Four"
	SCV(05) = "Five"
	SCV(06) = "Six"
	SCV(07) = "Seven"
	SCV(08) = "Eight"
	SCV(09) = "Nine"
	SCV(10) = "Ten"
	SCV(11) = "Eleven"
	SCV(12) = "Twelve"
	SCV(13) = "Thirteen"
	SCV(14) = "Fourteen"
	SCV(15) = "Fifteen"
	SCV(16) = "Sixteen"
	SCV(17) = "Seventeen"
	SCV(18) = "Eighteen"
	SCV(19) = "Nineteen"
	SCV(20) = "Twenty"

MAP1 SCROLL$,       S, 34       ! Scroll Screen Name.
MAP1 SCROLL'SCREEN, X, 5000	! Scroll Screen buffer.
MAP1 SCROLL'CHAR,   F, 6        ! Scroll Screen Character value.
MAP1 SCROLL'FIELD,  F, 6        ! Scroll Screen Field Number.
MAP1 SCROLL'TITLE$, S, 80	! Scroll Title
MAP1 SCROLL'UP'AR,  F, 6	! Scroll Screen Up arrow field number.
MAP1 SCROLL'DN'AR,  F, 6	! Scroll Screen Down arrow field number.
MAP1 SCROLL'MAX,    F, 6	! Maximum number in Array.
MAP1 SCROLL'CURRENT,F, 6        ! Current location in Array.
MAP1 SCROLL'WINDOW, F, 6        ! Size of Scroll Window Items.
MAP1 SCROLL'ARRAY(20), S, 20    ! Scroll Array.
MAP1 ESP'HOME,      F, 6, 30	! Define CTRL-^
MAP1 ESP'END,       F, 6, 5     ! Define CTRL-E


! Properly initialize terminal.
!
	XCALL INITRM, "Scroll Test","By James A. Jarboe IV"

! Fetch Needed Screens.	
!
	xcall FETCH, "SCROLA", SCREEN, X
	if X goto FETCH'ERROR
	SCROLL$ = "SCROLL"
	xcall FETCH, SCROLL$, SCROLL'SCREEN, X
	if X goto FETCH'ERROR

! Properly open First Screen.
!
	xcall OPNSCR, SCREEN
	CHAR = ESP'BEGLIN		! Preset Character.
	FIELD = 1			! Preset Field.
	ESP'FLSSEL = ESP'FLSDEC+asc(".")
! Get Screen input.
!
GTSCR:
	XCALL GTSCR, SCREEN, CHAR, FIELD, ESP'FLSSEL

	if (CHAR and 255) = ESP'MENU goto QUIT
	if (CHAR and 255) = ESP'EXECUTE goto QUIT

	if (CHAR and 255) = ESP'F9 call F9'SCROLL
	goto GTSCR

QUIT:
	xcall CLSSCR, SCREEN		! Properly close screen.
	xcall INITRM			! Properly close terminal.
	end				! Exit.


! Process F9.
!
F9'SCROLL:

! Preset Needed variables for Scrolling window.
!
	SCROLL'WINDOW  = 5		! Scroll depth.
	SCROLL'MAX     = 20		! Maximum in array.
	SCROLL'CURRENT = 1		! Current position in array.
	SCROLL'TITLE$  = "ESP Screen Scroll" ! Title.

! Fill array padded with spaces.
!
	for X = 1 to SCROLL'MAX
		SCROLL'ARRAY(X) = SCV(X)+SPACE$(20)
	next X

! Call the scrolling routine.
!
	CALL SCROLL'SCREEN

! Process what we got.
!
	XCALL GETVAL, SCROLL'SCREEN, SCROLL'FIELD, X$
	XCALL SETVAL, SCREEN, 1, X$, SCROLL'FIELD, SCROLL'CURRENT
	return


SCROLL'SCREEN:

	XCALL OPNSCR, SCROLL'SCREEN	! Properly Open Scroll Screen.
	SCROLL'UP'AR = SCROLL'WINDOW+1  ! Preset up arrow indicator.
	SCROLL'DN'AR = SCROLL'WINDOW+2  ! Preset down arrow indicator.

! Hide up arrow.
!
	XCALL TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'UP'AR, TRUE

! Set values in array and dim all input lines.
!
	for X = 1 to SCROLL'WINDOW
		XCALL SETVAL, SCROLL'SCREEN, X, SCROLL'ARRAY(X)
		XCALL SETDFC, SCROLL'SCREEN, X, 11,12
	next X

! Set title.
!
	xcall SETVAL, SCROLL'SCREEN, SCROLL'WINDOW+3, SCROLL'TITLE$


	SCROLL'CHAR = (ESP'BEGLIN OR ESP'DAF)
	SCROLL'FIELD = 1
	xcall SETDFC, SCROLL'SCREEN, SCROLL'FIELD, 0,0

! Process scrolling until MENU or EXECUTE.
!
SCROLL'EDIT:
	XCALL GTSCR, SCROLL'SCREEN, SCROLL'CHAR, SCROLL'FIELD	
	X = (SCROLL'CHAR and 255)
	IF (SCROLL'CHAR and 255) = ESP'MENU goto SCROLL'END
	IF (SCROLL'CHAR and 255) = ESP'EXECUTE goto SCROLL'END
	IF (SCROLL'CHAR and 255) = ESP'HOME call SCROLL'HOME : goto SCROLL'EDIT
	IF (SCROLL'CHAR and 255) = ESP'END call SCROLL'EOS : goto SCROLL'EDIT
	IF (SCROLL'CHAR and ESP'POSTEDIT) then call SCROLL'UPD
	goto SCROLL'EDIT

SCROLL'END:
	XCALL CLSSCR, SCROLL'SCREEN
	return


! Scroll Update.
!
SCROLL'UPD:
	IF (X < 10) OR (X > 11) : SCROLL'CHAR = ESP'BEGLIN :  return
	xcall SETDFC, SCROLL'SCREEN, SCROLL'FIELD, 11, 12
	X = SCROLL'FIELD
	IF (SCROLL'CHAR AND 255) = 10 call SCROLL'DOWN 
	IF (SCROLL'CHAR AND 255) = 11 call SCROLL'UP
	xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'UP'AR, FALSE
	xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'DN'AR, FALSE
	if SCROLL'CURRENT =1 xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'UP'AR, TRUE
	if SCROLL'CURRENT = SCROLL'MAX xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'DN'AR, TRUE
	return

! Scroll Down.
!
SCROLL'DOWN:
	if SCROLL'FIELD < SCROLL'WINDOW then X=X+1
	xcall SETDFC, SCROLL'SCREEN, X, 0,0
	SCROLL'CURRENT=SCROLL'CURRENT+1
	if SCROLL'FIELD <> SCROLL'WINDOW goto SCROLL'DOWN'END
	SCROLL'CHAR = ESP'BEGLIN
	IF SCROLL'CURRENT > SCROLL'MAX then SCROLL'CURRENT= SCROLL'MAX : GOTO SCROLL'DOWN'END
	for X = 1 to SCROLL'WINDOW
		XCALL SETVAL, SCROLL'SCREEN, X, SCROLL'ARRAY(SCROLL'CURRENT-(SCROLL'WINDOW-X))
	next X

SCROLL'DOWN'END:
	return

! Scroll UP
!
SCROLL'UP:
	if SCROLL'FIELD > 1 X=X-1
	xcall SETDFC, SCROLL'SCREEN, X, 0,0
	SCROLL'CURRENT=SCROLL'CURRENT-1
	if SCROLL'FIELD <> 1 goto SCROLL'UP'END
	SCROLL'CHAR = ESP'BEGLIN
	IF SCROLL'CURRENT < 1 SCROLL'CURRENT=1 : GOTO SCROLL'UP'END
	for X = 1 TO SCROLL'WINDOW 
		XCALL SETVAL, SCROLL'SCREEN, X, SCROLL'ARRAY(SCROLL'CURRENT+X-1)
	next X

SCROLL'UP'END:
	return

! User pressed HOME KEY.
!
SCROLL'HOME:
	xcall SETDFC, SCROLL'SCREEN, SCROLL'FIELD, 11, 12
	SCROLL'CURRENT = 1
	for X = 1 to SCROLL'WINDOW
		xcall SETVAL, SCROLL'SCREEN, X, SCROLL'ARRAY(X)
	next X
	SCROLL'FIELD = 1
	SCROLL'CHAR = ESP'BEGLIN
	SCROLL'CURRENT = 0
	X = 0
	xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'UP'AR, TRUE
	xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'DN'AR, FALSE
	goto SCROLL'DOWN

! User pressed END KEY or CTRL-E
!
SCROLL'EOS:
	xcall SETDFC, SCROLL'SCREEN, SCROLL'FIELD, 11, 12
	SCROLL'CURRENT = SCROLL'MAX-SCROLL'WINDOW
	for X = 1 to SCROLL'WINDOW	
		xcall SETVAL, SCROLL'SCREEN, X, SCROLL'ARRAY(SCROLL'CURRENT+X)
	next X
	SCROLL'FIELD = SCROLL'WINDOW
	SCROLL'CHAR  = ESP'BEGLIN
	SCROLL'CURRENT = SCROLL'MAX+1
	X = SCROLL'WINDOW+1
	xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'UP'AR, FALSE
	xcall TOOLBZ, TBX'HIDFLD, SCROLL'SCREEN, SCROLL'DN'AR, TRUE
	goto SCROLL'UP


FETCH'ERROR:
	xcall ERRDSP, "Fetch Error #"+STR(X)
	end

ERR'ROUTINE:
	xcall ERRDSP, "Basic Error #"+STR(ERR(0))
	END