10 PRINT CHR$(26)CHR$(13)TAB(29)"CONFIG 4.6 - 08 JUL 87" 20 PRINT TAB(14)"Copyright 1987 by George Borys, all rights reserved." 30 PRINT "If you find this program valuable, please consider making "; 40 PRINT "a tax-deductable"CHR$(10)CHR$(13)" contribution to the Bay Area "; 50 PRINT "Micro Decision Users Association (BAMDUA)" 60 PRINT TAB(23)"P.O. Box 5152, Berkeley, CA 94705"CHR$(10) 70 DIM MTAB(5,9),DPB(4,15),FORMAT(5),SIDES(5),TPI(5),MTR(5),HST(5),SRT(5) 80 DIM HUT(5),HLT(5),DRM(5),DSM(5),BLS(5),DAT(11,5) 'USE ARRAYS TO STORE DATA 90 RESTORE 150 'FIRST, READ DATA FOR VARIOUS DPB'S 100 FOR I=1 TO 4 'THAT'S SSDD, DSDD, SSQD, DSQD 110 FOR J=1 TO 15 '15 BYTES PER DPB 120 READ N$ 'GET HEX BYTE FROM DATA STATEMENTS 130 DPB(I,J)=VAL("&H"+N$) 'CONVERT HEX TO DECIMAL 140 NEXT J,I 'AND NOW, THE DPB DATA FOR SSDD, DSDD, SSQD, DSQD: 150 DATA 28,00,04,0F,01,5E,00,7F,00,C0,00,20,00,02,00 'SSDD 160 DATA 28,00,04,0F,01,C2,00,BF,00,E0,00,30,00,02,00 'DSDD 170 DATA 28,00,04,0F,01,C7,00,BF,00,E0,00,30,00,02,00 'SSQD 180 DATA 28,00,05,1F,03,C7,00,BF,00,C0,00,30,00,02,00 'DSQD 190 ON ERROR GOTO 330 'ERROR TRAP IN CASE OF BOGUS FILESPEC 200 PRINT TAB(32)"FILES" 'PROVIDE A HEADING FOR THE DIRECTORY DUMP 210 FILES 'DISPLAY DIRECTORY 220 PRINT CHR$(10) 'START FOLLOWING PROMPT ON A NEW LINE: 230 LINE INPUT "SYSTEM IMAGE TO PATCH (OR [RETURN] TO EXIT): ";FILESPEC$ 240 IF FILESPEC$="" THEN SYSTEM 'ABORT TO CP/M IF NO FILESPEC IS GIVEN 250 FOR I=1 TO LEN(FILESPEC$) 'FOLD FILESPEC INTO UPPER CASE 260 C=ASC(MID$(FILESPEC$,I,1)) 'GET ASCII VALUE OF EACH CHARACTER 270 MID$(FILESPEC$,I,1)=CHR$(C+32*(C=>ASC("a"))) 'FORCE TO UPPER CASE 280 NEXT I 'DO EVERY CHARACTER 290 PRINT CHR$(10)"Loading system image from file "FILESPEC$" ->" 300 OPEN "I",1,FILESPEC$ 'WILL GENERATE ERROR HERE IF FILE DOES NOT EXIST 310 CLOSE 'FILE EXISTS 320 GOTO 350 'SKIP OVER ERROR MESSAGE 330 PRINT "ERROR ACCESSING "FILESPEC$" -- IS IT THERE?" 340 RESUME 230 'TRY AGAIN TO GET VALID FILESPEC 350 ON ERROR GOTO 0 'TURN OFF ERROR TRAP 360 OPEN "R",1,FILESPEC$,128 ' OPEN FILESPEC FOR RANDOM ACCESS 370 FIELD 1,128 AS BUFFER$ 'FIELD THE BUFFER AS ONE LARGE BLOCK 380 DEF FNBLOCK(N)=INT(N/128)-1 'TRANSLATES ADDRESS TO BLOCK NUMBER 390 BOOTBLK=FNBLOCK(&H900) 'BOOT SECTOR BEGINS AT ADDRESS 0900H 400 GET 1,BOOTBLK ' GET BOOT SECTOR FOR CBIOS ADDRESS, LOOK FOR CODE: 410 T$=CHR$(&HB7)+CHR$(&HC2)+CHR$(&H18)+CHR$(0)+CHR$(&HC3) 'JUST BEFORE BIOS 420 X=INSTR(BUFFER$,T$) 'IS THE TARGET STRING IN THE BOOT SECTOR? 430 IF X>0 THEN 470 ELSE CLOSE'IF IT IS, THEN SKIP TO PROCESS THE INFORMATION 440 PRINT FILESPEC$" IS NOT A VALID SYSTEM IMAGE!" 'TARGET STRING NOT FOUND 450 ON ERROR GOTO 330 'RE-INSTALL ERROR TRAP 460 GOTO 230 'GO BACK TO INPUT PROMPT 470 BIOS=ASC(MID$(BUFFER$,X+5,1))+256*ASC(MID$(BUFFER$,X+6,1)) 'BIOS ADDRESS 480 OFFSET=BIOS-&H2300 'ADDRESS OFFSET WITHIN SYSTEM IMAGE 490 BIOSBLK=FNBLOCK(&H2300) 'BLOCK CONTAINING BEGINNING OF CBIOS 500 GET 1,BIOSBLK 'GET FIRST BLOCK OF CBIOS WITH ITS ADDRESS VECTORS 510 MTAB=ASC(MID$(BUFFER$,69,1))+256*ASC(MID$(BUFFER$,70,1)) 'MTAB ADDRESS 520 RAMDATX=ASC(MID$(BUFFER$,65,1))+256*ASC(MID$(BUFFER$,66,1)) 'RAMDATX ADR 530 DPB0=RAMDATX-75 'BACKUP TO DPB FOR DRIVE "A" 540 DPBBLK=FNBLOCK(DPB0-OFFSET) 'BLOCK CONTAINING THE 75 BYTES OF DPB'S 550 DPBSTART=DPB0-128*INT(DPB0/128) 'OFFSET TO START OF DPB0 IN DPBBLK 560 MTBLOCK=FNBLOCK(MTAB-OFFSET) 'BLOCK CONTAINING MTAB 570 MTSTART=MTAB-128*INT(MTAB/128) 'OFFSET TO START OF MTAB IN MTBLOCK 580 GET 1,MTBLOCK 'GET BLOCK CONTAINING MTAB 590 T1$=BUFFER$ 'SAVE BUFFER FOR MTAB DISPLAY 600 GET 1,DPBBLK 'GET DISK PARAMETER BLOCK 610 T2$=BUFFER$ 'SAVE BUFFER FOR DPB DISPLAY 620 IF MTSTART>(128-45) THEN 650 'SKIP TO BLOCK BRIDGE 630 MTAB$=MID$(T1$,MTSTART+1,45) 'OTHERWISE THIS IS THE MTAB INFO 640 GOTO 670 'BYPASS THE BLOCK BRIDGE: 650 GET 1,MTBLOCK+1 'GET REST OF MTAB 660 MTAB$=MID$(T1$,MTSTART,45)+LEFT$(BUFFER$,MTSTART+45-128) 'BUILD MTAB$ 670 IF DPBSTART>(128-75) THEN 700 'SKIP TO BLOCK BRIDGE 680 DPB$=MID$(T2$,DPBSTART+1,75) ' OTHERWISE THIS IS THE DPB INFO 690 GOTO 720 'SKIP THE BLOCK BRIDGE 700 GET 1,DPBBLK+1 'GET REST OF DPB 710 DPB$=MID$(T2$,DPBSTART+1,75)+LEFT$(BUFFER$,DPBSTART+75-128) 'BUILD DPB$ 720 DRIVES=1 'INITIALIZE COUNT OF CURRENTLY INSTALLED DRIVES 730 FOR D=1 TO 5 'ONE MTAB FOR EACH OF 5 DRIVES (A-E) 740 FOR I=1 TO 9 'NINE BYTES PER MTAB 750 MTAB(D,I)=ASC(MID$(MTAB$,I+9*(D-1),1)) 'GET MTAB DATA 760 NEXT I 'NEXT BYTE IN MTAB 770 DRIVES=DRIVES-(MTAB(D,1)<>MTAB(1,1)) 'TALLY UP NUMBER OF PHYSICAL DRIVES 780 NEXT D 'NEXT DRIVE 790 GOSUB 2190 ' DISPLAY MTAB INFORMATION 800 PRINT CHR$(10)FILESPEC$" IS CURRENTLY CONFIGURED AS A"DRIVES"DRIVE SYSTEM." 810 INPUT " -PRESS [RETURN], OR ENTER NEW NUMBER OF DRIVES (1 - 4): ";MAXDRV 820 IF MAXDRV<1 OR MAXDRV>4 THEN MAXDRV=DRIVES 'ACCEPT VALID NUMBERS 830 PRINT MAXDRV"DRIVE SYSTEM." 840 MTAB(1,1)=(MTAB(1,1) AND &HF8) OR 1 'INITIALIZE MTAB MOTOR CONTROL BITS 850 MTAB(2,1)=(MTAB(2,1) AND &HF8) OR 2 ' FOR A 4-DRIVE SYSTEM 860 MTAB(3,1)=(MTAB(3,1) AND &HF8) OR 4 ' (CAN ALWAYS BE CRUNCHED DOWN 870 MTAB(4,1)=(MTAB(4,1) AND &HF8) OR 4 ' TO FEWER DRIVES LATER) 880 FOR I=1 TO 4 '4 PHYSICAL DRIVES NUMBERED 0-3 890 MTAB(I,2)=(MTAB(I,2) AND &H7C) OR I-1 900 NEXT I 'MOTOR CONTROL BITS NOW SET FOR UP TO 4 DRIVES. 910 FOR DRIVE=0 TO MAXDRV-1 'GET INFORMATION FOR NUMBER OF DRIVES SPECIFIED 920 DRIVE$=CHR$(65+DRIVE) 'CREATE DRIVE LETTER 930 PRINT CHR$(10)"DRIVE "CHR$(34)DRIVE$CHR$(34)" CURRENTLY"; 940 PRINT SIDES(DRIVE+1)"SIDED." 'PRINT DEFAULT SETTING 950 INPUT "-PRESS [RETURN], OR ENTER NEW NUMBER OF SIDES (1 - 2): ";S 960 IF S<1 OR S>2 THEN S=SIDES(DRIVE+1) 'USE DEFAULT IF NO VALID ENTRY 970 PRINT S"SIDED DRIVE "CHR$(34)DRIVE$CHR$(34) 'SAY WHAT YOU'RE USING 980 IF S=1 THEN 1020 'SKIP IF SINGLE SIDED DRIVE 990 MTAB(DRIVE+1,1)=MTAB(DRIVE+1,1) OR &H20 'SET BIT FOR DS 1000 MTAB(DRIVE+1,2)=MTAB(DRIVE+1,2) OR 4 'SET BIT FOR DOUBLE SIDED MEDIA 1010 GOTO 1040 'SKIP SINGLE SIDED ROUTINE 1020 MTAB(DRIVE+1,1)=MTAB(DRIVE+1,1) AND &HDF 'RESET BIT -> SINGLE SIDED 1030 MTAB(DRIVE+1,2)=MTAB(DRIVE+1,2) AND &HFB 'RESET BIT -> SINGLE SIDED 1040 PRINT CHR$(10)"DRIVE "CHR$(34)DRIVE$CHR$(34)" IS"TPI(DRIVE+1)"TPI." 1050 INPUT "-PRESS [RETURN] OR ENTER NEW TPI (48 - 96): ";TPI 1060 IF TPI<>48 AND TPI<>96 THEN TPI=TPI(DRIVE+1) 'INSTALL DEFAULT IF NEEDED 1070 MTAB(DRIVE+1,2)=MTAB(DRIVE+1,2) AND &HDF 'RESET BIT -> 40 TRACK 1080 IF TPI=48 THEN 1100 'SKIP SETTING QUAD DENSITY BIT IF 48 TPI 1090 MTAB(DRIVE+1,2)=MTAB(DRIVE+1,2) OR &H20 'SET BIT -> 80 TRACK 1100 PRINT TPI"TRACKS PER INCH DRIVE "CHR$(34)DRIVE$CHR$(34)CHR$(10) 1110 PRINT "MOTOR ON WAIT TIME FOR DRIVE "CHR$(34)DRIVE$CHR$(34)" IS"; 1120 PRINT MTR(DRIVE+1)" mS." 'DISPLAY DEFAULT 1130 PRINT "-PRESS [RETURN] OR ENTER A NEW MOTOR ON WAIT TIME (0-1020 mS): ?"; 1140 LINE INPUT Q$ 'GET THE NEW MOTOR ON WAIT TIME 1150 IF Q$="" THEN 1170 ELSE Q=VAL(Q$) 'SKIP TO DEFAULT IF [RETURN] 1160 IF Q=>0 AND Q<=1020 THEN MTR(DRIVE+1)=4*INT(Q/4) 'INSTALL VALID NUMBERS 1170 PRINT "MOTOR ON WAIT TIME:"MTR(DRIVE+1)"mS."CHR$(10) 1180 MTAB(DRIVE+1,3)=INT(MTR(DRIVE+1)/4) 'INSTALL MOTOR ON WAIT TIME 1190 PRINT "HEAD SETTLING TIME AFTER SEEK FOR DRIVE "CHR$(34)DRIVE$CHR$(34); 1200 PRINT " IS"HST(DRIVE+1)" mS." 'DISPLAY DEFAULT 1210 PRINT "-PRESS [RETURN] OR ENTER NEW HEAD SETTLING TIME (0-1020 mS): ?"; 1220 LINE INPUT Q$ 1230 IF Q$="" THEN 1250 ELSE Q=VAL(Q$) 1240 IF Q=>0 AND Q<=1020 THEN HST(DRIVE+1)=4*INT(Q/4) 'ACCEPT LEGIT NUMBERS 1250 PRINT "HEAD SETTLING TIME AFTER SEEK:"HST(DRIVE+1)"mS."CHR$(10) 1260 MTAB(DRIVE+1,4)=INT(HST(DRIVE+1)/4) 'INSTALL NUMBER IN MTAB 1270 PRINT "STEPPING RATE FOR DRIVE "CHR$(34)DRIVE$CHR$(34)" IS"; 1280 PRINT SRT(DRIVE+1)"mS." 1290 INPUT "-PRESS [RETURN] OR ENTER A NEW STEPPING RATE (1-15 mS): ";Q 1300 IF Q=>1 AND Q<=15 THEN SRT(DRIVE+1)=INT(Q) 'ACCEPT VALID NUMBERS 1310 PRINT "STEPPING RATE:"SRT(DRIVE+1)"mS."CHR$(10) 1320 PRINT "HEAD UNLOAD TIME FOR DRIVE "CHR$(34)DRIVE$CHR$(34)" IS"; 1330 PRINT HUT(DRIVE+1)"mS." 1340 INPUT "-PRESS [RETURN] OR ENTER NEW HEAD UNLOAD TIME (16-240 mS): ";Q 1350 IF Q=>16 AND Q<=240 THEN HUT(DRIVE+1)=16*INT(Q/16) 'ACCEPT VALID NUMBERS 1360 PRINT "HEAD UNLOAD TIME:"HUT(DRIVE+1)"mS."CHR$(10) 1370 MTAB(DRIVE+1,5)=HUT(DRIVE+1)/16+16*(16-SRT(DRIVE+1)) 1380 PRINT "HEAD LOAD TIME FOR DRIVE "CHR$(34)DRIVE$CHR$(34)" IS"; 1390 PRINT HLT(DRIVE+1)"mS." 1400 INPUT "-PRESS [RETURN] OR ENTER NEW HEAD LOAD TIME (2-254 mS): ";Q 1410 IF Q=>2 AND Q<=254 THEN HLT(DRIVE+1)=2*INT(Q/2) 'ACCEPT VALID HLT 1420 PRINT "HEAD LOAD TIME:"HLT(DRIVE+1)"mS."CHR$(10) 1430 MTAB(DRIVE+1,6)=1+2*INT(HLT(DRIVE+1)/2) 'THAT'S THE WAY IT'S STORED. 1440 NEXT DRIVE 1450 PRINT CHR$(10)"Validating data..." 'SOUNDS BETTER THAN 'DIDDLING AROUND' 1460 FOR DRIVE=MAXDRV+1 TO 5 'INSTALL VIRTUAL DRIVE INFORMATION 1470 FOR I=1 TO 9 '9 BYTES IN MTAB 1480 MTAB(DRIVE,I)=MTAB(1,I) 'VIRTUAL DRIVES == DRIVE 'A' 1490 NEXT I,DRIVE 'FINISH INSTALLING VIRTUAL MTABS 1500 FOR D=1 TO 5 'NOW INSTALL ALL 5 DRIVES IN DPB$ AND MTAB$ 1510 FOR I=1 TO 9 '9 BYTES PER MTAB 1520 MID$(MTAB$,I+9*D-9,1)=CHR$(MTAB(D,I)) 'INSTALL BYTE IN MTAB IMAGE 1530 NEXT I 'FINISH ONE MTAB 1540 SINGLE=((MTAB(D,2) AND 4)=0) 'CHECK FOR SINGLE SIDED DRIVE 1550 QUAD=((MTAB(D,2) AND 32)=32) 'CHECK FOR QUAD DENSITY DRIVE 1560 FORMAT(D)=(2+SINGLE-2*QUAD) '4 POSSIBLE FORMATS ARE SSDD,DSDD,SSQD,DSQD 1570 FOR J=1 TO 15 '15 BYTES PER DPB TO INSTALL NOW 1580 MID$(DPB$,J+15*D-15,1)=CHR$(DPB(FORMAT(D),J)) 'INSTALL BYTE IN DPB IMAGE 1590 NEXT J,D 'FINISH INSTALLING DPB FOR EACH DRIVE 1600 GOSUB 2190 'DISPLAY ALL THAT WONDERFUL DATA ABOUT THE CONFIGURATION 1610 PRINT CHR$(10)"PRESS [RETURN] TO UPDATE "FILESPEC$ 1620 PRINT " [ESC] TO EXIT WITHOUT CHANGING, OR 1630 PRINT " ANY OTHER KEY TO RE-CONFIGURE: "; 1640 Q$=INKEY$ 'CHECK KEYBOARD - LOOP UNTIL KEY PRESSED 1650 IF Q$="" THEN 1640 ELSE IF Q$=CHR$(13) THEN 1680 'CHR$(13)=[RETURN] 1660 IF Q$=CHR$(27) THEN SYSTEM ELSE CLOSE 'CHR$(27)=[ESC] 1670 GOTO 190 'FILE IS CLOSED, RUN THE PROGRAM AGAIN 1680 GET 1,MTBLOCK 'GET MTAB INTO BUFFER 1690 T$=BUFFER$ 'TEMP STORAGE OF BUFFER FOR UPDATE 1700 MID$(T$,MTSTART+1,45)=MTAB$ 'INSTALL MTAB 1710 LSET BUFFER$=T$ 'BACK INTO BUFFER 1720 PUT 1,MTBLOCK 'BACK INTO FILE 1730 IF NOT (MTSTART>(128-45)) THEN 1790 'SKIP IF NO DEBLOCKING TO DO 1740 GET 1,MTBLOCK+1 'GET SECOND PART OF MTAB INTO BUFFER 1750 T$=BUFFER$ 'TEMP STORAGE OF BUFFER FOR UPDATE 1760 MID$(T$,1,MTSTART+45-128)=RIGHT$(MTAB$,MTSTART+45-128) 1770 LSET BUFFER$=T$ ' INSTALL REMAINDER OF MTAB 1780 PUT 1,MTBLOCK+1 'PUT BACK INTO FILE 1790 GET 1,DPBBLK 'GET BLOCK WITH DPB INFO 1800 T$=BUFFER$ 'TEMP STORAGE OF DPB BLOCK 1810 MID$(T$,DPBSTART+1,75)=DPB$ 'INSTALL DPB IN TEMP BUFFER 1820 LSET BUFFER$=T$ 'BACK INTO BUFFER 1830 PUT 1,DPBBLK 'BACK INTO FILE 1840 IF NOT (DPBSTART>(128-75)) THEN 1900 'SKIP IF NO DEBLOCKING TO DO 1850 GET 1,DPBBLK+1 'GET SECOND PART OF DPB INTO BUFFER 1860 T$=BUFFER$ 'TEMP STORAGE OF BUFFER FOR UPDATE 1870 MID$(T$,1,DPBSTART+75-128)=RIGHT$(DPB$,DPBSTART+75-128) 'UPDATE DPB 1880 LSET BUFFER$=T$ 'INSTALL REMAINDER OF DPB 1890 PUT 1,DPBBLK+1 'PUT BACK INTO FILE 1900 GET 1,FNBLOCK(&H980) 'GET BOOT SECTOR WITH BTAB, DPB 1910 XSUM=0 'INITIALIZE CHECKSUM TO ZERO 1920 FOR I=1 TO 25 'CHECK ALL 25 BYTES, JUST LIKE THE CBIOS DOES 1930 XSUM=XSUM XOR ASC(MID$(BUFFER$,I,1)) ' CHECKSUM 1940 NEXT 'PROCESS NEXT BYTE THROUGH CHECKSUM ALGORITHM 1950 T$=BUFFER$ 'PUT BUFFER INTO TEMP STORAGE 1960 FOR I=1 TO 9 '9 BYTES IN MTAB 1970 MID$(T$,I,1)=CHR$(MTAB(1,I)) 'INSTALL MTAB BYTES INTO TEMP STORAGE 1980 NEXT I 'NEXT BYTE 1990 IF XSUM<>0 THEN 2080 'SKIP DPB AND CHECKSUM ON REV 1.3 2000 FOR I=1 TO 15 '15 BYTE DPB TO INSTALL: 2010 MID$(T$,I+9,1)=CHR$(DPB(FORMAT(1),I)) ' INSTALL APPROPRIATE DPB 2020 NEXT I 'NEXT BYTE 2030 XSUM=0 'INITIALIZE NEW CHECKSUM: 2040 FOR I=1 TO 24 '25TH BYTE WILL BE THE CHECKSUM 2050 XSUM=XSUM XOR ASC(MID$(T$,I,1)) 'CALCULATE CHECKSUM 2060 NEXT I 'NEXT BYTE 2070 MID$(T$,25,1)=CHR$(XSUM) 'INSTALL CHECKSUM INTO TEMP STORAGE 2080 LSET BUFFER$=T$ 'PUT TEMP STORAGE INTO BUFFER 2090 PUT 1,FNBLOCK(&H980) 'PUT BOOT SECTOR BACK INTO FILE 2100 CLOSE 'DONE. -BUT LEAVE A PARTING MESSAGE: 2110 PRINT CHR$(26) 'CLEAR THE DISPLAY 2120 PRINT "The system image in "FILESPEC$" has been re-configured." 2130 PRINT CHR$(10)"TO INSTALL "FILESPEC$" ON SYSTEM TRACKS, TYPE:"CHR$(10) 2140 PRINT " SYSGEN "FILESPEC$;CHR$(10) 2150 PRINT " - THEN JUST FOLLOW THE PROMPTS." 2160 PRINT " (TO INITIALIZE THE NEW SYSTEM FOR A DIFFERENT TERMINAL," 2170 PRINT " USE INIT.COM)."CHR$(10) 2180 SYSTEM 'EXIT BACK TO THE SYSTEM (YOU'RE DONE!) 2190 FOR I=1 TO 5 '5 LOGICAL DRIVES TO GET PARAMETERS ON: 2200 SIDES(I)=1+(MTAB(I,1) AND 32)/32 'NUMBER OF SIDES (1 OR 2) 2210 DAT(1,I)=SIDES(I) 'NUMBER OF SIDES (1 OR 2) 2220 TPI(I)=48+48*(MTAB(I,2) AND 32)/32 'TRACKS PER INCH (48 OR 96) 2230 DAT(2,I)=TPI(I) 'TRACKS PER INCH (48 OR 96) 2240 MTR(I)=4*MTAB(I,3) 'MOTOR ON WAIT TIME IN mS 2250 DAT(3,I)=MTR(I) 'MOTOR ON WAIT TIME IN mS 2260 HST(I)=4*MTAB(I,4) 'HEAD SETTLING TIME IN mS 2270 DAT(4,I)=HST(I) 'HEAD SETTLING TIME IN mS 2280 SRT(I)=16-INT(MTAB(I,5)/16) 'STEPPING RATE IN mS 2290 DAT(5,I)=SRT(I) 'STEPPING RATE IN mS 2300 HUT(I)=16*(MTAB(I,5) MOD 16) 'HEAD UNLOAD TIME IN mS 2310 DAT(6,I)=HUT(I) 'HEAD UNLOAD TIME IN mS 2320 HLT(I)=MTAB(I,6) AND 254 'HEAD LOAD TIME IN mS, THEN DIRECTORY SPACE: 2330 DAT(7,I)=HLT(I) 'HEAD LOAD TIME DATA 2340 DRM(I)=1+ASC(MID$(DPB$,8+15*I-15,1))+256*(ASC(MID$(DPB$,9+15*I-15,1))) 2350 DAT(8,I)=DRM(I) 'NUMBER OF DIRECTORY ENTRIES 2360 BLS(I)=2^(ASC(MID$(DPB$,3+15*I-15,1))-3) 'BLOCK SIZE IN KBYTES; BLOCKS: 2370 DAT(10,I)=BLS(I) 'BLOCK SIZE DATA 2380 BLOCKS=1+ASC(MID$(DPB$,6+15*I-15,1))+256*ASC(MID$(DPB$,7+15*I-15,1)) 2390 DSM(I)=BLOCKS*BLS(I) 'DISK SIZE IN K (JUST BASED ON NUMBER OF BLOCKS) 2400 FOR AL01=10 TO 11 'TO BE REALISTIC ABOUT IT THOUGH, LET'S SUBTRACT 2410 FOR BIT=0 TO 7 'THE BLOCKS THAT ARE DEVOTED TO THE DIRECTORY: 2420 USED=(ASC(MID$(DPB$,AL01+15*I-15,1)) AND 2^BIT)<>0 'INFO FROM AL0, AL1 2430 DSM(I)=DSM(I)+BLS(I)*USED 'RE-ADJUST THE DISK SIZE BY SUBTRACTING 2440 NEXT BIT,AL01 'EVERY BLOCK THAT'S DEVOTED TO THE DIRECTORY AREA. 2450 DAT(9,I)=DSM(I) 'FREE SPACE ON DISK 2460 NEXT I '(16 BITS TO CHECK IN AL0 AND AL1) 2470 PRINT CHR$(10)TAB(2)"SYSTEM IMAGE FILE: "FILESPEC$; 'NOW DISPLAY INFO: 2480 PRINT " (*->VIRTUAL DRIVE)" 2490 PRINT TAB(14)"DRIVE: A "; 2500 FOR I=2 TO 5 'USE * TO FLAG VIRTUAL DRIVES 2510 PRINT CHR$(64+I);MID$(" *",1-(MTAB(I,1)=MTAB(1,1)),1);" "; 2520 NEXT I 'DISPLAY INFO FOR ALL 5 LOGICAL DRIVES 2530 RESTORE 2640 'point to data for display 2540 FOR J=1 TO 10 '10 lines of data to display 2550 READ T$ 'read title 2560 PRINT TAB(19-LEN(T$))T$": "; 2570 READ PU$ 'READ DATA PRINT FORMAT 2580 FOR I=1 TO 5 '5 DRIVES OF DATA 2590 PRINT USING PU$;DAT(J,I); 'print data 2600 NEXT I 'next drive 2610 PRINT 'new line 2620 NEXT J 'next line of data 2630 RETURN 'end of display routine 2640 DATA "SIDES","#### " 2650 DATA "TRACKS PER INCH","#### tpi" 2660 DATA "MOTOR ON WAIT TIME","#### mS " 2670 DATA "HEAD SETTLING TIME","#### mS " 2680 DATA "STEPPING RATE","#### mS " 2690 DATA "HEAD UNLOAD TIME","#### mS " 2700 DATA "HEAD LOAD TIME","#### mS " 2710 DATA "DIRECTORY ENTRIES","#### " 2720 DATA "DISK STORAGE","#### K " 2730 DATA "BLOCK SIZE","#### K " 10 DATA "DIRECTORY ENTRIES","#### " 2720 DATA "DISK STORAGE","#### K "