Google
 

Trailing-Edge - PDP-10 Archives - k20v7d - uetp/lib/rmtmac.mac
There are 4 other files named rmtmac.mac in the archive. Click here to see a list.
	TITLE	RMTMAC	RMS/MACRO UETP test program

	SEARCH	MONSYM,RMSINT

    	TWOSEG	400000

	T1=1			; Temporary ACs
	T2=2			; ...
	T3=3			; ...
	T4=4			; ...
	P1=5			; Permanent ACs
	P2=6			; ...
	P3=7			; ...
	P=17			; Stack pointer

	RELOC

	STKLEN=20
STACK:	BLOCK	STKLEN		; Stack
	RELOC

START:	RESET%			; Start cleanly
	MOVE	P,[IOWD STKLEN,STACK]	; Set up stack
	PUSHJ	P,TSTSEQ
	TRNE	T1,1
	JRST	OKSEQ
BADSEQ:	HRROI	T1,[ASCIZ\?Error in sequential tests
\]
	JRST	ENDSEQ
OKSEQ:	HRROI	T1,[ASCIZ\[Sequential tests successful]
\]
ENDSEQ:	PSOUT%			; Print message
	PUSHJ	P,TSTREL	; Test relative files
	TRNE	T1,1
	JRST	OKREL
BADREL:	HRROI	T1,[ASCIZ\?Error in relative tests
\]
	JRST	ENDREL
OKREL:	HRROI	T1,[ASCIZ\[Relative tests successful]
\]
ENDREL:	PSOUT%			; Print message
	PUSHJ	P,TSTIDX	; Test indexed files
	TRNE	T1,1
	JRST	OKIDX
BADIDX:	HRROI	T1,[ASCIZ\?Error in indexed tests
\]
	JRST	ENDIDX
OKIDX:	HRROI	T1,[ASCIZ\[Indexed tests successful]
\]
ENDIDX:	PSOUT%			; Print message
	HALTF%			; Quit
;
; TSTSEQ creates, writes, and reads a sequential file
;
	RELOC

SEQBUF:	BLOCK	1		; Record buffer

SEQFAB:	FAB$B
	F$FNA	[ASCIZ\RMSRMS.SEQ\]
	F$ORG	FB$SEQ		; Sequential
	F$RFM	FB$FIX		; Fixed format
	F$MRS	1		; One word records
	F$BSZ	^D36		; 36-bit bytes
	F$FAC	FB$GET!FB$PUT!FB$DEL	; Lots of access
	F$FOP	FB$SUP		; Supersede old files
	FAB$E

SEQRAB:	RAB$B
	R$FAB	SEQFAB		; Point at FAB
	R$UBF	SEQBUF		; Point at buffer
	R$RSZ	1		; Records always one byte long
    	R$USZ	1		; Buffer is one word long
	RAB$E

	RELOC

TSTSEQ:	$CREATE	SEQFAB		; Create the file
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	$CONNECT SEQRAB		; Connect a stream
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
;
; Write some records to the file.  Each record is
; one word long and contains the number of the
; record, i.e., the 10th record contains 10.
;
	MOVEI	P1,20		; Write 20 records
	MOVEI	T1,1		; Set up buffer
	MOVEM	T1,SEQBUF	; ...
S.LP1:	$PUT	SEQRAB		; Write a record
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	AOS	SEQBUF		; Increment record
	SOJG	P1,S.LP1	; Check counter and loop
	$DISCONNECT SEQRAB	; Terminate record stream
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	$CONNECT SEQRAB		; Start over at top of file
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
;
; Read through the file, checking that all 20 records exist.
; Delete every even-numbered record.
;
    	MOVEI	P1,20		; Read 20 records
	MOVEI	P2,1		; Record count
S.LP2:	$GET	SEQRAB		; Read a record
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	CAME	P2,SEQBUF	; Check that record contains correct data
	  JRST	S.QUIT		; No - quit
	TRNE	P2,1		; Is number even?
	  JRST	S.ODD		; No - skip $DELETE
	$DELETE	SEQRAB		; Yes - delete the record
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
S.ODD:	ADDI	P2,1		; Increment record counter
	SOJG	P1,S.LP2	; Loop until done
;
; At this point, we should have read to EOF.  The next
; $GET should make us bomb.
;
	$GET	SEQRAB		; Try for EOF
	CAIE	T2,ER$EOF	; Correct error?
	  JRST	S.QUIT		; No - quit
	$DISCONNECT SEQRAB	; Try again
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	$CONNECT SEQRAB		; Set to head of file
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
;
; Now read the 10 records which are in the file
;
	MOVEI	P1,10		; Count of records
	MOVEI	P2,1		; For data comparison
S.LP3:	$GET	SEQRAB		; Read a record
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	CAME	P2,SEQBUF	; Check that record contains correct data
	  JRST	S.QUIT		; No - quit
	ADDI	P2,2		; Increment data comparison by 2
	SOJG	P1,S.LP3	; Loop until done
;
; At this point, we should have read to EOF.  The next
; $GET should make us bomb.
;
	$GET	SEQRAB		; Try for EOF
	CAIE	T2,ER$EOF	; Correct error?
	  JRST	S.QUIT		; No - quit
	$DISCONNECT SEQRAB	; Try again
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	$CLOSE	SEQFAB		; Close the file
	CAILE	T2,ER$MIN	; Error?
	  JRST	S.QUIT		; Yes - quit
	JRST	S.EXIT		; Exit successfully
;
; S.QUIT is the error exit; it sets T1 to 0.
; S.EXIT is the success exit; it sets T1 to 1.
;
S.QUIT:	$CLOSE	SEQFAB		; In case it's still open
	TDZA	T1,T1		; Zero T1
S.EXIT:	MOVEI	T1,1		; Set T1 to success
	POPJ	P,		; End of TSTSEQ
;
; TSTREL creates, writes, and reads a sequential file
;
	RELOC

RELBUF:	BLOCK	1		; Record buffer
RELKEY:	BLOCK	1		; Key buffer

RELFAB:	FAB$B
	F$FNA	[ASCIZ\RMSRMS.REL\]
	F$ORG	FB$REL		; Relative
	F$RFM	FB$FIX		; Fixed format
	F$MRS	1		; One word records
	F$BSZ	^D36		; 36-bit bytes
	F$FAC	FB$GET!FB$PUT!FB$DEL	; Lots of access
	F$FOP	FB$SUP		; Supersede old files
	FAB$E

RELRAB:	RAB$B
	R$FAB	RELFAB		; Point at FAB
	R$UBF	RELBUF		; Point at buffer
	R$RSZ	1		; Records always one byte long
    	R$USZ	1		; Buffer is one word long
	R$KBF	RELKEY		; Point at key buffer
	RAB$E

	RELOC

TSTREL:	$CREATE	RELFAB		; Create the file
	CAILE	T2,ER$MIN	; Error?
	  JRST	R.QUIT		; Yes - quit
	$CONNECT RELRAB		; Connect a stream
	CAILE	T2,ER$MIN	; Error?
	  JRST	R.QUIT		; Yes - quit
;
; Write some records to the file.  Each record is
; one word long and contains the number of the
; record, i.e., the 10th record contains 10.
;
	MOVEI	T1,RB$SEQ	; Set sequential access
	$STORE	T1,RAC,RELRAB	; ...
	MOVEI	P1,20		; Write 20 records
	MOVEI	T1,1		; Set up buffer
	MOVEM	T1,RELBUF	; ...
R.LP1:	$PUT	RELRAB		; Write a record
	CAILE	T2,ER$MIN	; Error?
	  JRST	R.QUIT		; Yes - quit
	AOS	RELBUF		; Increment record
	SOJG	P1,R.LP1	; Check counter and loop
	$DISCONNECT RELRAB	; Terminate record stream
	CAILE	T2,ER$MIN	; Error?
	  JRST	R.QUIT		; Yes - quit
	$CONNECT RELRAB		; Start over at top of file
	CAILE	T2,ER$MIN	; Error?
	  JRST	R.QUIT		; Yes - quit
;
; Read the records by key
;
	MOVEI	T1,RB$KEY	; Set keyed access
	$STORE	T1,RAC,RELRAB	; ...
    	MOVEI	P1,20		; Read 20 records
R.LP2:	MOVEM	P1,RELKEY	; Set the key to read on
	$GET	RELRAB		; Read a record
	CAILE	T2,ER$MIN	; Error?
	  JRST	R.QUIT		; Yes - quit
	CAME	P1,RELBUF	; Check that record contains correct data
	  JRST	R.QUIT		; No - quit
	SOJG	P1,R.LP2	; Loop until done
	$CLOSE	RELFAB		; Close the file
	CAILE	T2,ER$MIN	; Error?
	  JRST	R.QUIT		; Yes - quit
	JRST	R.EXIT		; Exit successfully
;
; R.QUIT is the error exit; it sets T1 to 0.
; R.EXIT is the success exit; it sets T1 to 1.
;
R.QUIT:	$CLOSE	RELFAB		; In case it's still open
	TDZA	T1,T1		; Zero T1
R.EXIT:	MOVEI	T1,1		; Set T1 to success
	POPJ	P,		; End of TSTREL
;
; TSTIDX creates, writes, and reads an indexed file
;
	RELOC

IDXBUF:	BLOCK	1		; Record buffer

IDXKEY:	BLOCK	1		; Key buffer

I.XAB1:	XAB$B	KEY
	X$REF	1		; 1st alternate key
	X$DTP	XB$STG		; ASCII data
	X$KNM	[ASCIZ\KEY 1\]	; Key name
	X$POS	1		; Key position
	X$SIZ	1		; Key size
	XAB$E

I.XAB0:	XAB$B	KEY
	X$REF	0		; Primary key
	X$DTP	XB$STG		; ASCII data
	X$KNM	[ASCIZ\KEY 0\]	; Key name
	X$POS	0		; Key position
	X$SIZ	1		; Key size
	X$NXT	I.XAB1		; Next XAB in chain
	XAB$E

IDXFAB:	FAB$B
	F$FNA	[ASCIZ\RMSRMS.IDX\]
	F$ORG	FB$IDX		; Sequential
	F$RFM	FB$FIX		; Fixed format
	F$MRS	2		; Two-character records
	F$BSZ	^D7		; 7-bit bytes
	F$FAC	FB$GET!FB$PUT!FB$DEL	; Lots of access
	F$FOP	FB$SUP		; Supersede old files
	F$XAB	I.XAB0		; Point to XAB chain
	FAB$E

IDXRAB:	RAB$B
	R$FAB	IDXFAB		; Point at FAB
	R$UBF	IDXBUF		; Point at buffer
	R$RSZ	2		; Records always two characters long
	R$KBF	IDXKEY		; Key buffer
	R$RAC	RB$KEY		; Keyed access
	R$USZ	1		; Buffer is one word long
	RAB$E

	RELOC

TSTIDX:	$CREATE	IDXFAB		; Create the file
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
	$CONNECT IDXRAB		; Connect a stream
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
;
; Write some records to the file.  Each record is
; 2 characters long, and they are in the form
;
;	AZ
;	BY
;	CX
;	etc.
;
	MOVEI	P1,^D26		; Write 26 records
	MOVEI	P2,"A"		; Primary key
	MOVEI	P3,"Z"		; Alternate key
I.LP1:	DPB	P2,[POINT 7,IDXBUF,6]	; Write first "field"
	DPB	P3,[POINT 7,IDXBUF,13]	; Write second "field"
	$PUT	IDXRAB		; Write a record
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
	ADDI	P2,1		; Increment to next letter
	SUBI	P3,1		; Decrement to previous letter
	SOJG	P1,I.LP1	; Check counter and loop
	$DISCONNECT IDXRAB	; Terminate record stream
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
	$CONNECT IDXRAB		; Start over at top of file
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
;
; Read some records.
;
	MOVEI	T1,0		; Try primary key
	$STORE	T1,KRF,IDXRAB	; ...
	MOVEI	T1,"D"		; Try record starting with "D"
	DPB	T1,[POINT 7,IDXKEY,6]	; Set up the key
	MOVEI	T1,1		; and the key length
	$STORE	T1,KSZ,IDXRAB	; ...
	$GET	IDXRAB		; $GET the record
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
	MOVE	T2,[POINT 7,IDXBUF]	; Check the record
	ILDB	T1,T2		; Check the first character
	CAIE	T1,"D"		; Should be "D"
	  JRST	I.QUIT		; No - bug
	ILDB	T1,T2		; Check the second character
	CAIE	T1,"W"		; Should be "W"
	  JRST	I.QUIT		; No - bug
;
; Try the alternate key
;
	MOVEI	T1,1		; Try alternate key
	$STORE	T1,KRF,IDXRAB	; ...
	MOVEI	T1,"D"		; Try record whose second character is "D"
	DPB	T1,[POINT 7,IDXKEY,6]	; Set up the key
	MOVEI	T1,1		; and the key length
	$STORE	T1,KSZ,IDXRAB	; ...
	$GET	IDXRAB		; $GET the record
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
	MOVE	T2,[POINT 7,IDXBUF]	; Check the record
	ILDB	T1,T2		; Check the first character
	CAIE	T1,"W"		; Should be "W"
	  JRST	I.QUIT		; No - bug
	ILDB	T1,T2		; Check the second character
	CAIE	T1,"D"		; Should be "D"
	  JRST	I.QUIT		; No - bug
	$CLOSE	IDXFAB		; Close the file
	CAILE	T2,ER$MIN	; Error?
	  JRST	I.QUIT		; Yes - quit
	JRST	I.EXIT		; Exit successfully
;
; I.QUIT is the error exit; it sets T1 to 0.
; I.EXIT is the success exit; it sets T1 to 1.
;
I.QUIT:	$CLOSE	IDXFAB		; In case it's still open
	TDZA	T1,T1		; Zero T1
I.EXIT:	MOVEI	T1,1		; Set T1 to success
	POPJ	P,		; End of TSTIDX
	END	START