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

⟦1f1be03f4⟧

    Length: 36614 (0x8f06)
    Notes: pts_type(SC)
    Names: »DMTASK.SC«

Derivation

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

PTS(SC)

	IDENT DMTASK 	REL 10.0 80-05-28 870105041000 

			=4 , PR 6249 
			80-03-14 
			=3 ,DUPL KEY ONLY SEQ
			79-11-28 
			=2 , START NOT USED OK 
			79-11-22 
			=1 , INDEXED START NOT LESS
			79-11-02 
****************************************************
* 
*   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 BLOCK TO BE ACCESSED IS DEFINED IN FDB (FDBDMI, , -SNR).
*   ALL BUFFERS ARE CHECKED TO FIND OUT IF THIS BLOCK 
*   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 BLOCK MUST FIRST BE READ INTO A FREE BUFFER.
* 
	EJECT
* 
*************** 
*   ENTRIES   * 
*************** 
* 
* 
	ENTRY	DMTASK 
* 
*   FOLLOWING ENTRIES ARE USED BY MODULE DMOPCL 
	ENTRY	DMTERX,QOPEN,QRFP,QCL
	ENTRY	RECBFZ 
	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	FDBLRN 
	EXTRN	FDBMIA 
	EXTRN	FDBEAL 
	EXTRN	FDBADF 
	EXTRN	FDBAI1 
	EXTRN	FDBMEC,FWTVOL,FWTPAR 
	EXTRN	FWTFNR 
	EXTRN	FDBCRL 
	EXTRN	FDBDBR,FDBMRO,FDBDMI,FDBBLZ
	EXTRN	ECBFC
	EXTRN	ECBBA
	EXTRN	ECBRL
	EXTRN	ECBEL
	EXTRN	ECBRC
	EXTRN	ECBCW
	EXTRN	BUFLNK 
	EXTRN	BUFDMI 
	EXTRN	BUFFC
	EXTRN	BUFSNR 
	EXTRN	BUFOR
	EXTRN	BUFSTA 
	EXTRN	DWTECB 
	EXTRN	DWTOR
	EXTRN	DWTTAB,DWTOPT
	EXTRN	DMTRBU	RELEASE A DISC BUFFER 
	EXTRN	DMTIOT,CHKKEY
	EXTRN	CALSNO 
	EXTRN	DSUMOD 
	EXTRN	EATEST,EASETB,CRNGET,EARELB,GTBKBU 
	EXTRN	FNDKEY 
	EXTRN	CRNCIF,CRNCDF,CRNQUE 
	EXTRN	MXIND
	EXTRN	FDBKA,FDBNIF,RDNXTR
	EXTRN	FDBKEY	SAVE AREA FOR KEY IN INDEXED ACCESS 
	EXTRN	GTLGRN,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	SCTPLD	PROGRAM LOADING DEVICE
	EXTRN	DMOPEN,DMCLOS,DMRFP
	EXTRN	RELPRO 
	EXTRN	EOFRC,REQERR,NODERR,PROERR 
	EXTRN	PROT,KEYERR,NXTKYS 
	EXTRN	EOFERR 
	EXTRN	EOMERR 
	EXTRN	NOKEY
	EXTRN	DMTWM,DMTBM,DMTBMR,FNDFDB
	EXTRN	GETA14,DMTFRL,DMTREM 
	EJECT
* 
* 
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
* 
* 
X:B	EQU	0 
X:C	EQU	0 
X:E	EQU	1 
* 
*   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
INSLAS	EQU	X:E	INSERT SAME KEY LAST WHEN = 1
* 
* 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
	EJECT
* 
************************
*   DATA DEFINITIONS   *
************************
* 
*   THE FOLLOWING INTERNAL ORDER CODES IS THE RELATIVE
*   POSITION IN TIODM-TABLE TIODMF
* 
ORDERS	EQU	*
QRR	EQU	*-ORDERS
	DATA	DMRDRE	RANDOM READ
QSR	EQU	*-ORDERS
	DATA	DMSQRE	SEQUENTIAL READ
	IFT	INDXAC=1 
QIRR	EQU	*-ORDERS 
	DATA	DMIRR	INDEXED READ
QIRN	EQU	*-ORDERS 
	DATA	DMIRN	INDEXED READ NEXT 
	XIF
	IFT	INDXAC=0 
	DATA	DMTERR,DMTERR 
	XIF
QRW	EQU	*-ORDERS
	DATA	DMRDWR	RANDOM WRITE 
QSW	EQU	*-ORDERS
	DATA	DMSQWR	SEQUENTIAL WRITE 
	IFT	INDXAC=1 
QINS	EQU	*-ORDERS 
	DATA	DMINS	INDEXED INSERT
	XIF
	IFT	INDXAC=0 
	DATA	DMTERR
	XIF
	DATA	DMTERR	RESERVED 
QREWR	EQU	*-ORDERS
	DATA	DMREWR	RANDOM REWRITE 
	IFT	INDXAC=1 
QIRW	EQU	*-ORDERS 
	DATA	DMIRW	INDEXED REWRITE 
	XIF
	IFT	INDXAC=0 
	DATA	DMTERR
	XIF
QRD	EQU	*-ORDERS
	DATA	DMRDDE	RANDOM DELETE
	IFT	INDXAC=1 
QDEL	EQU	*-ORDERS 
	DATA	DMDEL	INDEXED DELETE
	XIF
	IFT	INDXAC=0 
	DATA	DMTERR
	XIF
QSTDIR	EQU	*-ORDERS 
	DATA	DMSTDI	START DIRECT 
	IFT	INDXAC=1 
QSTIND	EQU	*-ORDERS 
	DATA	DMSTIN	START INDEXED
	XIF
	IFT	INDXAC=0 
	DATA	DMTERR
	XIF
* 
*   FOLLOWING LABELS ARE FOUND IN MODULE DMOPCL 
* 
QOPEN	EQU	*-ORDERS
	DATA	DMOPEN	OPEN 
QCL	EQU	*-ORDERS
	DATA	DMCLOS	CLOSE
	DATA	DMTERR	READ STATUS DONE IN TIODM
QRFP	EQU	*-ORDERS 
	DATA	DMRFP	READ FILE PARAMETERS
	EJECT
**************
*   DMTASK   *
**************
* 
DMTASK	EQU	*
* 
*   SET UP A14 STACK
* 
	INH
	CF	A15,GETA14
	ENB
	LDR	A6,A1	FDB ADDR 
	LD	A5,FDBRRO,A6
	RF(N)	DMT090	FOR ORDERS XR  (SEE TIODM)
*			AND RFP,OPEN,STARTINDEXED 
	LD	A4,FDBADF,A6	DATA FILE
	CM	FDBKA,A4	MARK 1ST PASS INDEXED DEL
DMT020	EQU	*
* 
*   LOOP ENTRY FOR INDEXED READ,INDEXED NEXT,INDEXED DEL
*   START, AND SEQ READ 
* 
	LD	A7,DWTOR,A1	ORDER 
	ANK	A7,/3F 
	SUK	A7,QSR 
	RF(NZ)	SQR430	NOT SEQUENTIAL READ
	LD	A9,DWTECB,A1	USER ECB ADDR
* 
	LD	A2,ECBCW,A9 
	LD	A3,ECBCW+2,A9	REC NR
	CC	A2,FDBLRN,A1
	RF(L)	SQR430	NO EOF
	RF(G)	SQR410	EOF 
	CW	A3,FDBLRN+1,A1
	RF(NG)	SQR430	NO EOF 
SQR410	EQU	*
	LDKL	A1,EOFERR	EOF 
	ABL	DMTERX	ERR 
SQR430	EQU	*
	LDKL	A2,/CFFF
	ANS	A2,FDBDBR,A6	RELEASE BUFFER
	LDR	A8,A1
	ADKL	A8,FDBECB	ECB ADDR
	CF	A14,GTBKBU	GET BLOCK BUFFER 
	LDR	A2,A2
	RF(N)	DMT030	NO DATA IN BUFFER 
	EJECT
* 
*   DELAYED BUFFER IS WRITTEN 
*   IF IT IS NOT THE WANTED BLOCK 
* 
	LC	A7,BUFOR,A3	DELAY FLAG
	ANK	A7,/3
	RF(Z)	DMT080	NO DELAY
	CM	BUFOR,A3	RESET
	ANK	A7,1 
	RF(NZ)	DMT070	RIGHT SECTOR 
	LD	A7,BUFSNR,A3	SECT NR
	ST	A7,ECBCW,A8 
	LD	A7,BUFSNR+2,A3
	ST	A7,ECBCW+2,A8 
	LDK	A7,/95	WRITE WAIT
	LKM
	DATA	15
	CF	A14,DMTIOT	RET CODE CHECK AND RESET SECT NR 
	LDR	A1,A1
	ABL(NZ)	DMTERR	ERR 
	CF	A14,DMTRBU	RELEASE BUFFER 
	LDR	A1,A6	FDB ADDR 
	RB	DMT020	GET NEW BUFFER 
	EJECT
DMT030	EQU	*
*   READ BLOCK INTO BUFFER
* 
	LDK	A7,/91	PHYSICAL READ 
	LKM
	DATA	15	FM READ BLOCK
	CF	A14,DMTIOT	CHECK RETURN CODES FROM DISC I/O 
	LDR	A1,A1
	ABL(NZ)	DMTERR 
	LD	A5,ECBBA,A8 
	RF	DMT090
DMT070	EQU	*	RIGHT DELAYED BUFFER IS FOUND
	LDKL	A5,/1000
	ORS	A5,FDBDBR,A6	KEEP BUFFER 
DMT080	EQU	*	ENTRY IF SECT ALREADY IN BUFFER
	LDR	A5,A3
	ADKL	A5,BUFSTA	SKIP BUFFER HEADER
	ST	A5,ECBBA,A8	PUT BUFFER ADDR IN ECB
DMT090	EQU	*
	LDR	A1,A6
	LD	A7,DWTOR,A6 
*			A7 = INTERNAL ORDER CODE
	ANK	A7,/3F 
	ABI	ORDERS,A7	DMTASK FUNCTION TABLE
*   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 ) 
	EJECT
DMSQRE	EQU	*	SEQUENTIAL READ
* 
DMRDRE	EQU	*	RANDOM READ
* 
DMSTDI	EQU	*	START DIRECT 
* 
*   CHECK STATUS
* 
	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 
	CWK	A7,QRR 
	RF(E)	DMT190	RANDOM READ 
	CWK	A7,QSTDIR
	RF(NE)	DMT250	NOT START
	LC	A1,DWTOPT,A6	 
	ANK	A1,7	OPTION
	RF(NZ)	DMT250	NOT EQUAL
	RF	DMT230	EQUAL	=2 
DMT190	EQU	*
	LDKL	A1,NODERR	NO DATA 
	ABL	DMTERR 
	EJECT
DMT200	EQU	*
	SUK	A7,QSTDIR
	RF(Z)	DMT230	START 
	LD	A2,ECBRL,A9	REQ LGTH
	CW	A2,FDBRLE,A6	RECORD LGTH
	RF(NG)	DMT220
	LD	A2,FDBRLE,A6	MAX LGTH 
DMT220	ST	A2,ECBEL,A9	SET EFF LGTH
* 
*   MOVE THE RECORD 
* 
	CF	A14,DMTREM
* 
*   UPDATE CRN AND SET EXCLUSIVE ACCESS BIT 
DMT230	EQU	*
	ABL	DMT400	PUT CRN AND EA
	EJECT
DMT250	EQU	*	NO DATA AT SEQ READ
* 
*   GET NEXT RECORD 
* 
	LD	A2,ECBCW+2,A9	REC NR
	ADK	A2,1 
	RF(O)	DMT260	OVERFLOW
	RF	DMT270
DMT260	ANKL	A2,/7FFF
	IM	ECBCW,A9	CARRY
DMT270	ST	A2,ECBCW+2,A9 
DMT280	EQU	*
* 
*   CHECK EA
* 
	LDR	A1,A6	FDB ADDR 
	LD	A2,ECBCW,A9 
	LD	A3,ECBCW+2,A9	REC NR
	CF	A14,EATEST
	LDR	A4,A4	 
	ABL(N)	DMEAER	PROTECT ERROR
	IFT	INDXAC=1 
	LD	A4,DWTOR,A6	ORDER 
	ANK	A4,/3F 
	CWK	A4,QSTIND
	ABL(E)	DMT400	START INDEXED
	XIF
	LDR	A1,A2
	LDR	A2,A3	REC NR 
	EJECT
	LDR	A10,A8 
	CF	A14,CALSNO	PREP IO
	LDR	A8,A10 
	LDR	A1,A1
	ABL(NZ)	DMTERR	OUT OF MEDIUM 
	LDR	A1,A6	FDB ADDRESS
	LC	A3,FDBDBR,A6	DELAY
	ANK	A3,/10 
	RF(NZ)	DMT295	KEEP BUFFER
	LD	A3,ECBBA,A8 
	SUKL	A3,BUFSTA	BUFFER ADDR 
* 
*   RELEASE BLOCK BUFFER
* 
	CF	A14,DMTRBU
DMT295	EQU	*
	ABL	DMT020	NEXT RECORD 
	EJECT
DMSQWR	EQU	*	SEQUENTIAL WRITE 
* 
DMRDWR	EQU	*	RANDOM WRITE 
* 
DMREWR	EQU	*	RANDOM REWRITE 
* 
DMRDDE	EQU	*	RANDOM DELETE
* 
DMINS	EQU	*	INDEXED INSERT
* 
DMDEL	EQU	*	INDEXED DELETE
* 
DMIRW	EQU	*	INDEXED REWRITE 
* 
*   TEST STATUS 
	LD	A10,FDBRRO,A6 
	AD	A10,FDBRLE,A6 
	ADR	A10,A5	STATUS BYTE ADDRESS 
	LDR	A11,A5	BUFFER ADDR 
	LD	A2,ECBCW,A9 
	LD	A3,ECBCW+2,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)	DMS008	INDEXED INSERT
	XIF
	LDR	A4,A7
	SUK	A4,QRW 
	RF(E)	DMS008	DIRECT WRITE
	LDR	A4,A7
	SUK	A4,QSW 
	RF(NE)	DMS020	NOT SEQ WRITE
DMS008	EQU	*
	LDKL	A1,PROT	PROTECTED 
	RF	DMERR 
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
	LDR	A4,A7
	SUK	A4,QREWR 
	RF(Z)	DMERND	RANDOM REWRITE
	LDR	A4,A7
	SUK	A4,QRD 
	RF(Z)	DMERND	RANDOM DELETE 
DMS020	EQU	*
	CF	A14,EATEST
	LDR	A4,A4	RTN CODE 
	RF(N)	DMEAER	EA OTHER TASK 
DMS100	EQU	*
	LDK	A3,0	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
	LD	A2,FDBKA,A6 
	ABL(NZ)	DMT350	SECOND PASS INDEXED DEL 
	LDR	A2,A7
	SUK	A2,QDEL
	RF(E)	CHK010	INDEXED DELETE
	XIF
	LDR	A2,A7
	SUK	A2,QRD 
	ABL(E)	DMT350	RANDOM DELETE
	RF	DMT310
	IFT	INDXAC=1 
	EJECT
CHK010	EQU	*
*   INDEXED REWRITE,INDEXED INSERT AND INDEXED DELETE ENTERS HERE 
* 
*   COMPARE KEYS IN FILE AND USER BUFFER
* 
	LDK	A5,8	MAX 4 INDEX 
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
	LD	A2,DWTOR,A1 
	ANK	A2,/3F	ORDER INDEX 
	CWK	A2,QINS
	RB(E)	CHK040	NO CHECK ON INSERT
	SUK	A2,QIRW
	RF(Z)	CHK050	CHECK REWRITE 
	LC	A2,DWTOPT,A1	OPTION 
	ANK	A2,/4
	RB(NZ)	CHK040	NO CHECK ON DEL CURRENT
CHK050	EQU	*
* 
	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
	LD	A4,DWTTAB,A7	GET TTAB ADDRESS 
	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,PROT	KEY NOT FOUND 
	RF	DMERR 
CHK100	EQU	*
	LDR	A6,A1	FDB ADDR 
	LD	A7,DWTOR,A6 
	ANK	A7,/3F	ORDER INDEX 
	RF	DMT310
	XIF
	EJECT
DMERND	LDKL	A1,NODERR	NO DATA 
	RF	DMERR 
DMEAER	EQU	*	RELEASE EA FOR ALL FILES 
	SUR	A9,A9
	LC	A9,FDBTNR,A6	USER TASK ID 
	CF	A14,RELPRO	RELEASE PROTECT
	LDKL	A1,PROERR	PROTECT ERR 
DMERR	ABL	DMTERR
	EJECT
* 
*   MOVE RECORD 
* 
DMT310	EQU	*
	IFT	INDXAC=1 
	CWK	A7,QDEL
	RF(NE)	DMT313	NOT INDEX DEL
* 
*   MOVE KEYS TO FDB KEY AREAS
* 
	LDK	A5,8 
IXINS3	EQU	*
	LDR	A2,A6	FDB DATA 
	ADR	A2,A5
	LD	A3,FDBADF,A2	FDB INDEX
	RF(Z)	IXINS4	NO INDEX
	LD	A1,FDBKA,A3	KEY ADDR
	AD	A1,FDBRRO,A6	REC OFFS 
	ADR	A1,A11	BUFFERADDR GIVES KEY ADDR 
	LD	A2,FDBRLE,A3	REC LGTH 
	SUK	A2,6	KEY LGTH
	ADKL	A3,FDBKEY	TO ADDR 
	CF	A14,DMTBM	KEY TO FDB AREA 
IXINS4	EQU	*
	SUK	A5,2 
	RB(NZ)	IXINS3	MORE INDEXS
	ABL	DMXDEL	INDEXED DEL 
DMT313	EQU	*
	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 
	LD	A4,DWTTAB,A6	GET TTAB ADDRESS 
	CF	A14,MOV:US	MOVE RECORD FROM USER TO SYSTEM AREA 
	XIF
	EJECT
* 
DMT340	EQU	*
* 
*   SET STATUS USED 
* 
	LDK	A3,/FF 
DMT350	SCR	A3,A10 
	LD	A3,FDBDBR,A6
	RF(N)	DMT390	DELAY NO WRITE
	LDK	A7,/95	PHYSICAL WRITE
* 
*   WRITE BLOCK TO DISC 
* 
	LDR	A1,A6	FDB ADDRESS AS PARAMETER 
	LKM
	DATA	15	FM WRITE 
	CF	A14,DMTIOT	CHECK DISC I/O 
	LDR	A1,A1
	RF(NZ)	DMTERR
	RF	DMT400
	EJECT
DMT390	EQU	*
	LDKL	A2,/1000
	ORS	A2,FDBDBR,A6	KEEP BUFFER 
DMT400	EQU	*
	LDR	A1,A6	FDB ADDR DATA FILE 
	CF	A14,CRNGET	GET CURRENCY BUFFER
	LDR	A10,A2	BUFFER ADDR 
	LD	A2,ECBCW,A9 
	LD	A3,ECBCW+2,A9	LOG REC NR
	LD	A7,DWTOR,A1 
	ANK	A7,/3F	ORDER INDEX 
	LDK	A4,QRW 
	CWR	A7,A4
	RF(E)	DMT420	RANDOM WRITE
	LDK	A4,QREWR 
	CWR	A7,A4
	RF(E)	DMT420	REWRITE 
	LDK	A4,QSW 
	CWR	A7,A4
	RF(E)	DMT460	SEQ WRITE 
	IFT	INDXAC=1 
	LDK	A4,QIRW
	CWR	A7,A4
	RF(E)	DMT420	IND REWR
	LDK	A4,QINS
	CWR	A7,A4
	RF(E)	DMT460	INDEXED INSERT
	CWK	A7,QSTIND	 
	RF(E)	DMT406	START INDEXED 
	XIF
	LDK	A4,QSTDIR
	CWR	A7,A4
	RF(NE)	DMT409	NOT START
DMT406	EQU	*
	LDR	A4,A2
	LDR	A5,A3
	SUK	A5,1 
	RF(NN)	DMT408
	ANKL	A5,/7FFF
	SUK	A4,1 
DMT408	EQU	*
	ST	A4,CRNCDF,A10	NEW CURRENCY
	ST	A5,CRNCDF+2,A10 
	RF	DMT420
DMT409	EQU	*
	ST	A2,CRNCDF,A10 
	ST	A3,CRNCDF+2,A10	CRN DATA FILE 
DMT420	EQU	*
* 
*   CHECK PROTECT 
* 
	LC	A4,FDBDBR,A1
	ANK	A4,/1
	RF(Z)	DMT470	NOT PROTECT 
* 
*   CHECK IF EA IS SET ALREADY
* 
	CF	A14,EATEST	CHECK EA 
	LDR	A4,A4
	RF(NZ)	DMT470	EA ALREADY SET 
* 
*   SET EA
* 
	CF	A14,EASETB
	RF	DMT470
DMT460	EQU	*
* 
*   UPDATE LRN
* 
	SC	A2,FDBLRN,A1
	ST	A3,FDBLRN+1,A1
	RB	DMT420
DMT470	EQU	*
	IFT	INDXAC=1 
	LDK	A4,QINS
	CWR	A7,A4
	ABL(E)	DMINS2	INDEXED INSERT 
	XIF
	EJECT
DMTAEX	LDK	A1,0	CORRECT RETURN
* 
DMTERR	LC	A3,FDBDBR,A6
	ANK	A3,/10 
	RF(NZ)	DMTERX	KEEP BUFFER
	LD	A3,ECBBA,A8 
	SUKL	A3,BUFSTA 
	CF	A14,DMTRBU	RELEASE BUFFER AT A3 
DMTERX	EQU	*
	LD	A6,FDBADF,A6	GET FDB DATA FILE
	INH
*   A1 = RET CODE 
*   A6 = DWT ADDR 
	CF	A15,TENDIO
	ENB
	LKM
	DATA	3 
	IFT	INDXAC=1 
	EJECT
DMIRR	EQU	*	INDEXED RANDOM READ 
* 
DMSTIN	EQU	*	START INDEXED
********************************************* 
	LDR	A8,A1	FDB ADDR 
	ADKL	A8,FDBKEY	KEY AREA ADDR 
	LD	A11,FDBRLE,A1	REC LGTH INDEX
	SUKL	A11,6	KEY LENGTH
	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
	LD	A4,DWTOR,A6 
	ANK	A4,/3F	ORDER 
	SUK	A4,QSTIND
	RF(NZ)	DMR007	NOT START
	LC	A4,DWTOPT,A6
	ANK	A4,7	OPTION
	RF(Z)	DMR007	EQUAL 
	ANKL	A2,/FBFF	IGNORE NOKEY	=1
DMR007	EQU	*
	LDR	A2,A2	RET CODE 
	RF(NZ)	DMI037	KEY NOT FOUND	=4 
	LD	A2,FDBRRO,A1	RECORD ADDR	=3 
	ADKL	A2,BUFSTA		=3 
	ADR	A2,A3	REC ADDR	=3
	LD	A4,FDBRLE,A1	RECORD LENGTH	=3 
	SUK	A4,6		=3 
	ADR	A2,A4		=3
* 
*   MOVE LOG REC NO TO ECB
* 
	LDK	A5,0 
	LC	A5,3,A2 
	ST	A5,ECBCW,A9 
	LC	A5,4,A2 
	ECR	A5,A5
	LC	A5,5,A2 
	ST	A5,ECBCW+2,A9 
*   SET CRN 
* 
	LD	A11,FDBADF,A6	FDB DATA FILE 
	LDR	A1,A11	DATA FILE FDB 
	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
	LDK	A5,QRR	RANDOM READ 
	LD	A7,DWTOR,A11
	ANK	A7,/3F	ORDER 
	SUK	A7,QSTIND
	RF(NE)	DMR025	INDEXED READ 
	LDK	A5,QSTIND	START INDEXED
	SUK	A3,1 
	RF(NN)	DMR025	NOT UNDERFLOW
	ANKL	A3,/7FFF
	SUK	A2,1 
DMR025	EQU	*
	SC	A2,CRNCIF+1,A10 
	ST	A3,CRNCIF+2,A10	CRN INDEX FILE
	LD	A2,ECBCW,A9	REC NR DATA 
	ST	A2,CRNCDF,A10 
	LD	A2,ECBCW+2,A9 
	ST	A2,CRNCDF+2,A10 
	LC	A2,FWTFNR,A6	FILE NR
	SC	A2,CRNCIF,A10 
	LDR	A6,A11	FDB DATA
	SC	A5,DWTOR+1,A6	NEW ORDER 
	LDKL	A2,/CFFF
	ANS	A2,FDBDBR,A6	RELEASE INDEX BUFFERS 
	ABL	DMT280 
	EJECT
DMIRN	EQU	*	INDEXED READ NEXT 
********************************************* 
	LD	A2,FDBRRO,A1	RECORD OFFSET
	LDR	A3,A5
	SUKL	A3,BUFSTA 
DMI100	EQU	*
	ADR	A2,A3	BUFFADR
	ADKL	A2,BUFSTA 
	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
	LDKL	A1,EOFERR 
	RF	DMI035	EOF
DMI106	LDR	A3,A9	RESTORE
	RF	DMI010	NEXT REC 
	EJECT
DMI120	EQU	*	 
*   INDEX RECORD IS FOUND 
* 
	LD	A9,DWTECB,A1	USER ECB 
* 
*   KEY RECORD FOUN 
*   CHECK IF NEXT RECORD HAS THE SAME KEY 
* 
	LD	A2,FDBRRO,A1	RECORD OFFSET
	ADKL	A2,BUFSTA 
	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,NXTKYS	BIT 6 
	ORS	A5,ECBRC,A9	NEXT KEY SAME
DMR020	EQU	*
	LDK	A2,0	MARK FOUND
	ABL	DMR006	CONT AS FOR INDEXED RAND READ 
DMI037	LDKL	A1,KEYERR	KEY NOT FOUND	=4
	RF	DMI035		=4
DMI010	EQU	*
	CF	A14,RDNXTR	GET NEXT INDEX RECORD
	RB	DMI100	RECORD FOUND 
	LDR	A6,A1	FDB ADDR 
DMI031	EQU	*
	LDKL	A1,NODERR	NO IDENT
DMI035	EQU	*
	LDR	A3,A3	BUFFER ADDR
	ABL(Z)	DMTERX	NO BUFFER
	ABL	DMTERR	ERROR AND BUFFER
DMI036	EQU	*
	ANK	A1,/27 
	RB(NZ)	DMI035	BIT 10,13,14,15
	LDKL	A1,EOMERR	GRAVE ERR ALSO
	RB	DMI035
	EJECT
DMINS2	EQU	*	INDEXED INSERT PART 2
DMXDEL	EQU	*	INDEXED DELETE 
* 
********************************************* 
	LC	A3,FDBDBR,A6
	ANK	A3,/10 
	RF(NZ)	DXI010	KEEP BUFFER
	LD	A3,ECBBA,A8 
	SUKL	A3,BUFSTA 
	CF	A14,DMTRBU	RELEASE BUFFER 
DXI010	EQU	*
	LDK	A5,10	LOOPER 
DXI020	EQU	*	NEXT INDEX 
	LD	A7,DWTOR,A6	ORDER 
	ANK	A7,/3F 
	SUK	A5,2 
	RF(Z)	DXI100	ALL INDEXES 
	LDR	A4,A6	FDB DATA 
	ADR	A4,A5
	LD	A1,FDBADF,A4	FDB INDEX
	RB(Z)	DXI020	NO INDEX
	LD	A2,DWTOR,A6	ORDER 
	ST	A2,DWTOR,A1 
	LD	A2,DWTECB,A6	USER ECB ADDR
	ST	A2,DWTECB,A1
	ST	A5,FDBKA,A6	SAVE COUNTER
	SUK	A7,QINS
	RF(E)	DMINIX	INSERT INDEX
	RF	DMDELX	DELETE INDEX 
	EJECT
*   RETURN FROM UPDATING OF ONE INDEX 
* 
DMTAR5	EQU	*
	LD	A6,FDBADF,A1	FDB DATA FILE
	LD	A5,FDBKA,A6	GET COUNTER OF INDEXES
	RB	DXI020	TAKE NEXT INDEX
DXI100	EQU	*	INDEXES READY
	LDK	A1,0	RET CODE
	SUK	A7,QINS	INDEXED INSERT 
	ABL(E)	DMTERX	READY
	LDR	A1,A6
	ABL	DMT020	RESTART DMTASK
	EJECT
DMINIX	EQU	*	INSERT INDEX 
	IFT	MMUPAG=0 
* 
*   GET KEY IN USER BUFFER
* 
	LD	A4,FDBADF,A1	DATA FDB 
	LD	A4,DWTECB,A4	USER ECB 
	LD	A8,ECBBA,A4	USER BUFFER 
	AD	A8,FDBKA,A1	KEY ADDR
	RF	INS010
	XIF
	IFT	INDXAC=1 
* 
DMDELX	EQU	*	DELETE INDEX RECORD
********************************************* 
	LDR	A8,A1
	ADKL	A8,FDBKEY	KEY ADDR
INS010	EQU	*
	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)	DMI036	NO SECTOR FOUND
	LDR	A13,A3	BUFFER ADDR 
	LD	A5,DWTECB,A6	USER ECB 
	LD	A1,DWTOR,A6 
	ANK	A1,/3F 
	SUK	A1,QDEL
	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
	LDKL	A4,NXTKYS	NEXT KEY SAME 
	ORS	A4,ECBRC,A5	NEXT KEY SAME
	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
	ADKL	A2,BUFSTA 
	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 BLOCK 
* 
	LDK	A7,/95	WRITE,WAIT
	LKM
	DATA	15	FM 
	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,DWTECB,A6	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,A5 
	LD	A3,ECBCW+2,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 BLOCK 
* 
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 
	ADKL	A1,BUFSTA 
	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 
	ADKL	A1,BUFSTA 
	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,FWTFNR,A6	VOL DEV CODE 
	ANK	A2,/FF 
	STR	A2,A8	 
	LDR	A2,A13 
	ADKL	A2,BUFSTA 
	ST	A2,ECBBA,A8	SECTOR ADDR 
	LC	A2,FDBBLZ,A6	BLOCK SIZE 
	SLL	A2,8	IN BYTE 
	ST	A2,ECBRL,A8 
	LD	A2,FDBSNR,A6	SECTOR NR
	ST	A2,ECBCW,A8	SECTOR NR 
	LD	A3,FDBSNR+2,A6
	ST	A3,ECBCW+2,A8	SECT NR 
	LDK	A7,/95	WRITE , WAIT
	LKM
	DATA	15	FM 
	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 BLOCK
* 
	LDR	A1,A6	FDB ADDR 
	LDR	A3,A13	BUFFER ADDR 
	CF	A14,RDNXTR	GET FIRST RECORD IN NEXT SECTOR
	RF	INS260	OK 
	RF	DEL045	ERR
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,EOFRC	END OF FILE
	ORS	A1,ECBRC,A9	TO USER
	EJECT
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
INS440	EQU	*
	LDR	A1,A5	FDB INDEX
	LDR	A3,A13	BUFFER ADDR 
	CF	A14,DMTRBU	REL BUFFER 
	ABL	DMTAR5	ONE INDEX READY TAKE NEXT 
	EJECT
DEL000	EQU	*	DELETE INDEX RECORD CONT 
	LDR	A12,A5	USER ECB ADDR 
	LDR	A2,A2
DEL010	EQU	*
	ABL(NZ)	DMI036	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-3=ADDR REC NR
	LCR	A2,A1
	CC	A2,ECBCW+1,A12	REC NR 
	RF(NE)	DEL030	WRONG RECORD 
	LC	A2,1,A1 
	ECR	A2,A2
	LC	A2,2,A1	REC NR
	CW	A2,ECBCW+2,A12
	RF(E)	DEL200	RECORD FOUND
DEL030	EQU	*
	EJECT
* 
*   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	DMI036	ERROR 
DEL050	EQU	*
* 
*   CHECK IF RECORD IS USED 
* 
	LDR	A13,A3	NEW BUFFER ADDR 
	ADR	A2,A3
	ADKL	A2,BUFSTA 
	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 
* 
	LDK	A7,0 
	LC	A7,-1,A1	NR OF SAME CHAR
	ST	A7,16,A14	SAVE IN RECORD BUFFER AFTER ECB 
	CWR	A11,A7	KEY LENGTH
	RF(NE)	DEL220	NEXT KEY NOT SAME
	LDKL	A4,NXTKYS 
	ORS	A4,ECBRC,A12	NEXT KEY SAME 
DEL220	EQU	*
* 
*   MOVE UP RECORDS OVER DELETED
* 
	ADKL	A11,7	TOTAL RECORD LENGTH 
	LDR	A3,A13 
	ADKL	A3,BUFSTA 
	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	15	FM 
	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
	ADKL	A4,BUFSTA 
	ADR	A4,A13	RECORD ADDR 
	AD	A4,FDBRLE,A5	STATUS CHAR ADDR 
	LDK	A2,/FF 
	CCR	A2,A4
	RB(NE)	DEL240	FREE 
* 
*   SET CURRENCY
* 
	LDR	A9,A4	STATUS ADDR
	LD	A1,FDBADF,A5	FDB DATA F 
	CF	A14,CRNGET	GET CRN BUFFER 
	LC	A1,FWTFNR,A5	INDEX FILE NR
	CC	A1,CRNCIF,A2	LAST REF INDEX 
	RF(NE)	DEL350	NOT THIS IND 
* 
*   UPDATE CURRENCY 
* 
	LDR	A8,A2	CRN ADDR 
	LDR	A1,A5	INDEX
	CF	A14,GTLGRN	GET REC NR 
	SC	A2,CRNCIF+1,A8
	ST	A3,CRNCIF+2,A8	REC NR 
DEL350	EQU	*
	LC	A2,17,A14	NR OF SAME IN DELETED RECORD
*			WAS SAVED AT LABEL DEL200 
	CC	A2,-4,A9
	RF(NL)	DEL600
	SC	A2,-4,A9	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	15	FM 
	LDR	A1,A5	FDB ADDR 
	CF	A14,DMTIOZ	IO CHECK 
	LDR	A1,A1
	ABL(NZ)	DMTERR 
DEL900	EQU	*
	ABL	INS440 
	XIF
	END

Full view