;***************************************************************************;
; ;
; 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.
ASMMSG "== UltraStat 3.x (DEVICE) =="
AUTOEXTERN
;--- Include files
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
COPY DSKINF.CPY
COPY USYM/L
;--- Device Scanning Loop
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) ;
DEV.BYPASS:
MOVWL JOB.OFFSET(MEM),D0
BEQ DEV.LOOP
10$: TST DV.NXT(A0)
JEQ SNOOZE
MOV DV.NXT(A0),A0
ADD #DT.SIZ,DIB
INCW DEV.COUNT(MEM) ;
SOB D0,10$
DEV.LOOP:
KEY GET.COMMAND
BIT #F$UPDATE,FLAGS(MEM)
BEQ 10$
OR #DT$NEW,DT.FLG(DIB)
10$: MOV A0,DCB
;--- Handle a device
UPDATE.DEVICE:
CALL DEV.NAME
KEY 10$
CALL DEV.SIZE
KEY 10$
CALL DEV.INUSE
KEY 10$
CALL DEV.NOTES
AND #^C
,DT.FLG(DIB)
10$: CALL ARROW
DEV.NEXT::
INCW DEV.COUNT(MEM) ;
TST DV.NXT(A0)
JEQ SNOOZE
ADD #DT.SIZ,DIB
MOV DV.NXT(A0),A0
INCB ROW(MEM) ; increment display row
CMMB ROW(MEM),LAST.ROW(MEM) ; end of page?
JLOS DEV.LOOP ; no - on to next device
JMP SNOOZE
;--- Update device name (three letter code and unit)
DEV.NAME:
MOVW DV.DEV(DCB),D0
MOVW DV.UNT(DCB),D2
BIT #DT$NEW,DT.FLG(DIB)
BNE 10$
CMPW D0,DT.DEV(DIB)
BNE 10$
CMPW D2,DT.DRV(DIB)
REQ
10$: MOVW D0,DT.DEV(DIB)
MOVW D2,DT.DRV(DIB)
MOVW DV.FLG(DCB),DT.NOT(DIB)
CURSOR ROW(MEM),#2
HIGH
OUTDEV DT.DEV(DIB)
MOVWL D2,D1
DCVT 0,OT$TRM
TYPESP :
MOVB ROW(MEM),JOB.UPDATE(MEM)
CALL LOCATE.DRIVER
RTN
LOCATE.DRIVER:
CLR DT.DVR(DIB)
CMPW DT.DEV(DIB),#[DSK]
BEQ 10$
MOVW DT.DEV(DIB),TEMP(MEM)
CLRW TEMP+2(MEM)
MOVW #[DVR],TEMP+4(MEM)
SRCH TEMP(MEM),A6
BEQ 20$
RTN
10$: MOV ZSYDSK,A6
20$: MOV A6,DT.DVR(DIB)
RTN
;--- Update device size
DEV.SIZE:
CLR D0
BITW #DV$MNT,DT.NOT(DIB)
BEQ 10$
MOV DT.DVR(DIB),D6
BEQ 10$
MOV D6,A6
MOV DD.DSZ(A6),D0
10$: BIT #DT$NEW,DT.FLG(DIB)
BNE 20$
CMP D0,DT.MAX(DIB)
REQ
20$: MOV D0,DT.MAX(DIB)
CURSOR ROW(MEM),#9.
HIGH
MOV D0,D1
BEQ 30$
DCVT 7,OT$TRM!OT$ZER
BR 40$
30$: TYPE < >
40$: MOVB ROW(MEM),JOB.UPDATE(MEM)
RTN
;--- 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,-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
;--- Update device notes
DEFINE OUT1 FLAG,TEXT
BITW #FLAG,DT.NOT(DIB)
BEQ 1$$
TYPESP TEXT
1$$:
ENDM
DEV.NOTES:
MOVWL DV.FLG(DCB),D0
AND #DV$MNT!DV$LOG!DV$14D!DV$NAC!DV$ASN!DV$SHR,D0
BIT #DT$NEW,DT.FLG(DIB)
BNE 10$
CMPW D0,DT.NOT(DIB)
REQ
10$: MOVW D0,DT.NOT(DIB)
HIGH
CURSOR ROW(MEM),#46.
CLREOL
OUT1 DV$SHR,sharable
OUT1 DV$ASN,assigned to
BITW #DV$ASN,DT.NOT(DIB)
BEQ 20$
MOV DV.JCB(DCB),A6
OUTNAM JOBNAM(A6)
20$: OUT1 DV$MNT,mounted
;; OUT1 DV$LOG,logical
OUT1 DV$14D,extended
OUT1 DV$NAC,private
MOVB ROW(MEM),JOB.UPDATE(MEM)
CALL DISK.LABEL
RTN
;--- output disk label if (a) in wide mode, (b) device mounted, and (c)
; driver located.
DISK.LABEL:
BIT #F$WIDE,FLAGS(MEM)
REQ
BITW #DV$MNT,DT.NOT(DIB)
REQ
TST DT.DVR(DIB)
REQ
MOVW DT.DEV(DIB),DISK+D.DEV(MEM)
MOVW DT.DRV(DIB),DISK+D.DRV(MEM)
MOV DT.DVR(DIB),DISK+D.DVR(MEM)
CLR DISK+D.REC(MEM)
READ DISK(MEM)
MOV DISK+D.BUF(MEM),A2
CURSOR ROW(MEM),#78.
HIGH
CMPW LB.HDR(A2),#125252 ; labelled?
BNE 10$ ; no
CMPW LB.HDR+2(A2),#52525 ; labelled?
BNE 10$ ; no
TTYL LB.VLN(A2) ; output volume name
TSTB LB.VID(A2) ; is there an Id?
BEQ 10$ ; no - skip the parentheses
TYPE < (>
TTYL LB.VID(A2) ; volume Id
TYPE )
10$: CLREOL
RTN
END
.