! RANVUE.BAS      vue random files
! written by James A. Jarboe IV in October 1984   1-409-295-5767
! Program developed around VUE.SBR written by David Pallman
! and donated to the AMUS system.
! VUE.SBR/H   023-456-376-360
! Also uses XPPN.SBR written by Mike Sigona for the AM100
! and modified for the AM100/L by John Keys also donated to the AMUS system.
! XPPN.SBR/H  215-410-733-765
!
!
! Consists of:
! RANVUE.DO  - DO file to invoke RANVUE
! RANVUE.BAS - BASIC listing of RANVUE
! RANVUE.RUN - RUN version of RANVUE
! RANVUE.DOC - Somewhat of a Documentation of RANVUE
! RANVUE.DAT - RANDOM data file to help learn RANVUE
! RANVUE.LST - PRINTOUT of the RANVUE.DAT file
! RANVUE.RON - Letter of explaination
! TEST.DAT   - RANDOM data file to play with
! TEST.BAS   - BASIC listing to play with in using MAP read
!
! Three files acompany this program RANVUE.DAT and TEST.DAT and TEST.BAS
! RANVUE.DAT is an instructional help random data file that can be RANVUE'd
! to learn how to use it.
! TEST.DAT is a random file to play around with the exersizes learned
! in RANVUE.DAT.
! TEST.BAS is a basic file with map statements that can be read while in
! RANVUE to find out byte locations of the TEST.DAT file.
!
! ACCEPT.SBR, VUE.SBR and XPPN.SBR must also be on your system.
!
! To get the graphic borders to work correctly on your terminal and also the
! lower and upper intensity displays some things may have to be changed
! in this program.
! NOTICE:
! IT IS SETUP FOR SOROC TERMINALS ON THE AMUS SYSTEM
! EXCEPT FOR THE LOW AND HIGH INTENSITY DISPLAY
! Look at the GRAPHON and GRAPHOFF map statements and change them to match
! the graphics on mode and graphics off mode for your particular terminal.
! Also the statement LOW and HIGH need to be changed to match low and high
! intensity display characters for your terminal.
! The characters under the MAP BORDERS also need to be changed to correspond
! with the graphic characters that represent left corners, right corners,
! horizontal and vertical lines.
! If your terminal does not have graphics then these characters can be changed
! to -'s for horizontal lines, |'s for vertical lines, and +'s for corners.
!
!
! History:
! 1. 11-01-84  Version 1.0 donated to AMUS  could be some bugs
! 2.
!
!
!
!
!
!
! SUGGESTIONS:
! 1.           Make binary number location work on larger than 2 bytes NUMBERS
! 2.           Would be nice if someone would write an M68 subroutine
!               to handle the replacement of non-ascii characters that
!               I filter out in CHECK: so that the display screen doesn't
!               take so much time to appear and appears right.
! 3.           Make option to increase Random file size
! 4.           Option to sort the file
! 5.
!
! If anyone does find a use for this program or has any comments
! or suggestions for version 2.0, Please write or call
! James A. Jarboe
! c/o Educational Filmstrips
! 1401 19th Street
! Huntsville   TX,  77340
! (409) 295-5767
!
!
!  *********************   RANVUE   ****************************
!
!             A program to vue random data files
!
!           Invoked by typing  RANVUE filename
!
!  *************************************************************
!
!
MAP1 VERSION,S,30,"RANVUE  Version 1.0" ! version of program
MAP1 ARRY                               ! main array of info in xcall
MAP2  AR(8),X,64                       ! easy to get to display
MAP1 ROWS,F,6,8                         ! # of rows in display
MAP1 COLUMNS,F,6,64                     ! # of columns in display
MAP1 ST                                 ! string to fill array with
MAP2 SIT(8),X,64
MAP1 LEFTCOL,F,6,7                      ! left column position
MAP1 LEFTROW,F,6,4                      ! left row position
MAP1 BORDERS                            ! Graphic characters
       MAP2 TLC,S,1,"+"                ! top left corner  WAS B FOR FREEDOM100
       MAP2 HRZ,S,1,"-"                ! horizontal       WAS K FOR FREEDOM
       MAP2 TRC,S,1,"+"                ! top right corner WAS C FOR FREEDOM
       MAP2 VRT,S,1,"|"                ! vertical         WAS J FOR FREEDOM
       MAP2 BLC,S,1,"+"                ! bottom left corner WAS A FOR FREEDOM
       MAP2 BRC,S,1,"+"                ! bottom right corner WAS D FOR FREEDOM
MAP1 KS,S,79                            ! graphics hz line string
MAP1 ALL$,S,6                           ! Response character
MAP1 FILE$,S,30                         ! filename to be edited
MAP1 EXT$,S,4,".DAT"                    ! Default file extension
MAP1 BAKFIL$,S,30                       ! Bakup filename
MAP1 BXT$,S,4,".DAK"                    ! bakup file extension
MAP1 FILE1,F,6                          ! record # of opened file
MAP1 FILE2,F,6                          ! bakup file record #
MAP1 CH,S,1
MAP1 RP$,S,65                           ! replace what string
MAP1 WITH,S,65                          ! with this string
MAP1 GRAPHON,S,2,CHR$(27)+"$"           ! terminal graphics on mode
MAP1 GRAPHOFF,S,2,CHR$(27)+"%"          ! terminal graphics off mode
MAP1 LOW,S,2,CHR$(27)+")"               ! terminal low intensity WAS CHR$(27)+")"
MAP1 HIGH,S,2,CHR$(27)+"("              ! terminal high intensity WAS CHR$(27)+"("
MAP1 PLINE,S,512                        ! printing string
MAP1 BRAKS,S,512                        ! write brakets
MAP1 DEFA,S,1,"]"                       ! default braket char
MAP1 BACKUP,X,512                       ! temporary backup record
MAP1 FLP,F                              ! floating point number byte location
MAP1 FPN,F                              !
MAP1 ANS,F
MAP1 RECS,F
MAP1 ANSWER,F
MAP1 LEW,F,6,66
MAP1 CACL,F,6
MAP1 MAPFILE$,S,30
MAP1 NUM,S,6
MAP1 I,F
MAP1 LP,F
MAP1 PASS,S,10
MAP1 SHOW,S,1
MAP1 CFLP,F
MAP1 NEWN,F
MAP1 MSG$,S,50
MAP1 RECSIZ,F
MAP1 FLAG,F
MAP1 PRIFI,F
MAP1 RECSIZ(9),F,6                              ! Recordsizes to figure
       RECSIZ(1)=6                             ! out floating point number
       RECSIZ(2)=7                             ! locations
       RECSIZ(3)=8                             ! weird way to do it
       RECSIZ(4)=9                             ! but it works.
       RECSIZ(5)=10                            ! may take about two days
       RECSIZ(6)=11                            ! to explain how.
       RECSIZ(7)=12                            ! maybe there is an easier
       RECSIZ(8)=13                            ! way.
       RECSIZ(9)=14
MAP1 FIL1,X,1
MAP1 FIL2,X,2
MAP1 FIL3,X,3
MAP1 FIL4,X,4
MAP1 FIL5,X,5
MAP1 FIL43,X,43
MAP1 FIL51,X,51
MAP1 FIL29,X,29
MAP1 FIL27,X,27
MAP1 FIL11,X,11
MAP1 FIL55,X,55
MAP1 FIL58,X,58
MAP1 FLO$,S,20
MAP1 FLOAT,F,6
MAP1 BPLACE,S,1
MAP1 BINSIZ,F
MAP1 BIN$,S,20
MAP1 BINA,B,1
MAP1 BINB,B,2
MAP1 BINX,X,1
MAP1 BFILE,F
MAP1 BINARY'FILL
       MAP2 BI5,X,5
       MAP2 BI11,X,11
       MAP2 BI23,X,23
       MAP2 BI47,X,47
       MAP2 BI95,X,95
       MAP2 BI383,X,383
       MAP2 BI479,X,479
MAP1 PLACE,S,512                        ! used to locate floating point bytes
MAP1 BLACE,S,512
MAP1 GASL,F
MAP1 ASL,F
MAP1 OPTION,S,1
MAP1 PPN
  MAP2 PROJECT,B,2
  MAP2 PROGRAMMER,B,2
MAP1 DEVICE,S,6
MAP1 JOBNAM,S,6
MAP1 TRMNAM,S,6

! for goodness sakes don't change any of these numbers, letters or spaces
! they help to find the floating point location with a 512 byte area.
! If it looks confusing it's because it is!
!
PLACE="1AFJMO23456123456182A3B1C526E1B842A1D36E21CG83B1A64CG125D8K162AFN1DH2381EIL2A1BFJP21I34CG1AXY3B12AJMQ1B245D1K32A 1C5D2A1O 4C216EILN1A3B5D12A43B1Q2AH61BF2AZ1D342A1LNO321CG6EI1854CG123BFL1C2A3B16E25D1BF82A1C3BF21RX4361AHKM 12AJ581K24CG1R523B1CGJ2A1B64C2183B5D16EI3B"
PLACE=PLACE+"1254CG1B2ANO1C32A61IL42A1KM 621B5DHK1A34C812AK3B1C2A5D1BF2AG163B2A18GJ321DH4CG1A8Y56123BF 1R243B1LN2AQ1BF62A1N34521K6E381A5DHK12A4CG1D2AF 1CG23B18M4261B5DH21C3B6E1AH43B12A65D1B2APZ1 328G1OXY2A16EIL21BF45D1A3BFO125D361I24CG18F26E1C3B2A1K84321N5DHK1A"
!
BLACE=" A B C A B D A B C A B F A B C A B D A B C A B G A B C A B D A B C A B F A B C A B D A B C A B H A B C A B D A B C A B F A B C A B D A B C A B G A B C A B D A B C A B F A B C A B D A B C A B   A B C A B D A B C A B F A B C A B D A B C A B G A B C A B D A B C"
BLACE=BLACE+" A B F A B C A B D A B C A B H A B C A B D A B C A B F A B C A B D A B C A B G A B C A B D A B C A B F A B C A B D A B C A B   A B C A B D A B C A B F A B C A B D A B C A B G A B C A B D A B C A B F A B C A B D A B C A B   A B C A B D A B C A B F A B C A B D A B "
!
BRAKS="]]]]]]]]"
FOR I=1 TO 6
BRAKS=BRAKS+BRAKS
NEXT I
VERY:
       FILEBASE 1
       FILE1=1
       INPUT LINE "",FILE$
       A=INSTR(1,FILE$,"/")
       IF A=0 THEN GOTO LOOK1
       OPTION=FILE$[A+1,A+1]
       FILE$=FILE$[1,A-1]
LOOK1:
       B=INSTR(1,FILE$,".")
       IF B=0 THEN FILE$=FILE$+EXT$



BEGIN:
! delete the comments on the last two commented lines and change the
! password to suit you if you wish protection on your random files
! since they can be destroyed or messed up if your not careful.
!       INPUT "Password :",PASS
!       IF PASS#"SECRET" GOTO OUTOFF2
       XCALL XPPN,PPN,DEVICE,JOBNAM,TRMNAM
       PRINT TAB(-1,0);VERSION;LOW"  Status:           Log:"HIGH;DEVICE"["STR(PROJECT)","STR(PROGRAMMER)"]"
       PRINT TAB(1,60);LOW;"Mode:"HIGH
BEGIN2:
       CALL OPENAT
       CALL BORDER
       CALL CALC
       CALL MENU
TOP:
       IF FILE1> RECS THEN FILE1=FILE1-1:? CHR$(7)
       IF FILE1<1 THEN FILE1=1
       ? TAB(LEFTROW-1,48);FILE1
              READ #1,ST
              ARRY=ST
              IF SAME#FILE1 THEN BACKUP=ST:SAME=FILE1

CALL CLEAR
       ? TAB(1,LEW);"Ranvue            "
       CALL CHECK
       CALL FILL
       A=0:IT=0
        XCALL VUE,ST,ROWS,COLUMNS,LEFTROW,LEFTCOL
       WRITE #1,ST
       ST=SPACE$(512)
       ARRY=ST
       CALL COMMAND
! comment out this xcall accept if you do not use a FREEDOM 100 terminal
! the driver has a bug that does not filter out the character after the
! ESC or F1 is hit
! If you do use the FRE100 driver version 4.06 then the extra XCALL ACCEPT
! must be used.

!       XCALL ACCEPT,ALL
PAS:
       XCALL ACCEPT,ALL
       ALL$=CHR(ALL)
       CALL CLEAR'COMMAND
       IF ALL$="T" THEN FILE1=FILE1+1:GOTO TOP
       IF ALL$="R" THEN FILE1=FILE1-1:GOTO TOP
       IF ALL$="H" THEN FILE1=1:GOTO TOP
       IF ALL$="E" THEN FILE1=RECS:GOTO TOP
       IF ALL$="Q" THEN GOTO OUTOFF
       IF ALL$="C" THEN GOTO FILLIT
       IF ALL$="W" THEN GOTO REPLACE
       IF ALL$="P" THEN GOTO PAGE
       IF ALL$="G" THEN GOTO REPLACE
       IF ALL$="S" THEN GOTO REPLACE
       IF ALL$="B" THEN GOTO BACKUP
       IF ALL$="O" THEN GOTO PRIN
       IF ALL$="N" THEN GOTO NUMBCHOIC
       IF ALL$="A" THEN GOTO NEWFILE
       IF ALL$="M" THEN GOTO MAPS
       IF ALL$="I" THEN GOTO INCREASE
       ? TAB(LEFTROW+12,6);"What ?"
      CALL COMMAND
       GOTO PAS
OUTOFF:
       CLOSE #1
OUTOFF2:
       ? TAB(-1,0);
       END
FILLIT:
       ? TAB(1,LEW);"Char Fill     "
       CALL BELOW'SCREEN
       ? TAB(LEFTROW+11,5);:INPUT "Fill from Page ",PG1
       IF PG1=0 THEN GOTO ENFIL
       ? TAB(LEFTROW+12,5);:INPUT "To Page ",PG2
       ? TAB(LEFTROW+13,5);:INPUT "With what character ?",CH
       IF PG1<1 THEN PG1=1
       IF PG2> RECS THEN PG2=RECS
       IF CH="" THEN CH=DEFA
       CALL CLEAR
       ? TAB(LEFTROW+(ROWS/2),LEFTCOL+(COLUMNS/2)-15);"CLEARING PAGE ";PG1;" TO ";PG2;" WITH ";CH
       FOR I=1 TO 512
       ST[I,I]=CH
       NEXT I
       FOR FILE1=PG1 TO PG2
       WRITE #1,ST
       NEXT FILE1
       FILE1=PG1
ENFIL:
       CALL MENU
       GOTO TOP
REPLACE:
       CALL BELOW'SCREEN
       ? TAB(1,LEW);TAB(-1,9);
       IF ALL$="G" THEN MSG$="Global " ELSE MSG$="Replace "
       IF ALL$="S" THEN MSG$="Search for "
       ? TAB(1,LEW);MSG$
       CALL COMMAND
       ? MSG$;
       RP$=""
       INPUT "",RP$
       IF RP$="" THEN GOTO REPEND
       IF ALL$="S" THEN GOTO REPAS
       ? TAB(LEFTROW+12,6);:INPUT "With ? ",WITH$
REPAS:
       CALL CLEAR'COMMAND
       FOR FILE1=FILE1 TO RECS
               ? TAB(LEFTROW-1,48);FILE1
               READ #1,ST
               WI=INSTR(1,ST,RP$)
               IF WI=0 THEN GOTO NF
               ARRY=ST
               IF ALL$="G" THEN GOTO PA1
               CALL CLEAR
               CALL CHECK
               CALL FILL
PA1:
               FOR WI=1 TO ROWS
               POD=1
WITHIN:                         ! Search within the line for data to replace
               WHERE=INSTR(POD,AR(WI),RP$[1,LEN(RP$)])
               IF WHERE=0 THEN GOTO NI
       IF ALL$="G" THEN GOTO PA3
               ? TAB(LEFTROW+WI,WHERE+LEFTCOL);LOW;AR(WI)[WHERE,LEN(RP$)+WHERE-1];
               ? HIGH
               ? TAB(WI+LEFTROW,LEFTCOL+WHERE);
               XCALL NOECHO
               XCALL ACCEPT,CNG
               CNG$=CHR(CNG)
               IF ALL$="S" AND CNG$#"X" THEN WI=ROWS:NEXT WI:GOTO NOSE
               IF ALL$="S" THEN GOTO PA4
               IF CNG$="N" THEN ? TAB(WI+LEFTROW,LEFTCOL+WHERE);AR(WI)[WHERE,LEN(RP$)+WHERE-1]:GOTO BNI
               IF CNG$#"Y" THEN WI=ROWS:NEXT WI:GOTO NOSE
PA3:
               AR(WI)[WHERE,LEN(RP$)+WHERE-1]=WITH$[1,LEN(RP$)]
              SIT(WI)[WHERE,LEN(RP$)+WHERE-1]=WITH$[1,LEN(RP$)]

               IF ALL$="G" THEN GOTO BNI
PA4:
               ? TAB(LEFTROW+WI,LEFTCOL+1);AR(WI)
BNI:
               POD=WHERE+1:GOTO WITHIN
NI:
       NEXT WI
       WRITE #1,ST
NF:
       NEXT FILE1
       FILE1=1
REPEND:
       CALL MENU
       GOTO TOP
PAGE:                           ! See a particular page
       ? TAB(1,LEW);"Page         "
       CALL COMMAND
       ? "See Page";
       INPUT ,ANS$
        CALL CLEAR'COMMAND
       IF VAL(ANS$)>RECS THEN GOTO PAGE
       IF VAL(ANS$)<0 THEN GOTO ENP
       FILE1=VAL(ANS$)
ENP:
       CALL MENU
       GOTO TOP
NOSE:
!       ? TAB(WI+LEFTROW,LEFTCOL+WHERE);AR(WI)[WHERE,WHERE]
       STOR=FILE1
       WRITE #1,ST
       FILE1=RECS
       NEXT FILE1
       FILE1=STOR
       CALL MENU
       GOTO TOP
PRIN:
       ? tab(1,LEW);"Print          "
       CALL BELOW'SCREEN
       CALL COMMAND
       ? TAB(LEFTROW+ROWS+3,LEFTCOL+1);:INPUT"1. How characters per line ?",BYT
       IF BYT<1 THEN GOTO ENPRI
       ? TAB(LEFTROW+ROWS+4,LEFTCOL+1);:INPUT"2. Starting at record ?",SPG1
       IF SPG1=0 THEN ? TAB(LEFTROW+ROWS+4,LEFTCOL+25);"1":SPG2=RECS
       IF SPG1=0 THEN ? TAB(LEFTROW+ROWS+4,LEFTCOL+25);"3. Ending at record ?";RECS:goto PASPG2
       ? TAB(LEFTROW+ROWS+5,LEFTCOL+1);:INPUT"3. Ending at record ?",SPG2
PASPG2:
       ? TAB(LEFTROW+ROWS+6,LEFTCOL+1);:INPUT"4. How many lines per page ?",LPP
       BY=BYT
       CALL CLEAR
       CALL BELOW'SCREEN
       OPEN #14 "RANVUE.LST",OUTPUT
      LP=0
      FOR FILE1=SPG1 TO SPG2
       AS=1:BYT=BY
       ? TAB(LEFTROW+5,LEFTCOL+15);"Printing record ";FILE1
       READ #1,ST
       PRIFI=PRIFI+1
       PO=512/BYT
              FOR A=1 TO PO
              IF ST[AS,BYT]=BRAKS[AS,BYT] THEN GOTO PXA
              PLINE=ST[AS,BYT]
              PRINT #14,PLINE[1,BY]
              LP=LP+1
              IF LP=LPP THEN ? #14,CHR$(12);:LP=0
PXA:
             AS=AS+BY:BYT=BYT+BY
       NEXT A
       NEXT FILE1
       PLINE=SPACE$(512)
  ? #14,"THERE ARE "+RECS+" RECORDS IN "+FILE$
      PLINE[1,5]=PRIFI USING "#,###"
      PLINE[7,25]=" WHICH WERE PRINTED"
      PRINT #14,PLINE
      CLOSE #14
      XCALL SPOOL,"RANVUE.LST"
      FILE1=1
ENPRI:
      CALL MENU
      GOTO TOP
NUMBCHOIC:
       STOR=FILE1
       ? tab(1,LEW);"Number type       "
       CALL BELOW'SCREEN
       CALL COMMAND
       PRINT "Enter 'F' for Floating Point # or 'B' for Binary # ";
       XCALL ACCEPT,ALL
       ANS$=CHR(ALL)
       IF ANS$="F" THEN GOTO NUMB
       IF ANS$="B" THEN GOTO BIN
       CALL MENU
       GOTO TOP
BIN:
       ? tab(1,LEW);"Binary Numbers     "
      CALL BELOW'SCREEN
      CALL COMMAND
      INPUT "Enter Binary number location ",BIN
      ? TAB(10);:INPUT "Enter Binary number size ",BINSIZ
      CLOSE #1
      IF BINSIZ=1 THEN GOTO BIN1
      IF BINSIZ>2 THEN GOTO ENDBIN
      IF BIN/BINSIZ = INT(BIN/BINSIZ) THEN GOTO OKBIN
        CALL OPENB
        READ #1,BINB
        CALL SHOWB
        WRITE #1,BINB
        GOTO ENDBIN

OKBIN:

     BPLACE=BLACE[BIN,BIN]
     IF BPLACE="A" THEN BINSIZ=3:CALL OPENB:READ #1,BINX,BINB:CALL SHOWB:WRITE #1,BINX,BINB:GOTO ENDBIN
     IF BPLACE="B" THEN BINSIZ=3:CALL OPENB:READ #1,BINB     :CALL SHOWB:WRITE #1,BINB:GOTO ENDBIN
     IF BPLACE="C" THEN BINSIZ=12:CALL OPENB:READ #1,BI5,BINB:CALL SHOWB:WRITE #1,BI5,BINB:GOTO ENDBIN
     IF BPLACE="D" THEN BINSIZ=24:CALL OPENB:READ #1,BI11,BINB:CALL SHOWB:WRITE #1,BI11,BINB:GOTO ENDBIN
     IF BPLACE="F" THEN BINSIZ=48:CALL OPENB:READ #1,BI23,BINB:CALL SHOWB:WRITE #1,BI23,BINB:GOTO ENDBIN
     IF BPLACE="G" THEN BINSIZ=96:CALL OPENB:READ #1,BI47,BINB:CALL SHOWB:WRITE #1,BI47,BINB:GOTO ENDBIN
     IF BPLACE="H" THEN BINSIZ=192:CALL OPENB:READ #1,BI95,BINB:CALL SHOWB:WRITE #1,BI95,BINB:GOTO ENDBIN
     IF BIN=192 THEN BINSIZ=191:CALL OPENB:BFILE=2:READ #1,BINB:CALL SHOWB:WRITE #1,BINB:GOTO ENDBIN
     IF BIN=384 THEN BINSIZ=386:CALL OPENB:READ #1,BI383,BINB:CALL SHOWB:WRITE #1,BI383,BINB:GOTO ENDBIN
     IF BIN=480 THEN BINSIZ=482:CALL OPENB:READ #1,BI479,BINB:CALL SHOWB:WRITE #1,BI479,BINB:GOTO ENDBIN
     GOTO ENDBIN
OPENB:
       BREC=(INT(512/BINSIZ)*FILE1)-(INT(512/BINSIZ))
       BFILE=INT((BIN/BINSIZ)+.99)
       BFILE=BFILE+BREC
       OPEN #1,FILE$,RANDOM,BINSIZ,BFILE
       RETURN
SHOWB:
       ? TAB(17,1);"Binary Number is ";BINB USING "######"

CHANGEB:
       BIN$=" "
       ? TAB(18,1);:INPUT "Enter number c
hange ",BIN$
       IF BIN$=" " THEN RETURN
       BINB=VAL(BIN$)
       RETURN


BIN1:
    CALL OPENB
    READ #1,BINA
    ? TAB(17,1);"Binary Number is ";BINA
    BIN$=" "
    ? TAB(18,1);:INPUT "Enter number change ",BIN$
    IF BIN$=" " THEN GOTO ENDBIN
    BINA=VAL(BIN$)
    WRITE #1,BINA

ENDBIN:
       CLOSE #1
       CALL OPENAT
       FILE1=STOR
       CALL MENU
       GOTO TOP

NUMB:
       ? tab(1,LEW);"Floating Point      "
       ASL=0:FLP=0:FLPS=0:STORE1=0:GASL=0:CFLP=0:FAREC=0
       CALL BELOW'SCREEN
       CALL COMMAND
       INPUT "Enter Floating Point byte location ?",FLP
IF FLP>507 THEN GOTO FIN2
IF FLP<1 THEN GOTO FIN2
       CLOSE #1
FPLACE=PLACE[FLP,FLP]
IF VAL(PLACE[FLP,FLP])<1 OR VAL(PLACE[FLP,FLP])>8 THEN GOTO NTIP
IF VAL(PLACE[FLP,FLP])=0 THEN GOTO NTIP
BPR=RECSIZ(FPLACE)
STORE1=INT((FLP/BPR)+.99)
FAREC=(INT(512/BPR)*STOR)-(INT(512/BPR))
STORE1=STORE1+FAREC
CALL OPENIT
WRITE #1,FLOAT
GOTO FINISHED

NTIP:
BPR=64
FAREC=(INT(512/BPR)*STOR)-(INT(512/BPR))
IF FLP=108 THEN CALL OPE64:STORE1=2+FAREC:READ #1,FIL43,FLOAT:CALL BOTH:WRITE #1,FIL43,FLOAT:GOTO FINISHED
IF FLP=117 THEN CALL OPE64:STORE1=2+FAREC:READ #1,FIL51,FLOAT:CALL BOTH:WRITE #1,FIL51,FLOAT:GOTO FINISHED
IF FLP=216 THEN CALL OPE64:STORE1=4+FAREC:READ #1,FIL23,FLOAT:CALL BOTH:WRITE #1,FIL23,FLOAT:GOTO FINISHED
IF FLP=286 THEN CALL OPE64:STORE1=5+FAREC:READ #1,FIL29,FLOAT:CALL BOTH:WRITE #1,FIL29,FLOAT:GOTO FINISHED
IF FLP=348 THEN CALL OPE64:STORE1=6+FAREC:READ #1,FIL27,FLOAT:CALL BOTH:WRITE #1,FIL27,FLOAT:GOTO FINISHED
IF FLP=396 THEN CALL OPE64:STORE1=7+FAREC:READ #1,FIL11,FLOAT:CALL BOTH:WRITE #1,FIL11,FLOAT:GOTO FINISHED
IF FLP=440 THEN CALL OPE64:STORE1=8+FAREC:READ #1,FIL55,FLOAT:CALL BOTH:WRITE #1,FIL55,FLOAT:GOTO FINISHED
IF FLP=507 THEN CALL OPE64:STORE1=8+FAREC:READ #1,FIL58,FLOAT:CALL BOTH:WRITE #1,FIL58,FLOAT:GOTO FINISHED

PASIT:
SHOW=PLACE[FLP,FLP]
IF SHOW="A" THEN BPR=7 :CALL FIGUR:CALL RED1:GOTO FINISHED
IF SHOW="B" THEN BPR=8 :CALL FIGUR:CALL RED1:GOTO FINISHED
IF SHOW="C" THEN BPR=9 :CALL FIGUR:CALL RED1:GOTO FINISHED
IF SHOW="D" THEN BPR=10:CALL FIGUR:CALL RED1:GOTO FINISHED
IF SHOW="E" THEN BPR=11:CALL FIGUR:CALL RED1:GOTO FINISHED
IF SHOW="F" THEN BPR=8 :CALL FIGUR:CALL RED2:GOTO FINISHED
IF SHOW="G" THEN BPR=9 :CALL FIGUR:CALL RED2:GOTO FINISHED
IF SHOW="H" THEN BPR=10:CALL FIGUR:CALL RED2:GOTO FINISHED
IF SHOW="I" THEN BPR=11:CALL FIGUR:CALL RED2:GOTO FINISHED
IF SHOW="J" THEN BPR=9 :CALL FIGUR:CALL RED3:GOTO FINISHED              !9 W/3
IF SHOW="K" THEN BPR=10:CALL FIGUR:CALL RED3:GOTO FINISHED      !10 W/3
IF SHOW="L" THEN BPR=11:CALL FIGUR:CALL RED3:GOTO FINISHED      !11 W/3
IF SHOW="M" THEN BPR=10:CALL FIGUR:CALL RED4:GOTO FINISHED      !10 W/4
IF SHOW="N" THEN BPR=11:CALL FIGUR:CALL RED4:GOTO FINISHED      !11 W/4
IF SHOW="O" THEN BPR=11:CALL FIGUR:CALL RED5:GOTO FINISHED      ! W/5
IF SHOW="P" THEN BPR=12:CALL FIGUR:CALL RED4:GOTO FINISHED      !12 W/4
IF SHOW="Q" THEN BPR=22:CALL FIGUR:CALL RED7:GOTO FINISHED      !22 W/7
IF SHOW="R" THEN BPR=12:CALL FIGUR:CALL RED1:GOTO FINISHED      !12 W/1
IF SHOW="X" THEN BPR=12:CALL FIGUR:CALL RED2:GOTO FINISHED      !12 W/2
IF SHOW="Y" THEN BPR=12:CALL FIGUR:CALL RED3:GOTO FINISHED      !12 W/3
IF SHOW="Z" THEN BPR=16:CALL FIGUR:CALL RED5:GOTO FINISHED      !16 W/5
GOTO FINISHED


FINISHED:
CLOSE #1
CALL OPENAT
FIN2:
FILE1=STOR
CALL CLEAR'COMMAND
CALL BELOW'SCREEN
CALL MENU
GOTO TOP

OPENIT:
OPEN #1,FILE$,RANDOM,BPR,STORE1

READ #1,FLOAT
CALL SHOWIT
CHANGEIT:
FLO$=" "
? TAB(18,1);:INPUT "Enter number change ",FLO$
IF FLO$=" " THEN RETURN
FLOAT=VAL(FLO$)
RETURN

SHOWIT:
? TAB(17,1);"Floating Point # is ";FLOAT
RETURN

FIGUR:
OPEN #1,FILE$,RANDOM,BPR,STORE1
FAREC=(INT(512/BPR)*FILE1)-(INT(512/BPR))
STORE1=INT((FLP/BPR)+.99)
STORE1=STORE1+FAREC
RETURN

RED1:
READ #1,FIL1,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL1,FLOAT
RETURN

RED2:
READ #1,FIL2,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL2,FLOAT
RETURN
RED3:
READ #1,FIL3,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL3,FLOAT
RETURN
RED4:
READ #1,FIL4,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL4,FLOAT
RETURN
RED5:
READ #1,FIL5,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL5,FLOAT
RETURN
RED7:
READ #1,FIL7,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL7,FLOAT
RETURN
RED43:
READ #1,FIL43,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL43,FLOAT
RETURN
RED51:
READ #1,FIL51,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL51,FLOAT
RETURN
RED23:
READ #1,FIL23,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL23,FLOAT
RETURN
RED29:
READ #1,FIL29,FLOAT
CALL CHANGEIT
WRITE #1,FIL29,FLOAT
RETURN
RED27:
READ #1,FIL27,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL27,FLOAT
RETURN
RED11:
READ #1,FIL11,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL11,FLOAT
RETURN
RED55:
READ #1,FIL55,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL55,FLOAT
RETURN
RED58:
READ #1,FIL58,FLOAT
CALL SHOWIT:CALL CHANGEIT
WRITE #1,FIL58,FLOAT
RETURN
OPE64:
BPR=64
OPEN #1,FILE$,RANDOM,BPR,STORE1
RETURN
BOTH:
CALL SHOWIT
CALL CHANGEIT
RETURN

CLEAR:                          ! Clear data screen
       FOR I=1 TO ROWS
       ? TAB(LEFTROW+I,LEFTCOL+1);SPACE$(COLUMNS);
       NEXT I
       RETURN
CLEAR'COMMAND:                  ! clear Command line
       ? TAB(LEFTROW+11,5);SPACE$(40);
       ? TAB(LEFTROW+12,5);SPACE$(20);
       RETURN
BELOW'SCREEN:
       ? TAB(LEFTROW+11,1);TAB(-1,10);
       RETURN
FILL:                           ! Fill screen with data from file
       FOR I=1 TO ROWS
       ? TAB(LEFTROW+I,LEFTCOL+1);AR(I)
       NEXT I
       RETURN
COMMAND:                        ! Print command line
       ? TAB(LEFTROW+11,7);SPACE$(40);
       ? TAB(LEFTROW+11,7);">";
       XCALL NOECHO
       RETURN
MENU:                           ! Print command menu
       RC=LEFTROW+12
       CALL BELOW'SCREEN
       ? TAB(RC,10);
? TAB(RC+1,10);"T  ";LOW;"TURN PAGE         ";HIGH;"R  ";LOW;"RETURN 1 PAGE  ";HIGH;"H  ";LOW;"HOME"
? TAB(RC+2,10);HIGH;"E  ";LOW;"END OF FILE       ";HIGH;"Q  ";LOW;"QUIT           ";HIGH;"M  ";LOW;"READ MAPS OF FILE"
? TAB(RC+3,10);HIGH;"P  ";LOW;"DISPLAY PAGE      ";HIGH;"W  ";LOW;"WORD REPLACE   ";HIGH;"G  ";LOW;"GLOBAL"
? TAB(RC+4,10);HIGH;"S  ";LOW;"SEARCH FOR        ";HIGH;"C  ";LOW;"CHARACTER FILL ";HIGH;"O  ";LOW;"PRINT"
? TAB(RC+5,10);HIGH;"N  ";LOW;"FLOAT OR BINARY # ";HIGH;"A  ";LOW;"ANOTHER FILE   ";HIGH;"B  ";LOW;"RECALL RECORD BACKUP";HIGH
       RETURN
CALC:
     PRINT TAB(LEFTROW+2+ROWS,LEFTCOL-4)"+10";
     PLINE[1,10]="         |"
 FOR I=1 TO ROWS
     ?TAB(I+LEFTROW,LEFTCOL-5);1+(I*COLUMNS)-COLUMNS

 NEXT I
     FOR I=1 TO 5
     ? TAB(LEFTROW+ROWS+2,LEFTCOL+(I*10)+2);PLINE[1,10];
     NEXT I
     ? TAB(LEFTROW+ROWS+2,LEFTCOL+2);PLINE[1,10];
     RETURN
BORDER:                         ! Print screen Borders
       ? TAB(LEFTROW-1,10);LOW;"Editing ";HIGH;FILE$
       ? TAB(LEFTROW-1,43);LOW;"Page";HIGH
       IF OPTION="B" THEN MSG$="Backup" ELSE MSG$="NoBackup"

       ? TAB(1,30);MSG$;
       ? TAB(LEFTROW-1,58);LOW;"Records ";HIGH;RECS

       ? GRAPHON
       ? tab(LEFTROW,LEFTCOL); TLC;
               FOR W=1 TO COLUMNS
                       KS[W,W]=HRZ
               NEXT W
       ? tab(LEFTROW,LEFTCOL+1);KS;
       ? TRC;
       ET=LEFTROW+1+ROWS
               for n = LEFTROW+1 to ET
                       ? TAB(n,LEFTCOL);VRT
                       ? tab(n,COLUMNS+LEFTCOL+1); VRT;
               next n
       ? tab(ET,LEFTCOL); BLC;
       ? tab(ET,LEFTCOL+1); KS;
       ? tab(ET,COLUMNS+LEFTCOL+1); BRC;
       ? TAB(LEFTROW,10);
       ? GRAPHOFF
       RETURN
OPENAT:
       LOOKUP FILE$,ANSWER
       IF ANSWER > -1 THEN ? FILE$;" is not a Random file":END
       IF ANSWER =  0 THEN ? FILE$;" is not found":END
       RECS=ABS(ANSWER)
       OPEN #1,FILE$,RANDOM,512,FILE1
       IF OPTION="B" THEN CALL ALLBACK
       FILE1=1
       READ #1,ST
       ARRY=ST                                 ! make ARRY the same
       RETURN
CHECK:
       A=1
AGCHK:
APA:
FOR A=1 TO 8
FOR I = 1 TO 64
IF ASC(AR(A)[I,I])<32 OR ASC(AR(A)[I,I])>127 THEN AR(A)[I,I]="."
NEXT I
NEXT A
       RETURN
NEWFILE:
       CALL CLEAR
       CALL BELOW'SCREEN
       CALL COMMAND
       CLOSE #1
       FILE1=1:RECS=0
       ? "Enter new filename to edit ";
       GOTO VERY
MAPS:
    ? tab(1,LEW);"MAP Read          "
    XCALL NOECHO
    CALL BELOW'SCREEN
    CALL COMMAND
    INPUT LINE "Enter Filename to Process MAP'S: ",MAPFILE$
            IF MAPFILE$="" GOTO ENDMAP
          IF LEN(MAPFILE$)<7 MAPFILE$=MAPFILE$+".BAS"
            LOOKUP MAPFILE$,ANSWER
            IF ANSWER=0 ?TAB(17,1);MAPFILE$+" NOT FOUND";CHR(7);:INPUT "CR TO CONTINUE",CR$ : GOTO MAPS
HOME:   CALC = 0 : ROW = 16
        ?TAB(15,1);TAB(-1,9);"Reading "+MAPFILE$;TAB(15,59);"Starts at Byte:";TAB(-1,10);
        ? TAB(16,20);"E"LOW"nd;  "HIGH"H"LOW"ome;  "HIGH"A"LOW"dd;  "HIGH"N"LOW"o;  "HIGH"C"LOW"lear Total;"HIGH
            OPEN #3, MAPFILE$, INPUT
        LROW=16
READ:   PLINE = SPACE(70) : L=0 : NUM="0"
            INPUT LINE #3, PLINE
           XCALL STRIP,PLINE
           IF EOF(3) GOTO ENDMAPA
           IF INSTR(1,PLINE,"MAP")=0 GOTO READ
           PLINE = PLINE+SPACE(70-LEN(PLINE))
          LROW = LROW + 1
          IF LROW > 23 ?TAB(17,1);TAB(-1,10); : LROW = 17
  ACCEPT: L=INSTR(1,PLINE,"(")
          IF L#0 ?TAB(LROW,1);TAB(-1,11);PLINE[1;70];TAB(-1,12);TAB(LROW,75);"<";:GOTO ACCX
            ?TAB(LROW,1);PLINE[1;70];TAB(LROW,75);"<";
 ACCX:   XCALL ACCEPT, CHAR
            ?TAB(LROW-1,74);TAB(-1,9);TAB(LROW,74);TAB(-1,9)
           IF CHR(CHAR) = "A" THEN GOTO CALCU
           IF CHAR = 13 OR CHAR = 10 GOTO READ
           IF CHR(CHAR) = "N" THEN GOTO READ
           IF CHR(CHAR) = "H" THEN CLOSE #3:GOTO HOME
        IF CHR(CHAR) = "E" THEN GOTO ENDMAPA
        IF CHR(CHAR) = "C" THEN CALC=0:? TAB(15,75);TAB(-1,9);
        IF CHAR = 30 THEN CLOSE #3 : GOTO HOME
        GOTO ACCEPT
CALCU:
            C=INSTR(1,PLINE,"(")
               X=INSTR(1,PLINE,",")
        IF PLINE[X,X+2] = ",F," THEN NUM = "6" : GOTO TOTAL
        IF PLINE[X,X+1] = ",F"  THEN NUM = "6" : GOTO TOTAL
        IF PLINE[X,X+2] = ",S," THEN START = X+3 : GOTO VALU
        IF PLINE[X,X+2] = ",B," THEN START = X+3 : GOTO VALU
        IF PLINE[X,X+2] = ",X," THEN START = X+3 : GOTO VALU
        NEXT X
        GOTO READ
VALU:   FOR X = START TO 70
        IF PLINE[X,X] = "," OR PLINE[X,X] = " " THEN GOTO TOTAL
        NUM = NUM + PLINE[X,X]
        NEXT X
        GOTO READ
TOTAL:  XCALL STRIP,NUM
        CALC = CALC + VAL(NUM)
        IF CALC#0 ?TAB(15,75);TAB(-1,9);1+CALC-VAL(NUM) : NUM=" ":GOTO TOTX
        NUM=" "
TOTX:   IF L<1 GOTO READ
        GOTO ACCEPT
ENDMAPA:
        CLOSE #3
ENDMAP:
        CALL MENU
        GOTO TOP
BACKUP:
       CALL BELOW'SCREEN
       CALL CLEAR
       IF OPTION="B" THEN CALL TAKEBAK
       ARRY=BACKUP
CALL CLEAR
CALL CHECK
       CALL FILL
       CALL COMMAND
       PRINT "Do you wish to use this backup ";
       XCALL NOECHO
       XCALL ACCEPT,ANS
       ALL$=CHR(ANS)
       IF ALL$#"Y" THEN GOTO ENBAC
       ST=BACKUP
       WRITE #1,ST
       ? TAB(1,LEW);CHR(7);"Restored"
ENBAC:
       CALL MENU
       GOTO TOP
INCREASE:
!      CALL BELOW'SCREEN
!      CALL CLEAR
!      CALL COMMAND
!      ? FILE$" is "RECS" blocks long"
!      INPUT "Increase how many records? "INCRE
!      IF INCRE="" THEN GOTO ENINC
!
!
ENINC:
!    CALL MENU
!    GOTO TOP
ALLBACK:
       IF B=0 THEN BAKFIL$=FILE$+BXT$ ELSE BAKFIL$=FILE$[1,B-1]+BXT$
       LOOKUP BAKFIL$,ANSWER1
       IF ANSWER1>0 THEN ? CHR$(7);"Already exists as a sequential file":END
       IF ANSWER1<0 THEN KILL BAKFIL$
       ALLOCATE BAKFIL$,RECS
       OPEN #2,BAKFIL$,RANDOM,512,FILE2
       FILE1=0
BACK1:
       FILE1=FILE1+1
       IF FILE1>RECS THEN GOTO ENBAK
       READ #1,ST
       FILE2=FILE1
       WRITE #2,ST
       GOTO BACK1
ENBAK:
       CLOSE #2
       RETURN
TAKEBAK:
       OPEN #2,BAKFIL$,RANDOM,512,FILE1
       READ #2,BACKUP
       CLOSE #2
       RETURN