;***************************************************************************;
; ;
; UltraStat 3.x ;
; DEVICE STATUS SCREEN ;
; ;
;***************************************************************************;
;Copyright (C) 1988 UltraSoft Corporation. All Rights Reserved.
;
;Written by: David Pallmann
;
;All edit history for USTAT is in USYM.M68.
DEV.SCAN::
MOV DEVTBL,A0 ; point to base of job table
LEA DIB,DT.TBL(MEM)
MOVB JOB.ROW(MEM),ROW(MEM) ; set starting job row
CLRB JOB.UPDATE(MEM) ; clear new arrow row
CLRW DEV.COUNT(MEM) ;
;--- Update device blocks in use (and, blocks free)
DEV.INUSE:
CLR D0
TST DT.DVR(DIB) ; do we know address of driver?
BEQ 100$ ; no - forget about bitmap
BITW #DV$MNT,DT.NOT(DIB) ; is this device mounted?
BEQ 100$ ; no - forget about bitmap
MOV DT.MAX(DIB),D2 ; get #blocks into D2
CALL READ.BITMAP ; point A1 to bitmap
BNE 100$ ; failed
;[116] CLR D5 ; clear #blocks
;[116]10$: MOV #8.-1,D3
;[116] MOVB (A1)+,D1
;[116] MOV #1,D4
;[116]20$: MOVB D1,D7
;[116] ANDB D4,D7
;[116] BEQ 30$
;[116] INC D5 ; add 1 to count
;[116]30$: ASL D4 ; update bit to test
;[116] DEC D2
;[116] BEQ 40$
;[116] DBF D3,20$ ; loop
;[116] BR 10$
;[116]40$: MOV D5,D0
MOV INFO+DI.USE(MEM),D0 ; get blocks in use [116]
MOV D0,D5 ; [116]
;D0 now contains zero (non-disk or non-mounted device), or number of blocks
;in use
100$: BIT #DT$NEW,DT.FLG(DIB)
BNE 110$
CMP D0,DT.INU(DIB)
REQ
110$: MOV D0,DT.INU(DIB)
MOVB ROW(MEM),JOB.UPDATE(MEM)
CURSOR ROW(MEM),#17.
HIGH
MOV D0,D1
BNE 120$
TYPE < >
BR DEV.FREE
120$: DCVT 7,OT$TRM!OT$ZER
TST DT.MAX(DIB)
JEQ DEV.FREE
MOV DT.INU(DIB),D0
MUL D0,#100.
MOV DT.MAX(DIB),D2
DIV D0,D2
AND #177777,D0
TYPE < (>
MOV D0,D1
CMP D1,#100.
BNE 130$
CLR D1
TYPE 1
130$: DCVT 2,OT$TRM!OT$ZER
TYPESP %)
DEV.FREE:
CLR D0
TST DT.INU(DIB)
BEQ 10$
MOV DT.MAX(DIB),D0
SUB DT.INU(DIB),D0
10$: MOV D0,DT.FRE(DIB)
CURSOR ROW(MEM),#31.
HIGH
MOV D0,D1
BNE 20$
TYPE < >
RTN
20$: DCVT 7,OT$TRM!OT$ZER
TST DT.MAX(DIB)
REQ
MOV DT.FRE(DIB),D0
MUL D0,#100.
MOV DT.MAX(DIB),D2
DIV D0,D2
AND #177777,D0
TYPE < (>
MOV D0,D1
CMP D1,#100.
BNE 30$
CLR D1
TYPE 1
30$: DCVT 2,OT$TRM!OT$ZER
TYPESP %)
RTN
;RETURN BITMAP ADDR IN A1 FOR DEVICE @DCB
;determine if bitmap is paged or not. If it is paged, we must read the
;bitmap from disk to insure that we have the right one. If bitmap is not
;paged, we can speed things up tremendously by directly accessing the bitmap
;already in memory.
READ.BITMAP:
SAVE A0,A2-A5,D0-D5
;[116] MOV DV.BMP(DCB),D7 ; address bitmap DDB+flags+buffer [1.3]
;[116] BEQ 20$ ; no bitmap
;[116] MOV D7,A1
;[116] BITW #BM$PAG,D.DDB(A1) ; is bitmap paged? [1.3]
;[116] BNE 10$ ; yes, it is [1.3]
;[116] BITW #BM$VLD,D.DDB(A1) ; is bitmap valid for this device?
;[116] BEQ 10$ ; no
;[116] ADD #D.DDB+2,A1 ; no - point to in-memory bitmap
;[116] TST @A1 ; is first lword zeroed? [1.3]
;[116] BEQ 10$ ; yes - load bitmap to be sure [1.3]
;[116] REST A0,A2-A5,D0-D5
;[116] LCC #PS.Z
;[116] RTN ; return [1.3]
;[116] 10$:
MOVW DV.DEV(DCB),DISK+D.DEV(MEM)
MOVW DV.UNT(DCB),DISK+D.DRV(MEM)
CLR DISK+D.FIL(MEM)
CLRW DISK+D.EXT(MEM)
CLRW DISK+D.PPN(MEM)
MOV DT.DVR(DIB),DISK+D.DVR(MEM) ; DEBUG [116]
LEA A0,INFO(MEM) ; [116]
CLEAR @A0,DI.SIZ ; clear disk info area [118]
LEA A2,DISK(MEM) ; [116]
CALL DSKINF ; [116]
;[116] DSKBMR DISK(MEM) ; read bitmap from disk [1.3]
;[116] MOV DISK+D.ARG(MEM),A1 ; point A1 to bitmap area [1.3]
;[116] ANDW #^C<BM$LOK>,-2(A1) ; clear bitmap lock [1.3]
REST A0,A2-A5,D0-D5
LCC #PS.Z
RTN ; return [1.3]
20$: REST A0,A2-A5,D0-D5
LCC #0
RTN