! SCREEN.BAS  - Produces compilable BSI listing for terminal screen.
! Written 02-01-85
! by J. A. Jarboe IV
!
! USES: AMOS  .SBR    by Dave Pallman on AMUS
!       VUE   .SBR    by Dave Pallman on AMUS
!       STRIP .SBR    somewhere in AMOS land
!
! RUNS: on AM100/L

MAP1 ST                                 ! main array of info in xcall
MAP2  AR(24),S,80                      ! easy to get to display
MAP1 GRA                                ! Graphics of info
       MAP2 GR(24),S,80                ! easy to get to display
MAP1 DO(24),S,80
MAP1 VUE                                ! Maps for Xcall VUE.SBR
       MAP2 ROWS,F,6,23                ! # of rows in display
       MAP2 COLUMNS,F,6,80             ! # of columns in display
       MAP2 LEFTCOL,F,6,0              ! left column position
       MAP2 LEFTROW,F,6,0              ! left row position
MAP1 FILE$,S,24                         ! Filename to process
MAP1 EXT$,S,4,".SCR"                    ! Screen file extension
MAP1 BASFIL,S,24                        ! BASIC filename
MAP1 MSG$,S,30                          ! Input message
MAP1 QU,S,1,CHR(34)                     ! Quotation mark
MAP1 TERMINAL                           ! Terminal data
       ! Enter the characters for graphics characters for your terminal
       MAP2 BLC,S,1,"A"                ! bottom left corner
       MAP2 TLC,S,1,"B"                ! top left corner
       MAP2 TRC,S,1,"C"                ! top right corner
       MAP2 BRC,S,1,"D"                ! bottom right corner
       MAP2 CRS,S,1,"I"                ! cross
       MAP2 VRT,S,1,"J"                ! vertical
       MAP2 HRZ,S,1,"K"                ! horizontal
       MAP2 LEF,S,1,"L"                ! Line and left
       MAP2 LRT,S,1,"M"                ! Line and right
       MAP2 DWN,S,1,"N"                ! Line and down
       MAP2 LUP,S,1,"O"                ! Line and up
                                       ! ? tab(-1,y)
       MAP2 LOW,B,2,11                 ! Low Intensity
       MAP2 HIGH,B,2,12                ! High Intensity
       MAP2 PROT,B,2,13                ! prot field
       MAP2 UNPRO,B,2,14               ! unprot field
       MAP2 GON,B,2,23                 ! start line draw
       MAP2 GOFF,B,2,24                ! end line draw
MAP1 WHOLE,S,30                         ! Xcall AMOS, string


!******************
!
! MAIN MENU
!
!******************

MENU:

? TAB(-1,0);
? TAB(1,26);"Screen Processing";
? TAB(2,29);"Version 1.0";
? TAB(4,26);"Select Entry";
? TAB(6,23);"1. DIRectory of Screens";
? TAB(7,23);"2. VUE a Screen";
? TAB(8,23);"3. BASing listing of Screen";
? TAB(9,23);"4. INPut Special Effects to Screen";
? TAB(10,23);"5. SEE actual Screen";
? TAB(11,23);"6. HELp for Screen";
? TAB(12,23);"7. QUIT";
IF FILE$#" " THEN ? TAB(13,19);"Processing ";FILE$
? TAB(4,39);A$;TAB(4,39);:INPUT "",A$
ON A$ GOTO DIR,VUE,BAS,INP,SEE,HEL,QUIT
IF A$="DIR" THEN GOTO DIR
IF A$="VUE" THEN GOTO VUE
IF A$="BAS" THEN GOTO BAS
IF A$="INP" THEN GOTO INP
IF A$="SEE" THEN GOTO SEE
IF A$="HEL" THEN GOTO HEL
IF A$="QUI" THEN GOTO QUIT
GOTO MENU

!******************
!
! DIRectory
!
!******************

DIR:
       ? TAB(-1,0);"DIRECTORY OF SCREEN FILES"

       XCALL AMOS,"DIR *.SCR/W"
       CALL PROMPT
       GOTO MENU

!******************
!
! VUE the screen file
!
!******************

VUE:
       ? TAB(2,1);TAB(-1,10);
       MSG$="Enter name of file to VUE "
       CALL FILE
       XCALL AMOS,"VUE "+FILE$
       GOTO BAS

!******************
!
! INPut Special effects (INPUT,GRAPHICS,INTENSITY)
!
!******************

INP:
       ? TAB(-1,0);
       MSG$="Enter file to Process "
       CALL FILE
       ? TAB(-1,0);
       ? TAB(2,28);"SPECIAL EFFECTS";
       ? TAB(4,28);"Enter Selection ";
       ? TAB(6,28);"1. Input Statements";
       ? TAB(7,28);"2. Graphics on";
       ? TAB(8,28);"3. Main Menu";
       ? TAB(4,44);:INPUT "",M$
       IF VAL(M$)<1 OR VAL(M$)>2 THEN GOTO MENU
       ? TAB(-1,0);
       OPEN #1,FILE$,INPUT
       FOR I=1 TO 23
       INPUT LINE #1,AR(I)
       NEXT I
       FOR I=1 TO ROWS
       ? TAB(I,1);AR(I);
       AR(I)=AR(I)+SPACE$(80)
       NEXT I
       ON VAL(M$) CALL STA,GRA
INP1:
       CLOSE #1
       ? TAB(-1,0);
       IF GFLAG=1 THEN ? TAB(-1,GOFF);
       OPEN #1,FILE$,OUTPUT
       FOR I=1 TO 23
       ? #1,AR(I)[1,80]
       NEXT I
       CALL PUTGRA
       CLOSE #1

!******************
!
! BASic listing creation
!
!******************

BAS:
       ? TAB(-1,0);"PRODUCING BSI COMPILABLE LISTING"
       MSG$="Enter Name of File to Process "
       IF A$="3" OR A$="BAS" THEN CALL FILE
       OPEN #1,FILE$,INPUT
       OPEN #2,BASFIL,OUTPUT
       IFLAG=0
       FOR I=1 TO 23
       INPUT LINE #1,AR(I)
       NEXT I
       FOR I=1 TO 23
       INPUT LINE #1,GR(I)
       NEXT I
       GFLAG=0
BASAG:

       FOR I= 1 TO 23
       DO(I)=AR(I)
       IF GFLAG=1 THEN GOTO BASAG2
BASAG2:
       IF DO(I)="" THEN GOTO NXI
PASIT:
       A=0
       IF DO(I)=" " THEN GOTO NXI
       XCALL STRIP,DO(I)
FIN:
       A=A+1
       IF A> LEN(DO(I)) THEN GOTO NXI
       IF DO(I)[A,A]=" " THEN GOTO FIN
QUOT:
       Q1=INSTR(A,DO(I),CHR(34))
       IF Q1>0 THEN Q2=INSTR(Q1,DO(I),CHR(34))
       Q1=Q1-1
       IF GFLAG=1 THEN Q1=INSTR(A,DO(I)," "):Q1=Q1-1
       IF Q1<1 THEN Q1=LEN(DO(I))
PRI:
       ? #2,"? TAB("+I+","+A+");"+CHR$(34)+DO(I)[A,Q1]+CHR$(34)+";"
       A=Q1+3
       Q1=0:Q2=0
       GOTO FIN
NXI:
NEXI:
       A=0
       NEXT I
       Q2=1
       IF IFLAG=1 THEN GOTO QUOTA
       GFLAG=0
       FOR I=1 TO 23
       IF GFLAG=1 THEN GOTO PASFL
       IF GR(I)#""THEN ? #2,"? TAB(-1,"+GON+");":GFLAG=1
PASFL:
       IFLAG=1
       DO(I)=GR(I)
       GOTO BASAG2
QUOTA:
       IF GFLAG=1 THEN ? #2,"? TAB(-1,"+GOFF+");"
       FOR I=1 TO 23
QUOT2:
       Q1=INSTR(Q2,AR(I),CHR(34))
       IF Q1<1 THEN GOTO NEXIT
       Q2=Q1+3
       ? #2,"? TAB("+I+","+Q1+");:INPUT A$"
       GOTO QUOT2
NEXIT:
       Q2=1
       NEXT I
       FOR I=1 TO 23
       DO(I)=SPACE$(80):GR(I)=DO(I):AR(I)=DO(I)
       NEXT I
CL1:
       CLOSE #1
       CLOSE #2
       GOTO MENU

!*****************
!
! SEE actual compiled BSI file
!
!*****************

SEE:
       ? TAB(-1,0);
       MSG$="Enter name of file to process "
       IF A$="5" OR A$="SEE" THEN CALL FILE
       WHOLE="COMPIL "+BASFIL
       XCALL AMOS,WHOLE
       ? TAB(-1,0);
       XCALL AMOS,"RUN "+BASFIL[1,DOT-1]
       CALL PROMPT
       GOTO MENU

!******************
!
! HELP file
!
!******************

HEL:
       ? TAB(-1,0);
       XCALL AMOS,"HELP SCREEN"
       CALL PROMPT
       GOTO MENU

!******************
!
! SUBROUTINES
!
!******************

FILE:
       ? TAB(4,24);MSG$;
       WHR=24+LEN(MSG$)
       ? TAB(4,WHR);FILE$[1,DOT-1];
       ? TAB(4,WHR);
       INPUT "",FILE$
       XCALL STRIP,FILE$
       DOT=INSTR(1,FILE$,".")
       IF DOT=0 THEN FILE$=FILE$+EXT$
       DOT=INSTR(1,FILE$,".")
       BASFIL=FILE$[1,DOT-1]+".BSI"
       XCALL STRIP,BASFIL
       RETURN

PROMPT:
       ? TAB(24,1);"Enter Carriage Return to Continue";:INPUT " ",A$
       RETURN
QUIT:
       ? TAB(-1,0);
       END
STA:
       ? TAB(24,1);"ESC-End  ";QU;"$";QU;"-Input  ";QU;"L";QU;"-Low  ";QU;"H";QU;"-High";
        XCALL VUE,ST,ROWS,COLUMNS,LEFTROW,LEFTCOL
       GOTO INP1

GRA:
       ? TAB(-1,GON);
       FOR I=1 TO ROWS
       INPUT LINE #1,GR(I)
       GR(I)=GR(I)+SPACE$(80)
       IF GR(I)="" THEN GOTO NEXA
GTOP:
       A=A+1
       IF A>80 THEN GOTO NEXA
       IF GR(I)[A,A]=" " THEN GOTO GTOP
       B=INSTR(A,GR(I)," ")
       B=B-1
       IF B<1 THEN B=LEN(GR(I))
       ? TAB(I,A);GR(I)[A,B];:A=B:GOTO GTOP
NEXA:
       A=0
       NEXT I
       ? TAB(-1,GOFF);
       ? TAB(24,1);TAB(-1,GON);TLC;TAB(-1,GOFF);"=";TLC;"     ";
       ? TAB(-1,GON);HRZ;TAB(-1,GOFF);" =";HRZ;"   ";
       ? TAB(-1,GON);TRC;TAB(-1,GOFF);" =";TRC;"   ";
       ? TAB(-1,GON);VRT;TAB(-1,GOFF);" =";VRT;"   ";
       ? TAB(-1,GON);BLC;TAB(-1,GOFF);" =";BLC;"   ";
       ? TAB(-1,GON);BRC;TAB(-1,GOFF);" =";BRC;"   ";
       ? TAB(-1,GON);CRS;TAB(-1,GOFF);" =";CRS;"   ";
       ? TAB(-1,GON);DWN;TAB(-1,GOFF);" =";DWN;"   ";
       ? TAB(-1,GON);LUP;TAB(-1,GOFF);" =";LUP;"   ";
       ? TAB(-1,GON);LEF;TAB(-1,GOFF);" =";LEF;"   ";
       ? TAB(-1,GON);LRT;TAB(-1,GOFF);" =";LRT;"   ";
       ? TAB(-1,GON);
       GFLAG=1
       XCALL VUE,GRA,ROWS,COLUMNS,LEFTROW,LEFTCOL
       GOTO INP1
PUTGRA:
       FOR I=1 TO 23
       ? #1,GR(I)[1,80]
       NEXT I
       GFLAG=0
       RETURN