; ; PROGRAM NAME : M A P . M A C ; DATE : APRIL 30, 1976 ; BY : JAMES STANFILL ; DEPT OF MEDICINE ; UNIVERSITY OF WASHINGTON ; SEATTLE, WASHINGTON ; ; MODIFIED BY: ED BOLSON (V002) ;+ ; THIS TASK WILL DEPICT DISK USAGE IN TERMS OF BLOCKS ALLOCATED. ; THE USER SPECIFIES THE OUTPUT, EITHER TI OR A DISK FILE. THE ; OUTPUT CONSISTS OF A MAP OF ALL LOGICAL BLOCKS OF THE DISK ; SPECIFIED. IF A SPECIFIC DISK BLOCK IS ALLOCATED, THE FIRST ; WORD OF THE FILE ID OF THE FILE UTILIZING THAT BLOCK IS ; STORED IN THE CORRESPONDING WORD; SUBSEQUENT CONTIGUOUS ; BLOCKS WILL CONTAIN " ---". IF A SPECIFIC BLOCK IS NOT ; ALLOCATED THE CORRESPONDING WORD IN THE MAP WILL CONTAIN ; " ...". THE USER CAN ALSO SPECIFY AN INDEX LISTING OF FILE ID ; AND FILE NAMES. ; ; THE TASK IS BUILT AS A IAS FUNCTION, USING THE FOLLOWING COMMANDS : ; ; LINK/OPT/MU MAP,USRLIB/LIBRARY ; ENTER OPTIONS : ; LINK>LIBR=SYSRES:RO ; LINK>STACK=100 ; LINK>TASK=$$$MAP ; LINK>/ ; ; THE FORMAT OF THE COMMAND STRING EXPECTED BY THE TASK IS AS FOLLOWS : ; ; IAS>MAP OR ; MAP>[OUTFILE[/SWS]=] DEVICE NAME[/SWS] ; ; [/SWS] CAN BE: ; /ID - IF PRESENT THE INDEX LISTING IS ALSO PRODUCED. ; /ST:N - IF PRESENT THE MAP WILL START AT BLOCK N (DECIMAL) ; AND END AT N+4800. ; IF NO INPUT DEVICE NAME IS PRESENT, A DISK USAGE MAP OF SY0 IS ; PRODUCED. ;- ; .TITLE MAP--DISK BLOCK USAGE .IDENT /V002/ ;+ ; VERSION 2 - ADD ALLOWANCE FOR DISKS WITH MORE THAN MAXSIZ (4800) ; BLOCKS ;- .MCALL DIR$,OPEN$W,OPEN$R,READ$,CLOSE$,WAIT$ .MCALL FSRSZ$,FDBDF$,FDAT$A,FDRC$A,FDBK$A .MCALL FDOP$A,FDBF$A,NMBLK$,HMBOF$ .MCALL CALL,RETURN,PUT$,ALUN$,QIOW$,EXIT$ .MCALL GCMLB$,GCMLD$,CSI$,CSI$1,CSI$2,GCML$ .MCALL CSI$SW,CSI$ND,FHDOF$,DEF$L,CSI$SV ; TTYLUN=2 TTYEFN=2 DK1LUN=1 DK1EFN=1 DK2LUN=3 DK2EFN=3 IDMSK=1 CR=15 FF=14 LF=12 SPC=40 DSW=0 ; MAXSIZ=4800. ; ; MAP:: DIR$ #ASGTTY ;ASSIGN LUN 2 TO TI 1$: GCML$ #GCLBLK ;GET COMMAND LINE BITB #GE.EOF, ; TYPED ? BEQ 2$ ;NO--CONTINUE JMP 30$ ;YES--EXIT 2$: CSI$1 #CSIBLK,, BCC 3$ ;SYNTAX OK ? CALL SYNERR ;NO--REPORT IT BR 1$ 3$: MOVB ,TEMP ;SAVE STATUS AT THIS POINT CSI$2 #CSIBLK,OUTPUT,#ASSWT ;PICK UP OUTPUT FILE BCC 4$ ;ERROR ? CALL SYNERR ;NO--REPORT ERROR BR 1$ 4$: BITB #CS.EQU,TEMP ;TWO FILES SPECIFIED ? BNE 45$ ;YES MOV #"TI, ;NO--DEFAULT LISTING TO TI CLR 45$: OPEN$W #FDB1 ;NO--CREATE OUTPUT FILE BCC 5$ ;ERROR ? CALL DSKOPN ;YES--REPORT ERROR JMP 30$ ;AND EXIT 5$: BITB #CS.EQU,TEMP ;TWO FILES ? BEQ 6$ ;NO--CONTINUE CSI$2 #CSIBLK,INPUT,#ASSWT ;YES--PICK UP DEVICE NAME BCC 6$ ;SYNTAX OK ? CALL SYNERR ;NO--REPORT ERROR BR 1$ 6$: TST CSIBLK+C.DEVD ; DID USER PICK DEVICE? BNE 62$ ; YES-INDEED MOV #DEFDSZ,R1 ; NOPE- USE DEFAULT MOV #DEFDEV,R0 BR 63$ 62$: MOV ,R1 ;PICK UP DEVICE NAME SIZE MOV ,R0 ;GET ADDR OF DEVICE NAME 63$: MOV R0, ;AND INSERT INTO DSPT MOV R1,DSPT2 MOV #DN1,R2 MOV #DN2,R3 7$: MOVB (R0),(R2)+ ;INSERT DEVICE NAME MOVB (R0)+,(R3)+ ;INTO HEADINGS SOB R1,7$ 8$: TST IDFLG ;CROSS-LISTING WANTED ? BEQ 9$ ;NO--CONTINUE PUT$ #FDB1,#HEAD1,#HSZE1 ;YES--WRITE HEADING TO FILE BCC 9$ ;ERROR ? CALL DSKWRT ;YES--INFORM USER 9$: OPEN$R #FDB2,,,#FD.RWM ;OPEN INDEX FILE BCC 10$ ;ERROR ? CALL DSKOPN ;YES--INFORM USER 10$: MOV #3, ;SET UP TO READ HOME BLOCK MOV #2, READ$ #FDB2,#WORKBU ;READ HOME BLOCK BCC 11$ ;ERROR ? CALL DSKRED ;YES--INFORM USER 11$: WAIT$ #FDB2 ;NO--CONTINUE MOV ,R0 ;GET INDEX BIT MAP SIZE ADD #3,R0 ;AND FIND VBN FOR INDEX FILE HEADER MOV R0, ;INSERT VBN INTO FDB INC R0 MOV R0, ;ADJUST EOF BLOCK MOV #BLKBUF,R4 ;SET PTR TO TABLE START CALL GETBLK ;FIND # BLOCKS IN INDEX FILE INC R2 MOV R2, ;AND SET EOF COUNT ;+ ; THIS SECTION WILL READ EACH HEADER BLOCK, DETERMINE WHERE ON THE ; DISK THE FILE IS ALLOCATED, AND STORE THE 1ST WORD OF THE FILE ID ; IN CORRESPONDING WORDS IN BLKBUF. ;- 12$: MOV #BLKBUF,R4 ;SET PTR TO TABLE START CALL GETBLK ;FIND WHERE BLOCKS ARE ALLOCATED BCC 12$ 13$: CLOSE$ #FDB2 ;CLOSE INDEX FILE ;+ ; THIS SECTION WILL DISPLAY DISK BLOCK USAGE. THE FIRST BLOCK OF ; A FILE WILL CONTAIN THE FILE ID (1ST WORD) IN THE CORRESPONDING ; WORD; SUBSEQUENT CONSECUTIVE WORDS WILL CONTAIN " ---". IF A ; SPECIFIC BLOCK IS NOT USED IT WILL CONTAIN " ...". ; REGISTER USAGE : ; R0 = COUNTER FOR # BLOCKS/RECORD = 16. ; R1 = COUNTER FOR MAX # BLOCKS ON DISK = 4800. ; R2 = PTR FOR TABLE CONTAINING FILE ID/LBN'S ; R3 = SCRATCH FOR BINOCT ; R4 = " " " ; R5 = RECORD POINTER ;- PUT$ #FDB1,#HEAD2,#HSZE2 ;WRITE HEADING TO FILE BCC 14$ ;ERROR ? CALL DSKWRT ;YES--INFORM USER 14$: CLR LBN ;START AT LBN = 0 CLR FILEID MOV #MAXSIZ,R1 MOV #BLKBUF,R2 15$: MOV #16.,R0 ;16 BLOCKS/RECORD MOV #RECBUF,R3 MOV #35.,R4 16$: MOV #" ,(R3)+ ;CLEAR RECORD BUFFER SOB R4,16$ MOV LBN,R3 ADD STRBLK,R3 MOV #TEMP,R4 CALL BINOCT ;CONVERT LBN TO OCTAL FOR DISPLAY ADD #16.,LBN MOV #5,R3 MOV #RECBUF,R5 ;SET TO RECORD BUFFER MOV #,R4 17$: CMPB #' ,(R4) ;DISPLAY 5 DIGITS FILLING BEQ 18$ ;IN SPACES WITH ZEROES MOVB (R4),(R5)+ BR 19$ 18$: MOVB #'0,(R5)+ 19$: TSTB (R4)+ ;BUMP POINTER SOB R3,17$ MOV #LBNASC,R5 20$: TST (R2) ;BLOCK USED ? BNE 21$ ;YES MOV #" .,(R5)+ ;NO--INSERT " ..." MOV #"..,(R5)+ CLR FILEID BR 23$ 21$: CMP (R2),FILEID ;SAME FILE AS LAST BLOCK ? BEQ 22$ ;YES MOV (R2),R3 ;NO--PICK UP FILE ID MOV #TEMP,R4 CALL BINOCT ;AND CONVERT TO ASCII MOV ,(R5)+ MOV ,(R5)+ ;INSERT LAST 4 DIGITS INTO RECORD MOV (R2),FILEID ;BUFFER AND RE-SET FILE ID BR 23$ 22$: MOV #" -,(R5)+ ;SAME FILE AS LAST BLOCK SO MOV #"--,(R5)+ ;INSERT " ---" 23$: TST (R2)+ ;BUMP POINTER DEC R1 ;MORE BLOCKS LEFT ? BEQ 24$ ;NO--WE'RE DONE !!! SOB R0,20$ ;END OF THIS RECORD ? 24$: PUT$ #FDB1,#RECBUF,#70. ;YES--WRITE IT OUT BCC 25$ ;ERROR ? CALL DSKWRT ;YES--INFORM USER 25$: TST R1 ;MORE BLOCKS ? BGT 15$ ;YES CLOSE$ #FDB1 ;NO--CLOSE LIST FILE 30$: DIR$ #FIN DIR$ #EXIT ; SYNERR: DIR$ #ERR1 RETURN ; ASGTTY: ALUN$ TTYLUN,TI,0 EXIT: EXIT$ ERR1: QIOW$ IO.WLB,TTYLUN,TTYEFN,,,, FIN: QIOW$ IO.WLB,TTYLUN,TTYEFN,,,, ;+ ; THIS SUBROUTINE WILL DETERMINE THE NUMBER OF BLOCKS ALLOCATED ; BY A SPECIFIC FILE. UPON ENTRY THE VBN MUST BE SET (FDB2+F.BKVB+2) ; FOR THE FILE HEADER BLOCK WITHIN THE INDEX FILE. ; VBN = 1ST WORD OF FILE ID + N ; R4 = START OF BLOCK USAGE TABLE ; R2 = NUMBER OF BLOCKS ALLOCATED ;- GETBLK: MOV R0,-(SP) CLR R2 ;ZERO BLOCK COUNTER READ$ #FDB2,#WORKBU ;READ FILE HEADER BCC 1$ ;ERROR? CMPB #IE.EOF,F.ERR(R0) ;MAYBE--EOF ? BEQ 5$ ;NO--WE'RE DONE ! CALL DSKRED ;YES--INFORM USER BR 5$ ;AND EXIT 1$: WAIT$ #FDB2 ;NO--CONTINUE MOV #WORKBU,R0 TST H.FNUM(R0) ;BLOCK DESCRIBE AN ACTIVE FILE ? BEQ 4$ ;NO CMP #027027,(R0) ;BLOCK ACTUALLY A HEADER ? BNE 4$ ;NO--EXIT MOV H.FNUM(R0),FILEID ;YES--PICK UP FILE ID MOVB 1(R0),R1 ;GET MAP AREA OFFSET ASL R1 ;AND CONVERT TO A BYTE OFFSET ADD R1,R0 ;ADJUST POINTER TO MAP AREA MOVB M.USE(R0),R1 ;GET # WORDS OF RETRIEVAL PTRS ASR R1 ;EACH PTR CONSISTS OF 2 WORDS BLE 34$ ;0 BLOCKS ALLOCATED--EXIT!! ADD #M.RTRV,R0 ;MOVE TO START OF RETRIEVAL PTRS 2$: MOVB 1(R0),R3 ;GET BLOCK COUNT-1 BIC #177400,R3 ;CLEAR UPPER BYTE (SBE) INC R3 ADD R3,R2 ;ADD # BLKS TO TOTAL TST (R0)+ ;MOVE TO LOW LBN MOV (R0)+,R5 ;GET LBN & CONVERT SUB STRBLK,R5 ; BY OFFSET FOR START ASL R5 ;TO BYTE OFFSET ADD R4,R5 ;INDEX TO TABLE ENTRY 3$: CMP R5,#BLKEND ; OUT OF RANGE WE'RE INT'D IN BGE 33$ ; YES - QUIT THIS PTR CMP R5,R4 BGE 31$ ; IN RANGE ADD #2,R5 ; TRY AGAIN BR 32$ 31$: MOV FILEID,(R5)+ ;STORE FILE ID IN TABLE 32$: SOB R3,3$ ;MORE BLOCKS ? 33$: SOB R1,2$ ;NO--MORE RETRIEVAL PTRS ? 34$: TST IDFLG ;CROSS REFERENCE WANTED ? BEQ 4$ ;NO--CONTINUE CALL OUTFN ;YES--WRITE THE RECORD 4$: CCC BR 6$ 5$: CCC SEC 6$: MOV (SP)+,R0 RETURN ;+ ; THIS SUBROUTINE WILL FORM THE CROSS REFERENCE OF FILE ID AND ; FILE NAME. ;- OUTFN: MOV R2,-(SP) MOV ,R3 MOV #FID1,R4 CALL BINOCT ;CONVERT 1ST WORD OF FILE ID MOV ,R3 MOV #BUFADR,R4 CALL BINOCT ;CONVERT 2ND WORD OF FILE ID MOV #BUFADR,R1 MOV #6,R5 MOV #FID2,R2 CALL XFR ;REMOVE "SPACES" IN RECORD MOV #FN,R5 MOV #BUFADR,R2 MOV #8.,R1 1$: MOV #" ,(R5)+ ;INITIALIZE WORK AREA AND CLR (R2)+ ;AND REST OF RECORD BUFFER SOB R1,1$ MOV #WORKBU,R0 MOVB (R0),R1 ;PICK UP OFFSET TO ID AREA ASL R1 ;AND CONVERT TO A BYTE OFFSET ADD R1,R0 ;SET PTR TO ID AREA MOV R0,TEMP ;AND SAVE ADD #I.FNAM,R0 ;SET PTR TO FILE NAME MOV #BUFADR,R1 MOV #9.,R5 CALL RADASC ;CONVERT FILENAME TO ASCII MOV #FN,R2 MOV #9.,R5 CALL XFR ;X-FER TO RECORD BUFFER MOVB #'.,(R2)+ MOV TEMP,R0 ADD #I.FTYP,R0 ;SET PTR TO EXTENSION CLR BUFADR CLR BUFADR+2 MOV #BUFADR,R1 MOV #3,R5 CALL RADASC ;CONVERT EXTENSION TO ASCII MOV #3.,R5 CALL XFR ;X-FER TO RECORD BUFFER MOVB #';,(R2)+ MOV TEMP,R0 ADD #I.FVER,R0 ;SET PTR TO VERSION # MOV (R0),R3 MOV #BUFADR,R4 CALL BINASC ;CONVERT VERSION # TO ASCII MOV #6,R5 MOV #BUFADR,R1 CALL XFR ;X-FER TO RECORD BUFFER PUT$ #FDB1,#CRSLST,#CRSSZ ;WRITE THE RECORD BCC 2$ ;ERROR ? CALL DSKWRT ;YES--INFORM USER 2$: MOV (SP)+,R2 RETURN ;+ ; THIS SUBROUTINE WILL X-FER AN ASCII STRING (A NUMBER) FROM ONE ; LOCATION TO ANOTHER IGNORING THE "SPACES". ;- XFR: CMPB #' ,(R1) ;CHARACTER A SPACE ? BEQ 1$ ;YES--IGNORE IT MOVB (R1),(R2)+ ;NO--X-FER IT 1$: TSTB (R1)+ ;BUMP POINTER SOB R5,XFR ;MORE CHARACTERS ? RETURN ;NO ;+ .NLIST BIN CRSLST: .ASCII %FILE ID% .EVEN FID1: .BLKW 3 .ASCII %,% .EVEN FID2: .ASCII % % FN: .BLKW 8. CRSSZ=.-CRSLST ; HEAD1: .BYTE CR,LF,LF .ASCII %INDEX OF LISTING ON % .EVEN DN1: .ASCII %SY0:% .BYTE CR,LF HSZE1=.-HEAD1 .EVEN ; ; HEAD2: .BYTE FF,CR,LF .ASCII %CORE USAGE ON % .EVEN DN2: .ASCII %SY0:% .BYTE CR,LF HSZE2=.-HEAD2 .EVEN ; ; FBUF: .BYTE CR,LF .ASCII /[EXIT]/ .BYTE CR,LF FSZE=.-FBUF .EVEN ; EBUF1: .BYTE CR,LF .ASCII /***SYNTAX ERROR---TRY AGAIN***/ ESZE1=.-EBUF1 .EVEN ; .LIST BIN ;+ ; DISK ERROR ROUTINE ;- ; DSKOPN: MOV #"OP,DTYP MOV #"EN, BR CON1 DSKRED: MOV #"RE,DTYP MOV #"AD, BR CON1 DSKWRT: MOV #"WR,DTYP MOV #"TE, CON1: MOVB F.ERR(R0),R3 ;PICK UP ERROR BYTE BMI 1$ CLR R3 1$: NEG R3 ;TAKE 2'COMPLEMENT MOV #DNUM,R5 CLR R2 DIV #12,R2 SWAB R3 ADD R2,R3 ADD #30060,R3 MOV R3,(R5) DIR$ #ERRDPB ;WRITE OUT ERROR MESSAGE ERRRET: RETURN ; ; ERRDPB: QIOW$ IO.WLB,TTYLUN,TTYEFN,,,, ; ; .NLIST BIN DERR: .BYTE CR,LF,LF .ASCII /***DISK / .EVEN DTYP: .BYTE SPC,SPC,SPC,SPC .ASCII / ERROR -/ DNUM: .BYTE SP,SP .ASCII /***/ .BYTE CR,LF,LF DERSZE=.-DERR .EVEN .LIST BIN ;+ ; ALLOCATE AND INITIALIZE GCML CONTROL BLOCK ;- GCLBLK: GCMLB$ ,MAP,BUFADR,TTYLUN GCMLD$ DEF$L ;DEFINE GCML CONTROL BLOCK OFFSETS & BIT VALUES CSI$ ;DEFINE CSI CONTROL BLK OFFSETS & BIT VALUES .EVEN CSIBLK: .BLKB C.SIZE ;ALLOCATE STORAGE ; ASSWT: CSI$SW ID,IDMSK,IDFLG,SET,NEG CSI$SW ST,IDMSK*2,,,,STVAL CSI$ND ; STVAL: CSI$SV DECIMAL,STRBLK,2 CSI$ND ; BUFADR: .BLKW 41. IDFLG: .WORD 0 ; ;+ ; THIS SECTION CONTAINS THE FILE DESCRIPTOR BLOCKS AND ; ASSOCIATED INFORMATION. ;- ; FSRSZ$ 1 ;ONE RECORD CONTROLLED FILE FHDOF$ DEF$L ;DEFINE INDEX FILE OFFSETS HMBOF$ DEF$L ;DEFINE HOME BLOCK OFFSETS ; ; ; FDB FOR LIST FILE ; FDB1: FDBDF$ FDAT$A R.VAR,FD.CR, FDRC$A FD.PLC FDOP$A DK1LUN,,DFFNB1 FDBF$A DK1EFN ; DFFNB1: NMBLK$ ,,0,SY,0 ; ;+ ; FDB FOR INDEX FILE ;- FDB2:: FDBDF$ FDAT$A R.FIX,,1000 FDRC$A FD.RWM!FD.RAN!FD.PLC FDBK$A BLKBUF,1000,,DK2EFN FDOP$A DK2LUN,DSPT2,DFFNB2 FDBF$A DK2EFN ; DFFNB2: NMBLK$ ,,0,SY,0 ; BKST1: .BLKW 2 BKST2: .BLKW 2 ; DSPT2: .WORD .WORD .WORD UICSZ .WORD UIC .WORD SSZE2 .WORD STR2 ; .NLIST BIN DEFDEV: .ASCII /SY0:/ DEFDSZ=.-DEFDEV ; STR2: .ASCII /INDEXF.SYS;1/ SSZE2=.-STR2 .EVEN ; UIC: .ASCII /[0,0]/ UICSZ=.-UIC .EVEN .LIST BIN ; ;+ ; THIS SECTION CONTAINS THE BLOCK BUFFERS AND WORK BUFFERS ;- ; BLKBUF: .BLKW MAXSIZ BLKEND=. WORKBU: .BLKW 256. ; STRBLK: .WORD 0. ; STARTING BLOCK # ; LBN: .BLKW 1 TEMP: .BLKW 3 FILEID: .BLKW 1 ; RECBUF: .BLKB 6 LBNASC: .BLKB 64. ; .END MAP