DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦974325df7⟧

    Length: 29928 (0x74e8)
    Notes: pts_type(SC)
    Names: »DMOPCL.SC«

Derivation

└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
    └─⟦this⟧ »M:TU10/DMOPCL.SC« 
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
    └─⟦this⟧ »M:TU10/DMOPCL.SC« 

PTS(SC)

	IDENT DMOPCL 	REL 10.0 80-03-14 870105041000 

			=3 ,RECORD LGTH 256
			79-11-28 
			=2, COMMIT CHECK 
			79-11-22 
			=1 ,CONCURRENT OPEN
			79-11-02 
****************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   DMOPCL HANDLES OPEN CLOSE AND READ FILE PARAMETERS
*   IT IS ACTIVATED FROM DMTASK 
* 
* 
* 
* 
* 
****************************************************
* 
	EJECT
* 
*************** 
*   ENTRIES   * 
*************** 
* 
* 
	ENTRY	DMOPEN,DMCLOS,DMRFP
	EJECT
* 
***************** 
*   EXTERNALS   * 
***************** 
* 
	EXTRN	CLRBUF,CRNCDF,CRNCIF,CRNGET,CRNQUE 
	EXTRN	ECBRC
	EXTRN	FDBADF,FDBBLF,FDBCRL,FDBECB,FDBKA,FDBLRN 
	EXTRN	FDBMEC,FDBMIA,FDBNIF,FDBRLE,FDBSTA 
	EXTRN	FDBTNR 
	EXTRN	FNDFDB,DMTWM 
	EXTRN	FWTFNR,FWTPAR,FWTVOL 
	EXTRN	MOV:SU,MOV:US
	EXTRN	MPYMOD,MXIND,TENDIO,TTB:MT 
	EXTRN	DIVMOD 
	EXTRN	FDBDBR,FDBMRO,FDBDMI,FDBBLZ
	EXTRN	ECBFC
	EXTRN	ECBBA
	EXTRN	ECBEL
	EXTRN	ECBRL
	EXTRN	DWTECB 
	EXTRN	DWTOR
	EXTRN	DWTTAB,DWTOPT,BLKMXL 
	EXTRN	FPB:RL,FPB:BF,FPB:FO,FPB:BO,FPB:FN,FPB:EL
	EXTRN	FPB:V1,FPB:S1,FPB:V2,FPB:S2,FPB:V3,FPB:S3,FPB:V4,FPB:S4
	EXTRN	FPB:FR,FPB:US,FPB:SH,FPB:MN,FPB:SN,FPB:IF,FPB:KA 
	EXTRN	QOPEN,QRFP 
	EXTRN	PRUN 
	EXTRN	CRNSTA,DFTAB,DMTIDP
	EXTRN	MONMMU,DMTERX,QCL
	EXTRN	DMTRBU,DMTBM 
	EXTRN	DMTIOT 
	EXTRN	EARELB 
	EXTRN	TASHLT 
	EXTRN	FDBEAL 
	EXTRN	RECBFZ,REQERR
	EXTRN	DMTBMR 
	EJECT			DMTASK 
*   CONDITIONAL ASSEMBLY
**************************
* 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
* 
*   A PROGRAM VERSION FOR INDEXED ACCESS HANDLING 
*   IS OBTAINED BY SETTING INDXAC = 1 
X:B	EQU	0 
INDXAC	EQU	00000
* 
* 
	EJECT
FPBSTA	EQU	0	START ADDR FPB 
FPB:IV	EQU	FPBSTA+58	VOL NAME INDEX 
FPB:IS	EQU	FPBSTA+64	INDEX SIZE 
FPB:NI	EQU	FPBSTA+68	NR OF INDEX
FPB:I1	EQU	FPBSTA+70	INDEX ID 1 
FPB:K1	EQU	FPBSTA+77	NR OF KEY ITEMS
FPB:A1	EQU	FPBSTA+78	KEY ADDR 1 
FPB:L1	EQU	FPBSTA+80	KEY LENGTH 1 
FPB:I2	EQU	FPBSTA+82
FPB:L4	EQU	FPBSTA+116 
* 
FPB:FM	EQU	FPBSTA+6	TOSS FILE NR
* 
FPBSIZ	EQU	60	SIZE OF FPB AREA IN WORDS 
* 
FPBRES	EQU	8	RESERVED FIELD LENGTH IN FILE PAR BLOCK
* 
NOCORE	EQU	1	NO CORE ERROR CODE 
* 
ERPAR	EQU	4	WRONG PAR ERR CODE
* 
OFLW	EQU	3	OVERFLOW ERR CODE
* 
ERKEYL	EQU	8	LONG KEY ERR CODE
	EJECT
************************
*   DATA DEFINITIONS   *
************************
*   HERE FOLLOWS NON-REENTRANT AREAS USED BY ORDERS : 
*   OPEN,CLOSE,READ FILE PARAMETERS.
* 
OPESPA	DATA	'  '	2 SPACES 
OPEFN	EQU	*	FILE NAME PREFIXES
	DATA	'    '
	DATA	'I1M1'
	DATA	'I2M2'
	DATA	'I3M3'
	DATA	'I4M4'
OPEFNR	EQU	*	OPENED FILE NRS
	DATA	0,0,0 
OPEFCD	EQU	*	OPENED FILE CODES
	DATA	0,0,0 
OPEFWT	EQU	*	FWT ADDRESSES
	DATA	0,0,0,0,0 
OPEMXI	EQU	*	MASTER INDEX ADDRESSES 
	DATA	0,0,0,0,0 
OPELRN	DATA	0,0,0,0,0,0,0,0,0,0	LAST REC NRS
OPEKAD	DATA	0,0,0,0,0	KEY ADDRESSES 
OPEKYL	DATA	0,0,0,0,0	KEY LENGTH
DELAY	DATA	0
NROFIX	DATA	0	NR OF INDEX FILES 
INDVOL	RES	3	VOLUME NAME INDEX FILES
OPEFPB	RES	FPBSIZ	FILE ADM PARAM. BLOCK 
OPEEND	EQU	*-OPEFNR	NR OF BYTES 
	EJECT
DMRFP	EQU	*	READ FILE PARAMETERS
* 
*   A1 = A6 
*   A6 = FDB ADDRESS ALL ORDERS 
*   A7 = ORDER CODE ALL ORDERS
* 
	LDR	A10,A6	FBD ADDR
	LC	A6,FDBNIF,A10	NR OF INDEX 
	ANK	A6,/FF 
	ST	A6,NROFIX 
*   STORE FILE NRS IN OPEFNR
* 
	LDK	A5,10	2 * INDEXES
RFP100	EQU	*
	SUK	A5,2 
	RF(N)	OPE099	ALL FILES 
	LDR	A4,A10 
	ADR	A4,A5
	LD	A3,FDBADF,A4	FDB ADDR 
	RF(Z)	RFP130	NO FILE 
	LC	A6,FWTFNR,A3	FILE NR
RFP130	EQU	*
	LDR	A4,A5
	SRL	A4,1 
	SC	A6,OPEFNR,A4	SAVE FILE NR 
	RB	RFP100	NEXT FILE
	EJECT
*   A1 = A6 
*   A6 = FDB ADDRESS ALL ORDERS 
*   A7 = ORDER CODE ALL ORDERS
* 
DMOPEN	EQU	*	OPEN 
* 
*   A8 = ECB ADDR 
*   A9 = FPB ADDR 
*   A10= SYSTEM FWT ADDR
*   A11= CURRENT FWT ADDR 
*   A12= LOOP COUNTER (FILE INDEX)
* 
	LDKL	A9,OPEFPB	AS ABOVE
*   CHECK OPTIONS 
* 
	LDR	A10,A6	SYSTEM FWT ADDR 
	LDR	A11,A10	 
	LC	A2,DWTOPT,A10	OPTION
	LDR	A3,A2
	ANK	A2,/FC 
	SUK	A2,/8
	RF(NZ)	OPE020	NOT INPUT
	ANK	A3,/3
	RF(NZ)	OPEERR	ONLY UNPROT
	RF	OPE030
OPE020	EQU	*
	SUK	A2,/30 
	RF(NZ)	OPEERR	NOT INP/OUTP 
	ANK	A3,/3
	RF(Z)	OPEERR	UNPROT NOT ALLOWED
	SUK	A3,3 
	RF(Z)	OPEERR	NOT BOTH
OPE030	EQU	*
	EJECT
*   A12 = LOOP COUNTER FILES
* 
*         1 = DATA FILE 
*         2 = INDEX 1 
*         3 = MASTER INDEX 1
*         4 = INDEX 2 
*         ETC 
* 
*   CLEAR WORK AREA 
* 
	LDK	A2,OPEEND	NR OF BYTE TO CLEAR
OPE050	EQU	*
	SUK	A2,2 
	RF(N)	OPE060	NO MORE WORDS 
	CM	OPEFNR,A2 
	RB	OPE050	NEXT WORD
OPE060	EQU	*
* 
*   MOVE IN PARAMETER BLOCK 
* 
	LD	A3,DWTECB,A10	USER ECB ADDR 
	LD	A1,ECBBA,A3	 FD ADDR USER 
	ADK	A1,FPBRES	RESERVED FIELDS
	LDR	A2,A9	FPB ADDR 
	LDK	A3,FPB:L4+1	MAX SIGN LENGTH
	IFT	MMUPAG=1 
	LD	A4,DWTTAB,A10	USER TTAB ADDR
	CF	A14,MOV:US
	XIF
	IFT	MMUPAG=0 
	LDR	A2,A3
	LDR	A3,A9	TO ADDR
	CF	A14,DMTBM 
	XIF
	IFT	INDXAC=1 
* 
*   SAVE VOLUME NAME INDEX FILES
* 
	LDR	A1,A9	FPB ADDR 
	ADKL	A1,FPB:IV	FROM ADDR 
	LDKL	A3,INDVOL	TO ADDR 
	LDK	A2,6 
	CF	A14,DMTBM 
	XIF
	LC	A5,FPB:BO,A9	TOSS OPTIONS 
	ANK	A5,2 
	SLL	A5,14
	ST	A5,DELAY
	IFT	INDXAC=1 
	LC	A5,FPB:FO,A9
	ANK	A5,/FF 
	RF(Z)	OPE099	STANDARD FILE 
	LD	A5,DWTECB,A10	USER ECB ADDR 
	LD	A5,ECBRL,A5	REQ LGTH
	CWK	A5,FPB:NI+FPBRES 
	RF(NG)	OPEERR	NO INDEX 
	LC	A5,FPB:NI,A9	NR OF INDEXES
	SC	A5,NROFIX+1 
	EJECT
* 
*   SAVE BASE ADDRESSES FOR INDEXES 
* 
	LDK	A2,FPB:A1
	ADR	A2,A9	ADDR FIRST KEY ADDR
	ANK	A5,/F
	LDK	A3,2	OFFSET INDEX 1
OPE070	EQU	*
	SUK	A5,1 
	RF(N)	OPE099	ALL INDEXES 
	LDK	A1,0 
	LC	A1,-1,A2	NR OF KEY ITEMS
	SUK	A1,1 
	RF(NZ)	OPEER4	ERR
	LC	A1,2,A2	KEY LENGTH
	ST	A1,OPEKYL,A3
	LDR*	A1,A2	KEY OFFSET
	ST	A1,OPEKAD,A3
	ADK	A2,FPB:I2-FPB:I1 
	ADK	A3,2 
	RB	OPE070
	XIF
	EJECT
OPE099	LDKL	A12,1	DATA FILE INDEX 
OPE100	EQU	*	FILE LOOP
* 
*   OPEN FM FILE
* 
	LDKL	A9,OPEFPB	FPB ADDR
	LDR	A8,A10 
	ADKL	A8,FDBECB	ECB ADDR
	ST	A9,ECBBA,A8	FPB ADDR
	LC	A5,FPB:BO,A9
	ANK	A5,1 
	SC	A5,FPB:BO,A9	ONLY BASIC ALLOWED 
	LDK	A5,0 
	SC	A5,FPB:SH,A9	NOT EXCLUSIVE
	CWK	A10,FDBSTA 
	RF(NE)	OPE110	READ FILE PAR ORDER
	LDK	A7,/A1	OPEN
	LKM
	DATA	15
	LDR	A1,A10	MAIN FDB
	CF	A14,DMTIOT	ERR CHECK
	LDR	A1,A1
	RF(NZ)	OPEER0	ERR
	EJECT
* 
*   STORE FILE NR 
* 
	LDR	A1,A12	LOOP INDEX
	SRL	A1,1 
	LDR*	A6,A8 
	SC	A6,OPEFNR,A1	OPENED FILE NRS
OPE110	EQU	*
* 
*   GET FWT ADDR IN A11 
* 
	ANK	A6,/FF 
	LDKL	A11,FDBSTA	SYST FDB ADDR
	LDR	A3,A6	FILE NR
OPE150	EQU	*
	RF(Z)	OPE190	END COUNT 
	LDR*	A11,A11	NEXT FDB
	ANKL	A11,/FFFE	USE BIT 
	SUK	A3,1 
	RB	OPE150
	EJECT
OPEERR	LDKL	A1,REQERR	GENERAL ERR CODE
	RF	OPEER2
OPEER0	EQU	*
	LDR	A5,A1	RET CODE 
	ECR	A6,A5
	ANK	A6,/F	BIT 4-7 IN RC
	RF(Z)	OPEERA	NO SPECIAL CODE 
	ANK	A6,/A	GET BIT 4 AND 6 FROM RC
	ADK	A6,1	B4=9,B5=1,B6=3
OPEERS	EQU	*
	LDR	A1,A10	SYST FDB
	CF	A14,CRNGET	GET CURRENCY BUFFER
	SC	A6,CRNSTA,A2	STAT CODE
	ANKL	A5,/F1EF	NOT BIT 4,5,6,11 
	ORK	A5,/80	INF AVAIL 
OPEERA	LDR	A1,A5	RET CODE 
OPEER2	EQU	*
	LD	A9,DWTECB,A10	USER ECB ADDR 
	ORS	A1,ECBRC,A9	SEND CODE
	ABL	OPEER1 
OPEER3	LDK	A6,OFLW	OVERFLOW 
	RF	OPEERQ
OPEER4	LDK	A6,ERPAR	WRONG PARAMETER 
OPEERQ	LDKL	A5,REQERR	BIT 0 
	RB	OPEERS
OPEER8	LDK	A6,ERKEYL	LONG KEY 
	RB	OPEERQ
	EJECT
OPE190	EQU	*	FWT ADDR IN A11
* 
*   READ FILE PARAMETERS
* 
	STR	A6,A8	FILE NR
	LDK	A7,/83	RFP 
	LKM
	DATA	15
	LDR	A1,A10	MAIN FDB
	CF	A14,DMTIOT	ERR CHECK
	ORS	A1,ECBRC,A9	RET CODE 
	LDKL	A9,OPEFPB	FPB ADDR
	CWK	A12,1
	RF(NE)	OPE192	INDEX FILE 
	LD	A7,NROFIX	NR OF INDEXES 
	CWK	A7,4 
	RB(G)	OPEERR	TOO MANY INDEXES
	SLL	A7,1 
	ADK	A7,2 
	LDR	A12,A7	NEW LOOPER
	SUR	A13,A13	REL ADDR IN TABLES OF OPEN 
	RF	OPE191
OPE192	EQU	*
	LDR	A7,A12 
	ANK	A7,/FE	REL ADDR
	LDR	A13,A7 
OPE191	EQU	*
	CWK	A10,FDBSTA 
	ABL(NE)	OPE300	READ FILE PAR ORDER 
	LDR	A1,A1
	RB(NZ)	OPEER2
	EJECT
* 
*   CHECK OPENED FILE 
* 
	LDK	A3,/53	'S' 
	CC	A3,FPB:FO,A9
	RB(NE)	OPEERR	NOT STD FILE 
	LC	A3,FPB:US,A9	NR OF USERS
	SUK	A3,1 
	RF(Z)	OPE195	FIRST OPEN
	LC	A3,DWTOPT,A10	OPTION
	LDR	A2,A3
	ANK	A3,/02	EXCL
	RB(NZ)	OPEERR	EXCLUSIVE WANTED IN VAIN 
	ANK	A2,/3	WANTED MODE
	LC	A3,FDBDBR,A11 
	ANK	A3,/3	OLD MODE 
	CWR	A2,A3
	RB(NE)	OPEERR	ALL OPEN SAME !
	LC	A3,FDBNIF,A11	NR OF INDEX BEFORE FOR THIS FILE
	CW	A3,NROFIX	NR OF INDEXES 
	RB(NE)	OPEER4	ALW SAME INDEXES 
	LD	A2,DELAY
	RF(N)	OPE193	2ND DELAY WANTED IN VAIN
	LDKL	A2,/7FFF
	ANS	A2,FDBDBR,A11	NO DELAY 
OPE193	EQU	*
	ABL	OPE300 
	EJECT
OPE195	EQU	*
* 
*   CLEAR FDB 
* 
	LDKL	A2,FDBMEC 
	SUKL	A2,FDBECB	LENGTH
OPE196	EQU	*
	SUK	A2,2 
	RF(N)	OPE200	OK
	LDR	A7,A11 
	ADR	A7,A2
	CM	FDBECB,A7 
	RB	OPE196
OPE200	EQU	*
	LD	A2,DELAY
	ST	A2,FDBDBR,A11	SET DELAY FOR NEW FILE
	EJECT
* 
*   BUILD FWT FDB PART
* 
OPE250	EQU	*
	LD	A3,FPB:RL,A9	 
	ST	A3,FDBRLE,A11	RECORD LENGTH 
	LC	A3,FPB:BF,A9
	SC	A3,FDBBLF,A11	BLOCK FACTOR
	LD	A3,NROFIX	NR OF INDEXES 
	SC	A3,FDBNIF,A11	NR OF INDEX FILES 
	LC	A3,FPB:FR+1,A9
	SC	A3,FDBLRN,A11 
	LD	A3,FPB:FR+2,A9
	ST	A3,FDBLRN+1,A11	LAST REC NR 
	LD	A3,OPEMXI,A13 
	ST	A3,FDBMIA,A11	MASTER INDEX ADDR 
	RF(Z)	OPE255	NO MASTER INDEX 
	LD	A3,FPB:KA,A9
	CW	A3,OPEKAD,A13 
	RB(NE)	OPEER4	WRONG KEY
	ST	A3,FDBKA,A11	KEY ADDR 
OPE255	EQU	*
	LC	A3,FPB:BO,A9
	SLL	A3,6	TOSS OPTIONS DELAY AND BASIC
	LC	A4,DWTOPT,A10 
	ANK	A4,/3	OPTIONS
	ORR	A3,A4
	ANK	A4,1		=2 
	RF(Z)	OPE257	NOT PROTECT	=2
	IM	FDBBLZ,A11	COMMIT FLAG	=2 
OPE257	EQU	*		=2
	SLL	A3,8 
	ORS	A3,FDBDBR,A11	BASIC + OPTION 
*   CALCULATE DMTASK ID 
* 
	LC	A3,FWTVOL,A11	FIRST EXTENT VOLUME FC
	LDK	A6,0 
OPE260	CC	A3,DFTAB,A6 
	RF(E)	OPE270	THIS DISC 
	ADK	A6,1 
	RB	OPE260	SEARCH NEXT DISC CODE
OPE270	LC	A3,DMTIDP,A6	REL DMTASK ID
	SC	A3,FDBDMI,A11	MAIN DMTASK ID
* 
*   CALCULATE MAX FDBRRO
* 
	LD	A6,FDBRLE,A11	REC LENGTH
	ADK	A6,1 
	LDK	A7,0 
	LC	A7,FDBBLF,A11	BLOCK FACT
	SUK	A7,1 
	CF	A14,MPYMOD	A1,A2=A6*A7
	ST	A2,FDBMRO,A11	MAX FDBRRO
*   CALCULATE BLOCK SIZE
* 
	AD	A2,FDBRLE,A11	BLOCK LGTH
	ADK	A2,1	STATUS	=3 
	LDR	A1,A2	RESULT 
	SRL	A2,8	SECTOR NR 
	ANK	A1,/FF 
	RF(Z)	OPE290	NO SPILL
	ADK	A2,1 
OPE290	EQU	*
	SC	A2,FDBBLZ,A11	BLOCK SIZE
	SLL	A2,7	WORDS 
	CWK	A2,BLKMXL
	ABL(G)	OPEER4	TOO LARGE BLOCK SIZE 
	ST	A11,FDBADF,A11	 
OPE300	EQU	*
	ST	A11,OPEFWT,A13	SAVE FWT ADDR
	LDR	A13,A13
	ABL(Z)	OPE800	DATA FILE
	IFT	INDXAC=1 
	LDR	A3,A12 
	ANK	A3,/1
	ABL(Z)	OPE600	INDEX FILE 
	EJECT
OPE400	EQU	*	MASTER INDEX BRANCH
	CWK	A10,FDBSTA 
	ABL(NE)	OPE700	ORDER READ FILE PAR 
	LDR	A8,A10 
	ADKL	A8,FDBECB	ECB ADDR
	LD*	A3,DWTECB,A10	FILE CODE
	ANK	A3,/FF 
	ST	A3,-36,A14	FC ENTRY IN TTAB DMTASK
	ST	A11,-34,A14 
	STR	A3,A8
	LDK	A2,0 
	SC	A2,FDBDBR,A11	NO SPECIAL FUNCTIONS ALLOWED
	SC	A2,FDBBLZ+1,A11	NO COMMIT CHECK	=2
	LDK	A2,1 
	SC	A2,FDBDMI,A11	LET DMTASK 1 READ MASTER INDEX
* 
*   CALC NO OF WORDS NEEDED IN MASTRE INDEX 
* 
	LD	A6,FPB:RL,A9	REC LGTH 
	LDR	A1,A6
	SUK	A1,3	KEY LENGTH
	CW	A1,OPEKYL,A13	REQUESTED 
	ABL(NE)	OPEER4	ERR 
	LD	A7,FPB:FR+2,A9	NO OF RECS 
	CF	A14,MPYMOD	A1,A2=NO OF BYTES NEEDED 
	SRC	A1,1 
	ORR	A2,A1	GET MOST SIGN BIT
	ADK	A2,5 
	SRL	A2,1	NO OF WORDS NEEDED
	RF(Z)	DMT570	WRONG SIZE
	LD	A4,MXIND	LENGTH MXIND 
	SUK	A4,4	MAX A5 VALUE
	LDKL	A5,-2	OFFSET
DMT540	EQU	*
	ADK	A5,4	GET ENTRY 
	CWR	A5,A4
	RF(G)	DMT570	NO ENTRY FOUND
	LD	A3,MXIND,A5 
	RB(Z)	DMT540	ZERO ENTRY
	LD	A6,MXIND+2,A5 
	RB(N)	DMT540	ENTRY USED
	SUR	A6,A2	NO OF SPARE WORDS
	RB(N)	DMT540	LARGER ENTRY NEEDED 
* 
*   SUFFICIENT SPACE FOUND
* 
	LDKL	A1,/8000	USED BIT 
	ORS	A1,MXIND+2,A5	MARK ENTRY USED
	LDR	A7,A12 
	ANK	A7,/0E 
	ST	A3,OPEMXI,A7	MASTER INDEX ADDR
	LD	A7,FPB:FR+2,A9
	STR	A7,A3	NO OF ENTRIES
	LD	A1,FPB:RL,A9
	ST	A1,2,A3	ENTRY LENGTH
	ADK	A3,4	SKIP MX HEADRER 
	ST	A3,ECBBA,A8	BUFFER ADDR 
	ST	A1,ECBRL,A8	REQ LGTH
	LDR	A1,A5	MXIND ENTRY PAR TO REACTIVATION
	CWR	A1,A4	MXIND ENTRY
	RF(NL)	DMT590	LAST ENTRY 
	LD	A3,MXIND+6,A1 
	RF(N)	DMT590	NEXT ENTRY USED 
* 
*   MOVE SPARE WORDS TO NEXT ENTRY
* 
	LD	A2,MXIND+2,A1 
	ANKL	A2,/7FFF	REMOVE USE BIT 
	SUR	A2,A6
	ORKL	A2,/8000	USE BIT
	ST	A2,MXIND+2,A1 
	ADS	A6,MXIND+6,A1	MAKE NEXT ENTRY LARGER 
	LD	A7,MXIND,A1	PREVIOUS POINTER
	SLL	A2,1	NO OF BYTES 
	ADR	A7,A2
	ST	A7,MXIND+4,A1 
	EJECT
DMT590	EQU	*
* 
*   NOW READ MASTER INDEX WITH SEQUENTIAL READ
* 
	LDKL	A7,/0082	SEQ READ 
	LKM
	DATA	1 
	LD	A2,ECBRC,A8 
	ANKL	A2,/FEFF	BIT 7 ONLY RETRIES 
	RF(Z)	DMT560	NO ERROR
* 
*   REMOVE THE ONLY CRN BUFFER
* 
	LDR	A4,A11	FDB ADDR
	LD	A5,FDBCRL,A4	CRN BUF ADR
	RF(Z)	DMT553	NO CRN
	CM	FDBCRL,A4 
	INH
	LD	A6,CRNQUE 
	STR	A6,A5
	ST	A5,CRNQUE 
	ENB
DMT553	EQU	*
	LDR	A1,A2
	ANKL	A2,/1000	BIT 3 = EOF
	RF(NZ)	DMT595	READY ,WHOLIE MXINDEX IS READ
	ABL	OPEER2	ERR 
DMT560	EQU	*
* 
*   RECORD READ,READ NEXRT
* 
	LD	A2,ECBRL,A8 
	ADS	A2,ECBBA,A8	REC LENGTH 
	RB	DMT590	READ NEXT RECORD 
DMT570	EQU	*
	LDK	A6,NOCORE	CORE EXHAUSTED 
	ABL	OPEERQ 
*   CLOSE MASTER INDEX FILE 
* 
DMT595	EQU	*
	ST	A10,-34,A14	CLOSE FC ENTRY
	LDR	A8,A10	FWT ADDR
	ADKL	A8,FDBECB	ECB ADDR
	CM	FPB:FR+2,A9	DO NOT WRITE LRN
	LDR	A7,A12	LOOP COUNT
	SRL	A7,1 
	LC	A7,OPEFNR,A7	FILE NR
	SC	A7,ECBFC,A8 
	ST	A9,ECBBA,A8	PAR BLOCK ADDR
	LDK	A7,/A2	CLOSE 
	CF	A14,CLRBUF	RELEASE ALL FREE BUFFERS 
	LKM
	DATA	15
	LDR	A1,A10	MAIN FDB
	CF	A14,DMTIOT	ERR CHECK
	LDR	A1,A1
	ABL(NZ)	OPEER2 
	LDKL	A9,OPEFPB	FPB ADDR
	RF	OPE700	NEXT FILE
	EJECT
OPE600	EQU	*	INDEX FILE 
* 
*   UPDATE PAR BLOCK
* 
	LD	A3,OPEFWT	DATA FILE FDB ADDR
	LC	A2,FDBNIF,A3	 
	CM	FPB:NI,A9	FILLER
	SC	A2,FPB:NI,A9	NR OF INDEX
	LDR	A3,A12 
	SRL	A3,1 
	LDR	A2,A3
	LDR	A4,A9
	LDKL	A5,FPB:I2 
	SUKL	A5,FPB:I1	OFFSET
	SUR	A4,A5
OPE630	EQU	*
	ADR	A4,A5	REL ADDR 
	SUK	A2,1	NEXT INDEX
	RB(NZ)	OPE630
	ECR	A3,A3
	ADK	A3,1	TYPE DUPL 
	ST	A3,FPB:I1,A4	ID AND TYPE
	CM	FPB:I1+2,A4 
	CM	FPB:I1+4,A4 
	LDK	A7,1 
	ST	A7,FPB:I1+6,A4	NR OF ITEMS
	LD	A7,FDBKA,A11	KEY OFFSET 
	ST	A7,FPB:A1,A4	KEY ADDR 
	LD	A7,FDBRLE,A11	REC LGTH
	SUK	A7,6 
	CM	FPB:L1,A4	FILLER
	SC	A7,FPB:L1,A4	KEY LENGTH 
	ADK	A7,8 
	SRL	A7,1	WORD
	CWK	A7,RECBFZ
	ABL(G)	OPEER8	LONG KEY 
	EJECT
* 
*   CALCULATE INDEX SIZE
* 
	LD	A1,FPB:S1,A9
	LD	A2,FPB:S1+2,A9	SIZE IN SECTORS
	LC	A6,FDBBLZ,A11	BLOCK SIZE
	ANK	A6,/FF 
	CF	A14,DIVMOD
	ABL(O)	OPEER3	LONG FILE
	CM	FPB:IS,A9 
	ST	A2,FPB:IS+2,A9	SIZE IN BLOCKS 
* 
*   GET INDEX VOLUME NAME 
* 
	LDKL	A1,FPB:V1 
	LDK	A3,FPB:IV
	ADR	A1,A9	FROM ADDR
	ADR	A3,A9	TO 
	LDK	A2,6	LGTH
	CF	A14,DMTBM	MOVE
	XIF
	EJECT
* 
OPE700	EQU	*	NEXT FILE
	IFF	INDXAC=1	NO INDEX
	RF	OPE900	NO INDEX 
	XIF
	IFT	INDXAC=1	INDEXES YES 
	SUKL	A12,1	FILE LOOP 
	CWK	A12,1
	ABL(NG)	OPE900	ALL INDEXES ARE OPENED
	CWK	A10,FDBSTA 
	RF(NE)	OPE740	READ FILE PAR ORDER
* 
*   SKIP MASTER INDEX AT SECONDARY OPEN 
* 
	LD	A1,OPEFWT	DATA FILE 
	LC	A1,FWTPAR,A1
	ANK	A1,/3E	NR OF OPEN BEYOND 1 
	RF(Z)	OPE710	FIRST 
	ANKL	A12,/E	NO MASTER INDEX
OPE710	EQU	*
* 
*   NEXT FILE NAME
	LDR	A7,A12 
	SLL	A7,1	WORD ADDR 
	LD	A1,OPEFN,A7	FIRST 2 CHAR IN FILE NAME 
	ST	A1,FPB:FN,A9	FILE NAME
* 
*   FETCH VOLUME NAME FOR INDEXES 
* 
	LDKL	A1,INDVOL	FROM ADDR 
	LDR	A3,A9
	ADKL	A3,FPB:V1	TO ADDR 
	LDK	A2,6 
	CF	A14,DMTWM	MOVE VOLUME NAME
* 
*   MOVE SPACES TO OTHER VOLUME NAMES 
* 
	LDK	A6,30	NR OF VOLUME NAMES * 10
OPE750	EQU	*
	SUK	A6,10
	RF(N)	OPE770	ALL 
	LDKL	A1,OPESPA	FROM ADDR 
	LDR	A3,A9
	ADKL	A3,FPB:V2 
	ADR	A3,A6	TO ADDR
	LDK	A2,6	NR OF CHAR
	CF	A14,DMTWM 
	RB	OPE750
OPE740	EQU	*	GET FILE NR FOR READ FILE PAR
	LDR	A7,A12 
	SRL	A7,1 
	LC	A6,OPEFNR,A7
OPE770	EQU	*
	CM	DELAY	NO DELAY FOR INDEXES
	CM	NROFIX	NO INDEX FOR NEXT FILE 
	ABL	OPE100 
	XIF
	EJECT
OPE800	EQU	*	DATA FILE
* 
*   UPDATE USER PAR BLOCK 
* 
	LC	A2,FDBNIF,A11 
	ANK	A2,/FF 
	RF(Z)	OPE830	NO INDEX
	LDK	A2,1 
OPE830	EQU	*
	SC	A2,FPB:FO,A9	FILE ORG 
	LDK	A2,1 
	SC	A2,FPB:FO+1,A9	DEVICE TYPE
	LC	A2,OPEFNR	FILE NR 
	SC	A2,FPB:FM,A9
	LD	A2,FDBDBR,A11 
	SRL	A2,14
	SC	A2,FPB:BO,A9	DELAY BASIC TOSS OPTIONS 
* 
*   CONVERT SIZE TO NR OF RECORDS 
* 
	LDK	A5,3	4 VOLUMES 
	LDR	A13,A9 
OPE850	EQU	*
	LD	A1,FPB:S1,A13	LENGTH IN SECTORS 
	LD	A2,FPB:S1+2,A13 
	LC	A6,FDBBLZ,A11	NR OF SECT IN BLOCK 
	ANK	A6,/FF 
	CF	A14,DIVMOD
	ABL(O)	OPEER3	OVERFLOW 
	LDR	A6,A2	NR OF BLOCKS 
	LC	A7,FDBBLF,A11	NR OF REC IN BLOCK
	ANK	A7,/FF 
	CF	A14,MPYMOD	NR OF RECS 
	ST	A1,FPB:S1,A13 
	ST	A2,FPB:S1+2,A13 
	ADKL	A13,10
	SUK	A5,1 
	RB(NN)	OPE850	MORE VOLUMES 
* 
*   MOVE PART OF BLOCK TO USER
* 
	LDKL	A3,FPB:FR 
	SUKL	A3,FPB:RL	LENGTH
	LD	A4,DWTECB,A10	USER ECB ADDR 
	LD	A1,ECBRL,A4	REQ LENGTH
	SUK	A1,FPBRES	RESERVED 
	CWR	A3,A1
	RF(NG)	OPE860	TAKE SHORTEST
	LDR	A3,A1
OPE860	EQU	*
	LDR	A1,A3
	ADK	A1,FPBRES
	ST	A1,ECBEL,A4	SET EFFECTIVE LENGTH
	LDR	A1,A9	FROM ADDR
	IFT	MMUPAG=1 
	LD	A2,ECBBA,A4	TO ADDR 
	ADK	A2,FPBRES	RESERVED FIELD 
	LD	A4,DWTTAB,A10	TTAB ADDR USER
	CF	A14,MOV:SU
	XIF
	IFT	MMUPAG=0 
	LDR	A2,A3	LENGTH 
	LD	A3,ECBBA,A4	TO ADDR 
	ADK	A3,FPBRES	RESERVED ITEM
	CF	A14,DMTBM	MOVE
	XIF
* 
*   ADJUST FILE NAME FOR INDEXES
* 
	LDR	A1,A9
	ADKL	A1,FPB:FN	FROM ADDR 
	LDR	A3,A1
	ADK	A3,2	TO
	LDK	A2,6	NO OF CHAR
	CF	A14,DMTBMR	MOVE 
	ABL	OPE700 
	EJECT
OPE900	EQU	*	FINISH 
	LD	A11,OPEFWT	FDB ADDR DATA FILE 
	CWK	A10,FDBSTA 
	RF(NE)	OPE990	READ FILE PAR ORDER
* 
*   STORE FDB ADDRESSES IN ALL FDB'S
* 
	LDK	A5,10	NR OF FILES * 2
DMT625	EQU	*
	SUK	A5,2 
	RF(N)	DMT635	ALL FDB UPPDATED

	LD	A3,OPEFWT,A5	FDB ADDR INDEX 
	RB(Z)	DMT625	NO INDEX FILE 
	LDKL	A1,OPEFWT	FROM ADDR 
	ADKL	A3,FDBADF	TO ADDR 
	LDK	A2,10	NO OF BYTES
	CF	A14,DMTWM	MOVE 5 WORDS
	RB	DMT625
DMT635	EQU	*
* 
*   CONNECT FILE CODE OF DATA FILE
* 
	LD*	A2,DWTECB,A10	FILE CODE
	ANK	A2,/FF 
	SC	A2,OPEFCD	SAVE
	LDK	A5,0	TTAB AND CDTAB
	LD	A1,DWTTAB,A10	USER TTAB ADDR
	CF	A14,FNDFDB
	ST	A11,2,A4	FWT ADDR 
* 
*   REMOVE CURRENCY BUFFER
* 
	LDR	A1,A10 
	CF	A14,CRNGET	ADDR IN A2 
	ADKL	A1,FDBCRL	ROOT
	INH
OPE940	EQU	*
	LDR*	A3,A1	NEXT BUFFER 
	CWR	A3,A2
	RF(E)	OPE950	THIS
	LDR	A1,A3
	RB	OPE940
OPE950	EQU	*
	LDR*	A4,A3	NEXT
	STR	A4,A1
	LD	A3,CRNQUE 
	STR	A3,A2
	ST	A2,CRNQUE 
	ENB			=1 
OPE990	EQU	*
* 
*   CHECK USER SIZE AND UPDATE PARAMETER BLOCK
* 
	LDK	A1,FPB:IV
	LC	A2,FDBNIF,A11	NR OF INDEX 
	ANK	A2,/F
	IFT	INDXAC=1 
	RF(Z)	OPE994 
	LDR	A3,A2
	SLL	A2,3 
	SLL	A3,2 
	ADR	A2,A3	MULT WITH 12 
	ADK	A2,FPB:I1
	SUR	A2,A1	MAX NR OF REM CHAR 
OPE994	EQU	*
	XIF
	ADR	A1,A9	FROM ADDR
	LD	A3,DWTECB,A10	USER ECB
	LD	A4,ECBRL,A3	TOT LGTH
	SUK	A4,FPB:IV+FPBRES 
	CWR	A2,A4	REM LGTH 
	RF(NG)	OPE995	TAKE SHORTEST
	LDR	A2,A4
OPE995	EQU	*
	LDR	A4,A2
	ADK	A4,FPB:IV+FPBRES 
	ST	A4,ECBEL,A3	SET EFF LENGTH
	IFT	MMUPAG=0 
	LD	A3,ECBBA,A3	TO ADDR 
	ADK	A3,FPB:IV+FPBRES 
	CF	A14,DMTBM	MOVE
	XIF
	IFT	MMUPAG=1 
	LDR	A4,A2
	LD	A2,ECBBA,A3 
	ADK	A2,FPB:IV+FPBRES	TO ADDER
	LDR	A3,A4	LENGTH 
	LD	A4,DWTTAB,A10	USER TTAB ADDR
	CF	A14,MOV:SU
	XIF
	LDR	A6,A10	SYSTEM FWT ADDR 
	LDK	A1,0	RET CODE
	ABL	DMTERX	TENDIO+EXIT IN DMTASK 
	EJECT
DMCLOS	EQU	*	CLOSE
* 
*   A1 = A6 
*  (A3= BLOCK BUFFER ADDRESS )
*  (A5 = BLOCK ADDRESS )
*   A6 = FDB ADDRESS ALL ORDERS 
*   A7 = ORDER CODE ALL ORDERS
*  (A8 = FDBECB ADDRESS ) 
*  (A9 = USER ECB ADDRESS ) 
* 
	LD	A4,FDBDBR,A1
	RF(NN)	CLO200	NO DELAY 
	LDK	A7,/95	WRITE 
	LKM
	DATA	15	FM IO
	CF	A14,DMTIOT	ERR CHECK
CLO200	EQU	*
	CF	A14,DMTRBU	RELEASE BUFFER 
* 
*   CLEAR CURRENCY
* 
	LDR	A1,A6	FDB ADDR	=1
	CF	A14,CRNGET	GET CURRENCY BUFFER	=1 
	LDK	A1,0 
	SC	A1,CRNSTA,A2	STATUS 
	CM	CRNCDF,A2 
	CM	CRNCDF+2,A2 
	IFT	INDXAC=1 
	CM	CRNCIF,A2 
	CM	CRNCIF+2,A2 
	XIF
* 
*   BUILD CLOSE TABLES
* 
	LC	A7,ECBFC,A9	FILE CODE 
	LDK	A5,10	2 * FILES
CLO210	EQU	*
	SUK	A5,2 
	RF(N)	CLO300	ALL FILES 
	LDR	A4,A6
	ADR	A4,A5
	LDK	A1,0 
	LDK	A2,0 
	SUR	A8,A8
	SUR	A9,A9
	SUR	A10,A10
	LD	A3,FDBADF,A4	FDB ADDR 
	RF(Z)	CLO230	NO FILE 
	LD	A8,FDBMIA,A3	MASTER INDEX ADDR
	LC	A2,FWTFNR,A3	FILE NR
	LC	A9,FDBLRN,A3	LAST REC NR
	LD	A10,FDBLRN+1,A3 
CLO230	EQU	*
	ST	A8,OPEMXI,A5
	ST	A3,OPEFWT,A5
	LDR	A4,A5
	SRL	A4,1 
	SC	A2,OPEFNR,A4	FILE NR
	SC	A1,OPEFCD,A4	FILE CODE
	SLL	A4,2 
	ST	A9,OPELRN,A4	LAST REC NR
	ST	A10,OPELRN+2,A4 
	RB	CLO210	NEXT FILE
CLO300	EQU	*
	SC	A7,OPEFCD	FILE CODE 
	LDR	A10,A6	MAIN FDB ADDR 
	EJECT
OPEER1	EQU	*	RECOVERY AT ERRORS 
	LDR	A6,A10	MAIN FDB
	LD	A2,DWTOR,A10	ORDER
	ANK	A2,/FF 
	CWK	A2,QRFP	READ FILE PAR
	ABL(E)	DMTERX
*   FREE FILE CODES,MASTER INDEXES,FILES, CURRENCY
* 
	LDKL	A12,5 
OPEE10	EQU	*
	SUKL	A12,1 
	RF(NN)	OPEE20	MORE FILES 
	LDR	A6,A10	MAIN FDB ADDR 
	LDK	A1,0	RET CODE
	ABL	DMTERX 
OPEE20	EQU	*
*   RESET FILE CODE*
* 
	LC	A2,OPEFCD,A12	FILE CODE 
	ANK	A2,/FF 
	RF(Z)	OPEE25	NO CODE 
	LDK	A5,0	TTAB AND CDTAB
	LD	A1,DWTTAB,A10	USER TTAB ADDR
	CF	A14,FNDFDB
	LDR	A2,A2	RET CD 
	RF(Z)	OPEE25	NO ENTRY
	LDKL	A7,FDBSTA	SYSTEM FDB ADDR 
	ST	A7,2,A4	SYSTEM FWT ADDR 
OPEE25	EQU	*
	EJECT
* 
*   RELEASE EA+CRN BUFFERS
* 
	LDR	A7,A12 
	SLL	A7,1	WORDS 
	LD	A11,OPEFWT,A7	FDB ADDR
	RF(Z)	DMT894	NO FDB
	LDR	A1,A11 
	LDKL	A2,/C000
	SUR	A9,A9
	CF	A14,EARELB	REL PROTECT BUFFERS
	ENB
	LC	A5,FWTPAR,A11	
	ANK	A5,/3F	NR OF USERS 
	SUK	A5,1 
	RF(NZ)	DMT894	MORE THAN ONE OPEN 
	LD	A5,FDBEAL,A11	PRO LINK
	ABL(NZ)	TASHLT	DM ERR
	EJECT
* 
*   RELEASE CURRENCY BUFFERS
* 
	LDKL	A5,FDBCRL 
	ADR	A5,A11	LINK ROOT 
	LDR*	A4,A5 
	CMR	A5	CLEAR FDB 
	RF	DMT830
DMT820	EQU	*
	LDR	A4,A5	BUFFER ADDRESS 
DMT830	EQU	*
	RF(Z)	DMT840	ALL BUFFER S REMOVED
	LDR*	A5,A4	NEXT BUFFER ADDRESS 
* 
*   RETIURN BUFFER TO POOL
* 
	INH
	LD	A3,CRNQUE 
	STR	A3,A4
	ST	A4,CRNQUE 
	ENB
	RB	DMT820
	EJECT
DMT840	EQU	*
	IFT	INDXAC=1 
*   RELEASE MASRTER INDEX 
* 
	LD	A1,OPEMXI,A7	MASTER INDEX ADDR
	RF(Z)	DMT894	NO MX 
	LD	A5,MXIND	LENTH
	SUK	A5,2 
DMT885	EQU	*
	SUK	A5,4 
	RF(Z)	DMT890	FIRST INDEX 
	RF(N)	DMT894	NO MATER IX 
	CW	A1,MXIND+2,A5 
	RB(NE)	DMT885
	LD	A4,MXIND,A5 
	RF(N)	DMT890	PREVIOUS ENTRY USED 
	LD	A4,MXIND+4,A5	NO OF WORDS 
	ANKL	A4,/7FFF	REMOV USE BIT
	ADS	A4,MXIND,A5	NR OF WORDS
	EJECT
* 
* 
*   MOVE UP REST OF MXIND 
* 
	LDKL	A1,MXIND+6
	ADR	A1,A5	FROM ADDR
	LDR	A3,A1
	SUK	A3,4	TO ADDR 
	LD	A2,MXIND
	SUR	A2,A5
	SUK	A2,2	NO OF CHAR
	CF	A14,DMTWM	MOVE UOP
	RF	DMT894
DMT890	EQU	*
	LDKL	A4,/7FFF
	ANS	A4,MXIND+4,A5	REMOVE USE BIT 
	XIF
	EJECT
* 
*   CLOSE FILE
* 
DMT894	LDR	A8,A10 
	ADKL	A8,FDBECB	ECB ADDR
	LDKL	A9,OPEFPB	FPB ADDR
	LDR	A7,A12 
	SLL	A7,2	2 WORD INDEX
	LD	A1,OPELRN,A7	LAST REC NR
	ST	A1,FPB:FR,A9
	LD	A1,OPELRN+2,A7
	ST	A1,FPB:FR+2,A9
	LC	A7,OPEFNR,A12 
	ANK	A7,/FF 
	RF(Z)	DMT898	NO FILE OPENED
	ST	A7,ECBFC-1,A8	FILE NR 
	ST	A9,ECBBA,A8	PAR BLOCK ADDR
	LDK	A7,/A2	CLOSE 
	CF	A14,CLRBUF	CLEAR FREE BUFFERS 
	LKM
	DATA	15
	LDR	A1,A10	MAIN FDB
	CF	A14,DMTIOT	ERR CHECK
	ORS	A1,ECBRC,A9	SEND CODE
DMT898	EQU	*
	ABL	OPEE10	NEXT FILE 
	END

Full view