!*************************** AMUS Program Label ******************************
! Filename: DSKDOC.BAS                                      Date: 03/30/90
! Category: UTIL         Hash Code: 371-744-067-716      Version: 1.0(100)
! Initials: CHES/AM      Name: GARY CHESSER
! Company: EMERGITECH                              Telephone #: 6148666712
! Related Files: .LIT : GARWRT,GARRED,FIXGAR .SBR : BLOCKS,AMOS,RINKEY,NOECHO
! Min. Op. Sys.: 1.3                           Expertise Level: INT
! Special: Everyone should be off your system when running this program.
! Description: Used to diagnose a possible suspect drive. This program has six
! calls which you may use to check out a disk on your system.
!
!*****************************************************************************
!PROGRAMS NEEDED FOR THE DISK DOCTOR
!       SYS:GARWRT.LIT
!       SYS:GARRED.LIT
!       SYS:FIXGAR.LIT
!
!       BAS:RINKEY.SBR
!       BAS:NOECHO.SBR
!       BAS:AMOS.SBR
!       BAS:BLOCKS.SBR
!
!       DSKDOC.TXT AND DSKDOC.RUN MUST BE IN THE SAME PPN
!
!       [SAA] Add few trivial items to show them how to exit program.
!             Steve Archuleta, AMUS Staff
!
Program DSKDOC,1.0(100)

       MAP1    TITLE,S,30,"Gary Chesser's Disk Doctor"

       MAP1    TDATE,B,4
       MAP1    T1DATE,@TDATE
       MAP2     MONTH,B,1
       MAP2     DAY,B,1
       MAP2     YEAR,B,1
       MAP2     FIL,B,1

       MAP1    DRIVE,S,5,"DSK0:"

       MAP1    CHOICE,S,1,"D"
       MAP1    CMDLIN,S,80

       MAP1    DT$,S,8

       MAP1    CHAR,B,2

       MAP1    CONTIG,F,6
       MAP1    FREE,F,6
       MAP1    PERCENT,F,6

       ON ERROR GOTO ABORT'IT


GET'TITLE:

       PRINT TAB(-1,0);TAB(-1,29)      !CLEAR SCREEN & TURN OFF CURSOR
       GOSUB DSP'TITLE                 !DISPLAY OUR SCREEN

GET'INPUT:

       XCALL NOECHO                    !NEEDS TO BE SET W/RINKEY
       XCALL RINKEY,CHAR               !INPUT USER'S SPEC
       IF CHAR=0 THEN GOTO GET'INPUT   !IF NOTHING GET MORE INPUT
       IF CHAR=27 THEN GOTO FINISH     !IF ESC THE EXIT PROGRAM
       IF CHAR=8 THEN GOSUB GO'LEFT    !IF LEFT ARROW MOVE LEFT
       IF CHAR=10 THEN GOSUB GO'DOWN   !IF DOWN ARROW MOVE DOWN
       IF CHAR=11 THEN GOSUB GO'UP     !IF UP ARROW MOVE UP
       IF CHAR=12 THEN GOSUB GO'RIGHT  !IF RIGHT ARROW MOVE RIGHT
       IF CHAR=13 THEN GOSUB GO'DOIT   !IF RETURN THEN PERFORM USER REQUEST
       GOTO GET'INPUT                  !IF NONE OF ABOVE ANSWERS GET USER REQ

!*****************************************************************************
!DISPLAY MAIN SCREEN FOR USER INPUT
!               DEFAULT CHOICE = D  FOR DEVICE SPECIFICATIONS
!*****************************************************************************

DSP'TITLE:
       GOSUB PROG'CHOICE               !DISPLAY USER HELP
       ? tab(-1,29);                   !TURN OFF CUSOR
       GOSUB GET'DATE
       PRINT TAB(1,70);DT$
       PRINT TAB(3,22);TAB(-1,32);" ";TITLE;" ";TAB(-1,33)
       PRINT TAB(-1,23)
       PRINT TAB(5,1);"2ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3";TAB(-1,33)
       PRINT TAB(6,1);"62ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ36";TAB(-1,33)
       PRINT TAB(7,1);"66                                                                          66";TAB(-1,33)
       PRINT TAB(8,1);"66                                                                          66";TAB(-1,33)
       PRINT TAB(9,1);"66                                                                          66";TAB(-1,33)
       PRINT TAB(10,1);"66                                                                          66";TAB(-1,33)
       PRINT TAB(11,1);"66                                                                          66";TAB(-1,33)
       PRINT TAB(12,1);"66                                                                          66";TAB(-1,33)
       PRINT TAB(13,1);"61ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ56";TAB(-1,33)
       PRINT TAB(14,1);"1ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ5";TAB(-1,33)
       PRINT TAB(-1,24)

       PRINT TAB(7,13);TAB(-1,33);" ";"Help";" ";TAB(-1,33)
       PRINT TAB(7,29);TAB(-1,32);" ";"Select Drive";" ";TAB(-1,33)
       PRINT TAB(7,53);TAB(-1,33);" ";"Mounted Drives";" ";TAB(-1,33)

       PRINT TAB(10,13);TAB(-1,33);" ";"Read";" ";TAB(-1,33)
       PRINT TAB(10,33);TAB(-1,33);" ";"Write";" ";TAB(-1,33)
       PRINT TAB(10,53);TAB(-1,33);" ";"Statistics";" ";TAB(-1,33)

       PRINT TAB(16,30) "Press CTRL-C to EXIT"; ![SAA] Show em how to exit

       CHOICE = "D"
RETURN

GET'DATE:
       TDATE = DATE
       DT$ = (MONTH USING "#Z")+"/"+(DAY USING "#Z")+"/"+&
             (YEAR USING "#Z")
       RETURN

GO'DOIT:
       IF CHOICE = "D" THEN &
               ? TAB(20,1); : &
               INPUT "Input Drive name Ex. DSK0: >";DRIVE

       IF CHOICE = "M" THEN &
               ? TAB (-1,0) : &
               CMDLIN = "MOUNT" : &
               XCALL AMOS,CMDLIN : &
               ? TAB(20,1);TAB(-1,32); : &
               ? TAB(20,26);TAB(-1,33); : &
               ? TAB(20,2); : &
               INPUT "Press return to continue";W

       IF CHOICE = "H" THEN &
               ? TAB (-1,0) : &
               CMDLIN = "HELP DSKDOC.TXT" : &
               XCALL AMOS,CMDLIN : &
               ? TAB(23,1);TAB(-1,32) : &
               ? TAB(23,26);TAB(-1,33); : &
               ? TAB(23,2); : &
               INPUT "Press return to continue";W

       IF CHOICE = "R" THEN &
               ? TAB (-1,0) : &
               CMDLIN = "GARRED " + DRIVE : &
               XCALL AMOS,CMDLIN

       IF CHOICE = "W" THEN &
               ? TAB (-1,0) : &
               CMDLIN = "GARWRT " + DRIVE : &
               XCALL AMOS,CMDLIN

       IF CHOICE = "S" THEN &
               ? TAB(-1,0) : &
               CMDLIN = "FIXGAR " + DRIVE[1,3] : &
               XCALL AMOS,CMDLIN : &
               GOSUB GET'BLOCKS : &
               ? TAB(23,1);TAB(-1,32) : &
               ? TAB(23,26);TAB(-1,33); : &
               ? TAB(23,2); : &
               INPUT "Press return to continue";W

!start all over again
START'AGAIN:
       GOTO GET'TITLE

GET'BLOCKS:
       XCALL BLOCKS,DRIVE,CONTIG,FREE

!NOT DEVELOPED YET,IN NEXT REVISION ?
!       PERCENT = 100 * (FREE/57680)

       PRINT
       PRINT DRIVE;" has ";CONTIG;"Blocks of contiguous space and"
       PRINT "          ";FREE;"Blocks of total free space"
!       PRINT "          ";PERCENT;" percent of free space available"
RETURN

GO'DOWN:

       IF CHOICE = "W" OR CHOICE = "R" OR CHOICE = "S" THEN RETURN

       IF CHOICE = "D" THEN &
               CHOICE = "W" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,32); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO DFINISH

       IF CHOICE = "H" THEN &
               CHOICE = "R" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,32); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO DFINISH

       IF CHOICE = "M" THEN &
               CHOICE = "S" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33) : &
               PRINT TAB(10,33);TAB(-1,33) : &
               PRINT TAB(10,53);TAB(-1,32)

DFINISH:
RETURN

GO'UP:
       IF CHOICE = "D" OR CHOICE = "M" OR CHOICE = "H" THEN RETURN

       IF CHOICE = "R" THEN &
               CHOICE = "H" : &
               PRINT TAB(7,13);TAB(-1,32); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO UFINISH

       IF CHOICE = "W" THEN &
               CHOICE = "D" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,32); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO UFINISH

       IF CHOICE = "S" THEN &
               CHOICE = "M" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,32); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33);

UFINISH:
RETURN

GO'RIGHT:
       IF CHOICE = "S" OR CHOICE = "M" THEN RETURN

       IF CHOICE = "R" THEN &
               CHOICE = "W" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,32); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO RFINISH

       IF CHOICE = "W" THEN &
               CHOICE = "S" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,32); : &
               GOTO RFINISH

       IF CHOICE = "H" THEN &
               CHOICE = "D" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,32); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO RFINISH

       IF CHOICE = "D" THEN &
               CHOICE = "M" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,32); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33);

RFINISH:
RETURN

GO'LEFT:
       IF CHOICE = "R" OR CHOICE = "H" THEN RETURN

       IF CHOICE = "S" THEN &
               CHOICE = "W" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,32); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO LFINISH

       IF CHOICE = "W" THEN &
               CHOICE = "R" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,32); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO LFINISH

       IF CHOICE = "D" THEN &
               CHOICE = "H" : &
               PRINT TAB(7,13);TAB(-1,32); : &
               PRINT TAB(7,29);TAB(-1,33); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO LFINISH

       IF CHOICE = "M" THEN &
               CHOICE = "D" : &
               PRINT TAB(7,13);TAB(-1,33); : &
               PRINT TAB(7,29);TAB(-1,32); : &
               PRINT TAB(7,53);TAB(-1,33); : &
               PRINT TAB(10,13);TAB(-1,33); : &
               PRINT TAB(10,33);TAB(-1,33); : &
               PRINT TAB(10,53);TAB(-1,33); : &
               GOTO LFINISH

LFINISH:
RETURN


PROG'CHOICE:
       PRINT TAB(23,10);TAB(-1,145);" Use <-- --> Arrow keys to Select Program Present Drive ";DRIVE;" ";TAB(-1,33)
       RETURN

ABORT'IT:
       ? TAB(-1,28);           !TURN CURSOR BACK ON FOR WHOEVER

       IF ERR(0) = 1 THEN GOTO FINISH  ![SAA] don't complain on CTRL-C

       PRINT "ERR(0) = ";ERR(0)
       PRINT "ERR(1) = ";ERR(1)
       PRINT "ERR(2) = ";ERR(2)
FINISH:
       END