!*! 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