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

⟦7427caccd⟧

    Length: 46164 (0xb454)
    Notes: pts_type(SC)
    Names: »SDMTSK.SC«

Derivation

└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
    └─⟦this⟧ »TOSSWORK/SDMTSK.SC« 
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
    └─⟦this⟧ »TOSSWORK/SDMTSK.SC« 

PTS(SC)

	IDENT SDMTSK 	REL 11.0 81-05-13 870105041100 

			=B, REW. AND DEL. INDEXED,NO RELEASE OF KEY BLK BUF
			=B, REL 11.0 81-05-12
			=A, CONDITION FOR CR,DE,EX 
			=A, REL 11.0 81-04-15
			=9, REWRITE WITH DUP KEY DIDN'T WORK 
			=9, REL 11.0 81-03-09
			=8, DELETE DIRECT INDEXED DIDN'T WORK
			=8, REL 11.0 81-03-09
			=7, W.R.I. KEYS NOT CORRECT WRITTEN
			=7, REL 11.0 81-02-26
			=6, DELETE,REWRITE DIRECT INDEXED REFORMED 
			=6, REL 11.0 81-02-25
			=5, CURRENCY NOT CORRECT WHEN START INDX 
			=5, REL 11.0 81-02-24
			=4, MOV:SU DON'T WORK WHEN TASK NOT IN TCTAB 
			=4, REL 11.0 81-02-12 ,LIKE SDM TASK 
			=3, COMPARE KEYS WRONG FDB ADDRESS 
			=3, REL 11.0 81-02-06
			=2, INTERN ORDER START N.L WRONG 
			=2, REL 11.0 81-02-06
			=1, REG. CRASH WHEN COMP. KEYS 
			=1, REL 11.0 81-01-26
****************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   SDMTSK = HANDLES DATAMANAGEMENT DISC I/O
* 
* 
* 
* 
* 
****************************************************
* 
*   THIS MODULE IS ACTIVATED FROM TIODM.
* 
*   INPUT PARAMETERS: 
*   A1 = FDB ADDRESS
*   A2 = TID   TASK IDENT OF SDMTSK  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	SDMTSK 
* 
*   FOLLOWING ENTRIES ARE USED BY MODULE DMOPCL 
	ENTRY	SDMERX,ORDFLP
	EJECT
* 
***************** 
*   EXTERNALS   * 
***************** 
* 
* 

*	DEFINED IN TDISP
	EXTRN	PRUN	TTAB ADDRESS OF RUNNING TASK

*	DEFINED IN TOSSIO 
	EXTRN	TENDIO 
	EXTRN	ECBBA,ECBRL,ECBEL,ECBRC,ECBCW
	EXTRN	DWTTAB,DWTOPT,DWTECB,DWTOR 
	EXTRN	TTB:PW		=4 

*	DEFINED IN FMTASK 
	EXTRN	FWTFNR 
	EXTRN	FPB:EL 

*	DEFINED IN TIODM
	EXTRN	FDBADF,FDBAI1,FDBBLZ,FDBDBR
	EXTRN	FDBECB,FDBENL,FDBKA,FDBKEY 
	EXTRN	FDBLRN,FDBMRO,FDBOMD,FDBRLE
	EXTRN	FDBRRO,FDBSNR,FDBTNR 
	EXTRN	PROT,KEYERR,NXTKYS,EOFERR
	EXTRN	EOFRC,NODERR,PROERR,EOMERR 
	EXTRN	CRNCDF 
	EXTRN	DMTTSB	A14 STACK BASE
	EXTRN	DMXACD	EXIT RUNNING TASK AND ACTIVATE #D 
	EXTRN	SDMSTS	STACK START 
	EXTRN	SDMBF1,SDMBF2
	EJECT

*	DEFINED IN TIOSDM 
	EXTRN	SDMOOR,SDMLIM,SDMOEX,SDMOOS
	EXTRN	SDMOIP,SDMIOP

*	DEFINED IN SDMSUB 
	EXTRN	CALSNO 
	EXTRN	EATEST,EASETB,CRNGET,GTBKBU
	EXTRN	MOV:US,MOV:SU,MOVFW,MOVBW
	EXTRN	RELPRO 
	EXTRN	FMIORD,FMIOWR,FMIORF,FMIOEX
	EXTRN	FRMFIL 
	EXTRN	RLBLKB,CHKRCD
	EXTRN	GTLGRN 
	EXTRN	CRNUPD,CRNCIF
	EXTRN	CHKKEY 
	EXTRN	RDNXTR 
	EXTRN	RECECB	MOVE RECORD NUMBER TO ECBCW1,ECBCW2 
	EXTRN	FNDKEY 

*	DEFINED IN DMBUF
	EXTRN	BUFSNR,BUFOR,BUFSTA
	EXTRN	SDMRBU	RELEASE A DISC BUFFER 
	EXTRN	SDMRLB 

*	DEFINED IN DMOPCL 
	EXTRN	SDMOPN,SDMCLO,SDMRFP 
	EXTRN	OPEFPB 

*	DEFINED IN DSUMOD 
	EXTRN	DSUMOD 
	EJECT
* 
* 
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
X:A	EQU	0 
X:B	EQU	0		=A 
*	NOT SYSGEN SUPPORTED
Y:A	EQU	1 
Y:B	EQU	1 
* 
*   INDEXED ACCEXSS FUNCTIONS CAN BE OMITTED WITH 
*   INDXAC EQU 1 = INDEX ACCESS INCLUDED
*   INDXAC EQU 0 = INDEX ACCESS FUNCTIONS OMITTED 
INDXAC	EQU	X:A
INSLAS	EQU	Y:A	INSERT SAME KEY LAST WHEN = 1
*	A VERSION LEAVING OUT OPEN MODES: 
*	OPEN OUTPUT,OPEN EXTEND AND DISCARD 
*	IS OBTAINED BY SETTING Y:C=0
* 
CRDEEX	EQU	X:B		=A
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
*	KEYDUP=1 MEANS THAT PRIMARY INDEX (I1) DON'T
*	ALLOW DUPLICATE KEY WHEN READ OR WRITE
* 
KEYDUP	EQU	Y:B
	EJECT
*************** 
*  CONSTANTS  * 
*************** 

FMFPBL	EQU	80	FILE PARAMETER BLOCK LENGTH 
	EJECT
* 
************************
*   DATA DEFINITIONS   *
************************
* 
*   THE FOLLOWING INTERNAL ORDER CODES ARE THE
*   RELATIVE POSITION IN ORDTAB 
*   ORDER FROM TIOSDM IS CHANGED AS FOLLOWED
*   DWTOR TIOSDM       DWTOR AFTER CHANGE        A7 
*    0<X<=7              NOT CHANGED             0
*     X>7  ODD           X=(X+17)/2              -
*     X>7  EVEN          X=(X-8)/2               -
* 
ORDERS	EQU	*

OROPEN	EQU	*-ORDERS 
	DATA	SDMOPN	OPEN 

ORDRM0	EQU	*-ORDERS 
	DATA	RDRM00	READ RANDOM

ORDSQ0	EQU	*-ORDERS 
	DATA	RDSQ00	READ SEQUENTIAL

OWRRM0	EQU	*-ORDERS 
	DATA	WRRM00	WRITE RANDOM 

OWRSQ0	EQU	*-ORDERS 
	DATA	WRSQ00	WRITE SEQUENTIAL 

OREWR0	EQU	*-ORDERS 
	DATA	REWR00	REWRITE NOT INDEXED (DIRECT,CURRENT) 
	EJECT
ODELT0	EQU	*-ORDERS 
	DATA	DELT00	DELETE NOT INDEXED (DIRECT,CURRENT)

OSTRTD	EQU	*-ORDERS 
	DATA	STRTDI	START DIRECT (EQUAL,GREATER,NOT LESS)

OEXTND	EQU	*-ORDERS 
	DATA	EXTEND	EXTEND FILE

OCLOSE	EQU	*-ORDERS 
	DATA	SDMCLO	CLOSE

ORDFLP	EQU	*-ORDERS 
	DATA	SDMRFP	READ FILE PARAMETERS 

	IFT	INDXAC=1 
	EJECT
* 
*	INDEX ORDERS
* 
ORDRMX	EQU	*-ORDERS 
	DATA	RDRMIX	READ RANDOM INDEXED

ORDSQX	EQU	*-ORDERS 
	DATA	RDSQIX	READ SEQUENTIAL INDEXED

OWRRMX	EQU	*-ORDERS 
	DATA	WRRMIX	WRITE RANDOM INDEXED 

OWRSQX	EQU	*-ORDERS 
	DATA	DMTERR	WRITE SEQUENTIAL INDEXED (NOT ALLOWED) 

OREWRX	EQU	*-ORDERS 
	DATA	REWRIX	REWRITE INDEXED (DIRECT,CURRENT) 

ODELTX	EQU	*-ORDERS 
	DATA	DELTIX	DELETE INDEXED (DIRECT,CURRENT)

OSTRTX	EQU	*-ORDERS 
	DATA	STRTIX	START INDEXED (EQUAL,GREATER,NOT LESS) 

	XIF
	EJECT
* 
*	ORDER INDEX TABLE 
* 
BYTE	FORM	8,8 

ORDTAB	EQU	*
	BYTE	OCLOSE,ORDFLP	CLOSE,READ FILE PARAMETERS
	BYTE	OWRSQ0,OWRRM0	WRITE SEQUENTIAL,WRITE RANDOM 
	BYTE	OREWR0,OREWR0	REWRITE NOT INDEXED 
	BYTE	ODELT0,ODELT0	DELETE NOT INDEXED
	BYTE	ORDSQ0,ORDRM0	READ SEQUENTIAL,READ RANDOM 
	BYTE	OSTRTD,OSTRTD	START DIRECT
	BYTE	OSTRTD,OCLOSE	START DIRECT,CLOSE
ORDTEX	EQU	*-ORDTAB 
	IFT	INDXAC=0 
	BYTE	OEXTND,0	EXTEND 
	XIF
	IFT	INDXAC=1 
	BYTE	OEXTND,OWRSQX	EXTEND,WRITE SEQUENTIAL INDEXED 
	BYTE	OWRRMX,OREWRX	WRITE RANDOM INDEXED,REWRITE INDEXED
	BYTE	OREWRX,ODELTX	REWRITE INDEXED,DELETE INDEXED
	BYTE	ODELTX,ORDSQX	DELETE INDEXED,READ SEQUENTIAL INDEXED
	BYTE	ORDRMX,OSTRTX	READ RANDOM INDEXED,START INDEXED 
	BYTE	OSTRTX,OSTRTX	START INDEXED 
	XIF
ORDEXT	EQU	ORDTEX+ORDTEX-17	TIOSDM ORDER FOR EXTEND 
	EJECT
**************
*   SDMTSK   *
**************
* 
SDMTSK	EQU	*
* 
*   SET UP A14 STACK
* 
	LD	A14,PRUN
	ADKL	A14,DMTTSB	STACK BASE 
	LDR	A11,A1	FDB ADDR
	LDR	A8,A11 
	ADKL	A8,FDBECB	FDB ECB ADDRESS 
	LD	A9,DWTECB,A11	USER ECB ADDRESS
	LDK	A7,OROPEN
	LD	A5,DWTOR,A11	ORDER CODE FROM TIOSDM 
	ANK	A5,/7F 
	SUKL	A5,SDMLIM	LIMIT BETWEEN OPEN AND CLOSE
	RF(N)	DMT100	OPEN ORDER
	LDK	A7,2	MASK BIT
	TM	A7,A5 
	RF(Z)	DMT010	ORDER CODE EVEN 
	ADK	A5,50	CORRECT ORDER INDEX
DMT010	EQU	*
	SRL	A5,2	INDEX IN ORDER TABLE
	LC	A7,ORDTAB,A5	NEW ORDER INDEX
	SC	A7,DWTOR+1,A11	SAVE NEW INTERN ORDER INDEX
	LD	A5,FDBRRO,A11 
	EJECT
* 
*	READ RANDOM INDEXED,START INDEXED 
*	DELETE DIRECT INDEXED,REWRITE DIRECT INDEXED
*	OPEN AND READ FILE PARAMETERS DON'T NEED ANY
*	BLOCK BUFFER YET
	RF(N)	DMT090	NO BLOCK BUFFER YET 
DMT015	EQU	*		=8
	LD	A4,FDBADF,A11	DATA FILE 
	CM	FDBKA,A4	MARK 1ST PASS DELETE INDEXED 
DMT020	EQU	*
* 
*	LOOP ENTRY FOR
*	READ RANDOM INDEXED,READ SEQUENTIAL INDEXED 
*	DELETE INDEXED,START AND READ SEQUENTIAL
* 
	CF	A14,FNDBLB	FIND BLOCK BUFFER
	IFT	CRDEEX=0 
	ABL(N)	DMTERR	I/O ERROR
	ABL(P)	SDMERX	EOF WHEN READ SEQUENTIAL 
EXTEND	EQU	*		=A
	XIF
	IFT	CRDEEX=1 
	RF(Z)	DMT090	I/O OK
	ABL(P)	SDMERX	EOF WHEN READ SEQUENTIAL 
	EJECT
* 
*	TEST IF EXTEND SHOULD BE DONE 
* 
	LD	A7,DWTOR,A11
	ANK	A7,/3F	ORDER INDEX 
	CWK	A7,OEXTND
	RF(E)	DMT030	ORDER EXTEND
	SUK	A7,OWRSQ0
	RF(NZ)	DMTER	NOT WRITE SEQUENTIAL
DMT030	EQU	*
	LDR	A2,A1
	SLL	A2,2 
	RF(NN)	DMTER	NOT END OF FILE 
	LD	A2,FDBENL,A11	ENLARGE FACTOR
	RF(Z)	DMTER	NO ENLARGE FACTOR DECLARED 
	ADK	A7,0 
	RF(NZ)	DMT090	ORDER EXTEND 
	LDKL	A1,SDMOEX	TIOSDM ORDER FOR EXTEND 
	SC	A1,DWTOR+1,A11
	CF	A14,SDMRLB	RELEASE BLOCK BUFFER 
	LDKL	A8,SDMTSK	DISPATCH ENTRY
	LDR	A6,A11	FDB ADDRESS 
	ABL	DMXACD	EXIT AND ACTIVATE #D


DMTER	EQU	* 
	ABL	DMTERR	ERROR 
	EJECT
	XIF
DMT090	EQU	*
	LD	A7,DWTOR,A11
	LDR	A2,A7	OPTION AND ORDER CODE
	ANK	A7,/3F	A7=INTERNAL ORDER CODE
DMT100	EQU	*
	LDKL	A12,OPEFPB	FPB ADDRESS FOR OPEN CLOSE READ FILE PARAM.


*  (A4= BLOCK BUFFER ADDRESS )
*  (A5 = BLOCK BUFFER DATA ADDRESS )
*   A11= FDB ADDRESS ALL ORDERS 
*   A7 = ORDER CODE ALL ORDERS
*  (A8 = FDBECB ADDRESS ) 
*  (A9 = USER ECB ADDRESS ) 


	ABI	ORDERS,A7	SDMTSK FUNCTION
	EJECT
*********************************************** 
*                                             * 
*   R E A D   S E Q U E N T I A L             * 
*   R E A D   R A N D O M                     * 
*   S T A R T   D I R E C T                   * 
*                                             * 
*********************************************** 

RDSQ00	EQU	*	SEQUENTIAL READ
RDRM00	EQU	*	RANDOM READ
STRTDI	EQU	*	START DIRECT 
* 
*   CHECK STATUS
* 
	CF	A14,CHKSTS	CHECK STATUS 
	RF(NZ)	DMT200	STATUS=USED
* 
*	RECORD STATUS=NOT USED
* 
	SUK	A7,ORDRM0
	ABL(Z)	DMERND	READ RANDOM,NO DATA
	SUK	A7,OSTRTD-ORDRM0 
	RF(NZ)	DMT250	READ SEQUENTIAL
* 
*	START DIRECT
* 
	LC	A3,DWTOPT,A11 
	ANK	A3,7	OPTION
	RF(NZ)	DMT250	OPTION DEFINED 
	RF	DMT230	NO OPTION
	EJECT
* 
*	RECORD STATUS=USED
* 
DMT200	EQU	*
	SUK	A7,OSTRTD
	RF(Z)	DMT230	START DIRECT
	LD	A3,ECBRL,A9	REQ LGTH
	LD	A2,FDBRLE,A11	RECORD LENGTH 
	CWR	A3,A2
	RF(NG)	DMT220
	LDR	A3,A2	MAX LENGTH 
DMT220	EQU	*
	ST	A3,ECBEL,A9	SET EFFECTIVE LENGTH
* 
*   MOVE THE RECORD 
* 
	LD	A1,FDBRRO,A11 
	ADR	A1,A5	SOURCE ADDRESS 
	LD	A2,ECBBA,A9	DESTINATION ADDRESS 
	IFT	MMUPAG=0 
	CF	A14,MOVFW	MOVE RECORD TO USER 
	XIF
	IFT	MMUPAG=1 
	LD	A4,DWTTAB,A11	TTAB ADDRESS
	LD	A7,TTB:PW,A4	PSW FOR THIS TASK	=4 
	ANK	A7,1	SYSTEM,USER MODE BIT	=4 
	RF(NZ)	DMT225	USER MODE	=4 
	CF	A14,MOVFW	MOVE RECORD	=4
	RF	DMT230		=4
DMT225	EQU	*		=4
	CF	A14,MOV:SU	MOVE RECORD TO USER
	XIF
* 
*   UPDATE CRN AND SET EXCLUSIVE ACCESS BIT 
* 
DMT230	EQU	*
	ABL	DMT400	PUT CRN AND EA
	EJECT
* 
*	STATUS BYTE = NOT USED AND ORDER IS SEQ. READ OR
*	START DIRECT WITH OPTION
* 
DMT250	EQU	*	NO DATA AT SEQ READ
* 
*   GET NEXT RECORD 
* 
	ADK	A2,1 
	RF(P)	DMT260	NOT OVERFLOW OR NEGATIVE
	LDK	A2,0 
	ADK	A1,1 
DMT260	EQU	*
	ST	A1,ECBCW,A9 
	ST	A2,ECBCW+2,A9 
* 
*	ENTRY ALSO FOR READ RANDOM INDEXED AND START INDEXED
* 
DMT280	EQU	*
* 
*   CHECK EA
* 
	LD	A1,ECBCW,A9 
	LD	A2,ECBCW+2,A9	REC NR
	CF	A14,EATEST
	ABL(N)	DMEAER	PROTECT ERROR
	IFT	INDXAC=1 
	LD	A4,DWTOR,A11	ORDER
	ANK	A4,/3F 
	CWK	A4,OSTRTX
	RB(E)	DMT230	START INDEXED 
	XIF
	EJECT
	CF	A14,CALSNO	PREP IO
	ABL(NZ)	DMTERR	OUT OF MEDIUM 
	LC	A3,FDBDBR,A11	DELAY 
	ANK	A3,/10 
	RF(NZ)	DMT290	KEEP BUFFER
* 
*   RELEASE BLOCK BUFFER
* 
	CF	A14,SDMRLB	RELEASE BLOCK BUFFER 
* 
*	TAKE NEXT RECORD
* 
DMT290	EQU	*
	RB	DMT020	NEXT RECORD
	IFT	CRDEEX=1 
	EJECT
***************************** 
*   E X T E N D   F I L E   * 
***************************** 

EXTEND	EQU	*
	LD	A4,ECBBA,A8	BLOCK BUFFER ADDRESS
	LDKL	A3,OPEFPB	BUFFER FOR FILE PARAMETER BLOCK 
	ST	A3,ECBBA,A8	BUFFER ADDRESS IN ECB 
	LDK	A2,FMFPBL	FILE PARAMETER BLOCK LENGTH
	ST	A2,ECBRL,A8 
	CF	A14,FMIORF	READ FILE PARAMETERS 
	LD	A1,FDBENL,A11	ENLARGE FACTOR
	ST	A1,FPB:EL,A3	FILL IN ENLARGE
	CF	A14,FMIOEX	EXTEND FILE
	ST	A4,ECBBA,A8	SET BLOCK BUFFER ADDRESS
	RB(NZ)	DMTER	ERROR 
	CF	A14,FRMFIL	FORMAT FILE
	RB(NZ)	DMTER	ERROR WHEN FORMATTING 
	LDK	A7,OWRSQ0	WRITE SEQUENTIAL ORDER 
	SC	A7,DWTOR+1,A11
	ABL	DMT020	TRY WRITE SEQUENTIAL AGAIN
	XIF
	EJECT
*********************************************** 
*                                             * 
*   D E L E T E   I N D E X E D               * 
*   R E W R I T E   I N D E X E D             * 
*                                             * 
*********************************************** 

DELTIX	EQU	*	DELETE INDEXED 
REWRIX	EQU	*	REWRITE INDEXED
	IFT	INDXAC=1 
	ANKL	A2,/100 
	RF(Z)	DELT00	NOT DIRECT
	CF	A14,FNDKYP	SET PARAM AND THEN FNDKEY
	ABL(NZ)	DMIER2	KEY NOT FOUND 
	LD	A9,DWTECB,A11	ECB ADDRESS 
	CF	A14,RECECB	MOVE RECORD NUMBER TO ECB
	CF	A14,SDMRBU	REALEASE BLOCK BUFFER	=B 
	LD	A1,DWTOR,A11	INTERN ORDER INDEX	=6
	LD	A11,FDBADF,A11	FDB ADDRESS DATA FILE	=6 
	ANKL	A1,/FEFF	INDICATE CURRENT INSTEAD OF DIRECT	=6
	ST	A1,DWTOR,A11	SAVE IN FDB DATA FILE	=6 
	LD	A1,ECBCW,A9 
	LD	A2,ECBCW+2,A9 
	CF	A14,EATEST
	ABL(N)	DMEAER	EA OTHER TASK
	CF	A14,CALSNO	GET SECTOR NUMBER AND OFFSET IN SECTOR 
	ABL(NZ)	SDMERX	ERROR 
	LDR	A8,A11		=6 
	ADKL	A8,FDBECB	SDM ECB ADDRESS	=6
	ABL	DMT015	GET BLOCK BUFFER	=6	=8
	XIF
	EJECT
*********************************************** 
*                                             * 
*   W R I T E    S E Q U E N T I A L          * 
*   W R I T E    R A N D O M                  * 
*   R E W R I T E    N O T    I N D E X E D   * 
*   D E L E T E   N O T   I N D E X E D       * 
*   W R I T E   R A N D O M   I N D E X E D   * 
*                                             * 
*********************************************** 

WRSQ00	EQU	*	WRITE SEQUENTIAL 
WRRM00	EQU	*	WRITE RANDOM 
WRRMIX	EQU	*	WRITE RANDOM INDEXED 
REWR00	EQU	*	REWRITE NOT INDEXED
DELT00	EQU	*	DELETE NOT INDEXED 
* 
*	TEST IF OPENED OUTPUT SEQUENTIAL
* 
	CF	A14,CHKSTS	A10=POINTER TO RECORD STATUS 
	LC	A1,FDBOMD,A11 
	ANK	A1,/FF 
	CWK	A1,SDMOOS
	RF(E)	DMS110	OUTPUT SEQ.,DON'T CHECK STATUS
* 
*	CHECK STATUS
* 
	CF	A14,CHKSTS	CHECK RECORD STATUS
	RF(Z)	DMS110	RECORD STATUS=NOT USED
	EJECT
* 
*	RECORD STATUS=USED
* 
	IFT	INDXAC=1 
	LDR	A4,A7
	SUK	A4,OWRRMX
	RF(Z)	DMS100	WRITE RANDOM INDEXED
	XIF
	LDR	A4,A7
	SUK	A4,OWRRM0
	RF(Z)	DMS100	WRITE RANDOM
	SUK	A4,OWRSQ0-OWRRM0 
	RF(NZ)	DMS120	NOT WRITE SEQUENTIAL 
DMS100	EQU	*
	RF	DMERPR	PROTECTED
	EJECT
* 
*	RECORD STATUS=NOT USED
* 
DMS110	EQU	*
	IFT	INDXAC=1 
	LDR	A4,A7
	SUK	A4,OREWRX
	RF(Z)	DMERND	REWRITE INDEXED 
	SUK	A4,ODELTX-OREWRX 
	RF(Z)	DMERND	DELETE INDEXED
	XIF
	LDR	A4,A7
	SUK	A4,OREWR0
	RF(Z)	DMERND	REWRITE NOT INDEXED 
	SUK	A4,ODELT0-OREWR0 
	RF(Z)	DMERND	DELETE NOT INDEXED
DMS120	EQU	*
	CF	A14,EATEST
	RF(N)	DMEAER	EA OTHER TASK 
	EJECT
	LDK	A3,0	STATUS FREE 
	IFT	INDXAC=1 
	LDR	A2,A7
	SUK	A2,OWRRMX
	RF(E)	CHK010	WRITE RANDOM INDEXED
	SUK	A2,OREWRX-OWRRMX 
	RF(E)	CHK010	REWRITE INDEXED 
	LD	A1,FDBKA,A11
	RF(NZ)	DMT350	DELETE INDEXED (SECOND PASS) 
	SUK	A2,ODELTX-OREWRX 
	RF(E)	CHK010	DELETE INDEXED
	XIF
	LDR	A2,A7
	SUK	A2,ODELT0
	RF(E)	DMT350	DELETE NOT INDEXED
	IFT	INDXAC=0 
	RF	DMT320
	XIF
	IFT	INDXAC=1 
	RF	DMT310
	EJECT
CHK010	EQU	*
*   REWRITE INDEXED,WRITE RANDOM INDEXED AND DELETE INDEXED ENTERS HERE 
* 
*   COMPARE KEYS IN FILE AND USER BUFFER
* 
	LDK	A4,8	MAX 4 INDEX 
CHK040	EQU	*
	SUK	A4,2 
	RF(N)	CHK100	ALL INDEX CHECKED 
	LDR	A2,A11	FDB ADD 
	ADR	A2,A4
	LD	A6,FDBAI1,A2	FDB ADDR INDEX FILE
	RB(Z)	CHK040	NO INDEX
	LD	A2,DWTOR,A11
	ANK	A2,/3F	ORDER INDEX 
	SUK	A2,OWRRMX
	RB(Z)	CHK040	NO CHECK ON INSERT
	SUK	A2,OREWRX-OWRRMX 
	RF(Z)	CHK050	CHECK REWRITE 
	LC	A2,DWTOPT,A11	OPTION
	ANK	A2,/4
	RB(NZ)	CHK040	NO CHECK ON DEL CURRENT
	EJECT
*			=3
*	A6=FDB ADDRESS INDEX FILE		=3 
*			=3
CHK050	EQU	*
	LD	A9,DWTECB,A11	GET USER ECB	=9 
	IFT	MMUPAG=1 
	LD	A1,FDBKA,A6	GET KEY START ADDRESS	=3
	AD	A1,ECBBA,A9 
	LDKL	A2,FDBKEY	GET KEY SAVE AREA DISPLACEMENT
	ADR	A2,A6	GET KEY AREA POINTER	=3
	LD	A3,FDBRLE,A6	RECORD LENGTH	=3 
	SUK	A3,6	KEY LENGTH
	LDR	A9,A4	SAVE A4	=1 
	LD	A4,DWTTAB,A11	GET TTAB ADDRESS
	CF	A14,MOV:US	MOVE KEY TO FDB KEY AREA 
	LDR	A4,A9	RESTORE A4	=1
	LD	A9,FDBKA,A6	GET KEY START DISPLACEMENT	=3 
	XIF
	IFT	INDXAC=1 
	IFT	MMUPAG=0 
	LD	A2,ECBBA,A9	USER BUFFER ADDRESS 
	LD	A9,FDBKA,A11	KEY START ADDRESS
	ADR	A2,A9
	XIF
	IFT	INDXAC=1 
	EJECT
	LDR	A1,A2	ENTRY KEY ADDRESS
	AD	A9,FDBRRO,A11 
	ADR	A9,A5	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
	RF	DMERPR	PROTECTED
*				=3 
*	END OF CHECK KEY LOOP		=3 
*				=3 
CHK100	EQU	*
	LD	A7,DWTOR,A11
	ANK	A7,/3F	ORDER INDEX 
	XIF
	EJECT
* 
*   MOVE RECORD 
* 
DMT310	EQU	*
	IFT	INDXAC=1 
	SUK	A7,ODELTX
	RF(NZ)	DMT320	NOT DELETE INDEXED 
* 
*   MOVE KEYS TO FDB KEY AREAS
* 
	LDK	A4,8 
IXINS3	EQU	*
	LDR	A3,A11	FDB DATA
	ADR	A3,A4
	LD	A2,FDBADF,A3	FDB INDEX
	RF(Z)	IXINS4	NO INDEX
	LD	A1,FDBKA,A2	KEY ADDR
	AD	A1,FDBRRO,A11	REC OFFS
	ADR	A1,A5	BUFFERADDR GIVES KEY ADDR
	LD	A3,FDBRLE,A2	RECORD LENGTH
	SUK	A3,6	KEY LGTH
	ADKL	A2,FDBKEY	TO ADDR 
	CF	A14,MOVFW	KEY TO FDB AREA 
IXINS4	EQU	*
	SUK	A4,2 
	RB(NZ)	IXINS3	MORE INDEXS
	ABL	DMXDEL	DELETE INDEXED
	XIF
	EJECT
********************
*                  *
*   E R R O R      *
*                  *
********************

DMERPR	EQU	*
	LDKL	A1,PROT	PROTECTED 
	RF	DMERR 
DMERND	LDKL	A1,NODERR	NO DATA 
	RF	DMERR 
DMEAER	EQU	*	RELEASE EA FOR ALL FILES 
	LC	A3,FDBTNR,A11	USER TASK ID
	ANK	A3,/FF 
	CF	A14,RELPRO	RELEASE PROTECT
	LDKL	A1,PROERR	PROTECT ERR 
DMERR	EQU	* 
	RF	DMTERR
	EJECT
* 
*	MOVE RECORD FROM USER TO SYSTEM AREA
* 
DMT320	EQU	*
	LD	A9,DWTECB,A11	USER ECB ADDRESS
	LD	A3,FDBRLE,A11	RECORD LENGTH 
	LD	A2,FDBRRO,A11 
	ADR	A2,A5	TO ADDRESS 
	LD	A1,ECBBA,A9	FROM ADDRESS
	IFT	MMUPAG=0 
	CF	A14,MOVFW 
	XIF
	IFT	MMUPAG=1 
	LD	A4,DWTTAB,A11	GET TTAB ADDRESS
	CF	A14,MOV:US	MOVE RECORD FROM USER TO SYSTEM AREA 
	XIF
	EJECT
* 
* 
*   SET STATUS USED 
* 
	LDK	A3,/FF 
DMT350	SCR	A3,A10 
	LD	A3,FDBDBR,A11 
	RF(NN)	DMT390	NO DELAY 
* 
*	DELAY 
* 
	LDKL	A2,/1000
	ORS	A2,FDBDBR,A11	KEEP BUFFER
	RF	DMT400
* 
*   WRITE BLOCK TO DISC 
* 
DMT390	EQU	*
	CF	A14,FMIOWR
	RF(NZ)	DMTERR
	EJECT
* 
*	SET CURRENCY AND EXCLUSIVE ACCESS 
* 
DMT400	EQU	*
	CF	A14,CRNGET	GET CURRENCY BUFFER
	LDR	A10,A2	BUFFER ADDR 
	LD	A1,ECBCW,A9 
	LD	A2,ECBCW+2,A9	LOG REC NR
	LD	A7,DWTOR,A11
	ANK	A7,/3F	ORDER INDEX 
	LDR	A4,A7
	SUK	A4,OWRRM0
	RF(Z)	DMT450	WRITE RANDOM
	SUK	A4,OWRSQ0-OWRRM0 
	RF(Z)	DMT440	WRITE SEQUENTIAL
	SUK	A4,OREWR0-OWRSQ0 
	RF(Z)	DMT450	REWRITE NOT INDEXED 
	IFT	INDXAC=1 
	SUK	A4,OREWRX-OREWR0 
	RF(Z)	DMT450	REWRITE INDEXED 
	ADK	A4,OREWRX-OWRRMX 
	RF(Z)	DMT440	WRITE RANDOM INDEXED
	SUK	A4,OSTRTX-OWRRMX 
	RF(Z)	DMT410	START INDEXED 
	XIF
	LDR	A4,A7	ORDER INDEX
	SUK	A4,OSTRTD
	RF(NZ)	DMT430	NOT START DIRECT 
	EJECT
* 
*	START   A1,A2=LOGICAL RECORD NUMBER 
* 
*	LRN=LRN-1 
* 
DMT410	EQU	*
	LDR	A3,A1
	LDR	A4,A2
	SUK	A4,1 
	RF(NN)	DMT420
	ANKL	A4,/7FFF
	SUK	A3,1 
* 
*	SET NEW CURRENT RECORD NUMBER 
* 
DMT420	EQU	*
	ST	A3,CRNCDF,A10	NEW CURRENCY
	ST	A4,CRNCDF+2,A10 
	RF	DMT450

* 
*	SET CURRENT RECORD NUMBER 
* 
DMT430	EQU	*
	ST	A1,CRNCDF,A10 
	ST	A2,CRNCDF+2,A10	CRN DATA FILE 
	RF	DMT450

* 
*   UPDATE LRN
* 
DMT440	EQU	*
	SC	A1,FDBLRN,A11 
	ST	A2,FDBLRN+1,A11 
	EJECT
DMT450	EQU	*
* 
*   CHECK PROTECT 
* 
	LC	A4,FDBOMD,A11	OPEN MODE 
	ANK	A4,/FF 
	CWK	A4,SDMOIP
	RF(E)	DMT460	OPEN INPUT PROTECTED
	CWK	A4,SDMIOP
	RF(NE)	DMT470	NOT OPEN INPUT OUTPUT PROTECTED
* 
*   CHECK IF EA IS SET ALREADY
* 
DMT460	EQU	*
	CF	A14,EATEST	CHECK EA 
	RF(NZ)	DMT470	EA ALREADY SET 
* 
*   SET EA
* 
	CF	A14,EASETB
DMT470	EQU	*
	LDK	A1,0	SET RETURN CODE 
	IFT	INDXAC=1 
	LDK	A4,OWRRMX
	CWR	A7,A4
	ABL(E)	DMINS2	WRITE RANDOM INDEXED 
	XIF
	EJECT
*************************************** 
*                                     * 
*   E X I T   D M   T A S K           * 
*                                     * 
*************************************** 

* 
DMTERR	EQU	*
	LC	A4,FDBDBR,A11 
	ANK	A4,/10 
	RF(NZ)	SDMERX	KEEP BUFFER
	CF	A14,SDMRLB	RELEASE BLOCK BUFFER 
SDMERX	EQU	*
	LD	A6,FDBADF,A11	GET FDB DATA FILE 
	INH
* 
*   A1 = RET CODE 
*   A6 = DWT ADDR 
* 
	CF	A15,TENDIO
	ENB
	LKM
	DATA	3 
	IFT	INDXAC=1 
	EJECT
************************************************
*                                              *
*   R E A D   R A N D O M   I N D E X E D      *
*   S T A R T   I N D E X E D                  *
*                                              *
************************************************

RDRMIX	EQU	*	READ RANDOM INDEXED
STRTIX	EQU	*	START INDEXED
	CF	A14,FNDKYP	SET PARAM AND THEN FNDKEY
* 
*	ENTRY ALSO FOR READ SEQUENTIAL INDEXED
* 
DMR100	EQU	*	FROM READ SEQUENTIAL INDEXED 
	LD	A9,DWTECB,A11 
	LD	A2,DWTOR,A11
	ANK	A2,/3F	ORDER 
	SUK	A2,OSTRTX
	RF(NZ)	DMR110	NOT START
	LC	A2,DWTOPT,A11 
	ANK	A2,7	OPTION
	RF(Z)	DMR110	EQUAL 
	ANKL	A1,/FBFF	IGNORE NOKEY 
DMR110	EQU	*
	SUK	A1,1 
	RF(Z)	DMIER4	NOT OPERABLE
	ADK	A1,1 
	RF(NZ)	DMIER1	KEY NOT FOUND
	CF	A14,RECECB	MOVE RECORD NUMBER TO ECB
	EJECT
* 
*   SET CRN 
* 
	LDR	A13,A11	SAVE FDB INDEX FILE
	LD	A11,FDBADF,A11	FDB DATA FILE
	LD	A5,DWTOR,A13	GET INTERN ORDER INDEX	=5
	ANK	A5,/3F	ORDER INDEX 
	LDR	A12,A11	FDB DATA FILE
	CF	A14,CRNGET	GET CRN BUFFER ADDR
	LDR	A10,A2	CRN BUFFER ADDR 
	LDR	A11,A13	FDB INDEX FILE 
	CF	A14,GTLGRN	GET INDE X LOG REC NO
	LDK	A7,ORDRM0	RANDOM READ
	SUK	A5,OSTRTX
	RF(NE)	DMR120	INDEXED READ 
	LDK	A7,OSTRTX	START INDEXED
	SUK	A2,1 
	RF(NN)	DMR120	NOT UNDERFLOW
	ANKL	A2,/7FFF
	SUK	A1,1 
DMR120	EQU	*
	SC	A1,CRNCIF+1,A10 
	ST	A2,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,A11	FILE NR 
	SC	A2,CRNCIF,A10 
	LDR	A11,A12	FDB DATA FILE
	SC	A7,DWTOR+1,A11	NEW ORDER
	LDKL	A2,/CFFF
	ANS	A2,FDBDBR,A11	RELEASE INDEX BUFFERS
	ABL	DMT280 
	EJECT
***************************************************** 
*                                                   * 
*   R E A D   S E Q U E N T I A L   I N D E X E D   * 
*                                                   * 
***************************************************** 

RDSQIX	EQU	*	READ SEQUENTIAL INDEXED
	LD	A1,FDBRRO,A11	RECORD OFFSET 
	LDR	A4,A5	BUFFER ADDRESS 
	SUKL	A4,BUFSTA 
DMI100	EQU	*
	CF	A14,CHKRCD	CHECK RECORD STATUS
	RF(E)	DMI130	USED
	LD	A3,FDBMRO,A11 
	ST	A3,FDBRRO,A11	LAST RECORD IN BLOCK
	EJECT
* 
*   CHECK IF END OF FILE
* 
	CF	A14,GTLGRN	GET REC NR 
	CC	A1,FDBLRN,A11 
	RF(L)	DMI120	NOT EOF 
	RF(G)	DMIER6	EOF 
	CW	A2,FDBLRN+1,A11 
	RF(NL)	DMIER6	END OF FILE
DMI120	EQU	*
	CF	A14,RDNXTR	GET NEXT INDEX RECORD
	RB(NZ)	DMI100	RECORD FOUND 
	RF	DMIER2	ERROR
	EJECT
DMI130	EQU	*	 
* 
*   INDEX RECORD IS FOUND 
* 
	LD	A9,DWTECB,A11	USER ECB
* 
*   KEY RECORD FOUND
*   CHECK IF NEXT RECORD HAS THE SAME KEY 
* 
	LD	A1,FDBRRO,A11	RECORD OFFSET 
	ADKL	A1,BUFSTA 
	ADR	A1,A4	REC ADDR 
	LD	A3,FDBRLE,A11	REC LENGTH
	SUK	A3,6	KEY LENGTH
	ADR	A1,A3
	CC	A3,2,A1	DUPLICATE KEY CHARACTER 
	RF(NE)	DMI140	NEXT KEY NOT SAME
	LDKL	A1,NXTKYS	BIT 6 
	ORS	A1,ECBRC,A9	NEXT KEY SAME
DMI140	EQU	*
	LDK	A1,0	MARK FOUND
	ABL	DMR100	CONT AS FOR INDEXED RAND READ 
	EJECT
********************
*                  *
*   E R R O R      *
*                  *
********************

DMIER1	LDKL	A1,KEYERR	KEY NOT FOUND 
	RF	DMIERR	 
DMIER2	EQU	*
	LDKL	A1,NODERR	NO IDENT
DMIERR	EQU	*
	LDR	A4,A4	BUFFER ADDR
	ABL(Z)	SDMERX	NO BUFFER
	ABL	DMTERR	ERROR AND BUFFER
DMIER3	EQU	*
	ANK	A1,/27 
	RB(NZ)	DMIERR	BIT 10,13,14,15
	LDKL	A1,EOMERR	GRAVE ERR ALSO
	RB	DMIERR
DMIER4	EQU	*
	LDK	A1,1	NOT OPERABLE
	RB	DMIERR
DMIER5	EQU	*
	LDKL	A1,PROT	PROTECTED 
	RB	DMIERR
DMIER6	EQU	*
	LDKL	A1,EOFERR 
	RB	DMIERR
	EJECT
***************************************************** 
*                                                   * 
*   W R I T E   R A N D O M   I N D E X E D  (P2)   * 
*   D E L E T E   I N D E X E D                     * 
*                                                   * 
***************************************************** 

DMINS2	EQU	*	WRITE RANDOM INDEXED PART 2
DMXDEL	EQU	*	DELETE INDEXED 
	LC	A4,FDBDBR,A11 
	ANK	A4,/10 
	RF(NZ)	DXI010	KEEP BUFFER
	CF	A14,SDMRLB	RELEASE BLOCK BUFFER 
DXI010	EQU	*
	LDK	A5,10	LOOPER 
DXI020	EQU	*	NEXT INDEX 
	LD	A7,DWTOR,A11	ORDER
	ANK	A7,/3F 
	SUK	A5,2 
	RF(Z)	DXI100	ALL INDEXES 
	LDR	A1,A11	FDB DATA
	ADR	A1,A5
	LD	A1,FDBADF,A1	FDB INDEX
	RB(Z)	DXI020	NO INDEX
	LD	A2,DWTOR,A11	ORDER
	ST	A2,DWTOR,A1 
	LD	A2,DWTECB,A11	USER ECB ADDR 
	ST	A2,DWTECB,A1
	ST	A5,FDBKA,A11	SAVE COUNTER 
	LDR	A11,A1	FDB ADDRESS INDEX FILE
	SUK	A7,OWRRMX
	RF(E)	DMINIX	WRITE RANDOM INDEXED
	RF	DMDELX	DELETE INDEXED 
	EJECT
* 
*   RETURN FROM UPDATING OF ONE INDEX 
* 
DMTAR5	EQU	*
	LD	A11,FDBADF,A11	FDB ADDRESS DATA FILE
	LD	A5,FDBKA,A11	GET COUNTER OF INDEXES 
	RB	DXI020	TAKE NEXT INDEX
* 
*	END IF WRITE RANDOM INDEXED ELSE CONTINUE 
* 
DXI100	EQU	*	INDEXES READY
	LDK	A1,0	RET CODE
	SUK	A7,OWRRMX	WRITE RANDOM INDEXED 
	ABL(E)	SDMERX	READY
	ABL	DMT020	RESTART SDMTSK
	EJECT
***************************************************** 
*                                                   * 
*   W R I T E   R A N D O M   I N D E X E D         * 
*   D E L E T E   I N D E X   R E C O R D           * 
*                                                   * 
***************************************************** 

DMINIX	EQU	*	WRITE RANDOM INDEXED 
	IFT	MMUPAG=0 
* 
*   GET KEY IN USER BUFFER
* 
	LD	A9,FDBADF,A11	FDB ADDRESS DATA FILE 
	LD	A9,DWTECB,A9	USER ECB ADDRESS 
	LD	A9,ECBBA,A9	USER BUFFER 
	AD	A9,FDBKA,A11	KEY ADDRESS
	RF	INS010
	XIF
	IFT	INDXAC=1 
DMDELX	EQU	*	DELETE INDEX RECORD
	LDR	A9,A11 
	ADKL	A9,FDBKEY	KEY ADDR
INS010	EQU	*
	LDR	A12,A9 
	LD	A10,FDBRLE,A11	RECORD LENGTH
	SUKL	A10,6	KEY LENGTH
	LDR	A8,A14 
	ADKL	A8,2	ECB ADDR TO RECORD BUFFER AREASS 
	CF	A14,FNDKEY	GET INDEX RECORD 
	ADK	A4,0 
	RB(Z)	DMIER3	NO SECTOR FOUND 
	LDR	A6,A7	NUMBER OF SAME CHARACTERS
	LD	A9,DWTECB,A11	USER ECB ADDRESS
	LD	A2,DWTOR,A11	ORDER CODE 
	ANK	A2,/3F 
	SUK	A2,ODELTX
	ABL(E)	DEL000	DELETE INDEX RECORD
	EJECT
* 
*   SET RC BIT 6 TO USER IF NEXT KEY
*   IS SAME IN REQUESTED INDEX
* 
	ADK	A1,0 
	RF(NZ)	INS180	NEXT KEY NOT SAME
	IFT	KEYDUP=1	
	CW	A11,FDBAI1,A11	 
	RB(E)	DMIER5	FIRST INDEX 
	XIF	 
	IFT	INDXAC=1	
	LDKL	A1,NXTKYS	NEXT KEY SAME 
	ORS	A1,ECBRC,A9	SET RETURN CODE
	IFT	INSLAS=1 
	EJECT
* 
*   INSERT SAME KEY LAST
* 
	LD	A1,FDBRRO,A11	RECORD OFFSET 
	RF	INS100
INS080	EQU	*
	CF	A14,RDNXTR	GET NEXT REC 
INS090	EQU	*
	RB(Z)	DMIER3	ERROR 
INS100	EQU	*
	CF	A14,CHKRCD	CHECK RECORD STATUS
	RF(E)	INS150	USED
	LD	A3,FDBMRO,A11 
	ST	A3,FDBRRO,A11 
	RB	INS080	GET FIRST RE C IN NXT SECT 
INS150	EQU	*
	LC	A6,-4,A1	DUPLICATE KEY CHARACTER
	CWR	A6,A10	CHECK KEY LENGTH
	RB(E)	INS080	NEXT SAME GET NEXT
	EJECT
* 
*   UPDATE LAST SAME RECORD 
* 
	SC	A10,-4,A1	NEXT SAME 
	LD	A1,FDBRRO,A11 
	CW	A1,FDBMRO,A11 
	RF(NE)	INS160	SECT WRITTEN LATER 
* 
*   WRITE BLOCK 
* 
	CF	A14,FMIOWR
	ABL(NZ)	DMTERR 
* 
*   GET NEXT RECORD 
* 
INS160	EQU	*
	CF	A14,RDNXTR	GET NEXT RC
INS170	EQU	*
	RB(Z)	INS090	GO TO DMIER3 IF ERROR 
	XIF
	IFT	INDXAC=1 
	EJECT
INS180	EQU	*
* 
*   CREATE AN INDEX RECORD IN AREA 1
* 
	LDR	A1,A12	FROM ADDR 
	LDR	A2,A14 
	ADKL	A2,SDMBF1	TO ADDRESS
	LDR	A3,A10	KEY LENGTH
	CF	A14,MOVFW	MOVE KEY
	SCR	A3,A2	DUMMY
	ADK	A2,1 
	SCR	A3,A2	DUMMY
	ADK	A2,1 
	SCR	A6,A2	NR OF SAME CHAR
	ADK	A2,1 
	LD	A1,DWTECB,A11	USER ECB ADDRESS
	ADKL	A1,ECBCW+1	SOURCE POINTER 
	LDK	A3,3	NUMBER OF CHARACTERS TO MOVE
	CF	A14,MOVFW 
	LDK	A1,/FF	USED
	SCR	A1,A2	STATUS CHAR
	CF	A14,GTLGRN	GET REC NR INDEX 
* 
*   SAVE RECORD NR FOR FIRST MOVED INDEX
* 
	LDR	A12,A1 
	LDR	A13,A2 
	EJECT
* 
*   BELOW IS A NEW INDEX RECORD INSERTED AND FOLLOWING
*   USED RECORDS ROLLED FORWARD 
*   A4,A10,A11 IS USED AT ENTRY 
	ADKL	A10,7	RECORD LENGTH TOTAL 
* 
*   USE D REGISTERS 
*   A11  = FDB ADDR INDEX 
*   A9   = AREA ADDR
*   A10  = RECORD LENGTH INDEX
*   A5   = AREA INDEX 0=BUFAR1,1=BUFAR2 
*   A4   = BUFFER ADDRESS BLOCK 
* 
	LDK	A5,1	BUF ADR2
INS200	EQU	*
	LDKL	A9,SDMBF1	BUFFER 1
	ADK	A5,0 
	RF(Z)	INS210	BUFAR1
	LDKL	A9,SDMBF2	BUFFER 2
INS210	EQU	*
	ADR	A9,A14	RECORD BUFFER ADDRESS 
* 
*   SAVE LAST RECORD
* 
	LDR	A1,A4
	ADKL	A1,BUFSTA 
	AD	A1,FDBMRO,A11	ADDR OF LAST REC IN SECT
	LDR	A3,A10 
	LDR	A2,A9
	CF	A14,MOVFW	SAVE LAST RECORD
	EJECT
* 
*   MOVE REST OF BLOCK DOWN ONE RECORD POSITION 
* 
	LDR	A1,A4
	ADKL	A1,BUFSTA 
	AD	A1,FDBRRO,A11	FROM ADDR 
	LDR	A6,A1
	LD	A3,FDBMRO,A11 
	SU	A3,FDBRRO,A11	NR OF CHAR
	LDR	A2,A1
	ADR	A2,A10	TO ADDR 
	CF	A14,MOVBW	MOVE
* 
*   INSERT NEW RECORD 
* 
	LDKL	A1,SDMBF2 
	ADK	A5,0 
	RF(Z)	INS250	BUFAR1
	LDKL	A1,SDMBF1 
INS250	EQU	*
	ADR	A1,A14	FROM ADDR 
	LDR	A3,A10	NR OF CHAR
	LDR	A2,A6	TO ADDR
	CF	A14,MOVFW	MOVE
	EJECT
* 
*   WRITE BUFFER
* 
	LDR	A8,A14	USE STACK AS ECB	:=S
	SUKL	A8,SDMSTS	7 WORDS NEEDED	:=S
	LC	A2,FWTFNR,A11	VOL DEV CODE
	ANK	A2,/FF 
	STR	A2,A8	 
	LDR	A2,A4
	ADKL	A2,BUFSTA 
	ST	A2,ECBBA,A8	SECTOR ADDR 
	LC	A2,FDBBLZ,A11	BLOCK SIZE
	SLL	A2,8	IN BYTE 
	ST	A2,ECBRL,A8 
	LD	A2,FDBSNR,A11	SECTOR NR 
	ST	A2,ECBCW,A8	SECTOR NR 
	LD	A3,FDBSNR+2,A11 
	ST	A3,ECBCW+2,A8	SECT NR 
	CF	A14,FMIOWR
	ABL(NZ)	DMTERR 
* 
*   IF SPILLED RECORD IS FREE, OPERATION IS READY 
* 
	LDR	A2,A9	RECORD AREA ADDR 
	ADR	A2,A10	REC LGTH
	SUK	A2,1	ADDR OF STATUS CHAR 
	LD	A3,FDBMRO,A11 
	ST	A3,FDBRRO,A11	MAX OFFSET IN SECT
	CCR	A1,A2
	RF(Z)	INS400	FREE RECORD 
	EJECT
* 
*   GET NEXT BLOCK
* 
	LDR	A9,A5	SAVE A5	=7 
	CF	A14,RDNXTR	GET RECORD (7 WORDS ON STACK)	:=S
	LDR	A5,A9	RESTORE REGISTER	=7
	ADK	A4,0	SET CR	=7 
INS260	EQU	*
	RB(Z)	INS170	GO TO DMIER3 IF ERROR 
	XRK	A5,1	SWITCH KEY RECORD BUFFERS	=7
	RB	INS200
INS400	EQU	*
* 
*   UPDATE LRN IF EOF IS ENCOUNTERED
* 
	CF	A14,GTLGRN	 
	CC	A1,FDBLRN,A11 
	RF(L)	INS430	NO EOF
	RF(G)	INS410	EOF 
	CW	A2,FDBLRN+1,A11 
	RF(NG)	INS430	NO EOF 
INS410	EQU	*
	SC	A1,FDBLRN,A11	LAST RECORD NUMBER
	ST	A2,FDBLRN+1,A11 
	LD	A9,DWTECB,A11	USER ECB ADDRESS
	LDKL	A3,EOFRC	END OF FILE
	ORS	A3,ECBRC,A9	TO USER
	EJECT
INS430	EQU	*
* 
*   UPDATE CRN-LINK FOR MOVED INDEX RECORDS 
* 
	LDK	A7,1	ADD ONE TO CRN
	CF	A14,CRNUPD	ADD 1 TO RECORD NUMBERS
INS440	EQU	*
	CF	A14,SDMRBU	REL BUFFER 
	ABL	DMTAR5	ONE INDEX READY TAKE NEXT 
	EJECT
DEL000	EQU	*	DELETE INDEX RECORD CONT 
	ADK	A1,0 
DEL010	EQU	*
	ABL(NZ)	DMIER3	KEY NOT FOUND 
* 
*   CHECK RECORD NR DATA REC
* 
DEL020	EQU	*
	LD	A1,FDBRRO,A11 
	ADR	A1,A4
	AD	A1,FDBRLE,A11 
	ADK	A1,7	BUFSTA-3=ADDR REC NR
	LCR	A2,A1
	CC	A2,ECBCW+1,A9	REC NR
	RF(NE)	DEL030	WRONG RECORD 
	LC	A2,1,A1 
	ECR	A2,A2
	LC	A2,2,A1	REC NR
	CW	A2,ECBCW+2,A9 
	RF(E)	DEL200	RECORD FOUND
DEL030	EQU	*
	EJECT
* 
*   CHECK IF NEXT KEY SAME
* 
	CC	A10,-1,A1	KEY LENGTH
	RB(NE)	DEL010	NEXT KEY NOT SAME
DEL040	EQU	*
	CF	A14,RDNXTR	GET NEXT INDEX RECORD
DEL045	EQU	*
	RB(Z)	INS260	GO TO DMIER3 IF ERROR 
* 
*   CHECK IF RECORD IS USED 
* 
	CF	A14,CHKRCD	CHECK RECORD STATUS
	RB(E)	DEL020	USED
	LD	A1,FDBMRO,A11 
	ST	A1,FDBRRO,A11	LAST RECORD IN SECTOR 
	RB	DEL040	NEXT REC 
	EJECT
DEL200	EQU	*	RECORD FOUND 
* 
*   SET RC BIT 6 IF NEXT KEY SAME 
* 
	LC	A7,-1,A1	NR OF SAME CHAR
	ANK	A7,/FF 
	ST	A7,16,A14	SAVE IN RECORD BUFFER AFTER ECB 
	CWR	A10,A7	KEY LENGTH
	RF(NE)	DEL220	NEXT KEY NOT SAME
	LDKL	A2,NXTKYS 
	ORS	A2,ECBRC,A9	NEXT KEY SAME
DEL220	EQU	*
* 
*   MOVE UP RECORDS OVER DELETED
* 
	ADKL	A10,7	TOTAL RECORD LENGTH 
	LDR	A2,A4
	ADKL	A2,BUFSTA 
	AD	A2,FDBRRO,A11	TO ADDR 
	LDR	A1,A2
	ADR	A1,A10	FROM ADDR 
	LD	A3,FDBMRO,A11 
	SU	A3,FDBRRO,A11	NR OF CHAR
	CF	A14,MOVFW	MOVE
* 
*   SET LAST RECORD FREE
* 
	ADR	A2,A10 
	SUK	A2,1 
	SCR	A3,A2	STATUS FREE
	EJECT
* 
*   UPDATE CRN FOR MOVED RECORDS
* 
	CF	A14,GTLGRN	GET REC NR 
	LDR	A12,A1 
	LDR	A13,A2	FIRST REC NR MOVED
	LD	A3,FDBRRO,A11	SAVE RELATIVE RECORD OFFSET 
	LD	A6,FDBMRO,A11 
	ST	A6,FDBRRO,A11	MAX OFFSET
	CF	A14,GTLGRN	LAST REC NR MOVED
	ST	A3,FDBRRO,A11	RESET OFFSET
	LDKL	A7,-1 
	CF	A14,CRNUPD	UPDATE CRN BUFFERS 
	LDK	A5,1	MARK BUFFER CHANGED 
	EJECT
DEL240	EQU	*
	LD	A1,FDBRRO,A11 
	RF(NZ)	DEL290	NOT FIRST RECORD 
	CF	A14,GTLGRN	GET REC NR 
	LDK	A6,0 
	LDK	A7,1 
	CF	A14,DSUMOD	A1,A2 = A1,A2 - 1
	RF(Z)	DEL600	FILE START
	CF	A14,CALSNO	GET SECTOR NR
	RF(NZ)	DEL600	FILE START 
	ADK	A5,0 
	RF(Z)	DEL245	BUFFER NOT CHANGED
	EJECT
* 
*   WRITE SECTOR
* 
	CF	A14,FMIOWR
	ABL(NZ)	DMTERR 
	LDK	A5,0	BUFFER NOT CHANGED YET
DEL245	EQU	*
	CF	A14,SDMRBU	RELEASE BUFFER 
* 
*   GET PREVIOUS SECTOR 
* 
	LDK	A4,0 
	CF	A14,RDNXTR	GET SECTOR 
	RB(Z)	DEL045	GO TO DMIER3 IF ERROR 
DEL250	EQU	*
	LD	A1,FDBMRO,A11 
	RF	DEL300
DEL290	EQU	*
	SU	A1,FDBRLE,A11 
	SUK	A1,1 
DEL300	EQU	*
	ST	A1,FDBRRO,A11	PREVIOS RECORD OFFSET 
	CF	A14,CHKRCD	CHECK RECORD STATUS
	RB(NE)	DEL240	FREE 
	EJECT
* 
*   SET CURRENCY
* 
	LDR	A9,A3	STATUS ADDR
	LDR	A12,A11	FDB ADDRESS INDEX FILE 
	LD	A11,FDBADF,A11	FDB ADDRESS DATA FILE
	CF	A14,CRNGET	GET CRN BUFFER 
	LDR	A11,A12	FDB ADDRESS INDEX FILE 
	LC	A1,FWTFNR,A11	INDEX FILE NR 
	CC	A1,CRNCIF,A2	LAST REF INDEX 
	RF(NE)	DEL350	NOT THIS IND 
* 
*   UPDATE CURRENCY 
* 
	LDR	A3,A2	CRN ADDR 
	CF	A14,GTLGRN	GET REC NR 
	SC	A1,CRNCIF+1,A3
	ST	A2,CRNCIF+2,A3	RECORD NUMBER
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	*
	ADK	A5,0 
	RF(Z)	DEL900	BUFFER NOT CHANGED
	EJECT
* 
*   WRITE SECTOR
* 
DEL700	EQU	*
	CF	A14,FMIOWR
	ABL(NZ)	DMTERR 
DEL900	EQU	*
	ABL	INS440 
	XIF
	EJECT
* 
*	FNDBLB=FIND BLOCK BUFFER
* 
FNDBLB	EQU	*
	LD	A7,DWTOR,A11	ORDER
	ANK	A7,/3F 
	SUK	A7,ORDSQ0
	RF(NZ)	FBL110	NOT READ SEQUENTIAL
* 
	LD	A2,ECBCW,A9 
	LD	A3,ECBCW+2,A9	REC NR
	CC	A2,FDBLRN,A11 
	RF(L)	FBL110	NO EOF
	RF(G)	FBL100	EOF 
	CW	A3,FDBLRN+1,A11 
	RF(NG)	FBL110	NO EOF 
FBL100	EQU	*
	LDK	A2,1	INDICATE ERROR
	LDKL	A1,EOFERR	EOF 
	RF	FBL170	RETURN 
FBL110	EQU	*
	LDKL	A2,/CFFF
	ANS	A2,FDBDBR,A11	RELEASE BUFFER 
	CF	A14,GTBKBU	GET BLOCK BUFFER 
	RF(N)	FBL120	NO DATA IN BUFFER 
	EJECT
* 
*   DELAYED BUFFER IS WRITTEN 
*   IF IT IS NOT THE WANTED BLOCK 
* 
	LC	A7,BUFOR,A4	DELAY FLAG
	ANK	A7,/3
	RF(Z)	FBL150	NO DELAY
	CM	BUFOR,A4	RESET
	ANK	A7,1 
	RF(NZ)	FBL130	RIGHT SECTOR 
	LD	A7,BUFSNR,A4	SECT NR
	ST	A7,ECBCW,A8 
	LD	A7,BUFSNR+2,A4
	ST	A7,ECBCW+2,A8 
	CF	A14,FMIOWR
	RF(NZ)	FBL160	ERROR
	CF	A14,SDMRBU	RELEASE BUFFER 
	RB	FNDBLB	GET NEW BUFFER 
	EJECT
FBL120	EQU	*
* 
*   READ BLOCK INTO BUFFER
* 
	CF	A14,FMIORD	PHYSICAL READW 
	RF(NZ)	FBL160	ERROR
	LD	A5,ECBBA,A8 
	RF	FBL150
FBL130	EQU	*	RIGHT DELAYED BUFFER IS FOUND
	LDKL	A2,/1000
	ORS	A2,FDBDBR,A11	KEEP BUFFER
FBL150	EQU	*
	LDK	A2,0	INDICATE OK 
	RF	FBL170
FBL160	EQU	*
	LDKL	A2,-1	INDICATE ERROR
FBL170	EQU	*
	ADKL	A14,4 
	ADK	A2,0	SET CR
	ABR*	A14 
	EJECT
* 
*	CHKSTS=CHECK RECORD STATUS AND LOAD LOGICAL RECORD NUMBER 
* 
*	ENTRY : A11=FWT ADDRESS 
*	        A5=BLOCK ADDRESS
*	        A9=USER ECB ADDRESS 
* 
*	EXIT  : A1,A2=LOGICAL RECORD NUMBER 
*	        A10=RECORD STATUS POINTER 
*	        A4=DESTROYED
*	        CR=0 IF RECORD NOT USED 
* 
CHKSTS	EQU	*
	LD	A10,FDBRRO,A11
	AD	A10,FDBRLE,A11
	ADR	A10,A5 
	LD	A1,ECBCW,A9 
	LD	A2,ECBCW+2,A9 
	LDK	A4,0 
	ADKL	A14,4 
	CCR	A4,A10 
	ABR*	A14 
	EJECT
* 
*	FNDKYP=SET PARAMETERS AND THEN GO TO FNDKEY SUBROUTINE
* 
	IFT	INDXAC=1 
FNDKYP	EQU	*
	LDR	A9,A11 
	ADKL	A9,FDBKEY	KEY AREA ADDRESS
	LD	A10,FDBRLE,A11	RECORD LENGTH INDEX
	SUKL	A10,6	KEY LENGTH
	ABL	FNDKEY 
	XIF



	END

Full view