!*! Updated on 18-Dec-95 at 11:31 AM by Jim Randazzo; edit time: 0:01:16
!*************************** AMUS Program Label ******************************
! Filename: DKLOOK.BAS                                      Date: 11/03/95
! Category: UTIL         Hash Code: 000-000-000-000      Version: 1.0(106)
! Initials:   /AM        Name: Mike L. Sessi
! Company: Birmingham Data Systems Inc.            Telephone #: 707-795-1595
! Related Files: accept.sbr, noecho.sbr, norton.sbr, infld.sbr,amos.sbr, &
!                look.lit
! Min. Op. Sys.: AMOSL 1.0                     Expertise Level: none
!*****************************************************************************
!*! Updated on 02-Nov-95 at 0:00 AM by Mike L. Sessi   IV; edit time: 0:00:00
!*************************** AMUS Program Label ******************************
!
! 11/09/95 added code so this will run under d-run (RUNDOS)
! 11/05/95 esc now works in dir print
! 11/02/95 change screen output so Norton works on both type of terminals
! 11/01/95 Mike Sessi (mls) First release
!
100   PROGRAM norton,1.0(106)
!
! THIS PROGRAM USES
!       XCALL ACCEPT.SBR        ! to get single chr input
!       XCALL NOECHO.SBR        ! for accept.sbr
!       XCALL NORTON.SBR        ! reads a single block
!       XCALL INFLD.SBR         ! input line for header info
!       XCALL AMOS.SBR          ! to excute look.lit
!       LOOK.LIT                ! displays any kind of file

101 ! RENUMBERED ON 09/12/95
110 MAP1  LABEL                 ! block 0, disk label information
120     MAP2 FIL,B,4
130     MAP2    VOL'NAM,S,40
140     MAP2    VOL'ID,S,10
150     MAP2    CREATOR,S,30
160     MAP2    INSTALL,S,30
170     MAP2    SYSTEM,S,30
       MAP2    LAB1,B,1        ! last access
       MAP2    LAB2,B,1
       MAP2    LAB3,B,1
       MAP2    LAB4,B,1
       MAP2    LAB5,B,1        ! created on
       MAP2    LAB6,B,1
       MAP2    LAB7,B,1
       MAP2    LAB8,B,1
180     MAP2    FIL2,S,364
190
!
200
210  MAP1 MFDX                  ! master file directory
220      MAP2 MFD0(64)          ! 64 p'pn in 1 disk block
230             MAP3 PPNX,B,2   ! p'pn number
240             MAP3 LNK2,B,2   ! Points to the UFD block, also
                               ! the MFD block number
250             MAP3 MFD3,B,2   ! PASS WORD  ?
260             MAP3 MFD4,B,2   ! ???
!
       MAP1 PPN0,S,3           ! Hold p,pn number  [123,123]
270     MAP1 PPN1,S,3           ! P,PN 1st 3 numbers
280     MAP1 PPN2,S,3           ! 2nd 3 numbers
!

290  MAP1  UFD                          ! USER FILE DIRECTORY (42 ENTRYS/BLK)
300     MAP2 PTR,B,2                    ! Next UFD block number
310     MAP2 UFDENT(42)
320             MAP3    UFDNAM1,B,2     ! 1ST 3 CHR'S
330             MAP3    UFDNAM2,B,2     ! 2ND 3 CHR'S
340             MAP3    UFDNAMX,B,2     ! 3RD 3 CHR'S (EXT)
350             MAP3    UFDBLKX,B,2     ! FILE SIZE
360             MAP3    UFDACTX,B,2     ! FILE TYP. IF 65503 THEN CONTIG
370             MAP3    UFDFPTX,B,2     ! LINK TO 1ST BLOCK of file
380     MAP2 FIL3,X,6
!
390   MAP1 RAD5O
400             MAP2 RAD5,S,1
410             MAP2 RADX,S,50,"ABCDEFGHIJKLMNOPQRSTUVWXYZ   0123456789   "
450     RAD5=CHR(0)
!
420     MAP1 UNP,S,3            ! unpacked UFD file chars (3)
430     MAP1 SP,S,20,"                    "
440     MAP1 NAME,S,10          ! the unpacked file name
!
460     MAP1 SCR'ROW(128)       ! store the MFD screen
470             MAP2 SCR,S,80   ! MFD's ([123,123])
               MAP2 LNK,S,80   ! the link to the UFD
!
       MAP1 DIR'ROW(24)        ! screen of the UFD block
               MAP2 DIR'COL(5)
                       MAP3 DIR'NAM,S,10       ! file name.ext blocks
!
       MAP1 R'DRIVE(09)                ! DISK DEVICES NAMES
               MAP2 C'DRIVE(10)
                       MAP3 DISKS,S,6  ! disks names (dsk00:)
!
510 !   MAP1 NORTON
520             MAP1 DISK'DEVICE,S,7    ! give disk spec (dsk000:
530             MAP1 BLOCK'NO,B,4       ! give block number to read
540             MAP1 BUFFER,X,512       ! returns block info
560             MAP1 ERR'CODE,B,1       ! any problems
!
!       This info is stored in the A.A file in every P,PN
!
       MAP1 HEAD'IN
               MAP2 ENTRY,S,70
               MAP2 H'FIL,S,442
!
       MAP1 HEAD'HOLD,S,510            ! hold header info
! user defined info
! if you add more, change H'LOOP
       MAP1 HEAD'INFO(06),S,70
               HEAD'INFO(1)="No Information for this directory"
               HEAD'INFO(2)="DSK00:[1,2]Operator acct."
               HEAD'INFO(3)="DSK00:[1,4]System Acct."
               HEAD'INFO(4)="DSK00:[1,6]System Drivers"
               HEAD'INFO(5)="DSK00:[2,2]System commands files"
               HEAD'INFO(6)="DSK00:[7,6]System .bas files"
       MAP1 H'LOOP,B,1,6       ! NUMBER OF HEAD'INFO LINES

       MAP1 VARIABLE'LIST
               MAP2 AM0S,S,50
               MAP2 BS,F
               MAP2 MFD'ROW,F
               MAP2 SCH'STR,F
               MAP2 PPN'CT,F
               MAP2 B,F
               MAP2 A,F
               MAP2 MD,F
               MAP2 SCR1$,S,50
               MAP2 LEN'SCR,F
               MAP2 COL,F
               MAP2 BLOCKS,F
               MAP2 T'BLOCKS,F
               MAP2 FILES,F
               MAP2 ROW1,F
               MAP2 E,F
               MAP2 A0,F
               MAP2 X,F
               MAP2 R1,F
               MAP2 R2,F
               MAP2 R3,F
               MAP2 X3,F
               MAP2 Q,F
               MAP2 D,F
               MAP2 R,F

490       SIGNIFICANCE 11
500     STRSIZ 80
MLS:    input "Instruction ? ",q$
       if ucs(q$) = "T" then tst=1
       if ucs(q$) = "Y" then call INSTR

!
BEGIN:  INPUT "%Enter Disk Device (cr=DSK)? ",A$
       IF A$="" THEN   A$="DSK"
       IF LEN(A$) # 3 THEN ? "ONLY 3 LETTERS" : GOTO BEGIN
       XCALL NOECHO
!
START:
       ON ERROR GOTO EXIT
       CALL DISK'DEVICE
       CALL INIT
       CALL MFD
       MFD'ROW=2
       SCH'STR=1
       CALL FF
       CALL HEADER
       ? TAB(-1,29);           ! turn off cursor

COM:
       CALL MFD'MRK'ON
       PRINT TAB(23,1); "COMMANDS: (H)eader, The arrows (to move), CR";
       PRINT " (to make a selection)";
       XCALL ACCEPT,A
!
!                   <-      \/ ^  ->
!                    H       J  K  L CR
!                    8  9   10 11 12 13
       CALL MFD'MRK'OFF
       ON A-7 CALL BS,NULL,LF,VT,FF,CR
       IF A=27 THEN A$="DSK" : GOTO START              ! START OVER
       CALL HEADER
       COM$=UCS(CHR(A))
       IF COM$="H" THEN CALL UP'DATE'HD
       GOTO COM
!
NULL:   RETURN
!
HEADER:
       BH=INSTR(B,SCR'ROW(MFD'ROW),"]")        ! find end of p,pn in table
10      SCR1$= DISK'DEVICE+SCR'ROW(MFD'ROW)[B,BH]+"A.A" ! create file name
                                                       ! exp: DSK00:[1,6]A.A
20      LOOKUP SCR1$,FOUND
                       ! if file type is ok, then, read and print
       IF FOUND < 0 THEN CALL OPEN'HEAD : CALL CLOSE'HEAD : &
               PRINT TAB(1,1); TAB(-1,9);DISK'DEVICE; TAB(1,8); ENTRY; : &
                       ELSE CALL HEAD'CNG      ! if file is wrong type
                                               ! or doesn't exist,
       RETURN                                  ! change or create it

HEAD'CNG:
       CALL LOG12      ! log to 1,2 to get operator status

                       ! check if file is exist or wrong type
                       ! if wrong type, copy into right type,
                       ! then erase wrong type
70      IF FOUND > 0 THEN OPEN #14,SCR1$,INPUT : INPUT LINE #14,HEAD'HOLD : &
               CLOSE #14 : KILL SCR1$

71      ALLOCATE SCR1$,1        ! create new file
       CALL OPEN'HEAD          ! open file
       HEAD'IN=CHR(0)
       IF FOUND > 0 THEN HEAD'IN=HEAD'HOLD     ! move old file type into new
                                               ! keeping only 1st 70 chars.
               ! if file is empty, check for header infor.
       FOR HL=1 TO H'LOOP
               IF SCR1$[1,11] = HEAD'INFO(HL)[1,11] THEN &
                       ENTRY=HEAD'INFO(HL)[12,LEN(HEAD'INFO(HL))]
       NEXT HL
               ! if no header info, get default info.
       IF ENTRY="" THEN ENTRY=HEAD'INFO(1)
       CALL WRITE'HEAD
       CALL CLOSE'HEAD
       CALL LOGBK                              ! return to current P,PN
75      print tab(1,1); TAB(-1,9); DISK'DEVICE; TAB(1,8);ENTRY;
       RETURN
!
UP'DATE'HD:                     ! change header information
       CALL LOG12              ! log 1,2 to get operator status
       CALL OPEN'HEAD          ! open A.A file and read it
       XCALL INFLD,01,08,70,00,"*35]",ENTRY,INXCTL,1,1,EXITCODE
       CALL WRITE'HEAD         ! write file
       CALL CLOSE'HEAD
       CALL LOGBK              ! return to current P,PN
       ? TAB(-1,29);           ! turn off cursor
       RETURN
!

BS:     ! BACK SPACE
       IF B-1 < 2 THEN MFD'ROW=MFD'ROW-1 : B=100
       IF MFD'ROW=1 THEN MFD'ROW=PPN'CT : B=100
       FOR BS=B-1 TO 1 STEP -1
               IF SCR'ROW(MFD'ROW)[BS,BS] = "[" THEN B=BS : BS=1
       NEXT BS

       SCH'STR=B+1
       RETURN

FF:     ! RIGHT ARROW
FF1:    B=INSTR (SCH'STR,SCR'ROW(MFD'ROW),"[")
       IF B=0 AND MFD'ROW > PPN'CT THEN MFD'ROW=2 : SCH'STR=1 : GOTO FF
       IF B=0 THEN MFD'ROW=MFD'ROW+1 : SCH'STR=1 : GOTO FF:
       SCH'STR=B+1
       RETURN

VT:     ! UP ARROW
       MFD'ROW=MFD'ROW-1
       IF MFD'ROW=1 THEN MFD'ROW=PPN'CT
       SCH'STR=1
       CALL FF1
       RETURN

LF:     ! DOWN ARROW
       MFD'ROW=MFD'ROW+1
       IF MFD'ROW > PPN'CT THEN MFD'ROW=2 : SCH'STR=1 : CALL FF1
       SCH'STR=1
       CALL FF1
       RETURN

CR:     MFD'TEMP=MFD'ROW : MFD'COL=B
       CALL DIR
       print tab(-1,0);
       CALL INIT
       CALL MFD
       MFD'ROW=MFD'TEMP : B=MFD'COL
       CALL FF
       RETURN
INIT:
       FOR A=1 TO 64
               LNK(A)=SPACE(100)
               SCR(A)=CHR(0)
       NEXT A
       RETURN
MFD'MRK'ON:
13 !   PRINT TAB(MFD'ROW,B-1); TAB(-1,32);
       MRK=INSTR(B,SCR'ROW(MFD'ROW),"]")
!                                               *THIS IS FIELD CRT'S ?
       ? TAB(MFD'ROW,B-1); TAB(-1,32); SCR'ROW(MFD'ROW)[B,MRK]; TAB(-1,33);

!       PRINT TAB(23,1); LNK(MFD'ROW)[B;5];"@";
!       PRINT TAB(MFD'ROW,B); "!";
       RETURN
MFD'MRK'OFF:
14 !    ? TAB(MFD'ROW,B-1); TAB(-1,33);
       ? TAB(MFD'ROW,B-1); TAB(-1,33); SCR'ROW(MFD'ROW)[B,MRK]; TAB(-1,33);
       RETURN

700 MFD:
710   !READING THE MFD
       BLOCK'NO=1
620     CALL RD'DISK
630     MFDX=BUFFER : MD1=0
570     ? TAB(-1,0)
720     FOR MD=1 TO 64          ! 64 ppn's per block
730             IF PPNX(MD)=0 THEN MD=64 : GOTO OUT
740             CALL PPN'UNPACK
750             IF MD1=0 AND MD=1 THEN PPN0=PPN1 : MFD'ROW=2 : : COL=2
760             IF PPN1 # PPN0 THEN PPN0=PPN1 : ? : MFD'ROW=MFD'ROW+1 : &
                       : COL=2

               IF LEN(SCR(MFD'ROW)) > 70 THEN MFD'ROW=MFD'ROW+1 : COL=2 : &
                       PRINT

               SCR1$= " ["+PPN1+","+PPN2+"] "
765             SCR(MFD'ROW)=SCR(MFD'ROW) +SCR1$
               LNK(MFD'ROW)[COL;5] = LNK2(MD) USING "#ZZZZ"
               LEN'SCR=LEN(SCR1$)
               COL=COL+LEN'SCR

775             PRINT TAB(-1,33); "["+PPN1+","+PPN2+"]";TAB(-1,33);
800 OUT:        NEXT MD
       IF PPNX(64)=0 AND LNK2(64) # 0 THEN BLOCK'NO=LNK2(64) : CALL RD'DISK : &
                MFDX=BUFFER : MD1=1 : GOTO 720
        PPN'CT=MFD'ROW                 ! NO MORE ENTRY'S
810     RETURN
!********************* DIR *************
820 DIR:

       IF BLOCK'NO=0 THEN ? "NO FILES" : RETURN
       BLOCK'NO=LNK(MFD'ROW)[B;5]
       CALL RD'DISK
       UFD=BUFFER
830     BLOCKS=0 : T'BLOCKS=0 : FILES=0
       CALL DIR'CLR
840     CALL DIR2
860     RETURN          ! RTN TO CALLER
870  DIR2:
880     FOR A0=1 TO 42
               NAME=CHR(0)
900             UNP=CHR(0)
910             IF UFDBLKX(A0)=0 THEN A0=42 : GOTO DIR1
920             IF UFDNAM1(A0)=65535 THEN GOTO DIR1
               ROW1=ROW1+1
!
               IF COL>64 AND ROW1 > 23 THEN CALL PRT'FILES : CALL DIR'INP : &
                       IF A=27 THEN RETURN     ! rtn to mfd early
               IF ROW1>23 THEN ROW1=2 : COL=COL+16 : C'CT=C'CT+1 : CALL PRT'FILES
!
930             CALL RAD50              ! UNPACK THE FILE NAME
!
               DIR'NAM(ROW1,(C'CT))=NAME+SP[1,7-LEN(NAME)]+UNP+SP[1;3-LEN(UNP)]
!
940             FILES=FILES+1
950             PRINT TAB(ROW1,COL-1); TAB(-1,33); NAME;SP[1,7-LEN(NAME)]; &
                                       UNP ; SP[1;3-LEN(UNP)]; TAB(-1,33);
960             BLOCKS=UFDBLKX(A0)
970             PRINT STR(BLOCKS);       !    SP[1,4-LEN(STR(BLOCKS))+1];
980             T'BLOCKS = T'BLOCKS + BLOCKS
!
990             ! SIZE OF FILE
!               PRINT UFDACTX(A0);"   "         ! ACTIVE LINK OR TYPE
!               PRINT UFDFPTX(A0);              ! LINK TO BLOCK
1010 DIR1:      NEXT A0

1020    IF PTR = 0 THEN CALL PRT'FILES : CALL DIR'INP : RETURN
!
1030    BLOCK'NO=PTR
       CALL RD'DISK
       UFD=BUFFER

1060    GOTO DIR2
!
  PRT'FILES:
       PRINT TAB(1,30); STR(FILES); " Files In "; STR(T'BLOCKS);" Blocks On";
       RETURN
!
   DIR'INP:
       ROW1=2 : C'CT=1
       SCR1$=DIR'NAM(ROW1,C'CT)
       CALL DIR'MRK'ON
       PRINT TAB(-1,29);       ! CURSOR OFF
COM'DIR:
       print tab(24,1); "Commands: ^T, next screen, arrows (to";
       print " move from file to file), CR: read"; tab(1,1);
       XCALL ACCEPT,A
       CALL DIR'MRK'OFF
       CALL SAVE'CT
!                      <-           \/      ^     ->
!                       H            J      K      L     CR
!                       8   9       10     11     12     13
       ON A-7 CALL DIR'BS,NULL,DIR'LF,DIR'VT,DIR'FF,DIR'CR
       IF A=20 THEN CALL DIR'CLR : ROW1=2 : RETURN     ! ^T
       IF A=27 THEN : RETURN   ! ESC to exit 'dir'
       CALL CK'DIR'NAM
       CALL DIR'MRK'ON
       GOTO COM'DIR
!
DIR'BS: ! BACK SPACE (LEFT ARROW)
       C'CT=C'CT-1
       IF C'CT=0 THEN C'CT=5 : ROW1=ROW1-1
       IF ROW1=1 AND C'CT=5 THEN ROW1=23 : C'CT=5
       RETURN

DIR'FF: ! RIGHT ARROW
       C'CT=C'CT+1
       IF C'CT=6 AND ROW1 = 23 THEN ROW1=2 : C'CT=1
       IF C'CT=6 THEN ROW1=ROW1+1 : C'CT=1
       RETURN

DIR'VT: ! UP ARROW
       ROW1=ROW1-1
       IF ROW1=1 AND C'CT=1 THEN ROW1=23 : C'CT=5
       IF ROW1=1 THEN C'CT=C'CT-1 : ROW1=23
       RETURN

DIR'LF: ! DOWN ARROW
       ROW1=ROW1+1
       IF ROW1 > 23 THEN ROW1=2 : C'CT=C'CT+1
       IF C'CT=6 THEN ROW1=2 : C'CT=1
       RETURN

DIR'CR:
       DCR$=SCR1$[1,6]
       XCALL STRIP,DCR$
       AM0S="LOOK "+DISK'DEVICE+DCR$[1,LEN(DCR$)]+"."+SCR1$[8,10]+ SCR(MFD'ROW)[B,E]
       if tst=1 then print tab(-1,0); tab(12,10); AM0S : INPUT A$
!       PRINT TAB(1,1); SCR1$;
! check to see if we running under DRAVIC run (DRUN)
!
       ON ERROR GOTO AMOS
       F$=RAD50("123")
!
! ok, no error. we must be running d-run
!
       RUNDOS=AM0S
!
! back to normal processing
!
DIR'1:  ON ERROR GOTO EXIT
       CALL DIR'PRT
       PRINT TAB(-1,29);
       CALL UFD'LN
       CALL DIR'LF
       RETURN
AMOS:
!       ? ERR(0),ERR(1),ERR(2)
       RESUME AMOS1
AMOS1:  XCALL AMOS,AM0S
       GOTO DIR'1
!
SAVE'CT:
       C'CT'S=C'CT : ROW1'S=ROW1
       RETURN
RESTORE'CT:
       C'CT=C'CT'S : ROW1=ROW1'S
       RETURN

CK'DIR'NAM:
       IF DIR'NAM(ROW1,C'CT) = "" THEN CALL RESTORE'CT
       RETURN
!
DIR'PRT:
       PRINT TAB(-1,0);
       FOR C=1 TO 5
               CCT=C * 16 - 15
               FOR R=1 TO 23
                       IF DIR'NAM(R,C)="" THEN GOTO NXR
                       PRINT TAB(R,CCT); TAB(-1,33);DIR'NAM(R,C); TAB(-1,33);
NXR:            NEXT R
       NEXT C
       RETURN
!
DIR'MRK'ON:
! Need to re-print file name again. This will allow it to work on all crts
       CCT=C'CT * 16 - 15
       IF CCT <= 0 THEN CCT=1
       SCR1$=DIR'NAM(ROW1,C'CT)
       PRINT TAB(ROW1,CCT); TAB(-1,32); SCR1$; TAB(-1,33);
!       PRINT TAB(15,16); ROW1;C'CT;CCT;SCR1$;
!       PRINT TAB(ROW1,CCT); TAB(-1,32);
!       PRINT TAB(ROW1,CCT); "!";
       RETURN
DIR'MRK'OFF:
       CCT=C'CT * 16 - 15
       IF CCT <= 0 THEN CCT=1
       PRINT TAB(ROW1,CCT); TAB(-1,33);SCR1$; TAB(-1,33);
!      PRINT TAB(ROW1,CCT); "@";
       RETURN
!
!
UFD'LN:
833     E=INSTR(B,SCR(MFD'ROW),"]")
834     PRINT TAB(1,1);"PC Directory Utility";TAB(1,65); &
                           DISK'DEVICE ; SCR(MFD'ROW)[B,E];
       RETURN
DIR'CLR:
831     PRINT TAB(-1,0);
832     ROW1=1 : COL=2 : C'CT=1
       CALL UFD'LN
       FOR A=1 TO 24
               DIR'ROW(A)=SPACE(50)
       NEXT A
       RETURN

DISK'DEVICE:
       A=0 : DEV'R=1 : DEV'C=0
       ? TAB(-1,0)
DD2:    B$= STR(A) USING "#Z"
       DISK'DEVICE=A$+B$+":"
       BLOCK'NO=0
       CALL RD'DISK

       IF ERR'CODE # 0 THEN GOTO NEXT
       IF DEV'C+1 > 10 THEN DEV'R=DEV'R+1 : DEV'C=0 : PRINT TAB(-1,33)
       DISKS(DEV'R,DEV'C+1)=DISK'DEVICE
       PRINT TAB(-1,33);DISK'DEVICE;
       DEV'C = DEV'C +1
       A=A+1
       GOTO DD2
NEXT:
       PRINT TAB(70); TAB(-1,33)
       PRINT TAB(23,1); "Select Disk by using the arrows, then CR";

       DEV'ROW=1 : DEV'COL=1
       ? TAB(-1,29);
DEV'COM:
       CALL DEV'MRK'ON
       CALL DEV'CR
       CALL LABEL
       XCALL ACCEPT,A
!
!                   <-      \/ ^  ->
!                    H       J  K  L CR
!                    8  9   10 11 12 13
       CALL DEV'MRK'OFF
       CALL SAVE'DEV
       ON A-7 CALL DEV'BS,NULL,DEV'LF,DEV'VT,DEV'FF,DEV'CR
       IF A=27 THEN GOTO EXIT
       IF A=13 THEN RETURN             ! return to 'START'
       CALL CK'DEV
       GOTO DEV'COM
SAVE'DEV:
       DEV'COL'S=DEV'COL : DEV'ROW'S=DEV'ROW
       RETURN
RESTORE'DEV'CT:
       DEV'COL=DEV'COL'S : DEV'ROW=DEV'ROW'S
       RETURN
CK'DEV:
       IF DISKS(DEV'ROW,DEV'COL)="" THEN CALL RESTORE'DEV'CT
       RETURN
DEV'BS: ! BACK SPACE
       DEV'COL=DEV'COL-1
       IF DEV'COL   < 1 THEN DEV'ROW=DEV'ROW-1 : DEV'COL=10
       IF DEV'ROW < 1 THEN DEV'ROW=DEV'R : DEV'COL=10
       RETURN

DEV'FF: ! RIGHT ARROW
       DEV'COL=DEV'COL+1
       IF DEV'COL  > 10 THEN DEV'ROW=DEV'ROW+1 : DEV'COL=1
       IF DEV'ROW > DEV'R THEN DEV'ROW=1 : DEV'COL=1
       RETURN

DEV'VT: ! UP ARROW
       DEV'ROW=DEV'ROW-1
       IF DEV'ROW  < 1  THEN DEV'ROW=DEV'R
       RETURN

DEV'LF: ! DOWN ARROW
       DEV'ROW=DEV'ROW+1
       IF DEV'ROW > DEV'R THEN DEV'ROW=1
       RETURN

DEV'CR:
23      DISK'DEVICE=DISKS(DEV'ROW,DEV'COL)
!       PRINT TAB(1,1); DISK'DEVICE;  DEV'ROW;DEV'COL;
       RETURN

DEV'MRK'ON:
!       PRINT TAB(DEV'ROW+1,(DEV'COL*7)-7+1); TAB(-1,32);
!       PRINT TAB(DEV'ROW+1,(DEV'COL*7)-7+1); "!";
!
       PRINT TAB(DEV'ROW+1,(DEV'COL*7)-7+1); TAB(-1,32);
       PRINT DISKS(DEV'ROW,DEV'COL); TAB(-1,33);
       RETURN

DEV'MRK'OFF:
!       PRINT TAB(DEV'ROW+1,(DEV'COL*7)-7+1); TAB(-1,33);
!       PRINT TAB(DEV'ROW+1,(DEV'COL*7)-7+1); "@";
!
       PRINT TAB(DEV'ROW+1,(DEV'COL*7)-7+1); TAB(-1,33);
       PRINT DISKS(DEV'ROW,DEV'COL); TAB(-1,33);
       RETURN

LABEL:  ! READ THE LABEL OF DISK
       CALL RD'DISK
       LABEL=BUFFER
       PRINT TAB(19,1);TAB(-1,9);  "Vol Nam"; TAB(19,41); "Vol Id"; tab(19,51); "Install";
       PRINT TAB(20,1);TAB(-1,9);  VOL'NAM; TAB(20,41);VOL'ID; tab(20,51); INSTALL;
       PRINT TAB(21,1);TAB(-1,9);  "SYSTEM";TAB(21,32); "CREATOR";
       PRINT TAB(22,1);TAB(-1,9);  SYSTEM; TAB(22,32);CREATOR;

! READ  DISK
1250 RD'DISK:
1260    XCALL NORTON, DISK'DEVICE, BLOCK'NO, BUFFER,ERR'CODE
1270    RETURN
!
! FILE NAMES UNPACK
!
1330 RAD50:     D=40
1340    X=UFDNAM1(A0) : CALL UNPACK : CALL RAD51 : NAME=UNP
1350    X=UFDNAM2(A0) : CALL UNPACK : CALL RAD51 : NAME=NAME+UNP
1360    X=UFDNAMX(A0) : CALL UNPACK : CALL RAD51 : NAME=NAME ! +"."+UNP
1370    RETURN
1380 RAD51:
1390    UNP=RAD5O[R1+1,R1+1]+RAD5O[R2+1,R2+1]+RAD5O[R3+1,R3
+1]
1400    RETURN
1070 PPN'UNPACK:
1080    PPN1=CHR(0) : PPN2=CHR(0) : X=PPNX(MD)
1090    D=256 : CALL UNPACK             ! CONVERT TO OCTAL
1100    D=8 : X=R2 : X3=R3 : CALL UNPACK
1110    IF R1 > 0 THEN PPN1=STR(R1)+STR(R2)+STR(R3) : GOTO PPN2
1120    IF R2 > 0 THEN PPN1=STR(R2)+STR(R3) : GOTO PPN2
1130    PPN1=STR(R3)
1140 PPN2:
1150    D=8 : X=X3 : CALL UNPACK
1160    IF R1 > 0 THEN PPN2=STR(R1)+STR(R2)+STR(R3) : GOTO PPN9
1170    IF R2 > 0 THEN PPN2=STR(R2)+STR(R3) : GOTO PPN9
1180    PPN2=STR(R3)
1190 PPN9:      RETURN
!
1200 UNPACK:
1210    Q=INT(X/D) : R=X-Q*D : X=Q : R3=R
1220    Q=INT(X/D) : R=X-Q*D : X=Q : R2=R
1230    Q=INT(X/D) : R=X-Q*D : X=Q : R1=R
! ?     D,R1;"-";R2;"/";R3
1240    RETURN
!
OPEN'HEAD:
       ZZ=0
30      OPEN #1,SCR1$,RANDOM,512,ZZ
40      READ #1,HEAD'IN
       RETURN
CLOSE'HEAD:
       CLOSE #1
       RETURN
WRITE'HEAD:
       WRITE #1,HEAD'IN
       RETURN
LOG12:
       JOBCUR=WORD(1052)*65536+WORD(1054)      ! GET JOB ADDRESS(LONG WORD)
       LOGIN=WORD(JOBCUR+20)           ! SAVE WHERE USER IS LOGGED INTO
       WORD(JOBCUR+20)=258             ! LOG 1,2
       RETURN
LOGBK:
       WORD(JOBCUR+20)=LOGIN           ! LOG BACK TO WHERE WE WERE
       RETURN
INSTR:
       print tab(-1,0)
       print "This program will read the disks on this system."
       print "Then read the MFD's on that disk. Allowing you"
       print "to create an A.A file in each of the P,PNs."
       print "you will Also be able to look at any file on"
       print "that disk."
       PRINT
       print "while looking at a UFD, you can not ESC back to the MFD."
       print "You must read all of the UFD."
       print
       print "THIS only reads the old directory format."
       print
       print "yes, it does need some help."
       print "Any questions, call Mike at 707-795-1595"
       print
       return
EXIT:
       IF FOUND # 0 THEN CALL LOGBK
       ? TAB(-1,28); TAB(23,1);
       END