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

⟦31441c9f1⟧

    Length: 38970 (0x983a)
    Notes: pts_type(SC)
    Names: »SDMSUB.SC«

Derivation

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

PTS(SC)

	IDENT SDMSUB 	REL 11.0 81-05-22 870105041100 

			=6,FORMATTING ERROR
			=6,REL 11.0 81-05-12 
			=5,CONDITION FOR CR,DE,EX
			=5,REL 11.0 81-03-20 
			=4,BLOCK BUFFER CHAIN DESTR. WHEN FORM. WITH LEN=0 
			=4,REL 11.0 81-03-17 
			=3,NBR. OF SAME CHAR. IN KEY WRONG 
			=3,REL 11.0 81-03-13 
			=2,ADDRESS COMPARE WHEN FORMAT BLOCK,BAD	=1
			=2,REL 11.0 81-02-04	=1
			=1,SUB. TO FORMAT BLOCK BUFFER CHNG. 
			=1,REL 11.0 81-01-26 
****************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   SDMSUB = COMMON SDM-ROUTINES
* 
* 
* 
* 
* 
* 
****************************************************
****THIS MODULE IS ACTIVATED FROM :*****************
* 
*   DMTASK,TIODM,DMTASS 
* 
*************** 
*   ENTRIES   * 
*************** 
* 
	ENTRY	RELPRO 
	ENTRY	MOVBW
	ENTRY	EATEST,EASETB,EARELB,CRNGET
	ENTRY	CALSNO 
	ENTRY	GTBKBU 
	ENTRY	CARRBL,CRRBL 
	ENTRY	FMIOOP,FMIOCL,FMIORD 
	ENTRY	FMIORF,FMIOWR,FMIODL 
	ENTRY	FMIOCR,FMIOEX
	ENTRY	FRMFIL,FORMAT,FORMER	=1
	ENTRY	RLBLKB,CHKRCD
	ENTRY	CASZEN 
	EJECT
* 
*	E N T R I E S   F O R   I N D E X   S U B R O U T I N E S 
* 
* 
*************** 
*   ENTRIES   * 
*************** 
* 
	ENTRY	CHKKEY 
	ENTRY	RDNXTR 
	ENTRY	FNDKEY 
	ENTRY	CRNUPD 
	ENTRY	GTLGRN 
	ENTRY	CRNCIF 
	ENTRY	RECECB 
	EJECT
* 
***************** 
*   EXTERNALS   * 
***************** 
* 
* 
	EXTRN	FDBEAL,FDBTNR,FDBCRL,FDBRLE,FDBSNR,FDBRRO
	EXTRN	FDBBLF,FDBADF
	EXTRN	FDBBLZ,FWTFNR
	EXTRN	FDBSTA,SCTTCT,TTB:SA,ECBEL 
	EXTRN	FDBECB,DWTECB,DWTOR,BUFSTA,BUFDMI,BUFOR
	EXTRN	FDBLRN,FDBMIA,FDBMRO 
	EXTRN	ECBRC,ECBFC,ECBCW,ECBBA
	EXTRN	DIVMOD,MPYMOD
	EXTRN	CRNTID 
	EXTRN	SDMGBU 
	EXTRN	CRNQUE,GETBLK,FREQUE 
	EXTRN	CRBUFL 
	EXTRN	FDBDBR 
	EXTRN	HALT,DSUMOD,ECBRL
	EXTRN	EOMERR,RETRIE
	EXTRN	REQER2,QTJOB,TDISP 
	EXTRN	DWTTAB,MONMMU,TTB:MT 
	EXTRN	FDBOMD 
	EXTRN	MOVFW
	EXTRN	ADDMOD 
	EXTRN	SDMRBU,CLRBUF
	EXTRN	BLKMXL	MAX BLOCK LENGTH
	EXTRN	EOFRC,NOKEY
	EXTRN	RTNA14 
	EXTRN	FPB:RL,FPB:BF,FPB:S1,SIZDIF
	EJECT			SDMSUB			TOSSIO
* 
* 
***************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
***************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
X:A	EQU	0 
INDXAC	EQU	X:A
* 
*	A VERSION LEAVING OUT OPEN MODES: 
*	OPEN OUTPUT,OPEN EXTEND AND DISCARD 
*	IS OBTAINED BY SETTING Y:C=0
* 
X:B	EQU	0		=5 
CRDEEX	EQU	X:B			=5 
	EJECT
* 
*   THIS ROUTINE RELEASES PROTECTION AT END OF TRANSACTION
* 
*   ENTRY : A3 = DM INTERNAL USER ID
* 
*   USED REGS A1 - A5 , A9
* 
*	NUMBER OF A14 LEVELS = 4 (WORDS)
* 
RELPRO	EQU	*	RELEASE PROTECTION 
	LDR	A9,A11	SAVE FDB ADDRESS
	LDKL	A11,FDBSTA	FIRST FWT ADDR 
REL050	EQU	*
	LDR*	A1,A11
	ANK	A1,/1
	RF(Z)	REL053	NOT USED
	LDKL	A1,/C000	REMOVE BUFFERS FOR THIS TASK 
	CF	A14,EARELB
	ENB
REL053	EQU	*
	LDR*	A11,A11 
	ANKL	A11,/FFFE	SKIP USE BIT
	RB(NZ)	REL050	MORE FDBS
	LDR	A11,A9	FDB ADDRESS 
	RTN	A14
	EJECT
* 
************* 
*   MOVBW   * 
************* 
* 
*   ENTRY   DMTBM   BYTE MOVE 
* 
*   INPUT   A1 = FROM ADDRESS 
*           A3 = NO OF BYTES TO BE MOVED
*           A2 = TO ADDRESS 
* 
* 
*   OUTPUT A3 = NEXT CHAR 
* 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
DMTB10	EQU	*
	LDR*	A4,A14
	RTN	A14
* 
*   MOVBW HAS THE SAME FUNCTION AS DMTBM BUT
*   MOVES FROM THE END
* 
MOVBW	EQU	* 
	STR	A4,A14 
	ADR	A1,A3
	ADR	A2,A3
DMTB20	EQU	*
	SUK	A3,1 
	RB(N)	DMTB10 
	SUK	A1,1 
	SUK	A2,1 
	LCR	A4,A1
	SCR	A4,A2
	RB	DMTB20
	EJECT			SDMSUB 
****DESCRIPTION*************************************
* 
*   EATEST WILL SEARCH THE EA-LINK FOR A LOG RECORD NO. 
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB ADRESS 
*   A1,A2 = LOG RECORD NO 
* 
*   CF   A14,EATEST 
* 
****EXIT PARAMETERS*********************************
* 
*   A1,A2,A11 = UNCHANGED 
*   A3 = 0   NO EA AT ALL 
*      = +1  EA FOUND FOR ACTUAL TASK 
*      = -1  EA FOUND FO R OTHER TASK 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
****USED REGISTERS**********************************
* 

BLKTID	EQU	4	TASK ID
BLKRNM	EQU	5	RECORD NUMBER MOST SIGNIFICANT 
BLKRNL	EQU	2	RECORD NUMBER LEAST SIGNIFICANT
	EJECT			SDMSUB 
EATEST	EQU	*
	LD	A3,FDBEAL,A11	BUFFER QUEUE
	RF	EAT030
EAT020	EQU	*
	LDR*	A3,A3	NEXT BUFFER ADR 
EAT030	EQU	*
	RF(Z)	EAT100	EMPTY QUEUE,NO EA 
* 
*   SEARCH LOG REC NO 
* 
	CC	A1,BLKRNM,A3	FIRST CHARACTER
	RB(NE)	EAT020
	CW	A2,BLKRNL,A3	2 AND 3 CHARACTER
	RB(NE)	EAT020
* 
*   RECORD NO FOUND 
* 
	LC	A3,BLKTID,A3
	CC	A3,FDBTNR,A11	TASK ID 
	RF(E)	EAT060 
	LDKL	A3,-1	EA OTHER TASK 
	RF	EAT100
EAT060	EQU	*
	LDK	A3,1	EA SAME ATASK 
EAT100	EQU	*
	ADKL	A14,4 
	ADK	A3,0 
	ABR*	A14 
	EJECT			SDMSUB 
****DESCRIPTION*************************************
* 
*   EASETB WILL UNCONDITIONALLY PUT A NEW EA BUFFER IN EA-LINK
*   IF NO BUFFERS ARE AVAILABLE THE SYSTEM WILL HALT AND LITE SOP-LAMPS 
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB ADDR 
*   A1,A2 = LOGICAL RECORD NO 
* 
*   CF   A14,EASETB 
* 
****EXIT PARAMETERS*********************************
* 
*   A11= FDB ADDR 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A1,A4 
* 
******************************************************* 
	EJECT			SDMSUB 
EASETB	EQU	*
	ECR	A1,A1
	LC	A1,FDBTNR,A11	TASK ID 
	ECR	A1,A1
	INH
	CF	A15,GETBLK	GET BUFF AND STORE A1,A2 
* 
*   LINK BUFFER TO FDB
* 
	LD	A1,FDBEAL,A11	LINK ROOT 
	STR	A1,A4	THREAD 
	ST	A4,FDBEAL,A11	NEW ROOT
	ENB
	RTN	A14
	EJECT			SDMSUB 
****DESCRIPTION*************************************
* 
*   EARELB WILL RELEASE EA BUFFERS AND CONNECT THEM 
*   TO THE FREE LINK. 
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB-ADDRESS
*   A1,A2 = LOGICAL RECORD NO 
*   A1: BIT 0=1,BIT 1=1  ALL BUFFERS WITH TASK ID SAME AS FDB 
*       AND A3 = 0
*                        ARE REMOVED. 
*   A1: BIT 0=1,BIT 1=1 
*       AND A3 NOT EQ 0  ALL BUFFERS ON FDB WITH
*                        TASK ID AS SPEC IN A3 ARE RELEASED 
*       BIT 0=1,BIT 1=0  ALL BUFFERS ON FDB ARE REMOVED.
*       BIT 0=0          THE FIRST BUFFER WITH TASK ID AND LOG REC NO 
*                        AS SPEC IS REMOVED.
* 
****EXIT PARAMETERS*********************************
* 
*   A11,A3,A1 = UNCHANGED 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A2,A4,A5
* 
************************************************* 
* 
*   THE ROUTINE SETS INHIBIT
	EJECT			SDMSUB 
EARELB	EQU	*
	LDR	A4,A11 
	ADKL	A4,FDBEAL	ROOT ADR
EAR020	EQU	*
	LDR	A5,A4	SAVE OLD ROOT
	LDR*	A4,A4	NEXT BUFFER ADR 
	RF(Z)	EAR100	EA LINK END 
	LDR	A1,A1	REC NO 
	RF(N)	EAR050	RELEASE MANY BUFFERS
* 
*   SEARCH LOG REC NO 
* 
	CC	A1,BLKRNM,A4
	RB(NE)	EAR020
	CW	A2,BLKRNL,A4
	RB(NE)	EAR020
	RF	EAR060
EAR050	EQU	*
	CWK	A1,/A000	CHECK BIT 1 
	RF(L)	EAR080	BIT 1 ZERO,ALL BUFFERS REMOVED
	LDR	A2,A3	REQ TASK ID
	RF(NZ)	EAR065	TASK ID IN A3
EAR060	EQU	*
* 
*   SEARCH TASK IDENT 
* 
	LC	A2,FDBTNR,A11	TASK ID 
EAR065	EQU	*
	CC	A2,BLKTID,A4
	RB(NE)	EAR020
	EJECT
* 
*   EA BUFFER FOUND 
* 
EAR080	EQU	*
	LDR*	A2,A4	NEXT BUFADR 
	STR	A2,A5	REMOVE BUFFER FROM LINK
* 
*   RETURN BUFFER TO POOL 
* 
	INH
	LD	A2,FREQUE 
	STR	A2,A4	NEXT FREE
	ST	A4,FREQUE	NEW ROOT
	LDR	A4,A5	BUFFER ROOT
	LDR	A1,A1
	RB(N)	EAR020	RELEASE MORE
EAR100	EQU	*
	RTN	A14
	EJECT			SDMSUB 
****DESCRIPTION*************************************
* 
*   CRNGET WILL SEARCH THE CRN-LINK FOR TASK ID. IF NO BUFFER IS
*   FOUND A NEW IS FETCHED FROM THE FREE LINK AND B FILLED WITH 
*   ZEROES AND PUT ON THE CRN LINK. IF NO FREE BUFFERS ARE AVAILABLE
*   THE SYSTEM WILL HALT AND LITE SOP-LAMPS.
*   TASK ID IS PLACED IN THE BUFFER 
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB ADDRESS DATA FILE
*        FDBTNR,A11 = TASK NUMBER 
*   FDBTNR,A11=CALLING TASK NUMBER
*   FDBCRL,A11=CURRENCY LINK
* 
****EXIT PARAMETERS*********************************
* 
*   A11= UNCHANGED
*   A2 = ADDRESS OF FOUND CRN-BUFFER
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A1,A3 
* 
**************************************************
* 
	EJECT			SDMSUB 
CRNGET	EQU	*
	LDKL	A2,FDBCRL 
	ADR	A2,A11	CRN ROOT
CRN020	EQU	*
	LDR*	A2,A2	NEXT BUFFER 
	RF(Z)	CRN100	LINK END
* 
*   CHECK ATASK IDENT 
* 
	LC	A3,FDBTNR,A11	TASK ID 
	CC	A3,CRNTID,A2
	RB(NE)	CRN020	OTHER TASK 
	RF	CRN200	BUFFER FOUND 
* 
*   GET NEW BUFFER
* 
CRN100	EQU	*
	INH
	LD	A2,CRNQUE	FREE LINK ROOT
	RF(NZ)	CRN120
	LDK	A1,3	LAMP 10 AND 11
	CF	A15,HALT	NO MORE BUFFERS
CRN120	EQU	*
	LDR*	A3,A2	NEXT FREE 
	ST	A3,CRNQUE	UPD ROOT
	EJECT
* 
*   FILL BUFFER WITH ZEROES 
* 
	LDKL	A3,CRBUFL	BUFFER LENGTH IN BYTES
CRN140	EQU	*
	SUK	A3,2	ZEROE WORDS 2 - N 
	RF(NP)	CRN160	BUFFER ZEROED
	LDR	A1,A2	BUFFER ADR 
	ADR	A1,A3	OFFSET IN BUFFER 
	CMR	A1 
	RB	CRN140	MORE WORDS 
* 
*   CONNECT NEW BUFFER TO LINK
* 
CRN160	EQU	*
	LC	A3,FDBTNR,A11 
	SC	A3,CRNTID,A2	TASK ID
	LD	A3,FDBCRL,A11	LINK ROOT 
	STR	A3,A2	THREAD 
	ST	A2,FDBCRL,A11	NEW ROOT
CRN200	EQU	*
	ENB
	RTN	A14
	EJECT			SDMSUB 
****DESCRIPTION*************************************
* 
*   CALSNO WILL CONVERT A LOGICAL RECORD NO TO
*   RELATIVE
*   SECTOR AND OFFSET 
* 
****ENTRY PARAMETERS********************************
* 
*   A1,A2 = LOGICAL RECORD NO 
*   A11= FDB ADDR 
* 
*   CF   A14,CALSNO 
* 
****EXIT PARAMETERS*********************************
* 
*   A1 =  0 OK
*     NE 0 , ERROR =/A000=END OF MEDIUM 
*   A11= UNCHANGED
*   IN FDB : FDBSNR = SECTOR NR 
*            FDBRRO = OFFSET  IN BLOCK
*	NUMBER OF A14 LEVELS = 5 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A2-A3,A6-A7 
	EJECT			SDMSUB 
CALSNO	EQU	*
	ST	A4,-4,A14	SAVE A4 
* 
*   FIND BLOCK NO WITHIN FILE 
* 
	LDK	A6,0 
	LC	A6,FDBBLF,A11	BLOCKING FACTOR 
	CF	A14,DIVMOD	A2=A1,A2//A6,A1=REMAINDER
	RF(O)	CALERR	OVERFLOW
	LDR	A3,A2	QUOTIENT 
	LDR	A4,A1	REMAINDER
	RF(Z)	TIOD30	REST = 0
	ADK	A3,1	RECORD IN NEXT BLOCK
	RF	TIOD40
TIOD30	EQU	*
	LC	A4,FDBBLF,A11	BLOCK FACTOR
* 
*   FIND LOGICAL SECTOR NUMBER ON DISC
* 
TIOD40	EQU	*
	LDR	A6,A3	BLOCK NR 
	RF(NP)	CALERR
	SUK	A6,1 
	LDK	A7,0 
	LC	A7,FDBBLZ,A11	NR OF SECT IN BLOCK 
	CF	A14,MPYMOD
	ADK	A2,1 
	RF(O)	CAL050 
	RF	CAL090
CAL050	EQU	*
	ANKL	A2,/7FFF
	ADK	A1,1	CARRY 
CAL090	EQU	*
	ST	A1,FDBSNR,A11 
	ST	A2,FDBSNR+2,A11	SECT NR 
	EJECT
* 
*   FIND RELATIVE RECORD OFFSET WITHIN BLOCK
* 
	LDK	A3,0 
	LDR	A2,A4	REL REC NR IN BLOCK
TIOD60	EQU	*
	SUK	A2,1	A2=REL REC NR 
	RF(Z)	TIOD65	REL REC OFFS IN A3 NOW
	AD	A3,FDBRLE,A11	NO  ADD RECORD LENGTH 
	ADK	A3,1	SKIP STATUS BYTE
	RB	TIOD60
CALERR	LDKL	A1,EOMERR	OUT OF MEDIUM 
	RF	TIODMF
* 
*   STORE RELATIVE REC OFFSET IN FBDRRO 
* 
TIOD65	EQU	*
	LDK	A1,0	OK
	ST	A3,FDBRRO,A11 
TIODMF	EQU	*
	LD	A4,-4,A14	SAVED REGISTER
	RF	RETURN	RETURN AND SET CONDITION 
	EJECT

**********************
*   FM I/O HANDLER   *
**********************

*	ENTRY: A11=FDB ADDRESS
*        A8=ECB ADDRESS 
* 
*	EXIT : A1=RETURN CODE 
*	       A11,A8=SAME AS ENTRY 
*	       A2=USED
* 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
*	FMIO=FILE MANAGEMENT I/O HANDLER
* 
FMIOWR	EQU	*	WRITE,DMTIOT 
	LDK	A7,/95 
	RF	FMIO10

FMIOCL	EQU	*	CLOSE
	LDK	A7,/A2 
	RF	FMIO10

FMIODL	EQU	*	DELETE 
	LDKL	A7,/2A2 
	RF	FMIO10

FMIOOP	EQU	*	OPEN FILE
	LDK	A7,/A1 
	RF	FMIO10

FMIOEX	EQU	*	EXTEND 
	LDKL	A7,/1A1 
	RF	FMIO10

FMIOCR	EQU	*	CREATE 
	LDKL	A7,/2A1 
	RF	FMIO10
	EJECT
FMIORF	EQU	*	READ FILE PARAMETERS 
	LDK	A7,/83 
	RF	FMIO10

FMIORD	EQU	*	READ 
	LDK	A7,/91 

FMIO10	EQU	*
	LKM
	DATA	15
	EJECT			SDMSUB 
* 
*	RESTORE SECTOR NUMBER 
* 
	LD	A1,FDBSNR,A11 
	ST	A1,ECBCW,A8 
	LD	A1,FDBSNR+2,A11 
	ST	A1,ECBCW+2,A8 
	LD	A2,DWTECB,A11	DM ECB ADDRESS
	LD	A1,ECBRC,A8 
	RF(Z)	RETURN	DISC I/O OK 
	ANKL	A1,/FEFF
	RF(NZ)	DMTIT1	NOT ONLY RETRIES 
	LDKL	A1,RETRIE 
	ORS	A1,ECBRC,A2	USER RETURN CODE 
	LDK	A1,0	SET RETURN CODE OK
	RF	RETURN
DMTIT1	EQU	*
	LD	A2,ECBBA,A8 
	SUKL	A2,BUFSTA	BUFSTA
	CM	BUFDMI,A2	CLEAR FILE NR IN BUFFER 
RETURN	EQU	*
	ABL	RTNA14 
	EJECT			SDMSUB 
****DESCRIPTION*************************************
* 
*   GTBKBU WILL GET A BLOCK BUFFER FOR DISC I/O AND 
*   PREPARE IT. ECB IS PREPARED FOR PHYS I/O. 
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB ADDRESS
*   A8 = ECB ADDR 
* 
****EXIT PARAMETERS*********************************
* 
*   A11=FDB ADDRESS 
*   A1 = FDBRRO WHEN SECTOR IS FOUND IN CORE
*                               = -1 WHEN NO DATA IS FOUND IN 
*                                 THE FOUND CORE BUFFER 
*   A4 = BLOCK BUFFER ADDRESS 
*   A5 = BLOCK DATA BUFFER ADDRESS
*   A8 = ECB ADDR 
*	NUMBER OF A14 LEVELS = 5 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A2-A3 
* 
******************************************************
GTBKBU	EQU	*
	LC	A3,FWTFNR,A11	FILE NUMBER 
	ANK	A3,/FF 
	STR	A3,A8	FILE NR
	LC	A5,FDBBLZ,A11 
	SLL	A5,8	BLOCK SIZE IN BYTYE 
	ST	A5,ECBRL,A8	BLOCK LENGTH
	LD	A1,FDBSNR,A11	SECTOR NUMBER 
	LD	A2,FDBSNR+2,A11 
	CF	A14,SDMGBU	A4 := BUFFER ADDRESS 
	ST	A1,ECBCW,A8	SECT NR 
	ST	A2,ECBCW+2,A8	SECT NR 
	LDR	A5,A4
	ADKL	A5,BUFSTA	A5 = DATA BUFFER START ADDRESS
	ST	A5,ECBBA,A8 
	LDKL	A1,-1	SET DEFAULT RETURN CODE 
	ADK	A3,0 
	RF(NZ)	GTB100	BUFFER NOT IN MEMORY 
	LD	A1,FDBRRO,A11	RELATIV RECORD OFFSET 
GTB100	EQU	*
	RB	RETURN	RETURN AND SET CONDITION 
	IFT	CRDEEX=0		=5 
	EJECT
FRMFIL	EQU	*		=5
FORMAT	EQU	*		=5
FORMER	EQU	*		=5
RLBLKB	EQU	*		=5
CASZEN	EQU	*		=5
	RTN	A14		=5
	XIF			=5 
	IFT	CRDEEX=1		=5 
	EJECT
* 
*	FRMFIL=FORMAT FILE
* 
*	ENTRY:   A4=BLOCK BUFFER ADDRESS
*	         A8=FDB ECB ADDRESS 
*	         A11=FDB ADDRESS
* 
*	EXIT :   A1-A7
* 
*	NUMBER OF A14 LEVELS = 4 (WORDS)
* 
FRMFIL	EQU	*
	LC	A1,FDBBLZ,A11 
	SLL	A1,8	BLOCK SIZE IN BYTES 
	ST	A1,ECBRL,A8	REQUESTED LENGTH
* 
*	MAKE FORMAT BUFFER
* 
	CF	A14,FORMAT	MAKE FORMATED BUFFER 
	ST	A4,ECBBA,A8	BLOCK BUFFER ADDRESS
	LD	A1,FDBSNR,A11	SECTOR NUMBER MOST SIGN.
	LD	A2,FDBSNR+2,A11	SECTOR NUMBER LEAST SIGN. 
FRM130	EQU	*
	ST	A1,ECBCW,A8 
	ST	A2,ECBCW+2,A8 
	LDR	A3,A1	SAVE A1
	LDR	A5,A2	SAVE A2
	CF	A14,FMIOWR	WRITE SECTOR 
	RF(NZ)	FRM140	ERROR OR EOF 
	LDR	A1,A3	SAVED REGISTER 
	LDR	A2,A5	SAVED REGISTER 
	LDK	A6,0 
	LC	A7,FDBBLZ,A11	BLOCK SIZE IN SECTORS 
	CF	A14,ADDMOD
	RB	FRM130
	EJECT
FRM140	EQU	*
	LDR	A2,A1	RETURN CODE
	SLL	A2,2 
	RF(NN)	FRM160	NOT END OF FILE
RLBLKB	EQU	*
	LDK	A1,0	SET RETURN CODE 
FRM160	EQU	*
	SUKL	A4,BUFSTA	BUFFER WITH HEADER
	CF	A14,SDMRBU	RELEASE BUFFER 
	CF	A14,CLRBUF	CLEAR ALL BUFFERS
	RB	RETURN	RETURN AND SET CONDITION 
	EJECT
* 
*	FORMAT=FORMAT BUFFER IN RECORD SIZE 
* 
*	ENTRY :A4 = BLOCK BUFFER ADDRESS
*	       A1 = BUFFER LENGTH 
* 
*	EXIT  :A4 = NOT CHANGED 
*	       A1,A2,A3,A5 = USED 
* 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
FORMAT	EQU	*
	LDR	A3,A4	BLOCK BUFFER ADDRESS 
FORMER	EQU	*		=1
	LDR	A5,A1	LENGTH IN BLOCK BUFFER	=2	=1 
	RF(NP)	FRM120	NOTHING TO FORMAT	=4 
	LDK	A2,' '	FILL BUFFER WITH SPACES	=1
FRM100	EQU	*
	SCR	A2,A3		=1
	ADK	A3,1	UPDATE BUFFER POINTER	=1
	SUK	A1,1	REST LENGTH	=1
	RB(P)	FRM100	CONTINUE FILL BUFFER
	SUR	A3,A5	POINTER TO START OF BUFFER	=2	=1 
	SUK	A3,1	POINTER TO RECORD STATUS	=2	=1
	LDK	A2,0	RECORD STATUS=FREE
	LD	A1,FDBRLE,A11	RECORD LENGTH WITHOUT STATUS
	ADK	A1,1	LENGTH WITH STATUS
FRM110	EQU	*
	ADR	A3,A1	POINTER TO RECORD STATUS	=2	=1 
	SUR	A5,A1	LENGTH LEFT	=2	=1
	RF(N)	FRM120	ALL DONE IN BUFFER	=6	=2	=1 
	SCR	A2,A3	UPDATE STATUS	=2	=1
	RB	FRM110
FRM120	EQU	*
	RTN	A14
	XIF			=5 
	EJECT
* 
*	CARRBL=CALCULATE MAX FDBRRO AND BLOCK SIZE IN NBR OF SECTORS
* 
*	ENTRY: A11=FDB ADDRESS
* 
*	EXIT : A1=MAX FDBRRO
*	       A2=BLOCK SIZE IN NUMBER OF SECTORS 
*	       CR=GREATER IF BLOCK SIZE TOO LARGE 
*	       A3,A6,A7=USED
* 
*	NUMBER OF A14 LEVELS = 4 (WORDS)
* 
CARRBL	EQU	*
	LD	A6,FDBRLE,A11	RECORD LENGTH (BYTES) 
	LC	A7,FDBBLF,A11	BLOCK FACTOR (NBR OF RECORDS/BLOCK) 


* 
*	CRRBL=SAME AS CARRBL EXCEPT ENTRY PARAMETERS
* 
*	ENTRY: A6=RECORD LENGTH 
*	       A7=BLOCK FACTOR
* 
CRRBL	EQU	* 
	ADK	A6,1	RECORD STATUS BYTE
	LDR	A3,A6	SAVE RECORD LENGTH 
	ANK	A7,/FF 
	SUK	A7,1 
	CF	A14,MPYMOD
	LDR	A1,A2	MAX FDBRRO 
	EJECT
* 
*	CALCULATE BLOCK SIZE IN NBR OF SECTORS
* 
	ADR	A2,A3	ADD ONE RECORD 
	LDR	A3,A2
	SRL	A2,8	SECTOR NBR
	ANK	A3,/FF 
	RF(Z)	CAR100	EXACT 
	ADK	A2,1	ONE MORE SECTOR 
CAR100	EQU	*
	ADKL	A14,4	UPADTE STACK POINTER
	LDR	A3,A2
	SLL	A3,7	BLOCK SIZE IN WORDS 
	CWK	A3,BLKMXL	CHECK WITH MAX BLOCK SIZE
	ABR*	A14	RETURN
	IFT	CRDEEX=1		=5 
	EJECT

**********
* CASZEN *
**********

* 
*	CASZEN=CALCULATE SIZE 1-4 IN NBR OF SECTORS 
* 
*	ENTRY: A12=FPB ADDRESS
* 
*	EXIT : A3=ENLARGE IN NUMBER OF SECTORS
*	       A2,A5,A6,A7,A13=USED 
*	       A1=RETURN CODE 
*	       CR=O IF OVERFLOW 
* 
CASZEN	EQU	*
	LD	A6,FPB:RL,A12	RECORD LENGTH 
	LC	A7,FPB:BF,A12	BLOCK FACTOR
	ANK	A7,/FF 
	CF	A14,CRRBL	CALCULATE BLOCK SIZE (SECTORS/BLOCK IN A2)
	LDR	A4,A2	BLOCK SIZE 
	LDR	A13,A12	FPB ADDRESS
	ADKL	A13,FPB:S1	POINTER TO SIZE 1
	LDK	A5,4	NUMBER OF VOLUMES 
CAS100	EQU	*
	LC	A6,FPB:BF,A12	BLOCK FACTOR (RECORDS/BLOCK)
	ANK	A6,/FF 
	LDR*	A1,A13
	LD	A2,2,A13	A1,A2=SIZE (NBR OF RECORDS)
	CF	A14,DIVMOD	A1,A2/A6=A2  REST IN A1
	ADK	A1,0 
	RF(Z)	CAS110	NO REST 
	ADK	A2,1	TAKE CARE OF REST 
	EJECT
CAS110	EQU	*
	LDR	A6,A2
	LDR	A7,A4
	CF	A14,MPYMOD	A6*A7=A1,A2
	STR	A1,A13 
	ST	A2,2,A13	A1,A2=SIZE IN SECTORS
	ADKL	A13,SIZDIF
	SUK	A5,1 
	RB(P)	CAS100	NEXT VOLUME 
	RTN	A14
	XIF			=5 
	EJECT
*	CHKRCD=CHECK RECORD STATUS
* 
*	ENTRY: A11=FDB ADDRESS
*	       A1=RECORD OFFSET 
*	       A4=BLOCK BUFFER ADDRESS
* 
*	EXIT : A11,A4=NOT CHANGED 
*	       A1=POINTER AT STATUS 
*	       A3=/FF 
* 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
CHKRCD	EQU	*
	ADR	A1,A4
	ADKL	A1,BUFSTA 
	AD	A1,FDBRLE,A11	STATUS POINTER
	LDK	A3,/FF 
	ADKL	A14,4 
	CCR	A3,A1
	ABR*	A14 
	IFT	INDXAC=0 
	EJECT
CHKKEY	EQU	*
RDNXTR	EQU	*
FNDKEY	EQU	*
CRNUPD	EQU	*
GTLGRN	EQU	*
CRNCIF	EQU	*
RECECB	EQU	*
	RTN	A14
	XIF
	IFT	INDXAC=1 
	EJECT
****DESCRIPTION*************************************
* 
*   FNDKMX SEARCH GFOR A WYMBOLIC KEY IN A MASTER INDEX.
*   A BINARY SEARCH IS USED. REF : KNUTH PAGE 411 ALG. U. 
*   THE FIRST TWO WORDS IN MASTER INDEX IS :
*   - NO OF ENTRIES N 
*   - NO OF CHARACTERS PER ENTRY
* 
****ENTRY PARAMETERS********************************
* 
*   A5 = MASTER INDEX ADRESS
*   A9 = SEARCH KEY ADDRESS 
*   A10 = NR OF CHAR IN KEY 
*   A11=FDB ADDRESS 
* 
*   CF   A14,FNDKMX 
* 
****EXIT PARAMETERS*********************************
* 
*   A1,A2 = LOGICAL RECORD NO IN INDEX FILE 
*   A9,A10= UNCHANGED 
*	NUMBER OF A14 LEVELS = 5 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A3-A7,A12-A13 
* 
************************************************* 
* 
CRNCIF	EQU	8	INDEX CURRENCY OFFSET
	EJECT
FNDKMX	EQU	*
	LDR*	A2,A5	NO OF ENTRIES N 
	RF(NP)	FND045	NO MASTER INDEX
	LDR	A13,A2 
	ANKL	A13,/1	GET BIT 15 
	SRA	A2,1	
	LDR	A12,A2	M=N/2 FLOOR 
	ADR	A13,A2	I=N/2 CEILING 
	ADK	A5,2	TABLE BASE - 2
FND020	EQU	*
	LDK	A4,0 
	LDR*	A7,A5	ENTRY LENGTH
	LDR	A6,A13	I 
	SUK	A6,1 
	RF(NP)	FND025	HANDLES ALSO I=0 
	CF	A14,MPYMOD	A1,A2=(I-1)*EL 
	SRC	A1,1 
	ORR	A2,A1	GET MOST SIGN BIT
	LDR	A4,A2
FND025	EQU	*
	ADR	A4,A5	ADD MI BASE ADR - 2
	ADK	A4,2	ENTRY KEY ADR 
	LDR	A1,A4	ADDRESS OF ENTRY KEY 
	LDR	A6,A10	MAX KEY LENGTH
	LDK	A7,0	CHAR ADR
	CF	A14,CHKKEY	COMPARE KEYS 
	LDR	A7,A12	M 
	LDR	A6,A7
	ANK	A6,/1	BIT 15 
	SRA	A7,1	M/2 FLOOR 
	ADR	A6,A7	M/2 CEILING
	LDR	A1,A1	CHKKEY RTN INF 
	RF(NG)	FND040	SEARCHED KEY LESS OR EQUAL 
	EJECT
* 
*   SEARCHED KEY GREATER
* 
	LDR	A12,A12	M
	RF(Z)	FND050	SEARCH READY
	ADR	A13,A6	I=I+(M/2 CEIL)
FND030	EQU	*
	LDR	A12,A7	M=M/2 FLOOR 
	RB	FND020
FND040	EQU	*
	LDR	A12,A12	M
	RF(Z)	FND060	SEARCH READY
	SUR	A13,A6	I=I-(M/2 CEIL)
	RB	FND030
FND045	EQU	*	NO MASTER INDEX
	LDK	A1,0 
	LDK	A2,1	REC NR 1
	RF	FND070
FND050	EQU	*
	ADR*	A4,A5	NEXT ADDRESS OF ENTRY KEY 
FND060	EQU	*
	LDR	A3,A4	ENTRY ADR
	SUK	A3,3 
	ADR*	A3,A5	ADR REC NO
* 
*   MOVE LOG REC NO TO A1,A2
* 
	LDK	A1,0 
	LCR	A1,A3
	ADK	A3,1 
	LCR	A2,A3
	ADK	A3,1 
	ECR	A2,A2
	LCR	A2,A3
FND070	EQU	*
	ABL	CALSNO 
	EJECT
****DESCRIPTION*************************************
* 
*   CHKKEY COMPARES TWO CHARACTER STRINGS 
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = ADR OF ENTRY KEY 
*   A9 = ADR OF SEARCH KEY
*   A6 = MAX NO OF CAHARACTERS IN KEY 
*   A7 = REL NO OF FIRST CHAR TO CHECK IN KEY 
* 
*   CF   A14,CHKKEY 
* 
****EXIT PARAMETERS*********************************
* 
*   A1 = 0 WHEN SEARCED KEY IS CONTAINED IN ENTRY KEY 
*      = + 1 WHEN SEARCH KYEY IS GREATER
*      = -1 WHEN SEARCH KEY IS LESS 
*   A7 = REL NO OF NEXT CHAR TO CHECK = NO OF SAME CHARACTERS IN WHOLE KEY
*   A6 = MAX NO OF CHAR IN KEY
*   CR=0 WHEN KEY IS FOUND
*      P WHEN KEY IS GREATER
*      N WHEN KEY IS LESS 
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A2,A3 
********************************************************
	EJECT
CHKKEY	EQU	*
	LDR	A3,A9	SEARCH KEY ADDRESS 
	ADR	A3,A7	FIRST SC CHAR TO TEST
	ADR	A1,A7	FIRST EC CHAR TO TEST
CHK020	EQU	*
	LCR	A2,A3	SEARCED KEY CHAR 
	CCR	A2,A1	SC=EC? 
	RF(G)	CHK100	SC GT TH EC 
	RF(L)	CHK120	SC LESS THAN EC 
	ADK	A7,1	NO OF SAME CHAR 
	CWR	A7,A6	NO OF CHAR 
	RF(NL)	CHK060	ALL CHAR CHECKED 
	ADK	A3,1	NXT SC TO TEST
	ADK	A1,1	NXT EC TO TEST
	RB	CHK020	 
CHK060	EQU	*
	LDK	A1,0	FOUND 
	RF	CHK140
CHK120	EQU	*
	LDKL	A1,-1	SEARCHED KEY SMALLER
	RF	CHK140
CHK100	EQU	*
	LDK	A1,1	SEARCHED KEY SGREATER 
CHK140	EQU	*
	ABL	RETURN	RETURN AND SET CONDITION
	EJECT
****DESCRIPTION*************************************
* 
*   RDNXTR WILL MAKWE NEXT RECORD IN AN INDEX FILE AVAILABLE
*   IN A CORE BUFFER
*   WHEN NO RECORD IS READ BEFORE, THE FIRST RECORD IN SPECIFIED
*   SECTOR WILL BE MADE AVAILABLE 
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB ADDRESS FOR CURRENT RECORD (BEFORE NEXT) 
*        FDBCEX,FDBSNR
*        FDBRRO = RECORD OFFSET IN BUFFER, WHEN = -1 THE FIRST
*                 RECORD IN CURRENT SECTOR IS WANTED
*   A4 = ADDRESS OF BLOCK BUFFER FROM PREVIOUS CALL IN
*        SAME DM-REQUEST. =0 WHEN NO BYUFFER IS ALLOCATED 
*   A8 = ECB ADDRESS
* 
****EXIT PARAMETERS*********************************
* 
*   A11= FDB ADDRESS
*   A4 = BUFFER ADDRESS 
*      = 0 WHEN NO BUFFER IS ALLOCATED
*   A8 = ECB ADDRESS
*   CR=0 WHEN PHYSICAL I/O FAILED 
*   IF CR=0 
*   THEN   A1=I/O RETURN CODE 
*   ELSE   A1=FDBRR0=RECORD OFFSET
*	NUMBER OF A14 LEVELS = 7 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A2,A3,A5
* 
******************************************************
	EJECT
RDNXTR	EQU	*
	ADK	A4,0 
	RF(NZ)	RDN200	BUFFER EXIST 
* 
*   GET A BUFFER
* 
RDN040	EQU	*
	CF	A14,GTBKBU	GET BLOCKBUFFERADDR
	RF(NN)	RDN080	DATA ALREADY IN CORE 
* 
*   READ BLOCK FROM DISC
* 
	LDR	A3,A7	SAVE A7
	CF	A14,FMIORD	READ 
	LDR	A7,A3
	ADK	A1,0	RETURN CODE 
	RF(NZ)	RDN900	ERROR
RDN080	EQU	*
	LDK	A1,0 
	ST	A1,FDBRRO,A11	OFFSET FIRST RECORD 
	RF	RDN940	RETURN 
	EJECT
* 
*   BUFFER WAS BEFORE 
* 
RDN200	EQU	*
	LD	A1,FDBRRO,A11	RECORD OFFSET 
	RB(N)	RDN080	FIRST RECORD WANTED 
* 
*   CHECK IF THIS OFFSET POINTS TO LAST REC IN BUFFER 
* 
RDN220	EQU	*
	CW	A1,FDBMRO,A11	MAX OFFSET
	RF(NL)	RDN300	THIS REC LAST IN BUFFER
* 
*   GET NEXT REC IN CURRENT BLOCKBUFFER 
* 
	AD	A1,FDBRLE,A11	RECORD LENGTH 
	ADK	A1,1	STATUS CHAR 
	ST	A1,FDBRRO,A11	NEW OFFSET
	RF	RDN940	RETURN 
	EJECT
* 
*	GET NEW BLOCK 
* 
RDN300	EQU	*
	LD	A1,FDBSNR+2,A11 
	LDK	A3,0 
	LC	A3,FDBBLZ,A11	BLOCK SIZE (SECTORS/BLOCK)
	ADR	A1,A3	NEXT SECT
	RF(O)	RDN380 
	RF	RDN390
RDN380	ANKL	A1,/7FFF
	IM	FDBSNR,A11
RDN390	EQU	*
	ST	A1,FDBSNR+2,A11 
* 
*   GET NEXT BLOCK
* 
RDN500	EQU	*
	CF	A14,SDMRBU	RELEASE BUFFER 
	RB	RDN040	NEXT SECTOR
* 
*   ERROR EXIT
* 
RDN900	EQU	*
	ADK	A4,0 
	RF(Z)	RDN960	NO BUFFER 
	CF	A14,SDMRBU	RELEASE BUFFER 
RDN960	EQU	*
	LDK	A4,0	INDICATE NO BUFFER
* 
*	EXIT
* 
RDN940	EQU	*
	ADKL	A14,4 
	ADK	A4,0	SET CONDITION 
	ABR*	A14	RETURN
	EJECT
****DESCRIPTION*************************************
* 
*   FNDKEY WILL READ THE FIRST USED INDEX RECORD WITH THE 
*    SPECIFIED KEY OR NEXT HIGHER KEY 
*   IF END OF FILE, THE FIRST FREE RECORD IS FOUND
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB ADDRESS
*   A9 = SEARCH KEY ADDR
*   A10 = NO OF CHARACTERS IN KEY 
*   A8 = PHYSICAL ECB ADDRESS 
* 
****EXIT PARAMETERS*********************************
* 
*   A11= FDB ADDRESS
*        FDBSNR,FDBRRO = FOUND INDEX RECORD 
*   A1 = 0 WHEN KEY ISS FOUND 
*       = /400 WHEN NEXT HIGHER KEY IS FOUND
*      = RETURN CODE WHEN KEY IS NOT FOUND
*        BIT 1 CAN NEVBER BE SET BY DISC DRIVER 
*   A4 = BUFFER ADDRESS 
*      = 0 WHEN NO RECORD IS FOUND
*   A7 = NO OF SAME CHARACTERS
*   A8 = PHYSICAL ECB ADDRESS 
*   A10 = UNCHANGED 
*   CR=0 WHEN KEY IS FOUND
*	NUMBER OF A14 LEVELS = 9 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A2-A3,A5-A7,A12-A13 
* 
******************************************************
	EJECT
FNDKEY	EQU	*
* 
*   FIRST SEARCH THE NMASTER INDEX
* 
	LD	A5,FDBMIA,A11	ADDR OF MASTER INDEX
	CF	A14,FNDKMX	GET KEY ENTRY IN MASTER INDEX
	RF(NZ)	FKY900	ERROR
	LDR	A6,A10	NO OF CHAR IN KEY 
	LDK	A7,0	START CHAR KEY SEARCH 
	LDK	A4,0	NO BUFFER TO STYART WITH
FKY100	EQU	*
	CF	A14,RDNXTR	GET INDEX RECORD 
	RF(Z)	FKY900	I/O FAILED ,NO BUFFER 
* 
*   BUFFER AND ADATA IS FOUND 
* 
FKY150	EQU	*
	ADR	A1,A4	BUFFER ADR 
	ADKL	A1,BUFSTA 
	LDR	A5,A1
	AD	A5,FDBRLE,A11	ADDRESS TO STATUS CHARACTER 
	LCR	A2,A5		=3
	ANK	A2,/FF	STATUS CHARACTER	=3 
	SUK	A2,/FF		=3 
	RF(Z)	FKY200	USED RECORD 
	EJECT
* 
*   NO MORE RECORDS IN THIS SECTOR
* 
	LD	A13,FDBRRO,A11	SAVE CURRENT OFFSET
	LD	A5,FDBMRO,A11 
	ST	A5,FDBRRO,A11	LAST RECORD IN BLOCK
* 
* 
*	CHECK IF END OF FILE
* 
	LDR	A5,A7	CHAR ADDR
	CF	A14,GTLGRN	GET LOG REC NR 
	LDR	A6,A10	NR OF CHAR
	LDR	A7,A5	CHAR ADDR
	CC	A1,FDBLRN,A11 
	RB(L)	FKY100	NOT EOF 
	RF(G)	FKY180	EOF 
	CW	A2,FDBLRN+1,A11 
	RB(L)	FKY100	NOT EOF 
* 
*   EOF IS IN THIS SECTOR 
* 
FKY180	EQU	*
	ST	A13,FDBRRO,A11	OFFSET TO FIRST FREE RECORD
	LDKL	A1,EOFRC	EOF
	RF	FKY900
	EJECT
* 
*   CHECK KEY IN THIS RECODRD 
* 
FKY200	EQU	*
	CF	A14,CHKKEY	COMPARE KEYS 
	RF(Z)	FKY870	KEY FOUND 
	RF(N)	FKY850	SEARCH KEY LESS 
* 
*	SEARCH KEY GREATER
* 
FKY840	EQU	*
	CC	A7,-4,A5	NEXT KEY FLAG	=3 
	RB(NG)	FKY100	START OF KEY:S IDENTICAL 
	LC	A7,-4,A5	REDUCE NUMBER OF SAME CHARACTERS	=3
	RB	FKY100	NEXT KEY 
	EJECT
* 
*	SEARCH KEY LESS 
* 
FKY850	EQU	*
	LDKL	A1,NOKEY	KEY NOT FOUND
	RF	FKY950
* 
*	KEY FOUND 
* 
FKY870	EQU	*
	LDK	A1,0	KEY FOUND 
	RF	FKY950
FKY900	EQU	*
	LDK	A7,0	NO OF SAME LEAD CHARS 
FKY950	EQU	*
	ABL	RETURN	RETURN AND SET CONDITION
	EJECT
* 
*   CRNUPD UPDATES CRN-BUFFERS SO THAT RECORD NUMBERS FOR MOVED INDEX 
*   RECORDS ARE UPDATED 
* 
*   IN: 
*   A1,A2  = LAST RECORD NR MOVED 
*   A12,A13= FIRST RECORD NR MOVED
*   A11    = FDB ADDR INDEX 
*   A7     = ADD PARAMETER +1, -1 
* 
*   USED REGISTERS: 
*   A1-A3,A6-A7 
* 
*   OUT:
*   A11= FDB ADDR INDEX 
*   A12,A13 = UNCHANGED 
*	NUMBER OF A14 LEVELS = 4 (WORDS)
* 
CRNUPD	EQU	*
	LD	A3,FDBADF,A11	FDB DATA FILE 
	INH
	ADKL	A3,FDBCRL	CRN LINK ROOT 
CRU100	EQU	*
	LDR*	A3,A3 
	RF(Z)	CRU900	END OF LINK 
	LC	A6,FWTFNR,A11	FILE CODE 
	CC	A6,CRNCIF,A3
	RB(NE)	CRU100	WRONG FC 
	CC	A12,CRNCIF+1,A3 
	RB(G)	CRU100 
	RF(L)	CRU200 
	CW	A13,CRNCIF+2,A3 
	RB(G)	CRU100 
CRU200	EQU	*
	CC	A1,CRNCIF+1,A3
	RF(G)	CRU300 
	RB(L)	CRU100 
	CW	A2,CRNCIF+2,A3
	RB(L)	CRU100 
CRU300	EQU	*
* 
*   UPDATE CRN
* 
	LDR	A6,A7
	RF(N)	CRU230	-1
	LDK	A6,0 
CRU230	EQU	*
	ANKL	A7,/7FFF
	LDK	A1,0 
	LC	A1,CRNCIF+1,A3
	LD	A2,CRNCIF+2,A3
	CF	A14,ADDMOD
	SC	A1,CRNCIF+1,A3
	ST	A2,CRNCIF+2,A3
	RB	CRU100
CRU900	EQU	*
	ENB
	RTN	A14
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   GTLGRN WILL CONVERT FDBSNR AND FDBRRO TO A LOGICAL RECORD NO
* 
****ENTRY PARAMETERS********************************
* 
*   A11= FDB ADDRESS
*            FDBSNR,FDBRRO,FDBCEX 
* 
****EXIT PARAMETERS*********************************
* 
*   A1,A2 = LOG RECORD NO 
*	NUMBER OF A14 LEVELS = 4 (WORDS)
* 
****USED REGISTERS**********************************
* 
*   A6,A7 
* 
******************************************************
	EJECT			DMSUBR 
GTLGRN	EQU	*
	ST	A4,-4,A14	SAVE A4 
	LD	A1,FDBSNR,A11 
	LD	A2,FDBSNR+2,A11	REL SECT NR 
	LDK	A6,0 
	LDK	A7,1 
	CF	A14,DSUMOD
	LDK	A6,0 
	LC	A6,FDBBLZ,A11	BLOCK SIZE
	CF	A14,DIVMOD
	LDR	A6,A2	BLOCKS - 1 
* 
*   CONVERT FDBRRO TO NO OF RECORDS 
* 
	LDK	A7,0 
	LC	A7,FDBBLF,A11	BLOCK FACTOR
	CF	A14,MPYMOD	A1,A2=A6*A7
	LD	A4,FDBRLE,A11 
	ADK	A4,1	RECORD LENGTH 
	LDK	A7,0	RECORD COUNTER
	LD	A6,FDBRRO,A11	OFFSET IN SECTOR
	ADK	A6,1 
GTL150	EQU	*
	ADK	A7,1	RECORD COUNTER
	SUR	A6,A4
	RB(NN)	GTL150	COUNT RECORDS IN SECTOR
* 
*   ADD SECT*BLOCFACT AND RECINCURRSECT 
* 
	ADR	A2,A7
	RF(O)	GTL160	OVERFLOW
	RF	GTL170
GTL160	EQU	*
	ANKL	A2,/7FFF	DELETE OVERFLOWBIT 
	ADK	A1,1	ADD CARRY 
GTL170	EQU	*
	LD	A4,-4,A14	SAVED REGISTER
	RTN	A14
	EJECT
* 
*	RECECB=MOVE RECORD NUMBER TO ECBCW1,ECBCW2
* 
*	ENTRY: A11=FDB ADDRESS
*	       A4=BUFFER ADDRESS FROM SUB FNDKEY
*	       A9=ECB ADDRESS 
* 
*	EXIT:  A11,A4,A9=NOT CHANGED
*	       A1,A2   =USED REGISTERS
*	NUMBER OF A14 LEVELS = 2 (WORDS)
* 
RECECB	EQU	*
	LD	A2,FDBRRO,A11	RECORD ADDR 
	ADKL	A2,BUFSTA	
	ADR	A2,A4	REC ADDR 
	LD	A1,FDBRLE,A11	RECORD LENGTH 
	SUK	A1,6	
	ADR	A2,A1	 
* 
*   MOVE LOG REC NO TO ECB
* 
	LDK	A1,0 
	LC	A1,3,A2 
	ST	A1,ECBCW,A9 
	LC	A1,4,A2 
	ECR	A1,A1
	LC	A1,5,A2 
	ST	A1,ECBCW+2,A9 
	RTN	A14
	XIF



	END

Full view