;*; Updated on 27-Apr-93 at 6:51 PM by James A. Jarboe I V; edit time: 0:39:11
;*************************** AMUS Program Label ******************************
; Filename: FREE.M68                                        Date: 12/18/91
; Category: UTIL         Hash Code: 515-501-722-125      Version: 1.0(105)
; Initials: GR/AM        Name: JAMES A. JARBOE IV
; Company: EDUCATIONAL VIDEO NETWORK               Telephone #: 4092955767
; Related Files: NONE
; Min. Op. Sys.:1.x and 2.x                    Expertise Level: BEG
; Special: MUST USE 2.X ASSEMBLER.
; Description: Displays disk usage Statistics on 1.x and 2.x systems.
; Usage: .FREE {DSK#:},   Much more informative than the FREE.LIT provided
;       with AMOS 2.x systems and it works with both AMOS 1.x and 2.x.
;*****************************************************************************
;*; Updated on 18-Dec-91 at 10:55 PM by James A. Jarboe I V; edit time: 0:46:11
;*****************************************************************************
; FREE.M68
; Displays Disk Usage Statistics
;
; History:
;
; Written:
; 07-Jun-84    David F. Pallmann
;
; Modified:
;      12/07/85  E. Oulashin - on next word, prev bit being set
;                caused contig to be zero'ed when there were
;                contiguous blocks.
;      02/24/86  E. Oulashin - corrected percentages on totals,
;                also fixed to round properly on percentages.
;      02/25/86  Dave Heyliger - AMUS
;                Changed total end-use figure report to produce
;                proper disk-use total.
;
;      01/09/89  Ed Schrayer - allow use for a single device only
;                or all devices as before, also prevent devide by zero
;
; [105] 18-Dec-91 by James A. Jarboe IV     GR/AM
;       Neat little program that needed to be upgraded to the 90's
;       Made to work on 1.x and 2.x systems.
;       Made to not include FOLDER and NRD's in totals for real devices.
;       Fixed total percentage rounding.
;       Added Version and edit levels.
;       Took out internal device offsets as there are now defined in SYSSYM
;
; [106] 12-Mar-93 by James A. Jarboe IV     GR/AM
;       Update to flag extended devices.
; [107] 27-Apr-93 by James A. Jarboe IV     GR/AM
;       Updated to not abort when listing CD-ROM devices.
;
       SEARCH  SYS
       SEARCH  SYSSYM

       VMAJOR  =       1
       VMINOR  =       0
       VEDIT   =       107.            ; 27-Apr-93 Current             [106]

;MACROS

DEFINE  PRTTAB  ROW, COL
       MOVW    #<ROW_8.+COL>, D1
       TCRT
       ENDM

DEFINE  DEPACK  ADDR
       IF      NB,ADDR,LEA A1,ADDR
       SUB     #4,SP
       MOV     SP,A2
       UNPACK
       CLRB    @A2
       TTYL    @SP
       ADD     #4,SP
       ENDM

DEFINE  BITW    SRC,DST
       MOVW    DST,D7
       ANDW    SRC,D7
       ENDM

DEFINE  BIT     SRC, DST
       MOV     DST, D7
       ANDW    SRC, D7
       ENDM

DEFINE  BICW    SRC,DST
       MOVW    SRC,D6
       COMW    D6
       MOVW    DST,D7
       ANDW    D6,D7
       MOVW    D7,DST
       ENDM

DEFINE  ADDM    SRC,DST
       MOV     SRC,D7
       ADD     D7,DST
       ENDM

DEFINE  DIVIDE  SRC,DST
       DIV     SRC,DST
       AND     #177777,SRC
       ENDM

;DEVICE TABLE
;; Comment out as offsets are now defined in SYSSYM for 2.x             [105]
;      .OFINI
;      .OFDEF  DV.NXT,4                ;link to next device entry
;      .OFDEF  DV.FLG,2                ;flags--.
;              DV$LOG=10               ; logical unit
;              DV$SHR=1000             ; shareable device
;              DV$MNT=10000            ; mounted
;      .OFDEF  DV.DEV,2                ;device code RAD50
;      .OFDEF  DV.UNT,2                ;drive number RAD50
;      .OFSIZ  DV.SIZ                   ; Free device size.
;


;IMPURE AREA
                                       ;
       .OFINI
       .OFDEF  DISK,   D.DDB           ;DDB for reading bitmaps
       .OFDEF  FR.TBL, 0               ; Start of free table.          [105]
       .OFDEF  FREE,   4               ; Free block count per disk.    [105]
       .OFDEF  CONTIG, 4               ; Contig count per disk.        [105]
       .OFDEF  FR.EXP, DF.SIZ-4.       ; End of free table and room.   [105]
       .OFDEF  TFREE,  4               ; Total free count.
       .OFDEF  TEMP,   4               ; Temporary bitmap count old style.
       .OFDEF  TCONTG, 4               ; Total contig count
       .OFDEF  COUNT,  4               ;  <- not used
       .OFDEF  BLOCKS, 4               ; Total blocks per disk
       .OFDEF  ONEDSK, D.DDB           ; DDB for one device.
       .OFDEF  ONEFLG, 4               ; Flag for one device.
       .OFDEF  FR.FLG, 4               ; Flags.                        [105]
               FR$S2X  =       1_0     ;  2.x System.                  [105]
               FR$FLD  =       1_1     ;  Folder device.               [105]
       .OFDEF  LABBUF, 26.             ; Label display buffer          [106]
       .OFSIZ  MEMSIZ                  ; End of impure area.

; Make sure 2.x assembler is used so DSKFRE Monitor call and offsets are found.
; FREE will still on AMOS 1.x, this program just needs to be assembled
; with the 2.x assembler or d/SOFT's MACRO.
;
       ASSEMB1 =       1
       ASSEMB2 =       2

       IF      EQ, ASSEMB1-ASSEMB2, ASMERP "?Must use 2.x Assembler"
;


;START OF CODE

START:  PHDR    -2,0,PH$REE!PH$REU      ;program header
       GETIMP  MEMSIZ,A5               ;allocate impure area
       BYP                             ; Bypass junk                   [105]
       CMPB    @A2, #'/                ; User wants help?              [105]
       JEQ     BADUSE                  ; Yes..help em.                 [105]
       CMPB    @A2, #'?                ; User wants help?              [105]
       JEQ     BADUSE                  ; Yes..help em.                 [105]
       CALL    HEADER                  ; Do header                     [105]

       CMPB    PH.VER+1, #2            ; Is this a 2.x system?         [105]
       BLO     10$                     ; No..do everything the old way.[105]
       OR      #FR$S2X, FR.FLG(A5)     ; Yes..set flag.                [105]

10$:    CLR     COUNT(A5)
       CLR     TFREE(A5)
       CLR     TCONTG(A5)
       CLR     BLOCKS(A5)
       CLR     ONEFLG(A5)
       LIN                             ; one or all devices ? ES
       JEQ     LOOP

ONEDEV: BYP                             ; find first non-blank character
       FSPEC   ONEDSK(A5)              ; Set up DDB area
       TST     D.FIL+ONEDSK(A5)        ; If file name is included,
       JNE     BADUSE                  ; reject request.
       JOBIDX                          ; Get current job
       TSTW    D.DEV+ONEDSK(A5)        ; Did user just use ":"
       BNE     10$                     ;  no...
       MOVW    JOBDEV(A6), D.DEV+ONEDSK(A5) ; yes..set default device.
10$:    TSTW    D.DRV+ONEDSK(A5)        ; Is device set?
       BPL     20$                     ; Yes..
       MOVW    JOBDRV(A6), D.DRV+ONEDSK(A5) ; No..set default.
20$:    MOV     #1,ONEFLG(A5)           ; and set a flag for single device
                                       ; search only
;SCAN DEVICE TABLE

LOOP:   MOV     DEVTBL,A4               ;point A4 to first DEVTBL entry
10$:    BITW    #DV$MNT,DV.FLG(A4)      ;is device mounted?
       BEQ     20$                     ; no

       TST     ONEFLG(A5)              ; are we scanning for only one device?
       BEQ     15$                     ; if not, report on all devices

       CMMW    DV.DEV(A4),ONEDSK+D.DEV(A5)     ; did we match device name ?
       BNE     20$                             ; no - keep scanning
       CMMW    DV.UNT(A4),ONEDSK+D.DRV(A5)     ; did we match drive # ?
       BNE     20$                             ; no - keep scanning
       CALL    DEVICE                          ; report on the device and
       BR      EXIT                            ; exit to amos

15$:
       BIT     #<FR$FLD>, FR.FLG(A5)   ; Done folder devices?          [105]
       BNE     18$                     ; Yes..bypass DEVTBL check.     [105]
       MOV     A4, D7                  ; Get DEVTBL address.           [105]
       CMP     D7, SYSBAS              ; Greater than System Base?     [105]
       BLO     18$                     ; No..never mind.               [105]
       CALL    TOTALS                  ; Yes..do totals for real disks.[105]
       OR      #FR$FLD, FR.FLG(A5)     ; Set must be at folders flag.  [105]
       CRLF                            ; Bump screen.                  [105]
       TYPECR  <Folder Devices:>       ; Tellem..                      [105]
       CALL    HEADER                  ; Redoe Header table            [105]

18$:    CALL    DEVICE                  ; process device specs

20$:    MOV     DV.NXT(A4),D0           ;get link to next device entry
       CTRLC   30$                     ;if early abort -- jump out
       BEQ     30$                     ;branch on zero (end of table)
       MOV     D0,A4                   ;set new address into A4
       BR      10$                     ;and continue processing
30$:    CALL    TOTALS

EXIT:   CRLF
       EXIT

PAGE

;PROCESS DEVICE
;
DEVICE: CALL    READ                    ;read bitmap
       CALL    SCAN                    ;calculate blocks free
10$:    CALL    DISPLY                  ;display stats
       RTN

PAGE
READ:
       MOVW    DV.DEV(A4),DISK+D.DEV(A5)
       MOVW    DV.UNT(A4),DISK+D.DRV(A5)
       INIT    DISK(A5)
       MOV     DISK+D.DVR(A5),A0
       MOV     24(A0),D5               ;D5 contains device size in blocks
       BIT     #FR$S2X, FR.FLG(A5)     ; Is this a 2.x system?         [105]
       BEQ     10$                     ; No..read old way.             [105]
       ORB     #D$ERC!D$BYP, D.FLG+DISK(A5) ; Set do not abort         [107]
       CLEAR   FR.TBL(A5), DF.SIZ-4    ; Preclear free table.          [107]
       DSKFRE  DISK(A5), FR.TBL(A5)    ; Yes..read new way.            [105]
       ANDB    #^C<D$ERC!D$BYP>, D.FLG+DISK(A5) ; Reset for errors     [107]
       BR      99$                     ; Then return                   [105]
10$:
       DSKBMR  DISK(A5)                ;read the bitmap
       MOV     DISK+D.ARG(A5),A3       ;point A3 to bitmap area
       BICW    #BM$LOK,-2(A3)          ;clear bitmap lock
99$:    RTN

PAGE
SCAN:
       BIT     #FR$S2X, FR.FLG(A5)     ; 2.x System?                   [105]
       BNE     60$                     ; Yes...already got all.        [105]
       MOV     #1,D0                   ;set bit mask
       CLR     FREE(A5)                ;clear free count
       CLR     TEMP(A5)                ;clear temporary contiguous count
       CLR     CONTIG(A5)              ;clear contiguous count
       MOV     #1,D1                   ;set previous bit
       MOV     D5,D2                   ;D2 is bit count
10$:    BITW    D0,@A3                  ;test bit
       BEQ     30$                     ; branch if zero
       TSTB    D1                      ;one: was previous bit a zero?
       BNE     20$                     ; no
       CMM     TEMP(A5),CONTIG(A5)     ;new contiguous count?
       BLOS    20$                     ; no
       MOV     TEMP(A5),CONTIG(A5)     ; yes
20$:    CLR     TEMP(A5)                ;clear temp contig count
       MOVB    #1,D1                   ;set previous bit
       BR      40$
30$:    INC     FREE(A5)                ;zero: increment free count
       INC     TEMP(A5)                ;increment contiguous count
       CLR     D1                      ;clear previous bit
40$:    DEC     D2                      ;decrement count
       BEQ     50$                     ;branch if done
       ROLW    D0,#1                   ;get next bit
       BCC     10$                     ;branch if okay
       ADD     #2,A3                   ;advance to next word
;       MOV     #1,D1                   ;reset start bit REMOVED 02/86 ENO 12/07/85 ENO
       BR      10$                     ;processs new word
50$:    TSTB    D1                      ;was previous bit a zero?
       BNE     60$                     ; no
       CMM     TEMP(A5),CONTIG(A5)     ;new contig count?
       BLOS    60$                     ; no
       MOV     TEMP(A5),CONTIG(A5)     ; yes
60$:    INC     COUNT(A5)
       ADD     D5,BLOCKS(A5)
       ADDM    FREE(A5),TFREE(A5)
       ADDM    CONTIG(A5),TCONTG(A5)
       RTN

PAGE
DISPLY:
       DEPACK  DV.DEV(A4)
       CLR     D1
       MOVW    DV.UNT(A4),D1
       DCVT    0,OT$TRM
       TYPE    :
       TAB

DS.SIZ: MOV     D5,D1
       TST     D1
       JEQ     NOREAD
       DCVT    6,OT$TRM!OT$ZER
       TYPE    < >

DS.FRE:
       MOV     FREE(A5),D1
       DCVT    7,OT$TRM!OT$ZER!OT$TSP
       MOV     D5,D0
       MUL     D1,#1000.               ; WAS 100. 02/86 ENO
       DIVIDE  D1,D0
       ADD     #5.,D1                  ; ADDED 02/86 ENO
       DIVIDE  D1,#10.                 ; ADDED 02/86 ENO
       PUSH    D1
       PRTTAB  -1,11.
       TYPE    (
       PRTTAB  -1,12.
       POP     D1
       DCVT    2,OT$TRM!OT$ZER
       PRTTAB  -1,11.
       TYPE    <%) >
       PRTTAB  -1,12.

DS.USE:
       MOV     D5,D1
       SUB     FREE(A5),D1
       DCVT    7,OT$TRM!OT$ZER!OT$TSP
       MOV     D5,D0
       MUL     D1,#1000.               ; WAS 100. 02/86 ENO
       DIVIDE  D1,D0
       ADD     #5.,D1                  ; ADDED 02/86 ENO
       DIVIDE  D1,#10.                 ; ADDED 02/86 ENO
       PUSH    D1
       PRTTAB  -1,11.
       TYPE    (
       PRTTAB  -1,12.
       POP     D1
       DCVT    2,OT$TRM!OT$ZER
       PRTTAB  -1,11.
       TYPE    <%) >
       PRTTAB  -1,12.

DS.CTG: MOV     CONTIG(A5),D1
       DCVT    7,OT$TRM!OT$ZER
       TYPE    < >

DS.LBL:
       CALL    CLRLAB
       CLRB    D.ERR+DISK(A5)
       CLR     DISK+D.REC(A5)
       READ    DISK(A5)
       MOV     DISK+D.BUF(A5),A0
       CMP     @A0, #^H0AAAA5555       ; Is device labeled?            [105]
       BEQ     5$                      ; Yes..show it.                 [105]
       PRTTAB  -1,11.                  ;                               [105]
       TYPE    <  --- Not Labeled ---  >;                              [105]
       PRTTAB  -1,12.                  ;                               [105]
       BR      25$                     ; Bypass label.                 [105]
5$:
       PUSH    A0
       ADD     #4,A0
       MOV     #24.,D0
       LEA     A6, LABBUF(A5)
10$:    MOVB    (A0)+,D1
       BEQ     20$
       MOVB    D1, (A6)+
       SOB     D0,10$

20$:    POP     A0
       TTYL    LABBUF(A5)
25$:    MOVB    LB.FLG(A0), D7
       ANDB    #LB$14D, D7
       BEQ     30$
       TYPE    <Ext>
30$:    CRLF
       RTN

CLRLAB:
       LEA     A6, LABBUF(A5)
       MOV     #23., D0
10$:    MOVB    #32., (A6)+
       SOB     D0, 10$
       CLRB    @A6
       RTN

PAGE
TOTALS:
       BIT     #<FR$FLD>, FR.FLG(A5)   ; Already done totals?          [105]
       BEQ     10$                     ; No..lets do em.               [105]
       RTN                             ; Yes..return to caller.        [105]
10$:
       MOV     BLOCKS(A5),D1
       TST     D1
       JEQ     NOREAD
       PUSH    D1
       PRTTAB  -1,11.                  ;                               [105]
       TYPE    <============================================================================>
       PRTTAB  -1,12.                  ;                               [105]
       CRLF
       POP     D1

TOTSIZ:
       TYPESP  Total
       DCVT    10,OT$TRM!OT$ZER
       TYPE    < >

TOTFRE:
       MOV     TFREE(A5),D1
       DCVT    7,OT$TRM!OT$ZER!OT$TSP
       MOV     BLOCKS(A5),D0
       DIVIDE  D0,#2000
       DIVIDE  D1,#2000
       MUL     D1,#1000.               ; [105]
       DIVIDE  D1,D0
       ADD     #5.,D1                  ; [105]
       DIVIDE  D1,#10.                 ; [105]
       PUSH    D1
       PRTTAB  -1,11.
       TYPE    (
       PRTTAB  -1,12.
       POP     D1
       DCVT    2,OT$TRM!OT$ZER
       PRTTAB  -1,11.
       TYPESP  %)
       PRTTAB  -1,12.

TOTUSE:
       MOV     BLOCKS(A5),D1
       SUB     TFREE(A5),D1
       DCVT    7,OT$TRM!OT$ZER!OT$TSP
       MOV     BLOCKS(A5),D0
       DIVIDE  D0,#2000
       DIVIDE  D1,#2000
       MUL     D1,#1000.               ; [105]
       DIVIDE  D1,D0
       ADD     #5.,D1                  ; [105]
       DIVIDE  D1,#10.                 ; [105]
       PUSH    D1
       PRTTAB  -1,11.
       TYPE    (
       PRTTAB  -1,12.
       POP     D1
       DCVT    2,OT$TRM!OT$ZER
       PRTTAB  -1,11.
       TYPECR  %)
       PRTTAB  -1,12.
       RTN

HEADER:
       TYPECR  <Device   Size       Free         In use     Contig  Label>
       PRTTAB  -1, 11.
       TYPE  <------  ------  ------------  ------------  ------  ------------------------>
       PRTTAB  -1, 12.
       CRLF
       RTN

BADUSE: CRLF
       TYPECR  Usage:
       TYPECR  <       FREE        - For all devices.>
       TYPECR  <       FREE :      - For current device.>
       TYPECR  <       FREE DEV#:  - For a single device.>
       EXIT
NOREAD: CRLF
       PRTTAB  -1,11.
       TYPE    <%>
       PRTTAB  -1,12.
       TYPE    <Device >
       OFILE   ONEDSK(A5),<OT$TRM!OT$OFD>
       TYPECR  < does not exist.>
       EXIT

       END