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

⟦c52fc4326⟧

    Length: 55988 (0xdab4)
    Notes: pts_type(SC)
    Names: »DMTASK.SC«

Derivation

└─⟦245262b9f⟧ Bits:30009679 Philips computer tape "600220"
    └─⟦this⟧ »M:92NA/DMTASK.SC« 
└─⟦38a30a456⟧ Bits:30009662 Philips computer tape "600104"
    └─⟦this⟧ »M:92OD/DMTASK.SC« 
└─⟦470bcbfc6⟧ Bits:30009709 Philips computer tape "M_92LP"
    └─⟦this⟧ »M:92LP/DMTASK.SC« 
└─⟦6349b94c6⟧ Bits:30009684 Philips computer tape "600308"
    └─⟦this⟧ »M:92D1/DMTASK.SC« 
└─⟦726a6c4ca⟧ Bits:30009685 Philips computer tape "600309"
    └─⟦this⟧ »M:92D2/DMTASK.SC« 
└─⟦9ad21746d⟧ Bits:30009682 Philips computer tape "600304"
    └─⟦this⟧ »M:92NA/DMTASK.SC« 
└─⟦a25d6defe⟧ Bits:30009676 Philips computer tape "600210"
    └─⟦this⟧ »M:92NA/DMTASK.SC« 

PTS(SC)

	IDENT DMTASK 	REL 9.2 79-11-16  870105040920 

			=5, PR5649 
			REL 9.1 79-11-01 
			=4,CURRENCY INSERT 
			REL 9.1 79-07-02 
			=3,TEST KEY
			REL 9.1 79-07-02 
			=2,CH REQ
			REL 8.2
			=1,PR 790116 
			REL 8.2
****************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   DMTASK = HANDLES DATAMANAGEMENT DISC I/O
* 
* 
* 
* 
* 
****************************************************
* 
*   THIS MODULE IS ACTIVATED FROM TIODM.
* 
*   INPUT PARAMETERS: 
*   A1 = FDB ADDRESS
*   A2 = TID   TASK IDENT OF DMTASK  AT PRESENT NOT USED
* 
*   THE SECTOR TO BE ACCESSED IS DEFINED IN FDB (FDBDMI, -FC, -SNR).
*   ALL BUFFERS ARE CHECKED TO FIND OUT IF THIS SECTOR
*   IS ALREADY PRESENT IN A BUFFER. IF SO THE BUFFER STATUS IS SET
*   TO USED AND ACTIONS ACCORDING TO THE ORDER ARE TAKEN. IF NOT
*   THE SECTOR MUST FIRST BE READ INTO A FREE BUFFER. 
* 
*   ALL I/O LKM REQUESTS IN THIS MODULE ARE WITH ACTIVATION AND ARE 
*   FOLLOWED BY AN EXIT LKM REQUEST.
*   INDEX FILES ARE HANDLED IN SUBROUTINE RDNXTR WHERE
*   ALL I/O ARE MADE IN WAIT MODE 
* 
*   BY MEANS OF CONDITIONAL ASSEMBLY THE EXCLUSIVE ACCESS CHECK 
*   FOR INDEXED DELETE AND FOR INDEXED REWRITE AND
*   FOR RANDOM WRITE AND RANDOM DELETE CAN BE EXCLUDED. 
* 
*   QNOEXA=1   EXCLUSIVE ACCESS CHECK INCLUDED
*   QNOEXA=0   EXCLUSIVE ACCESS CHECK EXCLUDED
	EJECT
* 
*************** 
*   ENTRIES   * 
*************** 
* 
* 
	ENTRY	DMTASK 
	ENTRY	SQR	EXTERNAL CODE SEQ READ 
	ENTRY	QSW
	ENTRY	DMTWM
	ENTRY	QIRN,QIRR
	EJECT
* 
***************** 
*   EXTERNALS   * 
***************** 
* 
* 
	EXTRN	SCTTCT,SCTCDT
	EXTRN	TTB:ID	TASK IDENTIFICATION 
	EXTRN	TTB:TD,FDBSTA
	EXTRN	FNDTID 
	EXTRN	TENDIO 
	EXTRN	FDBECB 
	EXTRN	FDBSNR 
	EXTRN	FDBRRO 
	EXTRN	FDBRLE 
	EXTRN	FDBBLF 
	EXTRN	FDBTNR 
	EXTRN	FDBVTO 
	EXTRN	FDBCEX 
	EXTRN	FDBEXT 
	EXTRN	EXTDMI 
	EXTRN	EXTFC
	EXTRN	EXTLEN 
	EXTRN	EXTBAS 
	EXTRN	EXTELE 
	EXTRN	FDBLRN 
	EXTRN	FDBMIA 
	EXTRN	FDBEAL 
	EXTRN	FDBADF 
	EXTRN	FDBAI1 
	EXTRN	FDBCRL 
	EXTRN	FDBDBR,FDBMRN,FDBMRO 
	EXTRN	ECBFC
	EXTRN	ECBBA
	EXTRN	ECBRL
	EXTRN	ECBEL
	EXTRN	ECBRC
	EXTRN	ECBCW
	EXTRN	CLRBUF 
	EXTRN	BUFLNK 
	EXTRN	BUFDMI 
	EXTRN	BUFFC
	EXTRN	BUFSNR 
	EXTRN	BUFOR
	EXTRN	BUFSTA 
	EXTRN	CURBUF 
	EXTRN	DWTECB 
	EXTRN	DWTUEC 
	EXTRN	DWTOR
	EXTRN	DWTST,DWTTDM,DWTTQ 
	EXTRN	DWTWAT 
	EXTRN	DMTRBU	RELEASE A DISC BUFFER 
	EXTRN	VTLRN
	EXTRN	VLVBA
	EXTRN	VLVRL
	EXTRN	DMTIOT,DIVMOD
	EXTRN	MPYMOD,CHKKEY
	EXTRN	CALSNO 
	EXTRN	DSUMOD 
	EXTRN	EATEST,EASETB,CRNGET,EARELB,GTBKBU 
	EXTRN	QTJOB,GTLGRN 
	EXTRN	FNDKEY 
	EXTRN	CRNCIF,CRNCDF,CRNQUE 
	EXTRN	MXIND
	EXTRN	FDBKA,FDBNIF,RDNXTR
	EXTRN	FDBKEY	SAVE AREA FOR KEY IN INDEXED ACCESS 
	EXTRN	BUFAR1,BUFAR2,SECTLE,DMTIOZ,CRNUPD 
	EXTRN	MOV:US	MOVE FROM USER TO SYSTEM AREA 
	EXTRN	MOV:SU	MOVE FROM SYSTEM TO USER AREA 
	EXTRN	MONMMU 
	EXTRN	PRUN	TTAB ADDRESS OF RUNNING TASK
	EXTRN	TTB:MT	MMU TABLE 
	EXTRN	SCTPLD	PROGRAM LOADING DEVICE
	EJECT
* 
* 
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
*   CHECK OF EXCLUSIVE ACCESS BIT CAN BE EXCLUDED AT
*   RANDOM WRITE AND RANDOM DELETE BY SETTING X:A=0.
* 
* 
X:A	EQU	1 
X:B	EQU	0 
X:C	EQU	0 
X:D	EQU	1 
X:E	EQU	0 
* 
QNOEXA	EQU	00001
*   INDEXED ACCEXSS FUNCTIONS CAN BE OMITTED WITH 
*   INDXAC EQU 1 = INDEX ACCESS INCLUDED
*   INDXAC EQU 0 = INDEX ACCESS FUNCTIONS OMITTED 
INDXAC	EQU	00000
RECBFZ	EQU	00004	INDEX RECORD BUFFER SIZE IN WORDS
FLXDSC	EQU	X:D	FLEXIBLE DISC INCLUDED WHEN EQU 1
INSLAS	EQU	X:E	INSERT SAME KEY LAST WHEN = 1
* 
	EJECT			DMTASK 
* 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	1
* 
* 
*	A PROGRAM VERSION USING TOSS DISC PAGING
*	IS OBTAINED BY SETTING DSKPAG EQU 1.
* 
DSKPAG	EQU	0
* 
* 
*	A PROGRAM VERSION INCLUDING TOSS SWAPPABLE WORK 
*	BLOCKS IS OBTAINED BY SETTING SWPBLK EQU 1. 
* 
SWPBLK	EQU	0
* 
	EJECT
* 
************************
*   DATA DEFINITIONS   *
************************
* 
* 
EABIT	EQU	/20	EA-BIT IN DWT STATUS BYTE 
* 
VTOBLK	EQU	9	VTOC BLOCKING FACTOR 
* 
*   THE FOLLOWING INTERNAL ORDER CODES IS THE RELATIVE
*   POSITION IN TIODM-TABLE TIODMF
* 
QCL	EQU	0 
DMTAFU	DATA	DMCLOSE	CLOSE 
QRV	EQU	2 
	DATA	DMREVT	READ VTOC RECORD 
QIRN	EQU	4
	IFT	INDXAC=1 
	DATA	DMIRN	INDEXED READ NEXT 
QINS	EQU	6
	DATA	DMINS	INDEXED INSERT
QDEL	EQU	8
	DATA	DMDEL	INDEXED DELETE
QIRW	EQU	10 
	DATA	DMIRW	INDEXED REWRITE 
	DATA	DMIRR	INDEXED RANDOM RESAD
	XIF
QIRR	EQU	12 
	IFF	INDXAC=1 
	DATA	DMTERR,DMTERR,DMTERR,DMTERR,DMTERR
	XIF
QRD	EQU	14
	DATA	DMRDDE	RANDOM DELETE
QRW	EQU	16
	DATA	DMRDWR	RANDOM WRITE 
QRR	EQU	18
	DATA	DMRDRE	RANDOM READ
QREA	EQU	20 
	DATA	DMTERR	RELEASE EXCLUSIVE ACCESS 
QSW	EQU	22
	DATA	DMSQWR	SEQUENTIAL WRITE 
SQR	EQU	2	EXTERNAL ORDER CODE SEQ READ
QSR	EQU	24
	DATA	DMSQRE	SEQUENTIAL READ
QGCUR	EQU	26
	DATA	DMTERR	GET CURRENCY 
	IFT	INDXAC=1 
QINIX	EQU	28
	DATA	DMINIX	INSERT INDEX 
QDELX	EQU	30
	DATA	DMDELX	DELETE INDEX 
	XIF
	IFF	INDXAC=1 
	DATA	DMTERR,DMTERR 
	XIF
QGCURX	EQU	32 
	DATA	DMTERR	GET CURRENT INDEX
QRWD	EQU	34 
	DATA	DMRDWD	DELAYED RANDOM WRITE 
QRDD	EQU	36 
	DATA	DMRDDD	DELAYED RANDOM DELETE
QRRRB	EQU	38
	DATA	DMRRRB	RAND READ REL BUFF 
* 
VTOCRL	DATA	0	VTOC RECORD LENGTH
	EJECT
* 
**************
*   DMTFRL   *
**************
* 
*   ENTRY   DMTFRL   FIND RECORD LENGTH 
* 
*   INPUT   A1 = RETURN CODE IF INCORRECT LENGTH
*           A6 = FDB ADDRESS
*           A9 = USER ECB ADDRESS 
* 
*   OUTPUT  A2 = RECORD LENGTH TO BE USED 
*           A1 IS ORED INTO ECBRC IF ECBRL < REC LENGTH 
*           A2 IS STORED IN ECBEL 
* 
DMTFRL	EQU	*
	LD	A2,ECBRL,A9 
	CW	A2,FDBRLE,A6
	RF(E)	DMTF20	ECBRL = REC LENGTH
	RF(L)	DMTF10	ECBRL < REC LENGTH
	LD	A2,FDBRLE,A6	ECBRL > REC LENGTH 
	RF	DMTF20
DMTF10	ORS	A1,ECBRC,A9	SET RETURN CODE
DMTF20	ST	A2,ECBEL,A9	SET EFFECTIVE LENGTH
	RTN	A14
	EJECT
* 
************
*   DMTWM  *
************
* 
*   ENTRY   DMTWM   WORD MOVE 
* 
*   INPUT   A1 = FROM ADDRESS 
*           A2 = NO OF BYTES TO BE MOVED
*           A3 = TO ADDRESS 
* 
*           A4 WILL BE DESTROYED
* 
* 
DMTWM	EQU	* 
	SUK	A2,2 
	RF(N)	DMTW10	LAST WORD MOVED 
	LDR*	A4,A1 
	STR	A4,A3
	ADK	A1,2 
	ADK	A3,2 
	RB	DMTWM 
DMTW10	ANK	A2,/01 
	RF(E)	DMTW20 
	LCR	A4,A1	MOVE LAST CHAR 
	SCR	A4,A3
DMTW20	RTN	A14
	EJECT
* 
************* 
*   DMTBM   * 
************* 
* 
*   ENTRY   DMTBM   BYTE MOVE 
* 
*   INPUT   A1 = FROM ADDRESS 
*           A2 = NO OF BYTES TO BE MOVED
*           A3 = TO ADDRESS 
* 
*           A4 WILL BE DESTROYED
* 
*   OUTPUT A3 = NEXT CHAR 
* 
* 
DMTBM	EQU	* 
	SUK	A2,1 
	RF(N)	DMTB10	LAST BYTE MOVED 
	LCR	A4,A1
	SCR	A4,A3
	ADK	A1,1 
	ADK	A3,1 
	RB	DMTBM 
DMTB10	RTN	A14
* 
*   DMTBMR HAS THE SAME FUNCTION AS DMTBM BUT 
*   MOVES FROM THE END
* 
DMTBMR	ADR	A1,A2
	ADR	A3,A2
DMTB20	SUK	A2,1 
	RB(N)	DMTB10 
	SUK	A1,1 
	SUK	A3,1 
	LCR	A4,A1
	SCR	A4,A3
	RB	DMTB20
	EJECT
****DESCRIPTION*************************************
* 
*   FNDFDB WILL SEARCH TTAB AND SCTCDT FOR A FILE CODE
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = TTAB ADDR
*   A2 = FILE CODE TO SEARCH FOR
*   A5 NOT= 0  WHEN ONLY TTAB SHALL BE SEARCHED 
* 
****EXIT PARAMETERS*********************************
* 
*   A1 = UNCHANGED
*   A2 = FILE CODE. = 0 WHEN NO CODE IS FOUND 
*   A4 = TTAB/SCTCDT ENTRY ADDR WHEN CODE IS FOUND
*   A5 = 0 WHEN FOUND IN SCTCDT = 1 WHEN TTAB 
* 
****USED REGISTERS**********************************
* 
*   A1-A5 
* 
******************************************************
* 
*   LOOK FOR FILE CODE IN TTAB
* 
FNDFDB	EQU	*
	LD	A3,TTB:TD,A1	LENGTH DEV DESCR 
FND030	EQU	*
	SUK	A3,4	
	RF(NP)	FND040	FILE CODE NOT IN TTAB
	LDR	A4,A1
	ADKL	A4,TTB:TD		=1 
	ADR	A4,A3
	CWR*	A2,A4		=1 
	RB(NE)	FND030
*				=1 
	LDK	A5,1 
	RF	FND080	CODE FOUND IN TTAB 
* 
*   SEARCH FILE CODE IN SCTCDT
* 
FND040	EQU	*
	LDR	A5,A5
	RF(NZ)	FND060	ONLY TTAB IS SEACHED 
	LD*	A4,SCTCDT
FND050	EQU	*
	SUK	A4,4 
	RF(NP)	FND060	CODE NOT FOUND AT ALL
	LD	A3,SCTCDT 
	ADR	A3,A4
	CWR*	A2,A3		=1 
	RB(NE)	FND050
	AD	A4,SCTCDT 
	RF	FND080	CODE FOUND 
FND060	EQU	*
	LDK	A2,0	NO CODE 
FND080	EQU	*
	RTN	A14
	EJECT
* 
**************
*   DMTREM   *
**************
* 
*   ENTRY   DMTREM   MOVE RECORD FROM BUFFER TO USER RECORD AREA
* 
*   INPUT   RELATIVE REC OFFSET IN FDBRRO,A6
*           BUFFER ADDRESS IN A5
*           USER REC AREA IN ECBBA,A9 
*           RECORD LENGTH IN A2 
* 
* 
* 
*   MOVE THE RECORD 
*   IF (FROM) AND (TO) ADDRESSES BOTH EVEN THEN WORD MOVE 
*   IF (FROM AND (TO) ADDRESSES BOTH ODD THEN MOVE FIRST BYTE 
*      WITH BYTE INSTRUCTIONS AND THE REST WITH WORD MOVE 
*   ELSE USE BYTE MOVE INSTRUCTIONS FOR THE WHOLE REC 
* 
DMTREM	EQU	*
	LD	A1,FDBRRO,A6
	ADR	A1,A5	FROM ADDRESS 
* 
	IFT	MMUPAG=0 
	LDR	A4,A1
	LD	A3,ECBBA,A9	TO ADDRESS
	XRR	A4,A3
	ANK	A4,/01 
	RF(Z)	DMT210	BOTH ODD OR BOTH EVEN 
	CF	A14,DMTBM	ONE ODD AND ONE EVEN
	RF	DMT225
* 
DMT210	LDR	A4,A1
	ANK	A4,/01 
	RF(E)	DMT220	BOTH EVEN 
	SUK	A2,1	BOTH ODD
	LCR	A4,A1
	SCR	A4,A3
	ADK	A1,1 
	ADK	A3,1 
DMT220	CF	A14,DMTWM	WORD MOVE 
DMT225	EQU	*
	XIF
* 
	IFT	MMUPAG=1 
	LD	A4,DWTTDM,A6	GET TTAB ADDRESS 
	LC	A3,TTB:ID,A4	ID CALLING TASK
	CCK	A3,'##'
	RF(NE)	DMTREN	NOT DMTASK 
	LDK	A3,QRR 
	CC	A3,DWTOR+1,A6 
	RF(NE)	DMTREQ	NOT RANDOM READ
	LD	A4,DWTWAT,A6	PAR BLOCK ADDRESS
	LD	A4,4,A4	FDB ADDR INDEX FILE 
	LD	A4,DWTTDM,A4	USER TTAB
DMTREN	EQU	*
	INH
	TL	TTB:MT,A4	LOAD MMU REGISTERS
DMTREP	EQU	*
	LD	A4,PRUN	GET DM TTAB ADDRESS 
	TS	TTB:MT,A4	STORE USER MMU IN DM MMU TABLE
	ENB
	LDR	A3,A2	GET LENGTH 
	LD	A2,ECBBA,A9	GET RECEIVING BUFFER ADDRESS
	CF	A14,MOV:SU	MOVE RECORD FROM SYSTEM TO USER AREA 
	XIF
* 
	RTN	A14
	IFT	MMUPAG=1 
DMTREQ	INH
	TL	MONMMU	SYSTEM MMU 
	RB	DMTREP
	XIF
	EJECT
* 
*   SET UP A14 STACK
* 
GETA14	EQU	*
	LD	A14,PRUN	GET DM TTAB ADDRESS
	AD	A14,TTB:TD,A14	LENGTH DEVICE DESCR
	ADKL	A14,TTB:TD+32	STACK 
	RTN	A15	RETURN AND ENABLE
* 
	EJECT
* 
**************
*   DMTASK   *
**************
* 
* 
DMTASK	EQU	*
* 
*   SET UP A14 STACK
* 
	CF	A15,GETA14
	LDR	A6,A1	FDB ADDR 
	LDKL	A5,-1 
	CW	A5,FDBRRO,A6	SPECIAL PARAMETER -1 
	RF(E)	DMT090	FOR ORDERS XR,DX,IX  (SEE TIODM)
DMT020	EQU	*
	LD	A4,FDBDBR,A1
	RF(NN)	DMT025	NO DELAY 
	ANKL	A4,/C0FF
	LD	A2,DWTOR,A1 
	ANK	A2,/3F 
	CWK	A2,QCL 
	RF(E)	DMT024	CLOSE 
	CWK	A2,QRV 
	RF(E)	DMT024	READ VTOC 
	SUK	A2,QRRRB 
	RF(E)	DMT024	RAND READ REL BUFFER
	ORKL	A4,/100 
DMT024	EQU	*
	ST	A4,FDBDBR,A1
DMT025	EQU	*
	LDR	A8,A1
	ADKL	A8,FDBECB	ECB ADDR
	CF	A14,GTBKBU	GET BLOCK BUFFER 
	LDR	A2,A2
	RF(NN)	DMT080	BUFFER WAS BEFORE
* 
*   READ SECTOR INTO BUFFER AND EXIT
* 
	SUK	A5,QCL 
	RF(Z)	DMT030	CLOSE 
	LDK	A7,/11	PHYSICAL READ 
	LKM
	DATA	-1	I/O AND ACTIVATION 
	DATA	DMTAR1	DMTASK RESTART #1
	LKM
	DATA	3	EXIT
* 
DMT030	EQU	*	I/O WITH WAIT FOR CLOSE
	LDK	A7,/91 
	LKM
	DATA	1 
	RF	DMT050	CHECK RETURN CODES 
	EJECT
**************
*   DMTAR1   *
**************
*   RESTART POINT AFTER READ
* 
DMTAR1	EQU	*
* 
*   SET UP A14 STACK
* 
	CF	A15,GETA14
DMT050	EQU	*
	CF	A14,DMTIOT	CHECK RETURN CODES FROM DISC I/O 
	LDR	A1,A1
	ABL(NE)	DMTERR 
	LD	A5,ECBBA,A8 
	RF	DMT090
DMT080	EQU	*	ENTRY IF SECT ALREADY IN BUFFER
	LDR	A5,A3
	ADK	A5,8	SKIP BUFFER HEADER
	ST	A5,ECBBA,A8	PUT BUFFER ADDR IN ECB
DMT090	EQU	*
* 
*   HANDLE ACTUAL ORDER     ORDER INDEX IN DWTOR
* 
	ADK	A5,2	SKIP CYLID WORD 
	LD	A7,DWTOR,A6 
*			A7 = INTERNAL ORDER CODE
	ANK	A7,/3F 
	ABI	DMTAFU,A7	DMTASK FUNCTION TABLE
	EJECT
DMRRRB	EQU	*	RAND READ REL BUFF 
* 
DMSQRE	EQU	*	SEQUENTIAL READ
* 
DMRDRE	EQU	*	RANDOM READ
* 
*   CHECK STATUS   IF NOT USED THEN ERROR RETURN
* 
	LD	A2,FDBRRO,A6
	AD	A2,FDBRLE,A6
	ADR	A2,A5
	LDK	A1,0 
	CCR	A1,A2	STATUS BYTE IN A1
	RF(NE)	DMT200	USED 
	LDKL	A1,/800	NO DATA 
	ABL	DMTERR 
DMT200	LDK	A1,/8	INCORRECT LENGTH 
	CF	A14,DMTFRL	A2 := RECORD LENGTH
* 
*   MOVE THE RECORD 
* 
	CF	A14,DMTREM
* 
*   UPDATE CRN AND SET EXCLUSIVE ACCESS BIT 
* 
DMT230	EQU	*
	ABL	DMT400	PUT CRN AND EA
	EJECT
DMREVT	EQU	*	READ VTOC RECORD 
* 
DMCLOSE	EQU	*	CLOSE A FILE
* 
	LD	A2,FDBSNR,A6
	RF(NZ)	DMT270	VTOC SECTOR IN BUFFER
* 
*   VOLUME LABEL IN BUFFER
*   FIND VTOC SECTOR NUMBER AND RELATIVE RECORD OFFSET WITHIN SECTOR
*   FOR VTOC RECORD AND READ THIS SECTOR INTO BUFFER
* 
	LDR	A10,A6	SAVE FDB ADDR 
	LDR	A9,A8	SAVE ECB ADDR
	LD	A3,VLVRL-2,A5 
	ST	A3,VTOCRL 
	LDK	A6,VTOBLK	VTOC BLOCKING FACTIOR
	LD	A2,FDBVTO,A10	VTOC RECORD NUMBER
	LDK	A1,0 
	CF	A14,DIVMOD	A2=A1,A2/A6.A1=REMAINDRER
	LDR	A3,A2	QUOTIENT 
	LDR	A6,A10	FDB ADDR
	LDR	A2,A1	REST 
	RF(Z)	DMT240	REST = 0
	ADK	A3,1	RECORD IN NEXT SECTOR 
	RF	DMT250
DMT240	LDK	A2,VTOBLK	LAST RECORD IN SECTOR
DMT250	AD	A3,VLVBA-2,A5	VTOC BASE 
	ST	A3,FDBSNR,A6
	LDK	A3,0 
DMT255	SUK	A2,1 
	RF(Z)	DMT260 
	AD	A3,VLVRL-2,A5 
	ADK	A3,1	SKIP STATUS BYTE
	RB	DMT255
DMT260	ST	A3,FDBRRO,A6
* 
*   RELEASE BUFFER
* 
	LD	A3,ECBBA,A9 
	SUK	A3,8 
	CF	A14,DMTRBU	RELEASE BUFFER 
	CF	A14,CLRBUF	CLEAR FREE BUFFERS 
	ENB			ENB
	LDR	A1,A6	FDB ADDR 
	RB	DMT020	READ VTOC SECTOR 
	EJECT
DMT270	EQU	*
	SUK	A7,QRV 
	ABL(Z)	DMT500	READ VTOC RECORD 
*   CLOSE FILE
*   UPDATE VTOC LAST RECORD NUMBER
*   AND WRITE SECTOR BACK ON DISC 
	AD	A5,FDBRRO,A6
	LDK	A2,0 
	LC	A2,FDBLRN,A6
	SC	A2,VTLRN,A5 
	LD	A2,FDBLRN+1,A6
	ST	A2,VTLRN+1,A5 
*   CLOSE FILE. WRITE VTOC
* 
	LDK	A7,/95 
	LKM
	DATA	1 
* 
	LDR	A1,A6	FDBADDRESS IN A1 
	CF	A14,DMTIOT	CHECK RETURN CODES 
	LDR	A1,A1
	RF(NZ)	DMT724	ERROR
DMT720	EQU	*
	LD	A1,DWTTDM,A6	TTAB ADDR
*				=1 START 
	LD	A2,FDBMIA,A6	MASTER INDEX ADDR
	RF(Z)	DMT721	DATA FILE 
	LDK	A2,/FF	-1
DMT721	ADK	A2,1	0 OR 1
	ECR	A2,A2		=1 END
	LC	A2,ECBFC,A9	FILE CODE 
	LDK	A5,0	TRY LOCAL AND GLOBAL
	CF	A14,FNDFDB	GET ENTRY IN TTAB CDTADTAB 
	LDR	A13,A5	LOCAL/GLOBAL INDICATOR
	LDR	A2,A2
	RF(NZ)	DMT725	FC FOUND 
	LDKL	A1,/8000	REQ ERR
DMT724	ABL	DMTERR 
DMT725	EQU	*
	LD	A5,2,A4	FDB ADDRESS 
	LDR	A11,A4	SAVE TABLE ENTRY ADDR 
	LDR	A12,A1	SAVE TTEAB ADDR 
	SUR	A10,A10	MARK THAT FDB NOT SHALL BE RELEASED
	EJECT
*   CHECK IF THIS FDB ADDR IS USED ELEWHERE 
* 
*   SEARCH ALL TTABS
* 
	LD*	A2,SCTTCT
DMT730	EQU	*
	SUK	A2,2 
	RF(NP)	DMT780	NOT FOUND IN ANY TTAB
	LD	A3,SCTTCT 
	ADR	A3,A2
	LDR*	A1,A3 
	LC	A3,TTB:ID,A1	TASK ID
	CCK	A3,'##'
	RB(E)	DMT730	JUMP IF MONITOR TASK
	LD	A3,TTB:TD,A1
	ADKL	A1,TTB:TD+2	DEV DESCR TABLE +2
DMT770	EQU	*
	SUK	A3,4 
	RB(NP)	DMT730	NOT IN THIS TTAB 
	LDR	A4,A1
	ADR	A4,A3
	CWR*	A5,A4 
	RB(NE)	DMT770
	LDR	A7,A11	TTAB ENTRY
	ADK	A7,2	FDB OFFSET
	CWR	A4,A7
	RB(E)	DMT770	SAME ENTRY
	RF	DMT895	MORE USERS ON THIS FDB 
* 
*   NOW SEARCH SCTCDT 
* 
DMT780	EQU	*
	LD*	A4,SCTCDT
DMT790	EQU	*
	SUK	A4,4 
	RF(NP)	DMT800	THIS FDB HAS NO OTHER USER 
	LD	A2,SCTCDT 
	ADR	A2,A4
	CW	A5,2,A2 
	RB(NE)	DMT790
	LDR	A7,A4
	AD	A7,SCTCDT 
	CWR	A7,A11 
	RB(E)	DMT790	SAME ENTRY
	RF	DMT895	THIS FDB HAS MORE USERS
	EJECT
* 
*   NOW RELEASE THIS FDB
* 
DMT800	EQU	*
* 
*   RELEASE EA-BUFFERS
* 
	LDKL	A2,/8000	ALL EA-BUFFERS ARE RELEASED
	LDR	A1,A6	FDB ADDR 
	CF	A14,EARELB
* 
*   RELEASE CRN BUFFERS 
* 
	LDKL	A5,FDBCRL 
	ADR	A5,A6	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
DMT840	EQU	*
	IFT	FLXDSC=1 
* 
*   NOW CHECK DEVICE CODES. WHEN LAST FILE IS CLOSED ON 
*   A FLEXIBLE DISC UNIT, AN UNLOC IS MADE FOR THIS VOLUME
* 
	LDK	A1,4	EXTENT COUNTER
	LDR	A5,A6	FDB ADDR 
	ADKL	A5,FDBEXT+1	ZADDR OF FIRST VOL CODE 
	SUKL	A5,EXTELE	EXT LENGTH IN FDB 
	LDK	A4,0	FOR VOL CODE
DMT880	EQU	*
	ENB		SEE LABEL 910	ENB 
	SUK	A1,1	LOOP
	ABL(NN)	DMT900	CHECK THIS EXTENT 
	XIF
	IFT	INDXAC=1 
	EJECT
* 
*   ALL EXTENTS CHECKED 
*   RELEASE MASRTER INDEX 
* 
	INH
	LD	A1,FDBMIA,A6	MASTER INDEX ADDR
	RF(Z)	DMT894	NO MATER IX 
	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
* 
*   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
DMT894	EQU	*
	LDKL	A10,1	MARK THAT FDB SHALL BE RELEASED 
DMT895	EQU	*
	INH			INH
* 
*   DELETE TTAB/SCTCDT ENTRY
* 
	CMR	A11	FILE CODE
	CM	2,A11	FDB ADDR
* 
*   RELEASE DWT-QUEUQ IN THIS FDB-DWT 
* 
	LDR	A1,A6	FDBADDR
	ADKL	A1,DWTTQ	ADDR QUEUE START 
	LDR*	A5,A1	NEXT TTAB ADDR
	RF(Z)	DMTA20	NO Q
	CMR	A1	KILL ROOT 
DMTA10	LDR*	A1,A5	NEXT IN QUEUE 
	CF	A15,QTJOB	DISPATCH Q
	LDR	A5,A1	NEXT 
	RB(NZ)	DMTA10	MORE 
DMTA20	EQU	*
* 
*   NEXT ENTRY IN TTAB/CDATAB 
* 
	LDR	A1,A12	TTAB ADDR 
	LDK	A2,0 
	LC	A2,ECBFC,A9	FILE CODE USERT ECB 
	LDR	A5,A13	LOCAL/GLOBAL INDICATOR
	CF	A14,FNDFDB	SEARCH TTAB SCTCDT 
	LDK	A7,0	INDICATES A2 = 0
	IFT	INDXAC=1 
	LDR	A2,A2
	RF(Z)	DMTA30 
* 
*   MOV DWT TO NEXT FDB 
*   AN INDEX FILE SHALL ALSO BE RELEASED
* 
	LD	A7,2,A4	NEXT FDB ADDR TO CLOSE
	LDK	A1,2 
	ADR	A1,A6	FROM ADDR
	LDK	A3,2 
	ADR	A3,A7	TO ADDR
	LDK	A2,12	NO OF BYTES
	CF	A14,DMTWM	MOVE DWT
	IFT	MMUPAG=1 
	LD	A3,DWTUEC,A6
	ST	A3,DWTUEC,A7	MMU USER ECB ADDR
	XIF
	IFT	INDXAC=1 
	LD	A3,DWTTDM,A6
	ST	A3,DWTTDM,A7	MOVE 
	CM	FDBSNR,A7	SECTOR NR 
	LDKL	A3,FDBEXT 
	ADR	A3,A7
	ST	A3,FDBCEX,A7	1ST EXTENT 
	LDR	A10,A10		=1
	RF(Z)	DMTA30	NO RELEASE		=1
	LDKL	A3,/8000
	ST	A3,DWTST,A6	NOT BUSY
DMTA30	EQU	*
	XIF
	ENB			ENB
* 
*   RELEASE BUFFER
* 
	LD	A3,ECBBA,A8 
	SUK	A3,8 
	CF	A14,DMTRBU
* 
*   RELEASE FDB 
* 
	LDR	A10,A10
	RF(Z)	DMTA40	NO RELEASE
	IFT	INDXAC=1 
* 
*   REMOVE ALL OTHER REFERAENCES TO THIS FDB
* 
	LDK	A1,10	2*MAX NR OF FDBS 
DMTA50	SUK	A1,2	
	RF(N)	DMTA70	ALL FDBS CHECKED
	LDR	A2,A6
	ADR	A2,A1
	LD	A3,FDBADF,A2	OTHER FDB ADDR 
	RB(Z)	DMTA50 
	LDK	A4,10	2*MAX NR OF FDBS 
DMTA60	SUK	A4,2 
	RB(N)	DMTA50	ALL ADDR CHECKED IN OTHER FDB 
	LDR	A5,A3
	ADR	A5,A4
	CW	A6,FDBADF,A5
	RB(NE)	DMTA60
* 
*   DELETE THIS REFERENCE TO THE FDB THAT SHALL BE RELEASED 
* 
	CM	FDBADF,A5 
	RB	DMTA50
	XIF
	EJECT
DMTA70	EQU	*
	LDKL	A3,/FFFE
	INH			INH
	ANRS	A3,A6	SET FDB FREE
DMTA40	EQU	*
	CF	A14,CLRBUF	REMOVE ALL FREE BUFFERS
	LDR	A1,A7	NEW FDB ADDR 
	ABL(Z)	DMTERX	NO MORE FDBS 
	IFT	INDXAC=1 
	ENB			ENB
* 
*   FIND WHICH DMTASK IS NEXT AND ACTIVATE THAT 
* 
	LDK	A7,0 
	LC	A7,FDBEXT,A1	TASK 1ST EXT 
	ADKL	A7,'#D'	TASK ID 
	LKM
	DATA	-4
	DATA	DMTASK
	LKM
	DATA	3	EXIT
	XIF
	IFT	FLXDSC=1 
	EJECT
DMT900	EQU	*
*   UNLOCK FLEXDISC IN THIS LOOP
* 
*   REGISTERS 
*   A1 = EXTENT COUNTER 
*   A4 = LAST VOL CODE FLEXDOISC    A5 = EXT ADDR 
*   A6 = FDB ADDR 
*   A8 = ECB ADDR          A9 = DM ECB ADDR 
*   A10-A12 USED
* 
	ADKL	A5,EXTELE	EXT LENGTH IN FDB 
	LCR	A7,A5	VOLUME CODE
	ANK	A7,/FF 
	ABL(Z)	DMT880	NO CODE
* 
*   FLEXDICSC IF BIT 8-13 = 111110
* 
	ANK	A7,/F8 
	SUK	A7,/F8 
	ABL(NE)	DMT880	NO FLEXDISC 
* 
*   IF SAME FLEXDISC AS LAST, DO NOT SCHECK AGAIN 
* 
	CCR	A4,A5
	ABL(E)	DMT880	SAME 
* 
*   NOW SEARCH ALL FDBS FOR THOIS FLEXIBLE DISC VOL CODE
* 
DMT910	EQU	*
	LCR	A4,A5	SAVE VOL CODE
	LDKL	A3,FDBSTA	FDB LINK ROOT 
	INH			INH
	RF	DMT925
DMT920	EQU	*
	LDR*	A3,A3	FDB ADDR
DMT925	EQU	*
	ANKL	A3,/FFFE	  FDB ADDR 
	RF(Z)	DMT980	ALL FDBS CHECKED
	LDR*	A7,A3 
	ANK	A7,1 
	RB(Z)	DMT920	FREE
	CWR	A6,A3
	RB(E)	DMT920	CURRENT FDB 
	LDK	A7,4	EXTENT COUNTER
	LDR	A2,A3	FDB ADDR 
	ADKL	A2,FDBEXT+1 
*			ADDR OF 1ST VOL CODE
	SUKL	A2,EXTELE	EXT LENGTH IN FDB 
DMT930	EQU	*
	SUK	A7,1 
	RB(N)	DMT920	ALL EXTENTS CHECKED 
	ADKL	A2,EXTELE 
	CCR	A4,A2	VOLUME CODE
	ABL(E)	DMT880	CODE USED. NO UNLOCK 
	RB	DMT930	NEXT EXTENT
* 
*   ALL FSDBS CHECKED. MAKE UNLOAD
* 
DMT980	EQU	*
	ENB			ENB
* 
*   NOTE THAT ECBBUF IS ASSUMED NOT TO BE CHANGED 
*   WITH THIS REQUEST 
* 
	SC	A4,ECBFC,A8	VOL CODE
* 
	IFF	DSKPAG+SWPBLK=0
	LDK	A1,0 
	CC	A4,SCTPLD+1	CHECK FILE CODE 
	ABL(E)	DMT880	PROGRAM LOADING DEVICE?
	XIF
* 
	IFT	FLXDSC=1 
	LDK	A7,/B8	UNLOAD WAIT 
	LKM
	DATA	1 
	LD	A1,ECBRC,A8 
	ANK	A1,1	INOPER
	ABL(NZ)	DMTERR 
	ABL	DMT880	CHECK NEXT EXT
	XIF
	EJECT
DMT500	EQU	*	READ VTOC RECORD 
* 
	LD	A2,VTOCRL	VTOC REC LENGTH 
	CW	A2,ECBRL,A9 
	RF(NG)	DMT510	MOVE THE WHOLE VTOC REC
	LDK	A1,/8	INCORRECT LENGTH 
	ORS	A1,ECBRC,A9	SET RC BUT CONTINUE
	LD	A2,ECBRL,A9	MOVE WHAT USER TOLD YOU 
DMT510	EQU	*
	ST	A2,ECBEL,A9 
	CF	A14,DMTREM	MOVE RECORD
DMAEX	EQU	* 
	ABL	DMTAEX	EXIT
	EJECT
DMSQWR	EQU	*	SEQUENTIAL WRITE 
* 
DMRDWR	EQU	*	RANDOM WRITE 
* 
DMRDDE	EQU	*	RANDOM DELETE
* 
DMINS	EQU	*	INDEXED INSERT
* 
DMDEL	EQU	*	INDEXED DELETE
* 
DMIRW	EQU	*	INDEXED REWRITE 
* 
DMRDWD	EQU	*	DELAYED RANDOM WRITE 
* 
DMRDDD	EQU	*	DELAYED RANDOM DELETE
* 
*   TEST STATUS 
	LD	A10,FDBRRO,A6 
	AD	A10,FDBRLE,A6 
	ADR	A10,A5	STATUS BYTE ADDRESS 
	LDR	A11,A5	BUFFER ADDR 
	LDR	A1,A6	FDB ADDR 
	LD	A2,ECBCW+2,A9 
	ANK	A2,/FF 
	LD	A3,ECBCW,A9	LOG REC NR
	LDK	A4,0 
	CCR	A4,A10 
	RF(E)	DMS010	FREE
	IFT	INDXAC=1 
	LDR	A4,A7
	SUK	A4,QINS
	RF(E)	DMEAER	INDEXED INSERT
	XIF
	LDR	A4,A7
	SUK	A4,QSW 
	RF(E)	DMEAER	SEQ WRITE 
	IFT	QNOEXA=1 
*   NO EA-CHECK IF EA-BIT = 1 
* 
	LC	A4,DWTST,A6 
	ANK	A4,EABIT 
	RF(NZ)	DMS020	EA=1, NO CHECK 
*   EA MUST BE SET
* 
	CF	A14,EATEST
	LDR	A4,A4	RTN CODE 
	RF(NP)	DMEAER	NO EA THIS TASK
	XIF
	RF	DMS100
DMS010	EQU	*
	IFT	INDXAC=1 
	LDR	A4,A7
	SUK	A4,QIRW
	RF(Z)	DMERND	INDEXED REWRITE 
	LDR	A4,A7
	SUK	A4,QDEL
	RF(Z)	DMERND	INDEXED DELETE
	XIF
DMS020	EQU	*
	CF	A14,EATEST
	LDR	A4,A4	RTN CODE 
	RF(N)	DMEAER	EA OTHER TASK 
DMS100	EQU	*
	LDK	A1,0	SET STATUS FREE 
	IFT	INDXAC=1 
	LDR	A2,A7
	SUK	A2,QIRW
	RF(E)	CHK010	INDEXED REWRITE 
	LDR	A2,A7
	SUK	A2,QINS
	RF(E)	CHK010	INDEXED INSERT
	LDR	A2,A7
	SUK	A2,QDEL
	RF(E)	CHK010	INDEXED DELETE
	XIF
	LDR	A2,A7
	SUK	A2,QRD 
	RF(E)	DMT350	RANDOM DELETE 
	LDR	A2,A7
	SUK	A2,QRDD
	RF(E)	DMT350	DELAYED RANDOM DELETE 
	RF	DMT310	RW,RWD,SW
	IFT	INDXAC=1 
	EJECT
CHK010	EQU	*
*   INDEXED REWRITE,INDEXED INSERT AND INDEXED DELETE ENTERS HERE 
* 
*   COUNT NR OF INDEXES AND 
*   COMPARE KEYS IN FILE AND USER BUFFER
* 
	LDR	A1,A6	FDB ADDR 
	LDK	A5,8	MAX 4 INDEX 
	SUR	A12,A12	INDEX COUNTER
CHK040	EQU	*
	SUK	A5,2 
	RF(N)	CHK100	ALL INDEX CHECKED 
	LDR	A2,A1	FDB ADD
	ADR	A2,A5
	LD	A6,FDBAI1,A2	FDB ADDR INDEX FILE
	RB(Z)	CHK040	NO INDEX
	ADKL	A12,1	COUNT INDEX FILES 
	LD	A2,DWTOR,A1	ORDER	=3
	ANK	A2,/3F	ORDER INDEX 
	SUK	A2,QIRW
	RB(NE)	CHK040	NOT INDEXED REWRITE
* 
	IFT	MMUPAG=1 
	LDR	A7,A1	SAVE A1
	LD	A1,FDBKA,A6	GET KEY START ADDRESS 
	AD	A1,ECBBA,A9 
	LDKL	A2,FDBKEY	GET KEY SAVE AREA DISPLACEMENT
	ADR	A2,A6	ADD FDB ADDRESS
	LDR	A13,A2	SAVE A2 
	LD	A3,FDBRLE,A6	RECORD LENGTH
	SUK	A3,6	KEY LENGTH
	INH
	LD	A4,DWTTDM,A7	GET TTAB ADDRESS 
	TL	TTB:MT,A4	LOAD MMU REGISTERS
	LD	A4,PRUN	GET DM TTAB ADDRESS 
	TS	TTB:MT,A4	STORE USER MMU IN DM MMU TABLE
	ENB
	CF	A14,MOV:US	MOVE KEY TO FDB KEY AREA 
	LDR	A1,A7	RESTORE A1 
	LDR	A2,A13	RESTORE A2
	LD	A3,FDBKA,A6	GET KEY START ADDRESS 
	XIF
* 
	IFT	INDXAC=1 
	IFT	MMUPAG=0 
	LD	A2,FDBKA,A6	KEY START ADDR
	LDR	A3,A2
	AD	A2,ECBBA,A9	KEY IN BUFFER 
	XIF
* 
	IFT	INDXAC=1 
	AD	A3,FDBRRO,A1
	ADR	A3,A11	KEY IN FILE 
	LDK	A7,0 
	LD	A6,FDBRLE,A6	RECORD LENGTH
	SUK	A6,6	KEY LENGTH
	CF	A14,CHKKEY	COMPARE KEYS 
	CWR	A6,A7
	RB(E)	CHK040	KEY UNCHANGED CHECK NEXT
	LDR	A6,A1	FDB ADDR 
	LDKL	A1,/4000	KEY NOT FOUND
	RF	DMERR 
CHK100	EQU	*
	LDR	A6,A1	FDB ADDR 
	LD	A7,DWTOR,A6 
	ANK	A7,/3F	ORDER INDEX 
	LDK	A2,0 
	LC	A2,FDBNIF,A6
	CWR	A2,A12 
	RF(E)	DMT310	ALL INDEX IS EXISTING 
	LDKL	A1,/8000	REQ ERR
	RF	DMERR 
DMERND	LDKL	A1,/800	NO DATA 
	RF	DMERR 
	XIF
DMEAER	LDKL	A1,/2000	EA PROTECT 
DMERR	ABL	DMTERR
	EJECT
* 
*   MOVE RECORD 
* 
DMT310	EQU	*
	IFT	INDXAC=1 
	LDR	A2,A7
	SUK	A2,QDEL
	ABL(E)	DMXDEL	INDEXED DELETE 
	XIF
	LD	A2,FDBRLE,A6	RECORD LENGTH
	LD	A3,FDBRRO,A6
	ADR	A3,A11	TO ADDRESS
	LDR	A4,A3
	LD	A1,ECBBA,A9	FROM ADDRESS
* 
	IFT	MMUPAG=0 
	XRR	A4,A1
	ANK	A4,/01 
	RF(E)	DMT320	BOTH ODD OR BOTH EVEN 
	CF	A14,DMTBM	ONE ODD AND ONE EVEN
	RF	DMT340
* 
DMT320	LDR	A4,A3
	ANK	A4,/01 
	RF(E)	DMT330	BOTH EVEN 
	SUK	A2,1	BOTH ODD
	LCR	A4,A1
	SCR	A4,A3
	ADK	A1,1 
	ADK	A3,1 
DMT330	CF	A14,DMTWM	WORD MOVE 
* 
	XIF
* 
	IFT	MMUPAG=1 
	LDR	A3,A2	GET LENGTH 
	LDR	A2,A4	GET RECEIVING BUFFER ADDRESS 
	INH
	LD	A4,DWTTDM,A6	GET TTAB ADDRESS 
	TL	TTB:MT,A4	LOAD MMU REGISTERS
	LD	A4,PRUN	GET DM TTAB ADDRESS 
	TS	TTB:MT,A4	STORE USER MMU IN DM MMU TABLE
	ENB
	CF	A14,MOV:US	MOVE RECORD FROM USER TO SYSTEM AREA 
	XIF
* 
DMT340	EQU	*
* 
*   SET STATUS USED 
* 
	LDK	A1,/FF 
DMT350	SCR	A1,A10 
	LD	A3,FDBDBR,A6
	RF(NN)	DMT394	NO DELAY 
	LDR	A2,A7
	SUK	A2,QSW 
	RF(E)	DMT360	SEQUENTIAL WRITE
	LDR	A2,A7
	SUK	A2,QRWD
	RF(E)	DMT400	DELAYED RANDOM WRITE
	SUK	A7,QRDD
	RF(E)	DMT400	DELAYED RANDOM DELETE 
	RF	DMT390
*   WRITE IF LAST REC IN SECTOR 
* 
DMT360	LD	A4,FDBRRO,A6
	CW	A4,FDBMRO,A6
	RF(NE)	DMT400	NOT LAST RECORD
DMT390	LDK	A7,/05	BASIC WRITE 
	SLL	A3,1 
	RF(N)	DMT395	BASIC WANTED
DMT394	LDK	A7,/15	PHYSICAL WRITE
DMT395	EQU	*
* 
*   WRITE SECTOR ONTO DISC  AND EXIT
* 
	LDR	A1,A6	FDB ADDRESS AS PARAMETER 
	LKM
	DATA	-1	I/O AND ACTIVATION 
	DATA	DMTAR2	DMTASK RESTART #2
	LKM
	DATA	3	EXIT
	EJECT
* 
**************
*   DMTAR2   *
**************
* 
* 
DMTAR2	EQU	*	DMTASK RESTART AFTER WRITE 
* 
*   SET UP A14 STACK
* 
	CF	A15,GETA14
* 
	CF	A14,DMTIOT	CHECK DISC I/O 
	LDR	A1,A1
	RF(NZ)	DMTERR
	LDKL	A1,/C0FF
	ANS	A1,FDBDBR,A6	RELEASE BUFFER
DMT400	EQU	*
	LDR	A1,A6	FDB ADDR DATA FILE 
	LD	A2,ECBCW+2,A9 
	ANK	A2,/FF 
	LD	A3,ECBCW,A9	LOG REC NR
	LC	A11,ECBFC,A9	FILE CODE
	LD	A7,DWTOR,A1 
	ANK	A7,/3F	ORDER INDEX 
	LDK	A4,QSW 
	CWR	A7,A4
	RF(E)	DMT460	SEQ WRITE 
	LDK	A4,QRD 
	CWR	A7,A4
	RF(E)	DMT420	RAND DEL
	LDK	A4,QRDD
	CWR	A7,A4
	RF(E)	DMT420	DELAYED RANDEOM DELETE
	IFT	INDXAC=1 
	LDK	A4,QDEL
	CWR	A7,A4
	RF(E)	DMT420	INDEXED DELETE
	XIF
	LDR	A5,A2	SAVE REC NO PART 1 
	LDR	A9,A3
* 
*   UPDATE CRN
* 
	CF	A14,CRNGET	GET CRN BUFFER 
	LDR	A10,A2	BUFFER ADDR 
	IFT	INDXAC=1		=2 START 
	LDK	A3,QIRW
	CWR	A7,A3
	RF(E)	DMT410	INDEXED REWRITE 
	XIF			=2 END 
	CM	CRNCIF,A2 
*			CLEAR INDEX CRN 
	CM	CRNCIF+2,A2 
DMT410	EQU	*		=2
	LDR	A2,A5
	LDR	A3,A9
	ST	A2,CRNCDF,A10 
	ST	A3,CRNCDF+2,A10	CRN DATA FILE 
	SC	A11,CRNCDF,A10	CRN FIL E CODE 
	IFT	INDXAC=1 
	LDK	A4,QINS
	CWR	A7,A4
	RF(E)	DMT460	INDEXED INSERT
	XIF
DMT420	EQU	*
	LDK	A4,QSR 
	CWR	A7,A4
	RF(E)	DMT450	SEQ READ
	LDK	A4,QRR 
	CWR	A7,A4
	RF(E)	DMT450	RANDOM READ 
	LDK	A4,QRRRB 
	CWR	A7,A4
	RF(E)	DMT450	RAND READ REL BUFFER
DMT440	EQU	*
* 
*   RELEASE EA
* 
	CF	A14,EARELB	REL EA 
	RF	DMTAEX
DMT450	EQU	*
	LC	A4,DWTST,A1	DWTSTATUS 
	ANK	A4,EABIT	EA-BIT
	RF(NZ)	DMTAEX	EA=1. NO EA WANTED 
* 
*   CHECK IF EA IS SET ALREADY
* 
	CF	A14,EATEST	CHECK EA 
	LDR	A4,A4
	RF(NZ)	DMTAEX	EA ALREADY SET 
* 
*   SET EA
* 
	CF	A14,EASETB
	RF	DMTAEX
DMT460	EQU	*
* 
*   UPDATE LRN
* 
	SC	A2,FDBLRN,A1
	ST	A3,FDBLRN+1,A1
	IFT	INDXAC=1 
	LDK	A4,QINS
	CWR	A7,A4
	ABL(E)	DMINS2	INDEXED INSERT 
	XIF
	EJECT
DMTAEX	LDK	A1,0	CORRECT RETURN
* 
DMTERR	LD	A3,FDBDBR,A6
	RF(NN)	DMTEX1	NOT DELAY
	ANKL	A3,/3F00
	RF(NZ)	DMTERX	NO RELEASE OF BUFFER 
DMTEX1	LD	A3,ECBBA,A8 
	SUK	A3,8 
DMTEX2	EQU	*
	CF	A14,DMTRBU	RELEASE BUFFER AT A3 
DMTERX	EQU	*
	INH
*   A1 = RET CODE 
*   A6 = DWT ADDR 
	CF	A15,TENDIO
	ENB
EXIT	EQU	*
	LKM
	DATA	3 
	IFT	INDXAC=1 
	EJECT
DMIRR	EQU	* 
*			INDEXED RANDOM READ 
********************************************* 
	LD	A9,DWTECB,A1	USER ECB ADDR
	IFT	MMUPAG=0 
	LD	A8,ECBCW,A9	ADDR OF KEY 
	XIF
	IFT	INDXAC=1 
	IFT	MMUPAG=1 
	LDR	A8,A1	FDB ADDR 
	ADKL	A8,FDBKEY	KEY AREA ADDR 
	XIF
	IFT	INDXAC=1 
	SUR	A11,A11
	LC	A11,ECBCW+3,A9	NO OF CHAR 
*				=5 
	LDR	A13,A1 
	ADKL	A13,FDBECB	ECB ADDR 
	CF	A14,FNDKEY	GET INDEX RECORD 
DMR006	EQU	*	FROM INDEXED READ NEXT 
	LD	A9,DWTECB,A1
	LDR	A6,A1	FDB ADR
	LDKL	A8,FDBECB 
	ADR	A8,A6	ECB ADDRESS
	LDR	A2,A2	RETURN CODE
	RF(NZ)	DMI030	KEY NOT FOUND
* 
*   KEY RECORD FOUN 
*   CHECK IF NEXT RECORD HAS THE SAME KEY 
* 
	LD	A2,FDBRRO,A1	RECORD OFFSET
	ADK	A2,10	BUFFER HEADER
	ADR	A2,A3	REC ADDR 
	LD	A4,FDBRLE,A1	REC LENGTH 
	SUK	A4,6	KEY LENGTH
	ADR	A2,A4
	CC	A4,2,A2	DUPLICATE KEY CHAR
	RF(NE)	DMR020	NEXT KEY NOT SAME
	LDKL	A5,/200	BIT 6 
	ORS	A5,ECBRC,A9	NEXT KEY SAME
DMR020	EQU	*
* 
*   MOVE LOG REC NO TO ECB
* 
	LDK	A5,0 
	LC	A5,3,A2 
	SC	A5,ECBCW+3,A8 
	LC	A5,4,A2 
	ECR	A5,A5
	LC	A5,5,A2 
	ST	A5,ECBCW,A8 
* 
*   RELEASE BLOCK BUFFER
* 
	CF	A14,DMTRBU
	EJECT
* 
*   PERFORM RANDOM READ ON THOIS DATA RECORD
* 
	LDR	A6,A1	FDB ADDR 
	LC	A2,DWTST,A6	USER REQUESRT 
	ANK	A2,EABIT	GET EA BIT
	SLL	A2,1 
	LDK	A7,/A	RANDOM READ NO WAIT
	ORR	A7,A2	EA BIT 
* 
*   MOVE USER ECB 
* 
	LDR	A1,A9	FROM ECB ADDR
	LDR	A3,A8	TO ECB ADDR
	LDK	A2,6	NO OF CHAR
	CF	A14,DMTWM	MOVE ECB
	LDR	A1,A6	FDB ADDR 
	LKM
	DATA	-1
	DATA	DMTAR4
	LD	A7,ECBRC,A8 
	RF(N)	DMTAR4	REQ ERR 
	LKM
	DATA	3	EXIT
DMTAR4	EQU	*
* 
*   SET UP A14 STACK
* 
	CF	A15,GETA14
	LDR	A6,A1
	LDKL	A8,FDBECB 
	ADR	A8,A6	RR ECB 
	LD	A9,DWTECB,A6	USER ECB 
	LD	A1,ECBRC,A8 
	ORS	A1,ECBRC,A9	RET CODE TO USER 
	ANKL	A1,/EEF7	BIT 3,7 AND 12 NOT GRAVE ERROR 
	RB(NZ)	DMTERX	NOT OK 
* 
*   SET CRN FOR INDEX FILE
* 
	LD	A1,FDBADF,A6	FDB ADDR DATA FILEP
	CF	A14,CRNGET	GET CRN BUFFER ADDR
	LDR	A10,A2	CRN BUFFER ADDR 
	LDR	A1,A6	FDB ADDR INDEX FILE
	CF	A14,GTLGRN	GET INDE X LOG REC NO
	SC	A2,CRNCIF+1,A10 
	ST	A3,CRNCIF+2,A10	CRN INDEX FILE
	LC	A2,ECBFC,A9 
	SC	A2,CRNCIF,A10 
*			THAT WAS FILE CODE CRN
* 
*   SET RERTURN CODEXS
* 
	LD	A2,ECBEL,A8	EFFECTIVE LENGTH
	ST	A2,ECBEL,A9 
	LDK	A1,0	RETURN CODE 
	ABL	DMTERX	TENDIO
	EJECT
DMIRN	EQU	*	INDEXED READ NEXT 
********************************************* 
	LDR	A1,A6	FDB INDEX
	LD	A2,FDBRRO,A1	RECORD OFFSET
	LDR	A3,A5
	SUK	A3,10	BUFFER ADDR
DMI100	EQU	*
	ADR	A2,A3	BUFFADR
	ADK	A2,10	RECORD ADDR
	AD	A2,FDBRLE,A1	ADDR OF STATUS CHAR
	LDK	A5,/FF	USED MARK 
	CCR	A5,A2	STATUS 
	RF(E)	DMI120	USED
	LD	A4,FDBMRO,A1
	ST	A4,FDBRRO,A1	LAST REC IN SECT 
* 
*   CHECK IF END OF FILE
* 
	LDR	A9,A3	SAVE 
	CF	A14,GTLGRN	GET REC NR 
	CC	A2,FDBLRN,A1
	RF(L)	DMI106	NOT EOF 
	RF(G)	DMI105	EOF 
	CW	A3,FDBLRN+1,A1
	RF(L)	DMI106	NOT EOF 
DMI105	LDR	A3,A9
	RF	DMI030	EOF
DMI106	LDR	A3,A9	RESTORE
	RF	DMI010	NEXT REC 
DMI120	EQU	*	 
*   INDEX RECORD IS FOUND 
* 
	LDK	A2,0	MARK FOUND
	ABL	DMR006	CONT AS FOR INDEXED RAND READ 
DMI010	EQU	*
	CF	A14,RDNXTR	GET NEXT INDEX RECORD
	RB	DMI100	RECORD FOUND 
	LDR	A6,A1	FDB ADDR 
DMI030	LDKL	A1,/4000	KEY NOT FOUND
DMI035	EQU	*
	LDR	A3,A3	BUFFER ADDR
	ABL(Z)	DMTERX	NO BUFFER
	ABL	DMTERR	ERROR AND BUFFER
	EJECT
* 
DMINS2	EQU	*	INDEXED INSERT PART 2
* 
********************************************* 
	ENB			ENB
	LD	A3,ECBBA,A8 
	SUK	A3,8	BUFSTA
	CF	A14,DMTRBU	RELEASE BUFFER 
DMXDEL	EQU	*	INDEXED DELETE 
************************************************* 
	LDR	A11,A7	ORDER CODE
	LDR	A12,A8	PHYS ECB ADDR 
	LDK	A5,0 
	SC	A5,FDBDBR,A1	ZEROE INDEX FILE COUNTER 
	LDK	A5,8	NR OF INDEX * 2 
	LDR	A10,A1	FDB DATA
DXI020	SUK	A5,2 
	RF(N)	DXI100	ALL INDEXES 
	LDR	A6,A10 
	ADR	A6,A5
	LD	A1,FDBAI1,A6	FDB ADDR INDEX FILE
	RB(Z)	DXI020	NO INDEX
* 
*   GET FILE CODE FOR THIS FDB ADDR 
* 
	LD*	A6,SCTCDT
DXI030	SUK	A6,4 
	LD	A7,SCTCDT 
	ADR	A7,A6
	CW	A1,2,A7 
	RB(NE)	DXI030	SEARCH NEXT
	LDR	A8,A1	FDB INDEX
	ADKL	A8,FDBECB	ECB ADDR
	LC	A6,1,A7 
	SC	A6,ECBFC,A8	INDEX FILE
	LDR	A6,A11 
	SUK	A6,QINS
	RF(E)	DXI080	INDEXED DELETE
* 
*   GET ADDRESSS OF DATA RECORD 
* 
	LD	A6,ECBBA,A12	SECTOR ADDR
	ADK	A6,2	CYLID 
	AD	A6,FDBRRO,A10	ADDR DATA REC 
	AD	A6,FDBKA,A1	KEY OFFSET
	LDK	A7,/20	DELETE INDEX NOWAIT 
	RF	DXI090
DXI080	EQU	*
	LD	A9,DWTECB,A10	USER ECB ADDR 
	LD	A6,ECBBA,A9	USER BUFFER ADDR
	AD	A6,FDBKA,A1	KEY OFFSET
	IFT	MMUPAG=1 
	LDR	A6,A1
	ADKL	A6,FDBKEY	ADDR KEY AREA 
	XIF
	IFT	INDXAC=1 
	LDK	A7,/1F	INSERT INDEX NOWAIT 
DXI090	EQU	*
* 
*   A6 = KEY ADDRESS
* 
	ST	A6,ECBBA,A8 
*   A1 = FDB ADDR IN DE XFILE 
	LKM	 
	DATA	-1
	DATA	DMTAR5
	LD	A7,ECBRC,A8 
	RF(N)	DMTAR5	REQ ERR 
	RB	DXI020	NEXT INDEX DIRECT
DXI100	LKM
	DATA	3	EXIT
DMTAR5	EQU	*
	LD	A6,FDBADF,A1	FDB DATA FILE
	LD	A9,DWTECB,A6	USER ECB 
	LDKL	A8,FDBECB 
	ADR	A1,A8	ECB INSERT INDEX 
	ADR	A8,A6	ECB DISC IO
	LD	A1,ECBRC,A1	RET CODE BIT 10 AND 14 POSSIBLE 
	ORS	A1,ECBRC,A9	RC TO USER 
	LDK	A1,0	RETURN CODE 
	LC	A2,FDBDBR,A6	NR OF READY INDEX
	ADK	A2,1	COUNT INDEXES 
	CC	A2,FDBNIF,A6	TOT NR OF INDEX
	RF(NE)	DXI200
	LD	A7,DWTOR,A6 
	ANK	A7,/3F	ORDER CODE
	SUK	A7,QINS	INDEXED INSERT 
	ABL(E)	DMTERX	READY
*   RESTORE REGISTERS FOR INDEXED DELETE
* 
	LD	A10,FDBECB+2,A6	SECTOR ADDR 
	ADKL	A10,2	CYLID 
	AD	A10,FDBRRO,A6	
	AD	A10,FDBRLE,A6	ADDR STATUS CHAR
	LDK	A1,0	STATUS FREE 
	ABL	DMT350	CONTINUE AS FOR RANDOM DELETE 
DXI200	EQU	*
	SC	A2,FDBDBR,A6
	LKM
	DATA	3	EXIT. MORE INDEX LEFT 
	EJECT
DMINIX	EQU	*	INSERT INDEX 
* 
DMDELX	EQU	*	DELETE INDEX RECORD
********************************************* 
	LD	A9,DWTECB,A1	USER ECB ADDR
	LD	A8,ECBBA,A9	BUFFER ADDR USER
	LDR	A12,A8 
	LD	A11,FDBRLE,A1	RECORD LENGTH 
	SUKL	A11,6	KEY LENGTH
	LDR	A13,A14
	ADKL	A13,2	ECB ADDR TO RECORD BUFFER AREASS
	CF	A14,FNDKEY	GET INDEX RECORD 
	LDR	A6,A1	FDB ADDR 
	LDR	A1,A2	RET CODE 
	LDR	A3,A3
	ABL(Z)	DMI035	NO SECTOR FOUND
	LDR	A13,A3	BUFFER ADDR 
	LD	A4,FDBADF,A6	FDB DATA FILE
	LD	A5,DWTECB,A4	USER ECB 
	LD	A1,DWTOR,A6 
	ANK	A1,/3F 
	SUK	A1,QDELX 
	ABL(E)	DEL000	DELETE INDEX RECORD
* 
*   SET RC BIT 6 TO USER IF NEXT KEY
*   IS SAME IN REQUESTED INDEX
* 
	LDR	A2,A2
	RF(NZ)	INS050	NEXT KEY NOT SAME
*   (SHORT KEY NOT ALLOWED IN FILE) 
* 
	LC	A4,ECBFC,A5	FILE CODE 
	CC	A4,FDBECB+1,A6
	RF(NE)	INS049	NOT REQUESTED FILE CODE
	LDKL	A4,/200	BIT 6 
	ORS	A4,ECBRC,A5	NEXT KEY SAME
INS049	EQU	*
	IFT	INSLAS=1 
* 
*   INSERT SAME KEY LAST
* 
	LDR	A1,A6	FDB
	LD	A2,FDBRRO,A1	REC OFFS 
	RF	INS100
INS080	EQU	*
	CF	A14,RDNXTR	GET NEXT REC 
	RF	INS100	OK 
	ABL	DEL045	ERROR 
INS100	EQU	*
	ADR	A2,A3
	ADK	A2,10	REC ADDR 
	AD	A2,FDBRLE,A1	ADDR STATUS
	LDK	A5,/FF 
	CCR	A5,A2
	RF(E)	INS150	USED
	LD	A5,FDBMRO,A1
	ST	A5,FDBRRO,A1
	RB	INS080	GET FIRST RE C IN NXT SECT 
INS150	EQU	*
	LC	A5,-4,A2	DUPL KEY CHAR
	CWR	A5,A11	KEY LENGTH
	RB(E)	INS080	NEXT SAME GET NEXT
* 
*   UPDATE LAST SAME RECORD 
* 
	SC	A11,-4,A2	NEXT SAME 
	LD	A7,FDBRRO,A1
	CW	A7,FDBMRO,A1
	RF(NE)	INS160	SECT WRITTEN LATER 
* 
*   WRITE SECTOR
* 
	LDK	A7,/95	WRITE,WAIT
	LKM
	DATA	1 
	CF	A14,DMTIOZ	IO CHECK 
	LDR	A1,A1
	ABL(NZ)	DMTERR 
* 
*   GET NEXT RECORD 
* 
INS160	EQU	*
	LDR	A7,A5	NR OF SAME IN NEXT 
	LDR	A1,A6	FDB
	CF	A14,RDNXTR	GET NEXT RC
	RF	INS170	OK 
	ABL	DEL045	ERROR 
INS170	EQU	*
	LDR	A13,A3	BUFFER ADDR 
	LD	A5,FDBADF,A6
	LD	A5,DWTECB,A5	USER ECB ADDR
	XIF
	IFT	INDXAC=1 
INS050	EQU	*
* 
*   CREATE AN INDE XRECORD IN AREA 1
* 
	LDR	A1,A12	FROM ADDR 
* 
	LDR	A3,A14 
	ADK	A3,2	TO ADDR 
	LDR	A2,A11	KEY LENGTH
	CF	A14,DMTBM	MOVE KEY
	LDK	A2,0 
	SCR	A2,A3	DUMMY
	ADK	A3,1 
	SCR	A2,A3	DUMMY
	ADK	A3,1 
	SCR	A7,A3	NR OF SAME CHAR
	ADK	A3,1 
	LDR	A7,A3	ADDR OF LOG REC NR 
	LD	A2,ECBCW+2,A5 
	LD	A3,ECBCW,A5	REC NR DATA FILE REC
	SCR	A2,A7
	ADK	A7,2 
	SCR	A3,A7
	ECR	A3,A3
	SUK	A7,1 
	SCR	A3,A7	LOG REC NR 
	ADK	A7,2 
	LDK	A1,/FF	USED
	SCR	A1,A7	STATUS CHAR
	LDR	A1,A6	FDB INDEX
	CF	A14,GTLGRN	GET REC NR INDEX 
* 
*   SAVE RECORD NR FOR FIRST MOVED INDEX
* 
	ST	A2,-28,A14
	ST	A3,-26,A14
	EJECT
* 
*   BELOW IS A NEW INDEX RECORD INSERTED AND FOLLOWING
*   USED RECORDS ROLLED FORWARD 
*   A6,A11,A13 IS USED AT ENTRY 
	ADKL	A11,7	RECORD LENGTH TOTAL 
* 
*   USE D REGISTERS 
*   A6   = FDB ADDR INDEX 
*   A10  = AREA ADDR
*   A11  = RECORD LENGTH INDEX
*   A12  = AREA INDEX 0=BUFAR1,1=BUFAR2 
*   A13  = BUFFER ADDRESS SECTOR
* 
INS190	EQU	*
	LDKL	A12,1	BUFADR2 
INS200	EQU	*
	LDK	A1,0 
	LDR	A12,A12
	RF(Z)	INS210	BUFAR1
	LDKL	A1,RECBFZ	RECORD BUUFFER SIZE 
	SLL	A1,1	BYTE
INS210	LDR	A10,A14
	ADK	A1,2 
	ADR	A10,A1	RECORD BUFFER AREA ADDR 
* 
*   SAVE LAST RECORD
* 
	LDR	A1,A13 
	ADK	A1,10	BUFSTA+2 
	AD	A1,FDBMRO,A6	ADDR OF LAST REC IN SECT 
	LDR	A2,A11 
	LDR	A3,A10 
	CF	A14,DMTBM	SAVE LAST RECORD
*   MOVE REST OF SECTOR 
* 
	LDR	A1,A13 
	ADK	A1,10	BUFSTA+2 
	AD	A1,FDBRRO,A6	FROM ADDR
	LDR	A5,A1
	LD	A2,FDBMRO,A6
	SU	A2,FDBRRO,A6	NR OF CHAR 
	LDR	A3,A1
	ADR	A3,A11	TO ADDR 
	CF	A14,DMTBMR	MOVE 
*   INSERT NEW RECORD 
* 
	LDKL	A1,RECBFZ	BUFFER SIZE 
	SLL	A1,1	BYTE NO 
	LDR	A12,A12
	RF(Z)	INS250	BUFAR1
	LDK	A1,0	SELECT OTHER BUFFER 
INS250	EQU	*
	ADR	A1,A14	FROM ADDR 
	ADK	A1,2	FROM ADDR 
	LDR	A2,A11	NR OF CHAR
	LDR	A3,A5	TO ADDR
	CF	A14,DMTBM	MOVE
*   WRITE BUFFER
* 
	LDR	A8,A14	USE STACK AS ECB
	SUKL	A8,24 
	LC	A2,FDBEXT+1,A6	VOL DEV CODE 
	ANK	A2,/FF 
	STR	A2,A8	 
	LDR	A2,A13 
	ADK	A2,8	BUFSTA
	ST	A2,ECBBA,A8	SECTOR ADDR 
	LDKL	A2,SECTLE	SECTOR LGTH 
	ST	A2,ECBRL,A8 
	LD	A2,FDBSNR,A6	SECTOR NR
	ST	A2,ECBCW,A8	SECTOR NR 
	LDK	A7,/95	WRITE , WAIT
	LKM
	DATA	1 
	LDR	A1,A6	FDB INDEX
	CF	A14,DMTIOZ	IO CHECK 
	LDR	A1,A1
	ABL(NZ)	DMTERR 
* 
*   IF SPILLED RECORD IS FREE, OPERATION IS READY 
* 
	LDR	A2,A10	RECORD AREA ADDR
	ADR	A2,A11	REC LGTH
	SUK	A2,1	ADDR OF STATUS CHAR 
	LD	A4,FDBMRO,A6
	ST	A4,FDBRRO,A6	MAX OFFSET IN SECT 
	CCR	A1,A2
	RF(Z)	INS400	FREE RECORD 
* 
*   GET NEXT SECTOR 
* 
	LDR	A1,A6	FDB ADDR 
	LDR	A3,A13	BUFFER ADDR 
	CF	A14,RDNXTR	GET FIRST RECORD IN NEXT SECTOR
	RF	INS260	OK 
	LDR	A1,A5
	ABL	DMI035	ERROR 
INS260	EQU	*
	LDR	A13,A3	NEW BUFFER ADDR 
	LDR	A12,A12
	RB(Z)	INS190	SWITCH RECORD BUFFERS 
	SUR	A12,A12
	RB	INS200
	EJECT
INS400	EQU	*
* 
*   UPDATE LRN IF EOF IS ENCOUNTERED
* 
	LDR	A1,A6	FDB INDEX
	CF	A14,GTLGRN	 
	CC	A2,FDBLRN,A1
	RF(L)	INS430	NO EOF
	RF(G)	INS410	EOF 
	CW	A3,FDBLRN+1,A1
	RF(NG)	INS430	NO EOF 
INS410	EQU	*
	SC	A2,FDBLRN,A6	LLAST REC NR 
	ST	A3,FDBLRN+1,A6	 
	LDKL	A1,/1000	EOF
	ORS	A1,ECBRC,A9	EOF TO USER
INS430	EQU	*
* 
*   UPDATE CRN-LINK FOR MOVED INDEX RECORDS 
* 
	LDKL	A12,1	ADD ON E TO CRN 
	LDR	A8,A2
	LDR	A9,A3	LAST REC NR MOVED
	LD	A10,-28,A14 
	LD	A11,-26,A14	FIRST REC NR MOVED
	CF	A14,CRNUPD	ADD 1 TO RECORD NUMBERS
* 
*   UPDATE CRN IF SAME FILE CODE
* 
	LD	A1,FDBADF,A5	FDB DATA F 
	CF	A14,CRNGET	GET CRN BUFFER 
	LD	A9,DWTECB,A1	USER ECB ADDR	=4 
	LC	A4,ECBFC,A9	USER FILE CODE
	CC	A4,FDBECB+1,A5
	RF(NE)	INS440	OTHRER FILE
	ST	A10,CRNCIF,A2 
	ST	A11,CRNCIF+2,A2	REC NR
	SC	A4,CRNCIF,A2	FILE CODE
INS440	EQU	*
	LDR	A6,A5	FDB INDEX
	LDK	A1,0	OK RET CODE 
	LDR	A3,A13	BUFFER ADDR 
	ABL	DMTEX2 
	EJECT
DEL000	EQU	*	DELETE INDEX RECORD CONT 
	LDR	A12,A5	USER ECB ADDR 
	LDR	A2,A2
DEL010	EQU	*
	ABL(NZ)	DMI030	KEY NOT FOUND 
* 
*   CHECK RECORD NR DATA REC
* 
DEL020	EQU	*
	LD	A1,FDBRRO,A6
	ADR	A1,A3
	AD	A1,FDBRLE,A6
	ADK	A1,7	BUFSTA+2-3=ADDR REC NR
	LCR	A2,A1
	CC	A2,ECBCW+3,A12	REC NR 
	RF(NE)	DEL030	WRONG RECORD 
	LC	A2,1,A1 
	ECR	A2,A2
	LC	A2,2,A1	REC NR
	CW	A2,ECBCW,A12
	RF(E)	DEL200	RECORD FOUND
DEL030	EQU	*
* 
*   CHECK IF NEXT KEY SAME
* 
	CC	A11,-1,A1	KEY LENGTH
	RB(NE)	DEL010	NEXT KEY NOT SAME
	LDR	A1,A6	FDB INDEX
DEL040	EQU	*
	CF	A14,RDNXTR	GET NEXT INDEX RECORD
	RF	DEL050	OK 
DEL045	LDR	A1,A5	ERROR CODE 
	ABL	DMI035	ERROR 
DEL050	EQU	*
* 
*   CHECK IF RECORD IS USED 
* 
	LDR	A13,A3	NEW BUFFER ADDR 
	ADR	A2,A3
	ADK	A2,10	BUFSTA + 2 
	AD	A2,FDBRLE,A1	ADDR OF STATUS 
	LDK	A5,/FF 
	CCR	A5,A2
	RB(E)	DEL020	USED
	LD	A4,FDBMRO,A1
	ST	A4,FDBRRO,A1	LAST REC IN SECTOR 
	RB	DEL040	NEXT REC 
	EJECT
DEL200	EQU	*	RECORD FOUND 
* 
*   SET RC BIT 6 IF NEXT KEY SAME 
* 
	LC	A2,ECBFC,A12	USER FILE CODE 
	LDK	A7,0 
	LC	A7,-1,A1	NR OF SAME CHAR
	ST	A7,16,A14	SAVE IN RECORD BUFFER AFTER ECB 
	CC	A2,FDBECB+1,A6	 
	RF(NE)	DEL220	NOT REQUESTED FILE CODE
	CWR	A11,A7	KEY LENGTH
	RF(NE)	DEL220	NEXT KEY NOT SAME
	LDKL	A4,/200 
	ORS	A4,ECBRC,A12	NEXT KEY SAME 
DEL220	EQU	*
* 
*   MOVE UP RECORDS OVER DELETED
* 
	ADKL	A11,7	TOTAL RECORD LENGTH 
	LDR	A3,A13 
	ADK	A3,10	BUFSTA+2 
	AD	A3,FDBRRO,A6	TO ADDR
	LDR	A1,A3
	ADR	A1,A11	FROM ADDR 
	LD	A2,FDBMRO,A6
	SU	A2,FDBRRO,A6	NR OF CHAR 
	CF	A14,DMTBM	MOVE
* 
*   SET LAST RECORD FREE
* 
	ADR	A3,A11 
	SUK	A3,1 
	LDK	A1,0 
	SCR	A1,A3	STATUS FREE
* 
*   UPDATE CRN FOR MOVED RECORDS
* 
	LDR	A1,A6	FDB ADDR 
	CF	A14,GTLGRN	GET REC NR 
	LDR	A10,A2 
	LDR	A11,A3	FIRST REC NR MOVED
	LD	A12,FDBRRO,A6	OLD OFFSET
	LD	A4,FDBMRO,A6
	ST	A4,FDBRRO,A6	MAX OFFSET 
	CF	A14,GTLGRN	LAST REC NR MOVED
	LDR	A8,A2
	LDR	A9,A3	REC NR 
	ST	A12,FDBRRO,A6	RESET OFFSET
	LDKL	A12,-1
	CF	A14,CRNUPD	UPDATE CRN BUFFERS 
	LDKL	A12,1	MARK BUFFER CHANGED 
DEL240	EQU	*
	LD	A4,FDBRRO,A5
	RF(NZ)	DEL290	NOT FIRST RECORD 
	LDR	A1,A5	FDB
	CF	A14,GTLGRN	GET REC NR 
	LDR	A1,A2
	LDR	A2,A3
	LDK	A6,0 
	LDK	A7,1 
	CF	A14,DSUMOD	A1,A2 = A1,A2 - 1
	RF(Z)	DEL600	FILE START
	LDR	A6,A5	FDB ADDR 
	CF	A14,CALSNO	GET SECTOR NR
	LDR	A5,A6	FDB ADDR 
	LDR	A1,A1
	RF(NZ)	DEL600	FILE START 
	LDR	A8,A14 
	ADKL	A8,2	ECB ADDR 
	LDR	A12,A12
	RF(Z)	DEL245	BUFFER NOT CHANGED
* 
*   WRITE SECTOR
* 
	LDK	A7,/95	WRITE WAIT
	LKM
	DATA	1 
	LDR	A1,A5	FDB
	CF	A14,DMTIOZ	IO CHECK 
	LDR	A1,A1
	ABL(NZ)	DMTERR 
	SUR	A12,A12	BUFFER NOT CHANGED YET 
DEL245	EQU	*
	LDR	A3,A13 
	CF	A14,DMTRBU	RELEASE BUFFER 
* 
*   GET PREVIOUS SECTOR 
* 
	LDR	A1,A5	FDB ADDR 
	LDK	A3,0 
	CF	A14,RDNXTR	GET SECTOR 
	RF	DEL250	OK 
	LDR	A6,A1	FDB ADDR 
	RB	DEL045
DEL250	EQU	*
	LDR	A5,A1	FDB
	LDR	A13,A3	NEW BUFFER ADDR 
	LD	A4,FDBMRO,A5
	RF	DEL300
DEL290	EQU	*
	SU	A4,FDBRLE,A5
	SUK	A4,1 
DEL300	EQU	*
	ST	A4,FDBRRO,A5	PREVIOS RECORD OFFSET
	ADK	A4,10	BUFSTA+2 
	ADR	A4,A13	RECORD ADDR 
	AD	A4,FDBRLE,A5	STATUS CHAR ADDR 
	LDK	A2,/FF 
	CCR	A2,A4
	RB(NE)	DEL240	FREE 
	LC	A2,17,A14	NR OF SAME IN DELETED RECORD
	CC	A2,-4,A4
	RF(NL)	DEL600
	SC	A2,-4,A4	MAKE NR OF SAME SMALLER
	RF	DEL700	WRITE SECTOR 
DEL600	EQU	*
	LDR	A12,A12
	RF(Z)	DEL900	BUFFER NOT CHANGED
* 
*   WRITE SECTOR
* 
DEL700	EQU	*
	LDR	A8,A14 
	ADKL	A8,2	ECB ADDR 
	LDK	A7,/95	WRITE WAIT
	LKM
	DATA	1 
	LDR	A1,A5	FDB ADDR 
	CF	A14,DMTIOZ	IO CHECK 
	LDR	A1,A1
	ABL(NZ)	DMTERR 
DEL900	EQU	*
	ABL	INS440 
	XIF
	END

Full view