!
! DEMO72.bas - AM72 & MOUSE Demo Program
!               Works with 480 line or 350 line monitors
!

PROGRAM DEMO72,1.0

++INCLUDE       AMGSYM.BSI
++INCLUDE       FILES.MAP

MAP1    GCB                     , X,56000
MAP1    DSP'MAX                 , F,  6, 100
MAP1    DSP'ARRAY
       MAP2    DSP'COUNT       , B,  2
       MAP2    DSP'XY(100)
               MAP3    DSP'X   , B,  2
               MAP3    DSP'Y   , B,  2

MAP1    POINT'MAX               , F,  6, 100
MAP1    POINT'ARRAY
       MAP2    POINT'COUNT     , B,  2
       MAP2    POINTS(100)
               MAP3    POINT'X , B,  2
               MAP3    POINT'Y , B,  2

MAP1    MAX'ZONES               , F,  6, 20
MAP1    ZONES(20)
       MAP2    ZONES'X(2)      , F,  6
       MAP2    ZONES'Y(2)      , F,  6

MAP1    TEXT'X(20)              , F,  6
MAP1    TEXT'Y(20)              , F,  6

MAP1    STATUS                  , F,  6 !Status retruned from AMIGOS calls
MAP1    TEXT$                   , S, 80
MAP1    FIL'STAT                , S,  3 ! FILE STATUS
MAP1    LEVEL                   , F,  6
MAP1    INDEX                   , F,  6
MAP1    ICONS                   , F,  6
MAP1    COMMAND                 , S,100 ! CHAINING COMMAND
MAP1    CRLF                    , S,  2 ! CARRIAGE RETURN & LINE FEED FOR COMMAND
MAP1    DO'FILE                 , S, 16 ! COMMAND FILE USED IN MEM0:
MAP1    IPF'FILE                , S, 16 ! CONFIG. FILE FOR LEVEL POSITIONING
MAP1    FILES(20)
       MAP2     F'LEVEL       , X,   2 !  Level:
       MAP2     F'DESC        , X,  30 !  Description:
       MAP2     F'TYPE        , S,   1 !  Type:
       MAP2     F'CMND'2      , S,  30 !  Command Line 2
       MAP2     F'CMND'1      , S,  30 !  Command Line 1
       MAP2     F'CMND'3      , S,  30 !  Command Line 3
       MAP2     F'CMND'4      , S,  30 !  Command Line 4
       MAP2     F'CMND'5      , S,  30 !  Command Line 5
       MAP2     F'CMND'6      , S,  30 !  Command Line 6
       MAP2     F'NEW'LEVEL   , B,   1 !  New Level

! FOR XCALL "TRMCHR"
MAP1    TRMCHR'MAP
       MAP2    TRMCHR'FLAGS    , F,  6
       MAP2    TRMCHR'ROWS     , F,  6
       MAP2    TRMCHR'COLS     , F,  6
       MAP2    TRMCHR'COLORS   , F,  6
       MAP2    TRMCHR'FORE     , F,  6
       MAP2    TRMCHR'BACK     , F,  6
       MAP2    TRMCHR'WINROW   , F,  6
       MAP2    TRMCHR'WINCOL   , F,  6


!***********************************************!
DEMO72:
!       ON ERROR GOTO ERROR'ROUTINE
       SIGNIFICANCE    11
       XCALL   TRMCHR, STATUS,TRMCHR'MAP
       PRINT   TAB(-2,1);      TAB(-3,0);

       LEVEL   = 1

       DO'FILE = "MEM0:DEMO72.DO"

       PRINT   TAB(-1,0);
       CRLF    = CHR(13) + CHR(10)
       GOSUB   DO'OVERHEAD             ! SET DEFAULTS
RQLC2:
       GOSUB   DO'EXIT'BOX             ! WRITE EXIT BOX
       GOSUB   CREATE'ZONES            ! CREATE THE ZONES FOR ICONS
       GOSUB   FILL'ZONES              ! FILL ZONES BASED ON FILES.IDA
       GOSUB   DO'SELECTION            ! GET THE SELECTION

END'IT:
       GOSUB   CLOSE'FILES
       XCALL   AMGSBR,G'CLWK,GCB,STATUS
       PRINT   TAB(-1,0);
       END
!***********************************************!
DO'OVERHEAD:
! Set Mouse Cursor Shape
       PRINT   TAB(-1,29);
       PRINT   TAB(-1,160);CHR(32+3);
! Open the workstation
       XCALL AMGSBR,G'OPWK,GCB,"",STATUS
! Clear the workstation
       XCALL AMGSBR,G'CLRW,GCB,STATUS
! Text Overhead
       XCALL   AMGSBR,G'STXF,GCB,1001,STATUS   ! font
       XCALL   AMGSBR,G'STXC,GCB,7,STATUS      ! color
       XCALL   AMGSBR,G'SCHH,GCB,1500,STATUS   ! height
       XCALL   AMGSBR,G'SCHR,GCB,300,STATUS    ! rotation
! Fill Area Overhead
       XCALL   AMGSBR,G'SFAC,GCB,4,STATUS      ! color
       XCALL   AMGSBR,G'SFAS,GCB,2,STATUS      ! style
       XCALL   AMGSBR,G'SFAI,GCB,55,STATUS     ! index

       RETURN
                                               !
!***********************************************!
DO'EXIT'BOX:
       ! Exit Box
       COLOR   = 7
       XMIN    =300
       XMAX    =3500
       YMIN    =23000
       YMAX    =24500

       EXIT'X1 =300
       EXIT'Y1 =23000
       EXIT'X2 =3500
       EXIT'Y2 =24500

       GOSUB   DISP'BOX                        ! exit box

       XCALL   AMGSBR,G'STXF,GCB,1001,STATUS   ! font
       XCALL   AMGSBR,G'STXC,GCB,2,STATUS      ! color
       XCALL   AMGSBR,G'SCHH,GCB,900,STATUS    ! height
       XCALL   AMGSBR,G'SCHR,GCB,0,STATUS      ! rotation
       TEXT$   ="EXIT"
       XVAL    =900
       YVAL    =23500
       GOSUB   DISP'TEXT

       XCALL   AMGSBR,G'STXF,GCB,1003,STATUS   ! font
       XCALL   AMGSBR,G'STXC,GCB,4,STATUS      ! color
       XCALL   AMGSBR,G'SCHH,GCB,1200,STATUS   ! height
       XCALL   AMGSBR,G'SCHR,GCB,0,STATUS      ! rotation
       TEXT$   = "AM72 DEMO SOFTWARE"
       XVAL    = 8100
       YVAL    = 23000
       GOSUB   DISP'TEXT

       XCALL   AMGSBR,G'STXF,GCB,1006,STATUS   ! font
       XCALL   AMGSBR,G'STXC,GCB,4,STATUS      ! color
       XCALL   AMGSBR,G'SCHH,GCB,1100,STATUS   ! height
       XCALL   AMGSBR,G'SCHR,GCB,0,STATUS      ! rotation
       TEXT$   = "- with mouse interface - "
       XVAL    = 7500
       YVAL    = 22000
       GOSUB   DISP'TEXT

       RETURN
!***********************************************!
CREATE'ZONES:
       ! Screen Frame
       COLOR   = 7
       POINT'X(1)      = 300
       POINT'Y(1)      = 300
       POINT'X(2)      = 300
       POINT'Y(2)      = 31000
       POINT'X(3)      = 31000
       POINT'Y(3)      = 31000
       POINT'X(4)      = 31000
       POINT'Y(4)      = 300
       POINT'X(5)      = POINT'X(1)
       POINT'Y(5)      = POINT'Y(1)

       XCALL   AMGSBR,G'SPLC,GCB,1,STATUS
       POINT'COUNT     =5
       XCALL   AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS

       IF      (TRMCHR'ROWS = 24)      &
               YVAL    = 19200         &
       ELSE                            &
               YVAL    = 19800
       ZONES'KTR= 0

       FOR I   = 1 TO 10

       XVAL    = 500
               FOR X   = 1 TO 2
                       ZONES'KTR=ZONES'KTR+1

                       ZONES'X(ZONES'KTR,1)=XVAL
                       ZONES'Y(ZONES'KTR,1)=YVAL

                       ZONES'X(ZONES'KTR,2)=XVAL+1500
                       ZONES'Y(ZONES'KTR,2)=YVAL+1500

                       TEXT'X(ZONES'KTR)   =XVAL+2000
                       TEXT'Y(ZONES'KTR)   =YVAL+460

                       XVAL    = XVAL + 16000
               NEXT X
               IF      (TRMCHR'ROWS = 24)      &
                       YVAL    = YVAL - 1825   &
               ELSE                            &
                       YVAL    = YVAL - 2000

       NEXT I

       RETURN

!***********************************************!
FILL'ZONES:
       GOSUB   CLEAR'FILES'ARRAY
       GOSUB   OPEN'FILES
       FILES'KEY1 = SPACE(32)
       ICONS   = 0
       IF      (TRMCHR'ROWS = 24)      &
               ROW     = 5             &
       ELSE                            &
               ROW     = 6
       GOSUB   LOAD'ZONES'ARRAY

       FOR I   = 1 TO ICONS

       XCALL   AMGSBR,G'SWKV,GCB,ZONES'X(I,1),ZONES'Y(I,1),ZONES'X(I,2),ZONES'Y(I,2),STATUS

       GOSUB   DO'BOX

       XCALL   AMGSBR,G'SWKV,GCB,1,1,32000,32000,STATUS
       XCALL   AMGSBR,G'STXF,GCB,1001,STATUS   ! font
       XCALL   AMGSBR,G'STXC,GCB,7,STATUS      ! color
       XCALL   AMGSBR,G'SCHH,GCB,600,STATUS    ! height
       XCALL   AMGSBR,G'SCHR,GCB,0,STATUS      ! rotation

       XVAL    =TEXT'X(I)
       YVAL    =TEXT'Y(I)
!       TEXT$   = F'DESC(I)
!       GOSUB   DO'TEXT

! 480 line
       IF      (TRMCHR'ROWS <> 24)                     &
               IF      (INT(I/2) <> I/2)               &
                       PRINT   TAB(ROW,05);F'DESC(I);  &
               ELSE                                    &
                       PRINT   TAB(ROW,45);F'DESC(I);  : &
                       ROW     = ROW + 3

! 350 line
       IF      (TRMCHR'ROWS = 24)                      &
               IF      (INT(I/2) <> I/2)               &
                       PRINT   TAB(ROW,05);F'DESC(I);  &
               ELSE                                    &
                       PRINT   TAB(ROW,45);F'DESC(I);  : &
                       ROW     = ROW + 2

       NEXT I

       RETURN

!***********************************************!
DO'SELECTION:
       GOSUB   GETCOR                          ! mouse input
       GOSUB   CHECK'EXIT
       IF EXIT'FLAG=1          &
               ZONES'PNTR = 0  : &
               RETURN
       GOSUB   CHECK'ZONES
       IF      (ZONES'FLAG = 1)        &
               GOSUB   CHAIN'SELECTION : &
               RETURN

       GOTO    DO'SELECTION

CHECK'EXIT:
       EXIT'FLAG=0

       IF XVAL<(EXIT'X1-25) THEN RETURN
       IF XVAL>(EXIT'X2+25) THEN RETURN
       IF YVAL<(EXIT'Y1-25) THEN RETURN
       IF YVAL>(EXIT'Y2+25) THEN RETURN

       EXIT'FLAG=1

       RETURN

CHECK'ZONES:
       ZONES'FLAG=0

       FOR     SELECT = 1 TO ICONS
               IF XVAL<(ZONES'X(SELECT,1)-25) GOTO CHECK'ZONES'10
               IF XVAL>(ZONES'X(SELECT,2)+25) GOTO CHECK'ZONES'10
               IF YVAL<(ZONES'Y(SELECT,1)-25) GOTO CHECK'ZONES'10
               IF YVAL>(ZONES'Y(SELECT,2)+25) GOTO CHECK'ZONES'10
               ZONES'FLAG      = 1
               ZONES'PNTR      = SELECT
               SELECT          = ICONS

CHECK'ZONES'10:
       NEXT    SELECT

       RETURN

! *****************************************************
DO'BOX:
       COLOR   = VAL(F'TYPE(I))
       XMIN    =1500
       XMAX    =20000
       YMIN    =1500
       YMAX    =22000
       GOSUB   DISP'BOX

       RETURN
! *******************************************************

DISP'BOX:
       POINT'X(1)      =XMIN
       POINT'Y(1)      =YMIN
       POINT'X(2)      =XMIN
       POINT'Y(2)      =YMAX
       POINT'X(3)      =XMAX
       POINT'Y(3)      =YMAX
       POINT'X(4)      =XMAX
       POINT'Y(4)      =YMIN
       POINT'X(5)      =POINT'X(1)
       POINT'Y(5)      =POINT'Y(1)

       XCALL   AMGSBR,G'SPLC,GCB,1,STATUS
       XCALL   AMGSBR,G'SFAC,GCB,COLOR,STATUS  ! color
       POINT'COUNT     = 4
       XCALL   AMGSBR,G'FA,GCB,POINT'ARRAY,STATUS
       POINT'COUNT     = 5
       XCALL   AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS
       RETURN

DISP'LINE:
       POINT'X(1)      =XMIN
       POINT'Y(1)      =YMIN
       POINT'X(2)      =XMIN
       POINT'Y(2)      =YMAX
       POINT'X(3)      =XMAX
       POINT'Y(3)      =YMAX
       POINT'X(4)      =XMAX
       POINT'Y(4)      =YMIN
       POINT'X(5)      =POINT'X(1)
       POINT'Y(5)      =POINT'Y(1)
DISP'LINE'10:
       POINT'COUNT     =5
       XCALL   AMGSBR,G'SPLC,GCB,COLOR,STATUS
       XCALL   AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS
       RETURN

!***********************************************!
DO'TEXT:
       XCALL   AMGSBR,G'TX,GCB,XVAL,YVAL,TEXT$,STATUS
       RETURN
DISP'TEXT:
       XCALL   AMGSBR,G'TX,GCB,XVAL,YVAL,TEXT$,STATUS
       RETURN
!***********************************************!

GETCOR:
       XCALL AMGSBR,G'RQLC,GCB,0,0,0,XVAL,YVAL,CHAR,VALID
       RETURN

GETCOR1:
       XCALL AMGSBR,G'RQLC,GCB,XVAL,YVAL,2,XVAL,YVAL,CHAR,VALID
       RETURN
       END


CLEAR'FILES'ARRAY:
       FOR     ZIP = 1 TO 20
               F'LEVEL       = SPACE(2)
               F'DESC        = SPACE(30)
               F'TYPE        = SPACE(1)
               F'CMND'2      = SPACE(30)
               F'CMND'1      = SPACE(30)
               F'CMND'3      = SPACE(30)
               F'CMND'4      = SPACE(30)
               F'CMND'5      = SPACE(30)
               F'CMND'6      = SPACE(30)
               F'NEW'LEVEL   = 0
       NEXT    ZIP

       RETURN

LOAD'ZONES'ARRAY:
       GOSUB   FILES'GET'NEXT
       IF      (FIL'STAT <> "   ")             &
          OR   (VAL(FILES'LEVEL) <> LEVEL)     &
               RETURN


       ICONS           = ICONS + 1
       FILES(ICONS)    = FILES'RECORD

       GOTO    LOAD'ZONES'ARRAY

CHAIN'SELECTION:
       LOOKUP  DO'FILE,Q
       IF      (Q = 0)         &
               GOTO    CONT'CHAIN
       KILL    DO'FILE
       GOTO    CHAIN'SELECTION

CONT'CHAIN:
       COMMAND = SPACE(100)
       OPEN    #555,DO'FILE,OUTPUT
       PRINT   #555,":R"
       XCALL   STRIP, F'CMND'1(ZONES'PNTR)
       IF      (LEN(F'CMND'1(ZONES'PNTR)) > 0)         &
               PRINT   #555,F'CMND'1(ZONES'PNTR)

       XCALL   STRIP, F'CMND'2(ZONES'PNTR)
       IF      (LEN(F'CMND'2(ZONES'PNTR)) > 0)         &
               PRINT   #555,F'CMND'2(ZONES'PNTR)

       XCALL   STRIP, F'CMND'3(ZONES'PNTR)
       IF      (LEN(F'CMND'3(ZONES'PNTR)) > 0)         &
               PRINT   #555,F'CMND'3(ZONES'PNTR)

       XCALL   STRIP, F'CMND'4(ZONES'PNTR)
       IF      (LEN(F'CMND'4(ZONES'PNTR)) > 0)         &
               PRINT   #555,F'CMND'4(ZONES'PNTR)

       XCALL   STRIP, F'CMND'5(ZONES'PNTR)
       IF      (LEN(F'CMND'5(ZONES'PNTR)) > 0)         &
               PRINT   #555,F'CMND'5(ZONES'PNTR)

       XCALL   STRIP, F'CMND'6(ZONES'PNTR)
       IF      (LEN(F'CMND'6(ZONES'PNTR)) > 0)         &
               PRINT   #555,F'CMND'6(ZONES'PNTR)


       PRINT   #555,"RUN DEMO72"
       CLOSE   #555
       CHAIN   DO'FILE


! **************************************************
! ISAM FILE ACCESSING
! **************************************************
OPEN'FILES:
       FIL'STAT        = SPACE(3)
       OPEN    #FILES'CHN, FILES'FL$, INDEXED, FILES'RSZ, RECNO
       IF      (ERF(FILES'CHN) > 0)            &
               GOTO    REPORT'ERRORS

       RETURN

FILES'GET:
       FIL'STAT        = SPACE(3)
       ISAM    #FILES'CHN, 1, FILES'KEY1

       IF      (ERF(FILES'CHN) = 33)   &
               FIL'STAT        = "NOF" : &
               RETURN

       IF      (ERF(FILES'CHN) > 0)    &
               GOTO    REPORT'ERRORS

       GOSUB   READ'FILES
       RETURN

FILES'GET'NEXT:
       FIL'STAT        = SPACE(3)

       ISAM    #FILES'CHN, 2, FILES'KEY1
       IF      (ERF(FILES'CHN) = 38)   &
               FIL'STAT        = "EOF" : &
               RETURN

       IF      (ERF(FILES'CHN) = 33)   &
               FIL'STAT        = "NOF" : &
               RETURN

       IF      (ERF(FILES'CHN) > 0)    &
               GOTO    REPORT'ERRORS

       GOSUB   READ'FILES
       RETURN

READ'FILES:
       READ    #FILES'CHN, FILES'RECORD
       RETURN

CLOSE'FILES:
       CLOSE   #FILES'CHN
       RETURN


REPORT'ERRORS:
       PRINT   TAB(24,1);"ERROR # ";ERF(FILES'CHN);" -- ABORTING JOB"
       GOTO    END'IT

!++INCLUDE      BAS:ERROR.BSI