Google
 

Trailing-Edge - PDP-10 Archives - tops20_v6_1_tcpip_distribution_tp_ft6 - galaxy-sources/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,1985
;
;     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==:11			;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.

7	5.1201		4-Feb-85
	Use device-status.bin in DSK: if debugging

10	5.1206		18-Mar-85
	If there is no space for a new DDB entry, make room by deleting all
DDB entries that are currently not in use and have a zero flag word.  Also
in MTRMAC, increase DSFPGS to two.

11	5.1207		20-Mar-85
	In routine DSFINI: look for PS:<SYSTEM>DEVICE-STATUS.BIN.

\	;End of Revision History
SUBTTL	External Symbols

	EXTERNAL TSTF		;debug word
	EXTERNAL LVERS		;Version number used to calc checksum
	EXTERNAL STOP,STOPNW	;Stop routines
	EXTERNAL BTWTO,TMCT0	;Operator message routines
	EXTERNAL BTNFO
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
	SKIPE TSTF		;If debugging use file in users connected dir
	SKIPA T2,[XWD -1,[ASCIZ/DSK:DEVICE-STATUS.BIN/]] ;Debug, use DSK: 
	HRROI T2,[ASCIZ/PS:<SYSTEM>DEVICE-STATUS.BIN/] ;Use system file
	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?
	JRST [CALL MKRM			;No, make room
	      $STOP <No free entry in DSBUF> ;No room left
	      JRST DSFGTF]		;Try again
	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
	SUBTTL	Utility routines -- MKRM - make room for DSFGTF

;This routine is called when there is no space in the DDB to create an
;entry.  It tries to delete entries that are of no use.
;	returns +1 still no space
;		+2 allocated some space.

MKRM:	STKVAR <MKSPAC>		;Counter for deleted entries
	TMCT <%I	The following unuse structure entries have been deleted
	in order to allocate space to create new entries.%_>
	SETZM MKSPAC		;No one deleted yet.
	SKIPN T4,DSB.NE		;Get # of entries to check
	JRST MKRMEX		;No entries??? should not happen
	MOVEI T1,DSB.EO		;Get start of first entry
	CALL DSFNUP		;No update
MKRM1:	SKIPN DSFFLG(T1)	;Is it the default case.
	JRST [SKIPE DSFPNT(T1)	;Yes, is it mounted
	      JRST MKRM2	;Yes, get the next
	      MOVE T2,DSFTYP(T1) ;Get the type
	      CAIE T2,.DVSTR	;Is this a structure?
	      JRST MKRM2	;No, get the next	      
	      AOS MKSPAC	;Got one
	      MOVEI T2,12	;Number of structures on one line.
	      IDIV T2,MKSPAC	;See if we are at end of line
	      SKIPN T3,		;Do we need a new line
	      TMCT <%_>		;Yes
	      MOVE T2,DSFSPC(T1) ;Get the structure name.
	      TMCT <%2S:	> ;Add the name
	      CALL DSFDLE	;Yes, get rid of it
	      JRST MKRMEX	;Bad pointer
	      JRST MKRM2]	;Get the next
MKRM2:	ADDI T1,DSFESZ		;Point to the next entry
	SOJG T4,MKRM1		;If more, go look at it
MKRM3:	CALL DSFYUP		;Time to update
MKRMEX:	SKIPN MKSPAC		;Did we delete any?
	RET			;No, error return
	MOVEI T3,[ASCIZ/DEVICE-STATUS.BIN has been exhausted./]
	CALL BTNFO		;Request no formatting
	CALL BTWTO		;Send it off
	RETSKP			;Yes, success

	END