home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
turbods
/
disk12.lbr
/
DISK.BAS
next >
Wrap
BASIC Source File
|
1986-09-27
|
5KB
|
158 lines
rem disk.bas all system info on specified disk drive
integer i,directory.entries
real total.space,available.space
string disk.free.space,percent.used
%include cbc
i= match(";",command$,1)
if i>0 then operation$=ucase$(right$(command$,len(command$)-i))
if i<1 then print.options%=-1
disk$=ucase$(left$(command$,1))
if disk$<"A" or disk$>"P" then disk$=seldsk("")
disk%=asc(disk$)-65
rem main code
if match("L",operation$,1) then lprinter
print "DISK v1.1 "
print tab(10);
print using "Drive &: Characteristics";disk$:print
print tab(10);
print "Drive Status: ";
call asm(050h,0,21,(-1*256)+disk%,0) rem T21 get/set drive status
l%=mod(gethl,256)
if l%=0 then\
print "Not ready.":stop
h%=gethl/256
if h%=-1 then print " :Read Only";
if h%= 0 then print " :Read/Write";
call asm(050h,0,19,disk%,0) rem allocation info
s%=mod(getpsw,256)
fixed%=s%>=80h
s%=mod(s%,80h)
directory.blocks%=mod(getbc,256)
blocks.unused%=getde
total.blocks%=gethl
blocks.used%=total.blocks%-blocks.unused%
block.size%=4 rem default
if s%=3 then block.size%=1
if s%=4 then block.size%=2
if s%=5 then block.size%=4
if s%=6 then block.size%=8
if s%=7 then block.size%=16
total.space=float(total.blocks%)*float(block.size%)
directory.entries=directory.blocks%*block.size%
directory.entries=directory.entries*32
DISK.FREE.SPACE=STR$(float(blocks.unused%)*float(block.size%))
call asm(050h,0,20,(-1*256)+disk%,0) rem sector size call
sx%=mod(getpsw,256)
if sx%=0 then sector.size%=128
if sx%=1 then sector.size%=256
if sx%=2 then sector.size%=512
if sx%=3 then sector.size%=1024
if sx%=4 then sector.size%=2048
if sx%=5 then sector.size%=4096
if sx%=6 then sector.size%=8192
if sx%=7 then sector.size%=16384
reserved.tracks%=getbc
num.tracks%=getde
num.sectors%=gethl
percent.used = str$(int(100-(blocks.used%/total.space*100)))
available.space=total.space-(block.size%*directory.blocks%)
print tab(55);
if fixed% then print "(Fixed media)" else print "(Removable media)"
print tab(10);
print "Total space :";str$(total.space)+"k"
print tab(10);
print "Useable file space :";str$(available.space)+"k"
print tab(10);
print "Free space :";disk.free.space+"k"
print
print tab(10);
print "Sector size :";str$(sector.size%)
print tab(10);
print "Reserved tracks :";str$(reserved.tracks%)
print tab(10);
print "Tracks on disk :";str$(num.tracks%)
print tab(10);
print "Sectors/track :";str$(num.sectors%)
print tab(10);
print "Block size :";str$(block.size%)+"k"
print tab(10);
print "Directory blocks :";str$(directory.blocks%)
print tab(10);
print "Directory entries :";str$(directory.entries)
print tab(10);
print "Allocation Blocks :";str$(total.blocks%)
print tab(10);
print "Allocation blks used:";str$(blocks.used%)+" ("+percent.used+"%)"
print tab(10);
print "Allocation blks left:";str$(total.blocks%-blocks.used%)
print
console
if match("L",operation$,1) then \
print "Disk characteristics sent to printer."
if match("M",operation$,1) then gosub fixmap
if match("F",operation$,1) then gosub fixdir
if print.options% then\
print "Options ;L (send to printer)":\
print " ;M (rebuild disk map)":\
print " ;F (fix directory)"
stop rem end prog
fixmap:
print
print "OK to regenerate disk map on drive ";disk$;":? (Y/N) ";
input "";line answer$: answer$=ucase$(answer$)
if left$(answer$,1)<>"Y" then return
print "Regenerating map on drive ";disk$;":"
call asm(050h,0,11,(-1*256)+disk%,0) rem regenerate map
a%=mod(getpsw,256)
if a%<>0 then print "Unable to regenerate disk map.": return
if a%=0 then print "Disk map regenerated."
call asm(050h,0,19,disk%,0) rem allocation info
new.blocks.unused%=getde
new.blocks.used%=total.blocks%-new.blocks.unused%
if new.blocks.used%=blocks.used% then return
if new.blocks.used%>blocks.used% then a$="gained" else a$="lost"
print abs(blocks.used%-new.blocks.used%);" allocation blocks ";a$
return
fixdir:
print
print "It would be good to BACK UP drive ";+disk$+": before starting."
print "OK to reorganize directory on drive ";disk$;" (Y/N) ";
input "";line answer$:answer$=ucase$(answer$)
if left$(answer$,1)<>"Y" then return
print "Reorganizing directory on drive ";disk$;"- DO NOT INTERRUPT!";
call asm(050h,0,42,(-1*256)+disk%,0) rem regenerate map
a%=mod(getpsw,256)
if a%<>0 then print "Unable to reorganize directory.": return
if a%=0 then print "Directory reorganized."
return
rem ******************************