*BASIC AUTO REM > Z/FREE REM Z80 Source code for FREE.COM REM v0.01 28-Nov-88 JGH: Initial version : DIM mcode% &800:start%=&100 BDOS=5 : FOR P=0 TO 1 O%=mcode%:P%=start% [OPT P*3+4 LD C,25:CALL BDOS:\ PUSH AF: :\ Read current drive : LD C,27:CALL BDOS:PUSH HL :\ Get allocation table address LD C,31:CALL BDOS :\ Get disk parameter block address INC HL:INC HL:LD A,(HL) :\ A=BlockSHift LD DE,3:ADD HL,DE :\ HL=>DiskSizeMax LD E,(HL):INC HL:LD D,(HL) :\ DE=DiskSizeMax POP IX:PUSH DE:PUSH AF:LD HL,0:\ Save size, zero total \ IX=> alloc, A=acc, B=8 loop, C=byte, DE=DSM, HL=size : .Loop0 LD B,8:LD C,(IX+0) :\ Set up inner loop, get byte .Loop1 SLA C:JR NC,BitZero:INC HL :\ Inc total if bit set .BitZero DEC DE:LD A,D:AND E:JR Z,TotalCounted DJNZ Loop1:INC IX:JR Loop0 : .TotalCounted POP AF:POP DE :\ A=BSH, DE=DSM EX DE,HL:AND A:SBC HL,DE :\ DE=used, HL=free DEC A .Loop3 SLA E:RL D:SLA L:RL H :\ Shift DE and HL left DEC A:JR NZ,Loop3 : PUSH DE:CALL PrNumbers LD DE,StrFree:CALL PrString POP HL:CALL PrNumbers LD DE,StrUsed:CALL PrString : \ pops RET : .PrNumbers LD (Total+1),HL:SLA L:RL H :\ Store, convert to 128-byte sector count LD A,H:CALL PrHex:LD A,L:CALL PrHex:\ Print sector total LD DE,StrSectors:CALL PrString LD A,ASC" ":LD (Lead),A LD C,&F:LD DE,&4240:CALL PrDec : CALL PrComma LD C,&1:LD DE,&86A0:CALL PrDec LD DE,10000:CALL PrDec0 LD DE,1000:CALL PrDec0 : CALL PrComma LD DE,100:CALL PrDec0 LD DE,10:CALL PrDec0 LD A,(Total):CALL PrNybble LD DE,StrBytes : .PrString LD C,9:JP BDOS : .PrHex PUSH AF:RRA:RRA:RRA:RRA CALL PrNybble:POP AF : .PrNybble AND 15:CP 10 JR C,P%+4:ADD A,7 ADD A,ASC"0" .OUTCHR PUSH HL LD E,A:LD C,2:CALL BDOS POP HL:RET : .PrDec0 LD C,0 .PrDec LD B,&FF LD A,(Total+2):LD HL,(Total) .DecLoop INC B:€ A:SBC HL,DE:SBC A,C JR NC,DecLoop ADD HL,DE:ADC A,C LD (Total+2),A:LD (Total),HL LD A,B:€ A:JR Z,PrZero LD A,ASC"0":LD (Lead),A LD A,B:JP PrNybble .PrZero LD A,(Lead):JP OUTCHR : .PrComma LD A,(Lead):CP ASC" ":JR Z,OUTCHR LD A,ASC",":JP OUTCHR : RET : .Lead DEFM " " : .Total DEFB 0:DEFW 0 : .StrSectors DEFM " Sectors = $" : .StrBytes DEFM " Bytes $" .StrFree DEFM "Free":DEFB 13:DEFB 10:DEFM "$" .StrUsed DEFM "Used":DEFB 13:DEFB 10:DEFM "$" : ]NEXT A$="*SAVE FREE.COM "+STR$~mcode%+" "+STR$~O% PRINT A$