!! TYPRAN.bas  Prints a random file on the terminal
!
!       makes use of STRCTL.SBR   on AMUS
!                    STRIP.SBR    somewher in AMOS land
!                    INKEY.SBR    on AMUS
!!
!!          Author James A. Jarboe IV
!                  Educational Filmstrips
!                  1401 19th street
!                  Huntsville TX 77340
!                     409-295-5767
!                        GR/AM
!                      25-NOV-85
!
!!            Displays a random file on the terminal similar
!!            to the way TYPE displays a sequential file.
!!            INVOKE using the DO file called TYPRAN.DO
!!            Options at invoking time include
!!
!!           /B:##    starting at relative block number of the file
!!           /R       display relative record # of file
!!           /P:##    print ## bytes per line of display
!!           /D       display Alpha Accounting dummy record
!!
!!            Options during displying of file include
!!
!!      SPACE BAR    freeze display or continue display
!!      1-9          slow display   1=slow  9=fast
!!      HOME         start at begining of file
!!      S            stop display
!!      Q            quit and exit
!!      D            display Alpha Accounting dummy record
!!      H            display this help
!! BELOW is TYPRAN.DO
!!
!D #USAGE
!:S
!;
!;      TYPRAN.DO
!;      types out a random file on screen
!;
!;      Created:  25-nov-85 by JAJ       GR/AM
!;
!:S
!GOTO #$0
!;##USAGE
!XY=0
!XY=11
!:<USAGE: >
!XY=12
!:<TYPRAN>
!XY=11
!:< filename/{OPTIONS}
!>
!XY=12
!:<
!       This program will type out a RANDOM file on the screen.
!       Default characteristics are:
!                       DAT extension
!                       starting at block #1 of the file opened
!                       printing 64 bytes per line
!
!       Options:
!             /B:##    starting at logical block number of the file
!             /R       display logical record # of file
!             /P:##    print ## bytes per line
!             /D       display Alpha Accounting dummy record
!
!       SPACE BAR    freeze display or continue display
!       1-9          slow display   1=slow  9=fast
!       HOME         start at begining of file
!       S            stop display
!       Q            quit and exit
!       D            display Alpha Accounting dummy record
!       H            display this help
!>
!XY=12
!GOTO @EXIT
!;
!;      FORMAT the document specified.
!;
!;      1) find out if it exists.
!;#$0
!LOAD STRCTL.SBR
!LOAD STRIP.SBR
!LOAD INKEY.SBR
!:R
!RUN DSK0:TYPRAN.RUN[77,7]
!$0
!;@EXIT
!;      we're done with this simple little routine folks.
!:R
!
! PROGRAM
MAP1 PLINE,S,512                        ! input line variable
MAP1 FILENAME,S,50                      ! name of input string
MAP1 FILE$,S,24                         ! name of file
MAP1 MSG$,S,12                          ! message string
MAP1 RECSIZ,F,6,64                      ! record size default of 64 bytes
MAP1 SLASH1,F                           ! / character
MAP1 BLOCK,S,1                          ! block # of file opened
MAP1 RECORD,S,1                         ! relative record #
MAP1 PAGE,S,1                           ! bytes per line printed
MAP1 STRING,S,1,"0"                     ! Inkey  input character
MAP1 HOLD,S,20                          ! / data
MAP1 STORE,F                            ! store file1 number
MAP1 DUMB,S,1
MAP1 DUMMY
       MAP2 BYT1,S,1                   ! Alpha filler
       MAP2 BYT2,S,1                   ! Alpha filler
       MAP2 BYT3,F                     ! Alpha organized count
       MAP2 BYT4,F                     ! Alpha record count
       MAP2 BYT5,F                     ! Alpha maximum count
       MAP2 BYT6,F                     ! Alpha delete count
!
!
TOP:
       FILEBASE 1                      ! make record 1 = #1
       FILE1=0                         ! clear stuff
       ? TAB(-1,0);                    ! clear screen
       INPUT LINE "",FILENAME          ! get name of file
       FILENAME=UCS(FILENAME)          ! make it all upper case
       XCALL STRIP,FILENAME            ! clear out blanks
       CALL CLEAN                      ! cleanup input line for filename
       LOOKUP FILE$,ANSWER             ! look it up
       ?
       IF ANSWER=0 THEN ? FILE$;" doesn't exist":GOTO END
       IF ANSWER>0 THEN ? "mismatch file type":GOTO END
       OPEN #1,FILE$,RANDOM,512,FILE1! open file
       RECCNT=ABS(ANSWER)              ! size of file
       CALL SLASH                      ! get options
BEGIN:
       FILE1=FILE1+1                   ! increment file
       IF FILE1=1 THEN RECNO=0         ! record count to 0
       IF (FILE1=1 AND DUMB="1") THEN CALL DUMB
       ? TAB(-1,11);"Block #";FILE1;TAB(-1,12) ! print relative block
       READ #1,PLINE                   ! read file
       XCALL STRCTL,PLINE              ! clear out unprintables
       XCALL STRIP,PLINE               ! clear out blanks at end of line
       SIZ=INT((512/RECSIZ)+.9)        ! printed lines of record
       NEWSIZ=1                        ! starting byte of displayed record
       FOR I= 1 TO SIZ                 ! number of lines
       IF PAUSE>300 THEN FOR P=1 TO PAUSE:NEXT P       ! if pause set
       RECNO=RECNO+1                   ! relative record #
       REC$=RECNO                      ! put in string
       MSG$=""                         ! clear message
       IF RECORD="1" THEN MSG$="Rec #"+REC$+SPACE$(6-LEN(REC$))
       IF RECORD="1" AND NEWSIZ+RECSIZ>513 &
               THEN RECNO=RECNO-1:MSG$="not valid  "
       ? MSG$;PLINE[NEWSIZ;RECSIZ]     ! print it on screen
       CALL INKEY                      ! check for any inputs
       NEWSIZ=NEWSIZ+RECSIZ            !
       IF STRING="Q" THEN I=SIZ:NEXT I:GOTO OUT        ! quit if necessary
       NEXT I
       IF FILE1= RECCNT THEN GOTO OUT  ! quit if through
       GOTO BEGIN                      ! get next block
OUT:
       CLOSE #1                        ! close file
       ?
       IF FILE1=1 THEN MSG$="block read" ELSE MSG$="blocks read"
       ? "Total of";FILE1;MSG$         ! print stat
END:
       END
!!!!!!!!!! inkey input subroutine
INKEY:
       STRING="0"                      !
       XCALL INKEY,STRING
       STRING=UCS(STRING)
       IF STRING=" " THEN CALL NOMOVE
       IF STRING="H" THEN CALL HELP
       IF STRING="S" THEN CALL NOMOVE:RETURN
       IF STRING="D" THEN CALL DUMB:RETURN
       IF ASC(STRING)=30 THEN ? TAB(-1,0);:FILE1=0:I=SIZ:RETURN
       IF ASC(STRING)=19 THEN CALL NOMOVE:RETURN
       IF VAL(STRING)>0 THEN CALL PAUSE:RETURN
       RETURN

!!!!!!!!! stop display
NOMOVE:
       STRING="%"
       XCALL INKEY,STRING
       IF STRING #"%" THEN RETURN
       GOTO NOMOVE
!!!!!!!! slow display
PAUSE:
       PAUSE=VAL(STRING)
       PAUSE=PAUSE*300
       RETURN
!!!!!!!! look for /
SLASH:
       POS=1
SLASH1:
       SLASH1=INSTR(POS,FILENAME,"/")
       IF SLASH1=0 THEN RETURN
       POS=SLASH1+1
       SLASH2=INSTR(POS,FILENAME,"/")
       IF SLASH2=0 THEN POS=LEN(FILENAME) ELSE POS=SLASH2-1
       HOLD=FILENAME[SLASH1+1,POS]
       XCALL STRIP,HOLD
       IF HOLD[1,2]="B:" THEN BLOCK="1":FILE1=VAL(HOLD[3,POS])-1:GOTO POS
       IF HOLD[1,2]="P:" THEN PAGE="1":RECSIZ=VAL(HOLD[3,POS]):GOTO POS
       IF HOLD[1,1]="R" THEN RECORD="1":GOTO POS
       IF HOLD[1,1]="D" THEN DUMB="1": GOTO POS
       ?
       ? HOLD;" is an invalid option"
       ?:?TAB(-1,32);
? "      Valid Options are: ";TAB(-1,33);
?:?
? "            /B:##    starting at logical block number of the file"
? "            /R       display logical record # of file"
? "            /P:##    print ## bytes per line"
? "            /D       display Alpha Accounting dummy record"
       ? : ? "Press any key to continue";
       CALL NOMOVE
       ?
POS:
       POS=POS+1
       GOTO SLASH1
!!!!!!!!  help screen
HELP:
       ? TAB(-1,0);
?:? TAB(-1,32);
?"                                   OPTIONS                                 "
?TAB(-1,33);
?
?"      SPACE BAR    Freeze display or continue display"
?"      1-9          Slow display   1=slow  9=fast"
?"      HOME         Start at begining of file"
?"      S            Stop display"
?"      Q            Quit and exit"
?"      D            display Alpha Accounting dummy record"
?"      H            display this help"
?:?:?:?:?"Press any key to continue";
       CALL NOMOVE
       ?
       RETURN
DUMB:
       STORE=FILE1
       FILE1=1
       READ #1,DUMMY
       FILE1=STORE
       ?
       ? TAB(-1,32);
       ? "Dummy Record";TAB(-1,33);
       ?:?
       ? "flag 1 ";BYT1
       ? "flag 2 ";BYT2
       ? "orgcnt ";BYT3
       ? "reccnt ";BYT4
       ? "maxcnt ";BYT5
       ? "delcnt ";BYT6
       ?
       ? "Press any key to continue";
       CALL NOMOVE
       ?
       RETURN
CLEAN:
       RB=INSTR(1,FILENAME,"]")
       IF RB>1 THEN FILE$=FILENAME[1,RB]:RETURN
       SL=INSTR(1,FILENAME,"/")
       IF SL>1 THEN FILE$=FILENAME[1,SL-1]:RETURN
       FILE$=FILENAME
       RETURN