Trailing-Edge
-
PDP-10 Archives
-
SRI_NIC_PERM_SRC_1_19910112
-
5-galaxy/mtrddb.mac
There are 8 other files named mtrddb.mac in the archive. Click here to see a list.
TITLE MTRDDB - Device Data Base for MOUNTR
SUBTTL Preliminaries
;
;
; COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION
; 1984
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE
; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS
; SOFTWARE OR ANY OTHER COPIES THEREOF MAY NOT BE PROVIDED OR
; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO
; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE
; WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT
; BY DIGITAL EQUIPMENT CORPORATION.
;
; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY
; DIGITAL.
SUBTTL Required files
SEARCH MTRMAC
SEARCH MONSYM
SEARCH MACSYM
.REQUIRE SYS:MACREL
SALL ;Want clean listings
SUBTTL Version Information
DDBMAN==:0 ;Maintenance edit number
DDBDEV==:6 ;Development edit number
VERSIN (DDB) ;Generate edit number
IF2,<
PRINTX [Assembling MTRDDB]
> ;End IF2
SUBTTL Table of Contents
; Table of Contents for MTRDDB
;
;
; Section Page
; 1. Preliminaries. . . . . . . . . . . . . . . . . . . . . 1
; 2. Required files . . . . . . . . . . . . . . . . . . . . 2
; 3. Version Information. . . . . . . . . . . . . . . . . . 3
; 4. Table of Contents. . . . . . . . . . . . . . . . . . . 4
; 5. Revision History . . . . . . . . . . . . . . . . . . . 5
; 6. External Symbols . . . . . . . . . . . . . . . . . . . 6
; 7. Modifyable data area . . . . . . . . . . . . . . . . . 7
; 8. Initialize
; 8.1. DSFINI - setup device status file . . . . . . 8
; 8.2. DSFISQ - garbage collect. . . . . . . . . . . 9
; 8.3. DSFIRS - Reset device file. . . . . . . . . . 10
; 9. Global routines
; 9.1. DSFCRE - Create an entry. . . . . . . . . . . 11
; 9.2. DSFGET - Get an entry . . . . . . . . . . . . 12
; 9.3. DSFUDE - Update an entry. . . . . . . . . . . 13
; 9.4. DSFGNX - Get next entry of specified type . . 14
; 9.5. DSFDLE - Delete entry and put on free list. . 15
; 9.6. DSFNUP - Set No UPdate of DDB . . . . . . . . 16
; 9.7. DSFYUP - Set Yes UPdate of DDB. . . . . . . . 16
; 10. Utility routines
; 10.1. CHKPTR - Check pointer for validity . . . . . 17
; 10.2. DSFLOC - locate entry for specified device. . 18
; 10.3. DSFUPD - update device file . . . . . . . . . 19
; 10.4. DSFCKS - Compute checksum of dev. file. . . . 20
; 10.5. DSFGTF - Get a free entry . . . . . . . . . . 21
SUBTTL Revision History
COMMENT \
***** Release 5.0 -- Begin Development edits *****
1 5.1068 9-Dec-83
Create Disk DataBase module from already existing routines
in MOUNTR.
2 5.1077 4-Feb-84
Lots of changes:
1. Remove most of the library searches
2. Simplify the initialization code
3. Create a reasonable set of routines to manage the disk data base:
DSFCRE - Create an entry
DSFGET - Get an entry
DSFUDE - Update an entry
DSFGNX - Get next entry of a given type
DSFDLE - Delete entry and put on free list
DSFNUP - Set no update of DDB
DSFYUP - Set Yes Update of DDB
3 5.1083 6-Feb-84
Add skip return on success in DSFDLE.
4 5.1089 11-Feb-84
Base the checksum on the device status file version number, not
on the edit version number. Also, check for correct device status file
version number before checksum so the error message may be a little more
meaningful. Fix compare bug to compare with memory @DSFIS1+2. Finally,
have CHKPTR also check to see if entry is unused as part of its check.
DSFGNX now calls that so next entry is always legit.
5 5.1157 6-Sept-84
In routine DSFIS3, save the address of the last valid entry in the DDB
in DSB.NE.
6 5.1158 6-Sept-84
In routine DSFDLE:, write DSBUF out to disk after deleting a structure
entry from the DDB.
\ ;End of Revision History
SUBTTL External Symbols
EXTERNAL LVERS ;Version number used to calc checksum
EXTERNAL STOP,STOPNW ;Stop routines
EXTERNAL BTWTO,TMCT0 ;Operator message routines
SUBTTL Modifyable data area
DSFJFN: BLOCK 1 ;DISK-STATUS FILE JFN
DSFE:: BLOCK DSFESZ ;CURRENT DEVICE-STATUS FILE ENTRY
DSFREE: BLOCK 1 ;Address of first in free list
; 0 if no free list
DSFEND: BLOCK 1 ;Address of next available entry (at end)
DSFUPF: BLOCK 1 ;Update flag for DDB to disk
; 0 if update DDB
; -1 if no update DDB
SUBTTL Initialize -- DSFINI - setup device status file
; DSFINI - MAPS DEVICE-STATUS FILE INTO DSBUF
; RETURNS +1: ALWAYS
DSFINI:: MOVX T1,GJ%SHT+GJ%ACC ;FLAGS
HRROI T2,[ASCIZ/SYSTEM:DEVICE-STATUS.BIN/] ;FILESPEC
GTJFN ;GET JFN ON DEVICE-STATUS FILE
ERCAL STOP ;Shouldn't happen!
MOVEM T1,DSFJFN ;SAVE JFN (just for grins)
MOVX T2,OF%RD+OF%WR+OF%DUD ;FLAGS FOR OPENF
OPENF ;Try to open
ERCAL STOP ;Shouldn't happen!
HRLZ T1,DSFJFN ;GET JFN ,, FILE PAGE #
MOVE T2,[.FHSLF,,DSBUF_-9] ;FORK HANDLE ,, FORK PAGE #
MOVE T3,[PM%CNT+PM%RWX+PM%PLD+DSFPGS] ;FLAGS,,#PAGES
PMAP ;MAP THE FILE IN
ERCAL STOP ;Shouldn't happen!
; Check for proper checksum and CPU serial number. If bad, go reset DDB
CALL DSFCKS ;COMPUTE CHECKSUM
MOVE T2,T1 ;Save the checksum for a minute
MOVEI T1,.APRID
GETAB ;GET APR SERIAL #
JFCL ;SHOULD NEVER FAIL
CAME T1,DSB.PS ;Same cpu?
JRST [TMCT <%IChanged CPU>
JRST DSFIN3] ;No
MOVE T3,DSB.VE ;Get the version for the device data base
CAIE T3,DSBVER ;Is it the current?
JRST [TMCT <%IIncorrect file format version>
JRST DSFIN3] ;No
CAME T2,DSB.CK ;Correct checksum?
JRST [TMCT <%IIncorrect Checksum>
JRST DSFIN3] ;No
CALL DSFISQ ;If no problem, then setup ptrs. etc.
RET ;Normal return
DSFIN3: CALL DSFIRS ;Reset the file
TMCT <%_SYSTEM:DEVICE-STATUS.BIN file will be reset>
MOVEI T3,[ASCIZ/Device status file initialization error/]
CALL BTWTO ;Send it off
RET
SUBTTL Initialize -- DSFISQ - garbage collect
; This routine wants to garbage collect and delete any free entries
; then set up a couple of locations referencing DDB.
; For this loop:
; T1/ Address of currently examined entry
; T2/ work
; T3/ Address of first free entry
; T4/ Number of entries left to peruse
DSFISQ: SKIPN T4,DSB.NE ;Get # of entries to check
JRST DSFIS4 ;No entries??? should not happen
SETZM DSB.NE ;No entries
MOVEI T1,DSB.EO ;Get start of first entry
MOVE T3,T1 ;Current entry is first possible free
DSFIS1: SETZM DSFPNT(T1) ;Clear the pointer field since it can't work
MOVE T2,DSFSPC(T1) ;Get the spec field
CAMN T2,[-1] ;Is it free?
JRST DSFIS3 ;Yes, go get next entry
; Here to move entry if needed
CAMN T3,T1 ;Is it the current entry and no need to move?
JRST [ADDI T3,DSFESZ ;Yes, just add to the first free entry
JRST DSFIS2] ; and go get next entry
; Need to move entry to squeeze. T1 is the source, T3 is the destination.
MOVE T2,T3 ;Get destination
HRL T2,T1 ;Get source
ADDI T3,DSFESZ-1 ;Final destination
BLT T2,(T3) ;Move the entry
ADDI T3,1 ;Finish updating to the next free entry
DSFIS2: AOS DSB.NE ;Say we have another entry
; Here to get next entry
DSFIS3: ADDI T1,DSFESZ ;Point to the next entry
SOJG T4,DSFIS1 ;If more, go look at it
SETZM DSFREE ;No free entries
MOVEM T3,DSFEND ;Save next entry as the next free
CALL DSFUPD ;Since we did all this work, update file
DSFIS4: RET
SUBTTL Initialize -- DSFIRS - Reset device file
; RESET CONTENTS OF DEVICE-STATUS FILE (T1/ APR SERIAL #)
; Might want to send notification of resetting of device file!
DSFIRS: SETZM DSBUF
MOVE T2,[DSBUF,,DSBUF+1] ;GET BLT POINTER
BLT T2,DSBUF+DSFSZ-1 ;CLEAR REMAINDER OF BUFFER
MOVEM T1,DSB.PS ;STORE APR SERIAL #
MOVEI T1,DSBVER ;Get file version number
MOVEM T1,DSB.VE ;Save it
;No need to update pages!
; o Will happen anyway on first entry
; o If we die, the old file is as good
; CALL DSFUPD
SETZM DSFREE ;No free entries
MOVEI T1,DSB.EO ;Get beginning of entries
MOVEM T1,DSFEND ;Save it as the end
RET ;ALL DONE
SUBTTL Global routines -- DSFCRE - Create an entry
; Create an entry based on DSFE.
; RETURNS: T1 / pointer to entry
; +1 if entry already exists
; +2 if entry created
DSFCRE:: CALL DSFLOC ;First try to see if entry exists
SKIPA ;Want a bad return (doesn't exist)
RET ;oops. can't create that which exists
CALL DSFGTF ;Get a free entry
MOVE T3,T1 ;Copy destination to set up blt
HRLI T3,DSFE ;Set up source
BLT T3,DSFESZ-1(T1) ;Copy the entry
CALL DSFUPD ;Back it up on disk
RETSKP ;And done
SUBTTL Global routines -- DSFGET - Get an entry
; Get an entry T1 / pointer to entry
; DSFE with type and specification word
; would eventually like to drop this part of validation
; RETURNS: +1 if pointer is invalid
; +2 if entry found
; DSFE contains entry
DSFGET:: CALL CHKPTR ;First check the pointer
RET ;Bad news
MOVEI T2,DSFE ;Get destination
MOVE T3,T2 ;Copy destination to set up blt
HRL T3,T1 ;Set up source
BLT T3,DSFESZ-1(T2) ;Copy the entry
RETSKP ;Return it all to the user
SUBTTL Global routines -- DSFUDE - Update an entry
; Update an entry.
; T1 / pointer to entry
; DSFE / contains new entry
; RETURNS: +1 if entry not undated (bad pointer or data)
; +2 if entry updated
; T1 / pointer to entry (may be updated!)
DSFUDE:: CALL CHKPTR ;Check the pointer
RET ;Bad pointer
MOVE T2,DSFE+DSFSPC ;Get spec word
CAME T2,DSFSPC(T1) ;Are they at least the same?
RET ;No, bad update!
MOVE T3,T1 ;Copy destination to set up blt
HRLI T3,DSFE ;Set up source
BLT T3,DSFESZ-1(T1) ;Copy the entry
CALL DSFUPD ;Update things
RETSKP
SUBTTL Global routines -- DSFGNX - Get next entry of specified type
; This routine finds the next entry of the type specified in DSFE
; T1 / pointer to current (find the next)
; or 0 if want first
; DSFE+DSFTYP / Type of entry
; RETURNS: +1 if no more entries
; +2 if next entry found
; T1 / pointer to next entry
; DSFE / entry
DSFGNX:: MOVE T4,DSFE+DSFTYP ;Get the type
SKIPG T1 ;Initial run?
JRST [MOVEI T1,DSB.EO ;Yes
JRST DSFGN1] ;Go to loop
DSFGN0: ADDI T1,DSFESZ ;Add to get to next entry
DSFGN1: CAML T1,DSFEND ;At the end?
RET ;Yes, with no entry found
CALL CHKPTR ;Go check the current pointer
JRST DSFGN0 ;No good, probably free entry, another.
CAME T4,DSFTYP(T1) ;Correct type?
JRST DSFGN0 ;No, go try another
; Found a live one.
MOVEI T2,DSFE ;Get destination
MOVE T3,T2 ;Copy destination to set up blt
HRL T3,T1 ;Set up source
BLT T3,DSFESZ-1(T2) ;Copy the entry
RETSKP ;And done
SUBTTL Global routines -- DSFDLE - Delete entry and put on free list
; This routine takes entry and puts it on free list
; T1 / pointer
; RETURNS: +1 always
DSFDLE:: CALL CHKPTR ;Check the pointer
RET ;Bad pointer, nothing to delete
SETOM DSFSPC(T1) ;Say no good in entry
MOVE T2,DSFREE ;Get the free list header
MOVEM T2,DSFTYP(T1) ;Save pointer
MOVEM T1,DSFREE ;Update header
CALL DSFUPD ;Update file
RETSKP ;And done
SUBTTL Global routines -- DSFNUP - Set No UPdate of DDB
; This routine simply sets no update of the DDB. For performance.
; Returns: +1 always
DSFNUP:: AOS DSFUPF ;Set no update of file
RET ;And return
SUBTTL Global routines -- DSFYUP - Set Yes UPdate of DDB
; This routine sets update to occur and does an update for good measure
; Returns: +1 always
DSFYUP:: SOSG DSFUPF ;One less NO, update file?
CALL DSFUPD ;Yes, update the file
RET ;And return
SUBTTL Utility routines -- CHKPTR - Check pointer for validity
; This routine checks to validate that a pointer is reasonable.
; T1 / pointer
; RETURNS: +1 if pointer is bad
; +2 if pointer is ok
CHKPTR: CAIL T1,DSBUF ;Is it below the data base?
CAML T1,DSFEND ;No, is it below the end?
RET ;Not in range
SETO T2, ;Want to check against -1
CAMN T2,DSFSPC(T1) ;Is entry in use?
RET ;Entry not in use
RETSKP ;In range, ok to use
SUBTTL Utility routines -- DSFLOC - locate entry for specified device
; DSFLOC - LOCATE ENTRY FOR SPECIFIED DEVICE IN DEVICE-STATUS FILE
; DSFE + DSFTYP / DEVICE TYPE
; DSFE + DSFSPC / DEVICE IDENTIFIER
; RETURNS +1: DEVICE NOT REPRESENTED IN FILE
; +2: DEVICE ENTRY FOUND, T1/ pointer to entry
; DSFE contains entry
DSFLOC:: SKIPN T4,DSB.NE ;GET # OF ENTRIES TO CHECK
RET ;NONE, IT AIN'T HERE!
SKIPN DSFE+DSFSPC ;Is the identifier equal to 0?
$STOP <Attempt to locate DDB entry with 0 DSFSPC> ; Yes, must be bad
MOVEI T1,DSB.EO ;START SCAN HERE
DMOVE T2,DSFE ;GET REQUESTED TYPE AND IDENTIFIER
; Loop on the DDB entries looking for an entry of the same type and spc.
DSFLC1: CAME T2,DSFTYP(T1) ;DO DEVICE TYPES MATCH?
JRST DSFLC2 ;NO, SKIP IT
CAMN T3,DSFSPC(T1) ;DO IDENTIFIERS MATCH?
JRST [CALL DSFGET ;Yes, go set DSFE
CALL STOP ;Should never happen
RETSKP]
DSFLC2: ADDI T1,DSFESZ ;POINT AT NEXT ENTRY
SOJG T4,DSFLC1 ;GO CHECK NEXT ENTRY IF THERE IS ONE
; End of loop
RET ;Not found
SUBTTL Utility routines -- DSFUPD - update device file
; DSFUPD - COMPUTES AND INSTALLS CHECKSUM IN DEVICE-STATUS FILE
; BUFFER, THEN WRITES BUFFER OUT TO DISK
; RETURNS +1: ALWAYS
DSFUPD: SKIPLE DSFUPF ;Do we want an update on disk?
RET ;No
SAVEAC <T1> ;Save T1 for sure
SETZM DSFUPF ;Make sure things haven't gotten confused
CALL DSFCKS ;COMPUTE CHECKSUM OF BUFFER
MOVEM T1,DSB.CK ;STORE IT
HRLZ T1,DSFJFN ;GET JFN ,, FIRST PAGE #
JUMPE T1,R ;OOPS, NO JFN... HEH HEH HEH... BYE!
MOVEI T2,DSFPGS ;# OF PAGES TO UPDATE
UFPGS ;WRITE 'EM OUT
JFCL ;IGNORE ERRORS
RET
SUBTTL Utility routines -- DSFCKS - Compute checksum of dev. file
; DSFCKS - COMPUTE CHECKSUM OF DEVICE-STATUS FILE BUFFER
; RETURNS +1: ALWAYS, WITH CHECKSUM IN T1
DSFCKS: MOVEI T1,DSBVER ;START WITH CURRENT VERSION
MOVEI T3,DSFSZ-1 ;INIT SCANNING POINTER
DSFCK1: TLZ T1,400000 ;POSITIVE
TRO T1,1 ; AND ODD
MULI T1,400003 ;RANDOMIZE
MOVE T1,T2 ;COPY BACK TO T1
XOR T1,DSBUF(T3) ;MERGE NEXT WORD
SOJG T3,DSFCK1 ;LOOP THRU BUFFER
RET ;RETURN TO CALLER
SUBTTL Utility routines -- DSFGTF - Get a free entry
; Get a free entry to be created. Internal only routine.
; Entry is not initialized!
; RETURNS T1 / Address of entry
; +1 always
DSFGTF: SKIPE DSFREE ;Any free entries in list?
JRST [MOVE T1,DSFREE ;Yes, get address into T1
MOVE T2,DSFTYP(T1) ;Get next link
MOVEM T2,DSFREE ;Save as the beginning of free
JRST DSFGT5] ;Go to finish
MOVE T1,DSFEND ;Get end of entries
CAILE T1,DSBUF+DSFSZ-DSFESZ ;Room for one more?
CALL STOP ;NO
MOVE T2,T1 ;Make copy of end
ADDI T2,DSFESZ ;Add entry size
MOVEM T2,DSFEND ;Save it as new end of entries
AOS DSB.NE ;Remember we are using another entry
DSFGT5: RET
END