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

⟦8e0630664⟧

    Length: 40706 (0x9f02)
    Notes: pts_type(SC)
    Names: »FMCDEF.SC«

Derivation

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

PTS(SC)

	IDENT FMCDEF 	REL 11.0 81-05-13 870105041100 

* 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS                  *
* 
*   FMCDEF = FILE MANAGEMENT SUBMODULE           *
* 
* 
* 
* 
**************************************************
* 
* 
*   FMCDEF CONTAINS THE FOLLOWING MODULES 
* 
*   - CREATE   CREATE FILE
*   - DELETE   DELETE FILE
*   - EXTEND   EXTEND FILE
* 
* 
	EJECT		FMCDEF
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	CREATE	CREATE FILE 
	ENTRY	DELETE	DELETE FILE 
	ENTRY	EXTEND	EXTEND FILE 
	ENTRY	SEXTNO	FILE EXTENT NUMBER
	ENTRY	DV3RST 
* 
	EJECT		FMCDEF
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	FPB:BF	BLOCK FACTOR
	EXTRN	FPB:FN	FILE NAME 
	EXTRN	FPB:EL	ENLARGE 
	EXTRN	FPB:S1	SIZE 1
	EXTRN	FPB:IF	NUMBER OF INDEX FILES 
	EXTRN	FPB:MN	MONITOR NUMBER
	EXTRN	FPB:SN	SOP SWITCH NUMBER 
	EXTRN	FPB:KA	KEY ADDRESS IN RECORD 
	EXTRN	FPB:CD	CREATION DATE 
	EXTRN	ECBFC	ECB FILE CODE (FILE NUMBER)
	EXTRN	FILCOD	FILE CODE SAVE AREA 
	EXTRN	FM:RQE	FM REQUEST ERROR COMMON EXIT
	EXTRN	FMEXIT	FM COMMON EXIT
	EXTRN	FM:BUF	FM COMMON READ/WRITE BUFFER 
	EXTRN	FM:IO	FM COMMON IO ROUTINE 
	EXTRN	FM:ECB	FM COMMON ECB 
* 
	EJECT		FMCDEF
* 
* 
	EXTRN	VTC:EN	EXTENT NUMBER 
	EXTRN	VOL:EL	VOL.LABEL DISPL. VTOC EXTENT LENGTH 
	EXTRN	VTC:FS	FILE SECTION NUMBER 
	EXTRN	VTC:EB	EXTENT BASE 
	EXTRN	VOL:EB	VTOC EXTENT BASE
	EXTRN	VOL:FS	FSAT LENGTH 
	EXTRN	VTC:EL	FILE EXTENT LENGTH
	EXTRN	VTC:RL	RECORD LENGTH 
	EXTRN	VTC:BF	BLOCK FACTOR
	EXTRN	VTC:FO	FILE ORGANISATION 
	EXTRN	VTC:CD	CREATION DATE 
	EXTRN	VTC:IF	NUMBER OF INDEX FILES 
	EXTRN	VTC:LR	LAST RECORD NUMBER
	EXTRN	VTC:KA	KEY ADDRESS IN RECORD 
	EXTRN	VTC:ST	STATUS BYTE 
	EXTRN	VTC:NE	MAX EXTENT NUMBER 
	EXTRN	VTC:MN	MONITOR NUMBER
	EXTRN	VTC:FN	FILE NUMBER 
	EXTRN	VOLUME	POINTER IN FILCOD TO ACTUAL FILE CODE 
* 
	EJECT		FMCDEF
* 
* 
	EXTRN	FNDVTC	VTOC ENTRY FROM FILE NAME 
	EXTRN	DSUMOD	DOUBLE SUBTRACT 
	EXTRN	ADDMOD	DOUBLE ADD
	EXTRN	FWTNAM	FWT DISPLACEMENT FOR VOLUME NAME
	EXTRN	RDVTO2	READ VTOC SECTOR
	EXTRN	FMREAD	FM READ SUBROUTINE
	EXTRN	FM:MOV	MOVE SYSTEM-SYSTEM
	EXTRN	CMPDWD	COMPARES TWO STRINGES 
	EXTRN	RETCOD	RETURN CODE AREA IN FMTASK
	EXTRN	DLCLO1	CLOSE AFTER DELETE
	EXTRN	DLCLO2	CLOSE WITHOUT DELETE
	EXTRN	FWTPAR	FWT PARAMETER DISPLACEMENT
	EXTRN	FWTEW1	EWT POINTER IN FWT
	EXTRN	EWTVOL	FILE CODE DISPLACEMENT IN EWT 
	EXTRN	EWTSEX	FSN,FEN DISPLACEMENT IN EWT 
	EXTRN	FCHEC2	GET FWT ADDRESS FROM FILE NUMBER
	EXTRN	OPEN	OPEN ENTRY IN FM TASK 
	EXTRN	FM:MV4	MOVE FOUR CHARACTERS
	EXTRN	FM:MV8	MOVE EIGHT CHARACTERS 
	EXTRN	VTOCRL	VTOC RECORD LENGTH
	EXTRN	VTOCBF	VTOC BLOCKING FACTOR
	EXTRN	OPEXT	OPEN EXTENDED FILE 
	EXTRN	FM:INE	ILLEGAL NAME IN FM
	EXTRN	CMPSTR	COMPARE STRINGS 
	EXTRN	FEXTNO	FILE EXTENT NUMBER
	EXTRN	FNDVT2	FIND VTOC ENTRY 
* 
	EJECT		FMCDEF
* 
* 
******************************************
* 
*   CONDITIONAL ASSEMBLY
* 
******************************************
* 
* 
*   A  FULL INTRUCTION SET MAY BE INCLUDED
*   BY SETTING CPU852 EQU 0 
* 
* 
CPU852	EQU	1
* 
* 
*   THE EXTEND FILE FUNCTION IS 
*   OBTAINED BY SETTING XTEND EQU 1.
* 
XTEND	EQU	1 
X:A	EQU	XTEND 
* 
	EJECT		FMCDEF
* 
* 
************* 
* CONSTANTS * 
************* 
* 
* 
SPACES	EQU	/2020	ASCII SPACE
MAXEXT	EQU	63	MAX NUMBERS OF EXTENTS/FILE SECTION 
FSATRL	EQU	8	SIZE OF EACH ENTRY IN FSAT 
* 
* 
****************
* RETURN CODES *
****************
* 
* 
RC:NVL	EQU	/20	NEW VOLUME LOADED
RC:DAB	EQU	/4000	DELETE ABORTED 
RC:OFL	EQU	/10	OVER FLOW
RC:SEO	EQU	/200+RC:OFL	SECTION /EXTENT OVER FLOW
* 
	EJECT		FMCDEF
* 
* 
************* 
* WORK AREA * 
************* 
* 
* 
SEXTNO	DATA	0	FILE SECTION AND EXTENT NUMBER
SAVEA9	DATA	0	SAVE AREA FOR USER ECB ADDRESS
* 
* 
*   A9 IS USED AS BASE REGISTER FOR WRKARE
* 
* 
WRKARE	EQU	*
	DATA	0,0,0,0,0	VTOC RECORD 
	DATA	0,0,0,0,0 
	DATA	0,0,0,0,0 
	DATA	0,0,0,0,0 
	DATA	/00FF	NO OF EXTENTS,VTOC OCCUPIED 
* 
	EJECT		FMCDEF
* 
* 
FILLEN	EQU	*-WRKARE	FILE SECTION LENGTH TO BE CREATED 
	DATA	0,0 
VTCSEC	EQU	*-WRKARE	VTOC BASE SECTOR
	DATA	0 
FSATLE	EQU	*-WRKARE	FSAT LENGTH IN BYTES
	DATA	0 
VTCEND	EQU	*-WRKARE	VTOC LAST SECTOR
	DATA	0 
FSATBA	EQU	*-WRKARE	FSAT BASE SECTOR
	DATA	0 
EXTLEN	EQU	*-WRKARE	REMAINING EXT LENGTH
	DATA	0,0 
FWTSAV	EQU	*-WRKARE	FWT ADDRESS SAVE AREA 
	DATA	0 
EXTZER	EQU	*-WRKARE	1ST VTOC ENTRY SECTOR 
	DATA	0 
WRKALE	EQU	*-WRKARE	LENGTH OF WORK AREA 
* 
	EJECT		FMCDEF
* 
* 
******************************************
*                                        *
*   CREATE ENTRY                         *
*                                        *
******************************************
* 
*   PARAMETERS FROM FMTASK: 
* 
*              A1  = 0
*              A5  = TTAB ADDRESS OF CALLING TASK 
*              A8  = FM ECB ADDRESS 
*              A9  = USER ECB ADDRESS 
*              A10 = FILE PARAMETER BLOCK ADDRESS 
* 
* 
CREATE	EQU	*
	CF	A14,CENTRY	CLEAR WORK AREA AND SAVE PARAMETERS
	LDK	A5,3	VOLUME COUNTER
CRE:02	EQU	*
	LC	A1,FILCOD,A5	FILE CODE
	ANK	A1,/FF 
	RF(Z)	CRE:04	NO VOLUME SPECYFIED 
	LDR	A2,A5	FILE SECTION NUMBER
	CF	A14,GETFIL	REQUESTED LENGTH 
	RF(NZ)	CRE:06	LENGTH SPECYFIED 
CRE:04	EQU	*
	SUK	A5,1 
	RB(NN)	CRE:02	NEXT VOLUME
	ABL	CDERQE	REQUEST ERROR NO LENGTH SPECYFIED 
* 
	EJECT		FMCDEF
* 
* 
*   PREPARE VTOC RECORD 
* 
* 
CRE:06	EQU	*
	IFT	CPU852=1 
	LDR	A1,A10	GET FPB ADDRESS 
	ADKL	A1,FPB:FN	FILE NAME DISPLACEMENT
	LDR	A3,A9	VTOC ADDRESS 
	CF	A14,FM:MV8	FILE NAME
	XIF
* 
	IFT	CPU852=0 
	ML	4,FPB:FN,A10	FILE NAME
	MS	4,VTC:FN,A9 
	XIF
* 
	LDR*	A1,A10	GET RECORD LENGTH
	ST	A1,VTC:RL,A9
	LD	A1,FPB:BF,A10	BLOCKING FACTOR, FILE ORG 
	ST	A1,VTC:BF,A9
* 
	EJECT		FMCDEF
* 
* 
	LDR	A1,A10 
	ADKL	A1,FPB:CD	CRD 
	LDR	A3,A9
	ADKL	A3,VTC:CD 
	LDK	A2,9 
	CF	A14,FM:MOV	CRD,RET PERIOD 
	LDK	A7,6	NUMBER OF CHARACTERTS 
	SUK	A3,3	ADDRESS TO CHAR 
CRE:10	EQU	*
	SUK	A3,2	NEXT CHARACTERS 
	LDR*	A1,A3 
	RF(Z)	CRE:20	BINARY ZERO 
	CWK	A1,/3030	NUMERICAL ZERO
	RF(NE)	CRE:30
CRE:20	EQU	*
	SUK	A7,2	COUNTER 
	RB(NZ)	CRE:10
	LDR	A8,A3	ADDRESS TO CRD 
	LKM
	DATA	11
	LDKL	A8,FM:ECB	ECB ADDRESS 
CRE:30	EQU	*
	LC	A2,FPB:IF,A10	NUMBER OF INDEX FILES 
	LD	A1,FPB:KA,A10	KEY ADDRESS 
	SC	A2,VTC:IF,A9
	ST	A1,VTC:KA,A9
	CF	A14,CHKFIL	CHECK FROM FIRST FILE CODE (A5=0)
	RF(NZ)	CDEINE	FILE ALREADY IN ONE OF VOLUMES 
	LDR	A6,A10	FPB ADDRESS 
	ADKL	A6,FPB:FN 
	SUKL	A6,FWTNAM 
	ST	A6,FWTSAV,A9	INTO SAVE AREA 
* 
	EJECT		FMCDEF
* 
* 
*   CREATE FILE SECTIONS
* 
* 
CRE:40	EQU	*
	CF	A14,CREFIL	CREATE FILE SECTION
	RF(NZ)	CREDEL	ERROR
	CWK	A2,3 
	RB(NG)	CRE:40	NEXT SECTION 
	LD	A5,VOLUME	FILE SECTION OF FIRST SPECYFIED VOLUME
	LCR	A7,A5	FILE CODE
	ANK	A7,/FF 
	LDKL	A3,OPEN 
	RF	EXIT10	OPEN CREATED FILE
* 
	EJECT		FMCDEF
* 
* 
*   DELETE CREATED PARTS OF FILE IN CASE OF ERROR 
*   INPUT A4 = RETURN CODE
* 
* 
CREDEL	EQU	*
	SUK	A4,RC:NVL
	RF(Z)	CRED80	NEW VOLUME LOADED 
	CM	VTC:FS,A9	FIRST VOLUME
	CF	A14,DELFIL	DELETE CREATED FILE
CRED80	EQU	*
	RF	CDEXIT	END REQUEST
* 
	EJECT		FMCDEF
* 
* 
******************************************
*                                        *
*   DELETE ENTRY                         *
*                                        *
******************************************
* 
*   PARAMETERS FROM FMTASK SEE CREATE ENTRY 
* 
* 
DELETE	EQU	*
	CF	A14,EDENTR	CLEAR WORK AREA AND SAVE PARAM.
	RF(NZ)	DEL:90	ERROR END REQUEST
	LC	A1,FWTPAR,A6
	LDR	A2,A1
	ANK	A2,/3F	NUMBER OF USERS 
	SUK	A2,1 
	RF(Z)	DEL:00	ONE USER
	LDKL	A4,RC:DAB	RC:DELETE ABORTED 
	LDKL	A3,DLCLO2	CLOSE FILE FOR THIS USER
	RF	EXIT10
* 
	EJECT		FMCDEF
* 
* 
*   COLLECT FILE CODES AND DELETE FILE SECTIONS 
* 
* 
DEL:00	EQU	*
	CM	FILCOD	CLEAR FILE CODE AREA 
	CM	FILCOD+2
	ADKL	A6,FWTEW1 
DEL:10	EQU	*
	LDR*	A6,A6 
	LDKL	A1,-4 
	LC	A2,EWTVOL,A6	GET FILE CODE
DEL:20	EQU	*
	ADK	A1,1 
	RF(P)	DEL:40	NEXT EWT
	LC	A3,FILCOD+3,A1	COLLECTED FILE CODE
	ANK	A3,/FF 
	RF(Z)	DEL:30	NO MORE COLLECTED FILE CODES
	CWR	A3,A2
	RB(NE)	DEL:20	CHECK NEXT 
DEL:30	EQU	*
	SC	A2,FILCOD+3,A1	SAVE FILE CODE 
DEL:40	EQU	*
	LDR*	A6,A6 
	RB(NZ)	DEL:10	NEXT ENTRY IN EWT
	CF	A14,DELFIL	DELETE FILE
DEL:60	EQU	*
	LDKL	A3,DLCLO1	CLOSE FILE
* 
	EJECT		FMCDEF
* 
* 
EXIT00	EQU	*
	LD	A6,FWTSAV,A9	GET FWT ADDRESS
EXIT10	EQU	*
	ORS	A4,RETCOD	SAVE RETURN CODE 
	LDK	A4,0 
EXIT20	EQU	*
	LD	A9,SAVEA9 
	ABR	A3	BACK TO FMTASK
DEL:90	EQU	*
	LDR	A1,A4	RETURN CODE
	SUK	A1,RC:NVL	NEW VOLUME LOADED
	RB(Z)	DEL:60	CLOSE FILE
CDEXIT	EQU	*
	LDKL	A3,FMEXIT 
	RB	EXIT10	END REQUEST
* 
CDERQE	EQU	*
	LDKL	A3,FM:RQE	REQUEST ERROR 
	RB	EXIT20
CDEINE	EQU	*
	LDKL	A3,FM:INE	ILLEGAL VOLUME/FILE NAME
	RB	EXIT20
* 
	EJECT		FMCDEF
* 
* 
********************************************* 
*                                           * 
*   EXTEND ENTRY                            * 
*                                           * 
********************************************* 
* 
*   PARAMETERS FROM FMTASK SEE CREATE ENTRY 
* 
* 
EXTEND	EQU	*
	IFT	XTEND=1
	CF	A14,EDENTR	CLEAR WORK AREA MAKE PREPARATIONS
	RB(NZ)	CDEXIT	ERROR
	LDKL	A5,FWTEW1	EXTENT POINTER
	ADR	A5,A6
EXT:00	EQU	*
	LDR	A2,A5	SAVE LAST POINTER
	LD*	A5,0,A5
	RB(NZ)	EXT:00	NEXT ENTRY 
	LC	A5,EWTSEX,A2
	ST	A5,SEXTNO	SAVE FSN,FEN
* 
	EJECT		FMCDEF
* 
* 
	LD	A2,FPB:EL,A10	GET ENLARGE 
	RB(Z)	CDERQE	NO SPECYFIED LENGTH 
	ST	A2,EXTLEN+2,A9
	LDR	A2,A5	FSN,FEN
	ADK	A2,1	NEXT EXTENT 
	ANK	A2,/FF 
	RF(NZ)	EXT:15	NOT SECTION OVERFLOW 
	LDKL	A4,RC:SEO	RC: SECTION OVERFLOW
	RB	CDEXIT
EXT:15	EQU	*
	SRL	A2,6	FSN 
	LC	A2,FILCOD,A2	FILE CODE
	CF	A14,FNDVTC	GET 1ST VTOC ENTRY 
	ADK	A4,0 
	RB(NZ)	CDEXIT	READ ERROR 
	CF	A14,RDVTO2	GET 1ST VTOC ENTRY 
	ADK	A4,0 
	RB(NZ)	CDEXIT	READ ERROR 
	ST	A2,EXTZER,A9	SAVE SECTOR NUMBER OF 1ST EXT
	LC	A4,VTC:FO,A13	FILE ORGANISATION 
	SUK	A4,'L' 
	RB(E)	CDERQE	L FILE
* 
	EJECT		FMCDEF
* 
* 
	LDR	A1,A13 
	LDKL	A2,VTOCRL-2 
	LDR	A3,A9	VTOC RECORD ADDRESS
	CF	A14,FM:MOV	MOVE VTOC TO WORK AREA 
	LDR	A2,A5	FEN
	ADK	A2,1 
	ANK	A2,/3F 
	ST	A2,VTC:EN,A9	NEXT FILE EXTENT TO CREATE 
	CM	VTC:LR,A9	CLEAR LAST RECORD NUMBER
	CM	VTC:LR+2,A9 
	SRL	A5,6	FILE SECTION NUMBER 
	ADK	A5,1 
	CF	A14,CHKFIL	CHECK IF FILE ALREADY IN SYSTEM
	RB(NZ)	CDEINE
EXT:20	EQU	*
	CF	A14,EXTFIL	EXTEND FILE SECTION
	RB(NZ)	CDEXIT	RETURN CODE FROM EXTFIL
	SUK	A2,3 
	RB(NP)	EXT:20	NEXT FILE SECTION
	LD	A5,SEXTNO	FSN,FEN 
	SRL	A5,6	FILE SECTION NUMBER 
	LC	A2,FILCOD,A5	GET CORRESPONDING FILE CODE
	ADKL	A5,FILCOD	ADDRESS TO FC 
	ST	A5,VOLUME 
	LDK	A5,/3F 
	ANS	A5,SEXTNO	FEN
	LDKL	A3,OPEXT	OPEN EXTENDED FILE 
	RB	EXIT00
	XIF
* 
	IFT	XTEND=0
	RB	CDERQE	FUNCTION NOT INCLUDED, ERROR 
	XIF
* 
	EJECT		FMCDEF
* 
* 
**********
* CREFIL *
* EXTFIL *
**********
* 
* 
*   CREATES FILE SECTION IF FILE CODE SPECIFIED IN FILCOD 
* 
*   INPUT  :  A2  = FILE SECTION NUMBER 
*             A8  = FM ECB ADDRESS
*             A9 = WRKARE BASE ADDRESS
*            A10 = FPB ADDRESS
*            EXTLEN = REST LENGTH FROM PREVIOUS SECTIONS
* 
*   OUTPUT  :  A4 = RETCOD = RETURN CODE
*             A2 = INCREMENTED FILE SECTION NUMBER
*              CR SET ACCORDING TO A4 
* 
CREFIL	EQU	*
	CF	A14,GETFIL	GET FILE SECTION LENGTH
	RF(NZ)	CEF010	DEMANDED FILE SECTION LENGTH 
* 
	EJECT		FMCDEF
* 
* 
EXTFIL	EQU	*	EXTEND FILE
* 
	IFT	CPU852=1 
	LD	A1,EXTLEN,A9	REST LENGTH FROM PREVIUS SECTIONS
	LD	A2,EXTLEN+2,A9
	XIF
* 
	IFT	CPU852=0 
	ML	2,EXTLEN,A9	REST LENGTH FROM PREVIUS SECTIONS 
	XIF
* 
	CM	EXTLEN,A9 
	CM	EXTLEN+2,A9 
* 
	EJECT		FMCDEF
* 
* 
CEF000	EQU	*
	LDK	A4,0	RESET RETURN CODE 
	CF	A14,DBLX00	SET CR ACCORDING TO A1,A2
	ABL(Z)	CEFOUT	NO LENGTH TO BE CREATED
CEF010	EQU	*
* 
	IFT	CPU852=1 
	ST	A1,FILLEN,A9	FILE SECTION LENGTH TO CREATE
	ST	A2,FILLEN+2,A9
	CF	A14,DV3RST	MAKE FILE SECTION LENGTH MULT OF 3 
	LDR	A6,A9
	ADK	A6,FILLEN
	LDR	A3,A6
	CF	A14,DBLADR
	XIF
* 
	IFT	CPU852=0 
	MS	2,FILLEN,A9	FILE SECTION LENGTH TO CREATE 
	CF	A14,DV3RST	MAKE FILE SECTION MULT OF 3
	DA	FILLEN,A9 
	MS	2,FILLEN,A9 
	XIF
* 
	CF	A14,GET:FC	GET FILE CODE
	RF(Z)	CEFOUT	NOT SPECIFIED VOLUME
	CF	A14,VTCPAR	GET VTOC PARAMETERS
	RF(NZ)	CEFOUT
* 
	EJECT		FMCDEF
* 
* 
*   SCAN FSAT TO FIND FITTING EXTENTS 
* 
*   INPUT : A8=ECB ADDRESS
*           FSATBA = FSAT BASE SECTOR 
*           FILLEN = WANTED EXTENT LENGTH 
* 
* 
CEF100	EQU	*
	SUR	A12,A12	FLAG INDICATING FITTING EXTENT FOUND 
	CM	VTC:EL,A9	RESET MOST FIT EXTENT LENGTH
	CM	VTC:EL+2,A9 
	LDK	A5,0	1ST POSITION IN FSAT
CEF110	EQU	*
	CF	A14,FSREAD	READ FSAT
	RF(NZ)	CEFOUT	DISC ERROR 
* 
	IFT	CPU852=1 
	ADKL	A2,FM:BUF	ADDRESS TO N:TH EXTLEN IN FSAT
	LDR	A13,A2	SAVE
	LDK	A1,FILLEN	ADDRESS TO WANTED EXTENT LENGTH
	ADR	A1,A9
	CF	A14,CMPDWD
	XIF
* 
	IFT	CPU852=0 
	LDR	A13,A2	SAVE DISPLACEMENT 
	ADKL	A13,FM:BUF
	ML	2,FILLEN,A9	WANTED EXTENT LENGTH
	DSR*	A13	EXTENTION LENGTH
	XIF
* 
	RF(E)	CEF120	EXTENT FOUND
	RF(L)	CEF130	FOUND EXTENT GREATER THAN WANTED
	LDR	A12,A12
	RF(NZ)	CEF160	GREATER FREE EXTENT ALREADY FOUND
* 
	EJECT		FMCDEF
* 
* 
	IFT	CPU852=1 
	LDKL	A1,VTC:EL	ADDRESS TO PRESENT MOST FIT 
	ADR	A1,A9
	LDR	A2,A13 
	CF	A14,CMPDWD
	XIF
* 
	IFT	CPU852=0 
	ML	2,VTC:EL,A9	PRESENT MOST FIT
	DSR*	A13	EXTENT LENGTH 
	XIF
* 
	RF(NL)	CEF160	NOT GREATER THAN LAST FOUND MOST FIT 
	RF	CEF150
* 
	EJECT		FMCDEF
* 
* 
CEF120	EQU	*
	LDKL	A12,-1	INDICATE EQUAL FOUND 
	RF	CEF150
CEF130	EQU	*
	LDR	A12,A12
	RF(Z)	CEF140	1ST GREATER EXTENT FOUND
* 
	IFT	CPU852=1 
	LDKL	A1,VTC:EL	ADDRESS TO PRESENT MOST FIT 
	ADR	A1,A9
	LDR	A2,A13 
	CF	A14,CMPDWD
	XIF
* 
	IFT	CPU852=0 
	ML	2,VTC:EL,A9	PRESENT MOST FIT
	DSR*	A13	EXTENT LENGTH 
	XIF
* 
	RF(NG)	CEF160	NOT MOST FIT 
CEF140	EQU	*
	LDKL	A12,1	INDICATE GREATER FOUND
CEF150	EQU	*
* 
	IFT	CPU852=1 
	LDR	A1,A13	MOVE FROM BUFFER
	LDKL	A3,VTC:EL	TO WORK AREA
	ADR	A3,A9
	CF	A14,FM:MV8
	XIF
* 
	IFT	CPU852=0 
	MLR	4,A13	FROM FM:BUF TO WORK AREA 
	MS	4,VTC:EL,A9 
	XIF
* 
	LDK	A4,0	RESET RC
	LDR	A6,A5	SAVE MOST FIT DISPLACEMENT 
	LDR	A12,A12
	RF(N)	CEF170	EQUAL FOUND 
* 
	EJECT		FMCDEF
* 
* 
CEF160	EQU	*
	ADK	A5,FSATRL	NEXT ENTRY IN FSAT 
	CW	A5,FSATLE,A9
	RB(L)	CEF110	SCAN MORE ENTRIES IN FSAT 
CEF170	EQU	*
* 
	IFT	CPU852=1 
	LD	A1,VTC:EL,A9
	RF(NZ)	CEF200	SPACE ON DISC
	LD	A2,VTC:EL+2,A9
	SUK	A2,2 
	XIF
* 
	IFT	CPU852=0 
	ML	2,VTC:EL,A9 
	RF(NZ)	CEF200	SPACE ON DISC
	SUK	A2,2 
	XIF
* 
	ABL(NP)	CEF500	NO SPACE ON DISC
* 
	EJECT		FMCDEF
* 
* 
*   UPDATE FSAT 
* 
*   INPUT : A6 = DISPLACEMENT IN FSAT TO BE UPDATED 
*           A12 = 0 ,IF EXTENT SMALLER THAN REQUESTED 
*              = 1 ,IF GREATER
*           FM:BUF = FILE MANAGEMENT BUFFER 
*           VTC:EL = FILE EXTENT LENGTH 
*           VTC:EB = FILE EXTENT BASE 
* 
CEF200	EQU	*
	LDR	A5,A6	GET ENTRY IN FSAT
	CF	A14,FTREAD
	RF(NZ)	CEFOUT	READ ERROR 
	ANK	A5,/F8	DISPLACEMENT IN FSAT SECTOR 
	LDR	A12,A12
	RF(NZ)	CEF210	DELETE FSAT ENTRY
* 
	IFT	CPU852=1 
	LD	A1,VTC:EL,A9	EXTENT LENGTH
	LD	A2,VTC:EL+2,A9
	XIF
* 
	IFT	CPU852=0 
	ML	2,VTC:EL,A9	EXTENT LENGTH 
	XIF
* 
	CF	A14,DV3RST
	RF(Z)	CEF220	NO REST 
* 
	EJECT		FMCDEF
* 
* 
	IFT	CPU852=1 
	LDKL	A3,VTC:EL	GET ADDRESS TO EXTENT LENGTH
	ADR	A3,A9
	LDR	A6,A3
	SUK	A2,3 
	SUK	A1,1	A1=/FFFF
	CF	A14,DBLADR	MAKE EXTENT MULTIPLE OF 3
	XIF
* 
	IFT	CPU852=0 
	SUK	A2,3	-REST 
	SUK	A1,1	/FFFF 
	ANKL	A2,/7FFF
	DA	VTC:EL,A9 
	MS	2,VTC:EL,A9	EXTENT LENGTH MULT OF 3 
	XIF
* 
	RF	CEF220
CEF210	EQU	*
* 
	IFT	CPU852=1 
	LDKL	A3,VTC:EL	GET FILE EXTENT LENGTH
	ADR	A3,A9
	LDK	A1,FILLEN
	ADR	A1,A9
	CF	A14,FM:MV4
	XIF
* 
	IFT	CPU852=0 
	ML	2,FILLEN,A9	FILE EXTENT LENGTH
	MS	2,VTC:EL,A9 
	XIF
* 
	EJECT		FMCDEF
* 
* 
CEF220	EQU	*
	LDKL	A3,FM:BUF	FSAT EXTENT LENGTH
	ADR	A3,A5
	CF	A14,DBLSU1	NEW EXTENT LENGTH=OLD LENGTH-CREATED LENGTH
	RF(NZ)	CEF230	REST EXTENT LENGTH GREATER 
	CF	A14,CLFSAT	CLEAR FSAT ENTRY 
	RF	CEF240
CEF230	EQU	*
* 
	IFT	CPU852=1 
	LDKL	A3,FM:BUF+4 
	ADR	A3,A5
	LDKL	A6,VTC:EL	EXTENT BASE+LENGTH
	ADR	A6,A9
	CF	A14,DBLADD	NEW EXTENTBASE=EXTBASE+CREATED EXTBASE 
	XIF
* 
	IFT	CPU852=0 
	ML	2,FM:BUF+4,A5 
	DA	VTC:EL,A9 
	MS	2,FM:BUF+4,A5	NEW EXT BASE=EXTBAS+CREATED EXTBASE 
	XIF
* 
CEF240	EQU	*
	CF	A14,CDEWRI	WRITE
	RF(Z)	CEF350	WRITE OK
CEFOUT	EQU	*
	CM	EXTZER,A9	1ST VTOC POINTER
	IM	VTC:FS,A9	NEXT SECTION
	LD	A2,VTC:FS,A9
	CM	VTC:EN,A9	EXTENT ZERO 
	ORS	A4,RETCOD	SAVE RETURN CODE 
	ABL	SET:CR	SET CONDITION REGISTER
* 
	EJECT		FMCDEF
* 
* 
*   SEARCH FOR FREE VTOC ENTRIES
* 
* 
*   INPUT : VTCSEC = VTOC BASE SECTOR 
*           VTCEND = VTOC LAST SECTOR 
*           FM:BUF = FM BUFFER
* 
CEF300	EQU	*
	CF	A14,FMREAD	READ VTOC
	RB(NZ)	CEFOUT	DISC ERROR 
	LDKL	A7,VTOCBF	VTOC BLOCK FACTOR 
	LDKL	A13,FM:BUF	BUFFER ADDRESS 
* 
	EJECT		FMCDEF
* 
* 
CEF320	EQU	*
	LD	A4,VTC:ST,A13	VTOC STATUS BYTE
	ANK	A4,/FF 
	RF(Z)	CEF400	FREE VTOC ENTRY FOUND 
	LDKL	A1,VTC:FN	ADDRESS TO FILE NAME
	ADR	A1,A9
	LDR	A2,A13	VTOC FILE NAME
	LDK	A3,8 
	CF	A14,CMPSTR
	RF(NE)	CEF340	NOT SAME NAME
	LD	A1,VTC:EN,A13	EXTENT NUMBER 
	RF(NZ)	CEF340	NOT 1ST
	LD	A1,VTCSEC,A9	VTOC SECTOR NUMBER 
	ST	A1,EXTZER,A9
CEF340	EQU	*
	ADKL	A13,VTOCRL	NEXT VTOC ADDRESS
	SUK	A7,1 
	RB(P)	CEF320	MORE VTOC:S ON THIS SECTOR
	IM	VTCSEC,A9	NEXT VTOC SECTOR
CEF350	EQU	*
	LD	A2,VTCSEC,A9	VTOC SECTOR
	CW	A2,VTCEND,A9
	RB(NE)	CEF300	MORE VTOC SECTORS
	LDK	A4,RC:OFL	RC: NO MORE VOLUMES
	RB	CEFOUT
* 
	EJECT		FMCDEF
* 
* 
*   CREATE A VTOC 
* 
*   INPUT : A10 = FPB ADDRESS 
*           A13 = VTOC ENTRY ADDRESS
*           A8 = FM:ECB ADDRESS 
* 
CEF400	EQU	*
	LC	A4,VTC:FO,A9	FILE ORGANISATION
	SUK	A4,'L' 
	RF(NZ)	CEF450	NOT L FILE 
	LC	A1,FPB:MN,A10	MONITOR NUMBER
	ECR	A1,A1
	LC	A1,FPB:SN,A10	START SWITCH
	ST	A1,VTC:MN,A9	VTOC 
	CM	VTC:KA,A9	KEY ADDRESS 
CEF450	EQU	*
	LDR	A3,A13	MOVE VTOC 
	LDKL	A2,VTOCRL 
	LDR	A1,A9	VTOC RECORD ADDRESS
	CF	A14,FM:MOV
	CF	A14,CDEWRI	WRITE
	RB(NZ)	CEFOUT	WRITE ERROR
* 
	EJECT		FMCDEF
* 
* 
	IM	VTC:EN,A9	NEXT FILE EXTENT
	LDK	A3,FILLEN	ADDRESS TO FILE SECTION LENGTH TO BE CREATED 
	ADR	A3,A9
	CF	A14,DBLSU1	SUBTRACT 
	RF(Z)	CEF600	FILE SECTION READY
	LC	A4,VTC:FO,A9	FILE ORGANISATION
	SUK	A4,'L' 
	RF(Z)	CEF470	TOO MANY EXTENTS
	LD	A1,VTC:EN,A9
	SUK	A1,MAXEXT
	ABL(NP)	CEF100	NEXT EXTENT OF FILE SECTION 
CEF470	EQU	*
	LDKL	A4,RC:SEO	RC: TOO MANY FILE EXTENTS 
	RF	CEF510	TOO MANY FILE EXTENTS
* 
	EJECT		FMCDEF
* 
* 
CEF500	EQU	*
	LDK	A4,RC:OFL	RC: NO MORE VOLUMES
CEF510	EQU	*
	LD	A5,VTC:FS,A9	GET FILE SECTION NUMBER
CEF520	EQU	*
	ADK	A5,1	NEXT VOLUME 
	CWK	A5,3 
	RB(G)	CEFOUT	NO MORE VOLUMES 
	LC	A1,FILCOD,A5	GET FILE CODE
	ANK	A1,/FF 
	RB(Z)	CEF520	NEXT VOLUME 
	LDR	A2,A5
	CF	A14,GETFIL	FILE SECTION LENGTH
	RB(NZ)	CEF520	NO REST PILE 
CEF530	EQU	*
	LDK	A4,0	RESET CR
* 
	IFT	CPU852=1 
	LDK	A3,EXTLEN	SAVE REST FOR LATER
	ADR	A3,A9
	LDK	A6,FILLEN
	ADR	A6,A9
	CF	A14,DBLADD
	XIF
* 
	IFT	CPU852=0 
	ML	2,EXTLEN,A9	SAVE REST 
	DA	FILLEN,A9 
	MS	2,EXTLEN,A9 
	XIF
* 
	EJECT		FMCDEF
* 
* 
CEF600	EQU	*
	LD	A2,EXTZER,A9	1ST EXTENT VTOC SECTOR NO
	RF(NZ)	CEF650	VTOC ENTRY FOUND 
	LD	A2,VTCSEC,A9	LAST SEARCHED SECTOR 
CEF650	EQU	*
	LD	A12,VTCEND,A9	VTOC END
	LD	A6,FWTSAV,A9	GET FILE NAME BASE 
	CF	A14,RDVTO2	SCAN FOR FIRST VTOC
	ADK	A4,0 
	RF(NZ)	CEF900	READ ERROR 
	LD	A1,VTC:EN,A9	LAST EXTENT NUMBER 
	SC	A1,VTC:NE,A13	UPDATE NUMBER OF EXTENTS
	CF	A14,CDEWRI
CEF900	EQU	*
	ABL	CEFOUT 
* 
	EJECT		FMCDEF
* 
* 
**********
* DELFIL *
**********
* 
*   COLLECT ADJECENT EXTENDS AND CREATE ONE NEW 
* 
*   INPUT :  FWTSAV = FWT ADDRESS OR ADJUSTED FPB ADDRESS 
*                 THAT IS (FILENAME)=(FWTSAV)+FWTNAM
*            A8 = FM:ECB ADDRESS
*            FILCOD = AREA CONTAINING FILE CODES
*            VTC:FS SHOULD BE ZERO
* 
DELFIL	EQU	*
	CM	FEXTNO
	CF	A14,GET:FC	GET FILE CODE
	RF(Z)	DELF03	NO SPECIFIED FILE CODE
	CF	A14,VTCPAR GET VTOC PARAMETERS
	RF(NZ)	DELF03	ERROR
DELF00	EQU	*
	LD	A6,FWTSAV,A9	GET FWT ADDRESS
	LD	A12,VTCEND,A9	VTOC END SECTOR 
	LD	A2,VTCSEC,A9	PRESENT VTOC SECTOR
	CF	A14,FNDVT2	NEXT VTOC
	ST	A2,VTCSEC,A9	UPDATE POINTER 
	ADK	A2,0 
	RF(Z)	DELF03	NO ENTRY IN VTOC
	ADK	A4,0 
	RF(Z)	DELF05	NEXT VTOC ENTRY 
* 
	EJECT		FMCDEF
* 
* 
DELF03	EQU	*
	ORS	A4,RETCOD
	IM	VTC:FS,A9	NEXT FILE SECTION 
	LD	A1,VTC:FS,A9
	SUK	A1,4 
	RB(N)	DELFIL	NEXT FILE SECTION 
	RTN	A14
* 
	EJECT		FMCDEF
* 
* 
*   VTC:EB = BASE SECTOR OF CREATED FREE SPACE
*   VTC:EL = END SECTOR OF CREATED FREE SPACE 
* 
* 
DELF05	EQU	*
	LDKL	A1,SPACES 
	STR	A1,A13	SPACES IN FILE NAME 
	ST	A1,2,A13
	ST	A1,4,A13
	ST	A1,6,A13
	CM	VTC:ST,A13	FREE ENTRY 
	LD	A1,VTC:EN,A13	EXTENT NUMBER 
	RF(NZ)	DELF08	NOT 1ST
	LC	A1,VTC:NE,A13	NUMBER OF EXTENTS 
	NGR	A1,A1
	ADS	A1,FEXTNO
* 
	EJECT		FMCDEF
* 
* 
DELF08	EQU	*
* 
	IFT	CPU852=1 
	LDKL	A1,VTC:EL	GET EXTENT LENGTH 
	ADR	A1,A13	MOVE EXT LEN AND EXT BASE TO WORK AREA
	LDKL	A3,VTC:EL 
	ADR	A3,A9
	CF	A14,FM:MV8
	LDKL	A3,VTC:EL	ADDRESS TO EXTENT LENGTH
	ADR	A3,A9
	LDKL	A6,VTC:EB	ADDRESS TO EXTENT BASE
	ADR	A6,A9
	CF	A14,DBLADD	VTC:EL=EXTENT BASE + EXTENT LENGTH 
	XIF
* 
	IFT	CPU852=0 
	ML	4,VTC:EL,A13
	DAR	A3	VTC:EL=EXT BASE+EXT LENGTH
	MS	4,VTC:EL,A9 
	XIF
* 
	CF	A14,CDEWRI	WRITE
	RB(NZ)	DELF03	ERROR
* 
	EJECT		FMCDEF
* 
* 
*   SCAN FOR ADJACENT FREE SPACE
* 
* 
	SUR	A12,A12	POINTER IN FSAT
DELF10	EQU	*
	LDR	A5,A12	DISPLACEMENT IN FSAT
	CF	A14,FSREAD
	RB(NZ)	DELF03	READ ERROR 
* 
	EJECT		FMCDEF
* 
* 
*   EXTLEN = FSAT EXTENT BASE+LENGTH
* 
* 
	ANK	A5,/F8	DISPLACEMENT IN BUFFER
* 
	IFT	CPU852=1 
	LDK	A3,EXTLEN	ADDRESS TO SAVE AREA 
	ADR	A3,A9
	LDKL	A1,FM:BUF+4	MOVE EXTENT BASE FROM FSAT
	ADR	A1,A5
	CF	A14,FM:MV4
	LDK	A3,EXTLEN	ADDRESS TO SAVE AREA 
	ADR	A3,A9
	CF	A14,DBLAD1	FSAT EXTENT BASE+LENGTH
	XIF
* 
	IFT	CPU852=0 
	ML	2,FM:BUF+4,A5 
	DA	FM:BUF,A5 
	MS	2,EXTLEN,A9 
	XIF
* 
	EJECT		FMCDEF
* 
* 
*   CHECK IF ANY LOWER ADJACENT FREE SPACE
* 
* 
	IFT	CPU852=1 
	LDR	A1,A3	ADDRESS TO FSAT BASE+LENGTH
	LDKL	A2,VTC:EB	EXTENT BASE 
	ADR	A2,A9
	CF	A14,CMPDWD	CHECK IF FSAT EXTBASE = EXTBASE+EXTLEN 
	XIF
* 
	IFT	CPU852=0 
	DS	VTC:EB,A9	CHECK IF FSAT EXTBASE=EXTBASE + EXTLEN
	XIF
* 
	RF(NE)	DELF30	NOT ADJECENT 
* 
	IFT	CPU852=1 
	LDKL	A3,VTC:EB 
	ADR	A3,A9
	LDKL	A1,FM:BUF+4	MOVE EXTENT BASE TO VTC:EB
	ADR	A1,A5
	CF	A14,FM:MV4
	XIF
* 
	IFT	CPU852=0 
	ML	2,FM:BUF+4,A5 
	MS	2,VTC:EB,A9 
	XIF
* 
	RF	DELF35	UPDATE FSAT SECTOR 
* 
	EJECT		FMCDEF
* 
* 
*   CHECK IF ANY UPPER ADJACENT FREE SPACE
* 
* 
DELF30	EQU	*
* 
	IFT	CPU852=1 
	LDKL	A1,FM:BUF+4	FSAT EXTENT BASE ENTRY
	ADR	A1,A5	DISPLACEMENT 
	LDKL	A2,VTC:EL	EXTENTBASE + EXTENT LENGTH
	ADR	A2,A9
	CF	A14,CMPDWD	CHECK IF ADJECENT
	XIF
* 
	IFT	CPU852=0 
	ML	2,FM:BUF+4,A5	FSAT EXTENT BASE
	DS	VTC:EL,A9	EXTENT BASE + EXTENT LENGTH 
	XIF
* 
	RF(NE)	DELF40	NOT ADJECENT 
* 
	IFT	CPU852=1 
	LDKL	A3,VTC:EL	EXPAND EXTLEN 
	ADR	A3,A9
	CF	A14,DBLAD1
	XIF
* 
	IFT	CPU852=0 
	ML	2,VTC:EL,A9 
	DA	FM:BUF,A5 
	MS	2,VTC:EL,A9 
	XIF
* 
DELF35	EQU	*
	CF	A14,CLFSAT	FREE FSAT ENTRY
	CF	A14,CDEWRI	WRITE
	RB(NZ)	DELF03	WRITE ERROR
DELF40	EQU	*
	ADKL	A12,FSATRL	NEXT ENTRY IN FSAT 
	CW	A12,FSATLE,A9 
	RB(L)	DELF10	CONTINUE SEARCH OF FSAT 
* 
	EJECT		FMCDEF
* 
* 
*   PUT FREE SPACE IN FSAT SEARCH FOR FREE FSAT ENTRY 
* 
* 
	LDK	A5,0 
DELF50	EQU	*
	CF	A14,FSREAD	GET FSAT ENTRY 
	RB(NZ)	DELF03	READ ERROR 
	LDR	A12,A2	DISPLACEMENT IN BUFFER
	ADKL	A12,FM:BUF	ADDRESS
	LDR	A1,A12 
	CF	A14,GETPAR	GET EXT LEN
	RF(Z)	DELF60	FREE FSAT ENTRY 
	ADK	A5,FSATRL
	CW	A5,FSATLE,A9
	RB(NG)	DELF50
	LDK	A4,RC:OFL	RC: NO FSAT ENTRIES AVAILIBLE
	ORS	A4,RETCOD
	RF	DELF70	DELETE NEXT VTOC ENTRY OF FILE SECTION 
* 
	EJECT		FMCDEF
* 
* 
DELF60	EQU	*
* 
	IFT	CPU852=1 
	LDKL	A3,VTC:EL	EXTENT END
	ADR	A3,A9
	LDKL	A6,VTC:EB	ADDRESS TO EXTENT BASE
	ADR	A6,A9
	CF	A14,DBLSUB	GET EXTENT LENGTH
	LDR	A3,A12	ADDRESS TO FREE FSAT ENTRY
	LDKL	A1,VTC:EL	ADDRESS TO EXT BASE AND EXT LENGTH
	ADR	A1,A9
	CF	A14,FM:MV8	FILL IN FSAT ENTRY 
	XIF
* 
	IFT	CPU852=0 
	ML	4,VTC:EL,A9 
	DSR	A3 
	MSR	4,A12	UPDATE FSAT
	XIF
* 
	CF	A14,CDEWRI	WRITE
	RF(NZ)	DELF80	ERROR
	IM	FEXTNO
DELF70	EQU	*
	ABL(NZ)	DELF00	NEXT EXTENT 
DELF80	EQU	*
	ABL	DELF03	NEXT SECTION
* 
	EJECT		FMCDEF
* 
* 
*************** 
* SUBROUTINES * 
*************** 
* 
* 
**********
* DV3RST *
**********
* 
* 
*   CALCULATES REST WHEN DIVIDE BY 3
* 
*   INPUT  : A1,A2 = DIVIDENT 
* 
*   OUTPUT :    A2 = 3-REST OR IF REST=0 A2=0 
*                A1=0 
* 
DV3RST	EQU	*
	SLL	A1,1 
	ADR	A2,A1
DV3R10	EQU	*
	LDR	A1,A2
	ANK	A1,3	ONE FIGURE IN BASE 4
	SRL	A2,2 
	ADR	A2,A1	ADDED TO REST OF FIGURES IN BASE 4 
	RF(Z)	SET2CR	REST = 0
	SUK	A2,3 
	RB(P)	DV3R10	CONTINUE TO ADD 
	NGR	A2,A2
	RF	SET2CR
* 
	EJECT		FMCDEF
* 
* 
**********
* GETFIL *
* GETPAR *
**********
* 
* 
*   GET FILE SECTION LENGTH 
* 
*   INPUT : A2 = FILE SECTION NUMBER
*          A10 = FPB ADDRESS
* 
*   OUTPUT: A1,A2 = FILE SECTION LENGTH 
*              CR SET ACCORDING TO FILE SECTION LENGTH
* 
* 
GETFIL	EQU	*
	LDR	A1,A2	MULTIPLY BY 10 
	SLL	A1,2 
	ADR	A1,A2
	SLL	A1,1 
	ADR	A1,A10	ADDRESS TO FILE SECTION LENGTH
	ADKL	A1,FPB:S1	SIZE DISPLACEMENT IN FPB
GETPAR	EQU	*
	LD	A2,2,A1	LEAST SIGNIFICANT PART
	LDR*	A1,A1	MOST SIGNIFICANT PART 
	RF	DBLX00	SET CR 
* 
	IFT	CPU852=1 
	EJECT		FMCDEF
* 
* 
**********
* DBLADD *
* DBLADR *
* DBLAD1 *
**********
* 
* 
*   DOUBLE ADD ON MEMORY LOCATIONS
*   DOUBLE ADD ON MEMORY BY REGISTERS A1,A2 
* 
*   INPUT :  A3 = ADDRESS TO ARG1 
*            A6 = ADDRESS TO ARG2 
* 
*   OUTPUT:  A3 = ADDRESS TO ARG1 + ARG2
*            A1,A2 = ARG1+ARG2
*            A6,A7 ARE DESTOYED 
* 
DBLAD1	EQU	*	SPECIAL ENTRY
	LDR	A6,A5
	ADKL	A6,FM:BUF 
DBLADD	EQU	*
	LDR*	A1,A3	GET ARG1
	LD	A2,2,A3 
DBLADR	EQU	*
	LD	A7,2,A6	GET ARG2
	LDR*	A6,A6 
	CF	A14,ADDMOD	ARG1+ARG2
	RF	DBLXIT
	XIF
* 
	EJECT		FMCDEF
* 
* 
**********
* DBLSUB *
* DBLSU1 *
**********
* 
*   DOUBLE SUBTRACT ON MEMORY LOCATIONS 
* 
*   INPUT :  A3 = ADDRESS TO ARG1 
*            A6 = ADDRESS TO ARG2 
* 
*   OUTPUT:  A3 = ADDRESS TO ARG1-ARG2
*            A1,A2 = ARG1-ARG2
*            A6,A7 ARE DESTOIED 
*            IF A1=A2=0 THEN A3=0 
* 
DBLSU1	EQU	*	SPECIAL ENTRY
	LDR	A6,A9
	ADKL	A6,VTC:EL 
DBLSUB	EQU	*
* 
	IFT	CPU852=1 
	LDR*	A1,A3	ARG1
	LD	A2,2,A3 
	LD	A7,2,A6	ARG2
	LDR*	A6,A6 
	CF	A14,DSUMOD	ARG1-ARG2
	XIF
* 
	IFT	CPU852=0 
	MLR	2,A3 
	DSR*	A6
	XIF
* 
	EJECT		FMCDEF
* 
* 
DBLXIT	EQU	*
* 
	IFT	CPU852=1 
	STR	A1,A3	SAVE RESULT
	ST	A2,2,A3 
	XIF
* 
	IFT	CPU852=0 
	MSR	2,A3 
	XIF
* 
DBLX00	EQU	*
	ADKL	A14,4 
	ADK	A1,0 
	RF(NZ)	DBLX10
	ADK	A2,0 
DBLX10	EQU	*
	ABR*	A14 
* 
	EJECT		FMCDEF
* 
* 
**********
* GET:FC *
**********
* 
*   GET FILECODE FROM FILECODE AREA 
* 
*   INPUT  : VTC:FS = FILE SECTION NUMBER 
* 
*   OUTPUT : A2 = FILE CODE 
*            CR SET ACCORDING TO FILECODE 
* 
* 
GET:FC	EQU	*
	LD	A2,VTC:FS,A9	GET FILE SECTION NUMBER
	LC	A2,FILCOD,A2	FILE CODE
SET2CR	EQU	*
	LDK	A1,0 
	RB	DBLX00	SET CR ACCORDING TO A2 
* 
	EJECT		FMCDEF
* 
* 
**********
* CDEWRI *
**********
* 
*   PERFORM WRITE 
* 
*   INPUT: A8=ECB ADDRESS 
*          A7 USED
*   OUTPUT: A4=RETURN CODE
*           CR SET ACCORDING TO RETURN CODE 
* 
* 
CDEWRI	EQU	*
	LDK	A7,/95 
	CF	A14,FM:IO 
	RF	SET:CR
	EJECT		FMCDEF
* 
* 
**********
* CLFSAT *
**********
* 
*   CLEAR 4 WORDS IN FM:BUF SPECIFIED BY A5 
* 
*   INPUT :  A5 = DISPLACEMENT IN FM:BUF
* 
CLFSAT	EQU	*
	CM	FM:BUF,A5 
	CM	FM:BUF+2,A5 
	CM	FM:BUF+4,A5 
	CM	FM:BUF+6,A5 
	RTN	A14
* 
	EJECT		FMCDEF
* 
* 
**********
* CENTRY *
* EDENTR *
**********
* 
*   CREATE,DELETE AND EXTEND PREPARATION ROUTINE
*   CLEAR WORK AREA AND SAVES TTAB ADDRESS
* 
*   INPUT :  A5 = TTAB ADDRESS OF CALLING TASK
*            REGISTER A3 USED 
* 
*   OUTPUT : A4=RC FROM FCHEC2
*            CR SET ACCORDING TO A4 
* 
EDENTR	EQU	*	ENTRY USED BY EXTEND AND DELETE
	INH
	CF	A15,FCHEC2
	ENB
CENTRY	EQU	*	ENTRY USED BY CREATE 
	LDK	A3,WRKALE-2
CDEE05	EQU	*
	CM	WRKARE,A3 
	SUK	A3,2 
	RB(NN)	CDEE05
	ST	A9,SAVEA9	SAVE USER ECB ADDRESS 
	LDKL	A9,WRKARE	BASE ADDRESS
	ST	A6,FWTSAV,A9	SAVE FWT ADDRESS 
	LDK	A3,/FF 
	ST	A3,VTC:ST-1,A9	INDICATE USED ENTRY
	RF	SET:CR
* 
	EJECT		FMCDEF
* 
* 
**********
* FSREAD *
* FTREAD *
**********
* 
*   FSREAD: READ FSAT SECTOR IF 1ST ENTRY IN SECTOR REQUESTED 
*   FTREAD: READ FSAT SECTOR
* 
*   INPUT :  A5 = FSAT DISPLACEMENT 
*            FSATBA = FSAT BASE SECTOR
* 
*   OUTPUT:  A2 = DISPLACEMENT IN FM:BUF
*            A4 = RTETURN CODE FROM READ OPERATION
*            CR IS SET TO ZERO IF A4=0
* 
FSREAD	EQU	*
	LDK	A4,0	RESET RETURN CODE 
	LDR	A2,A5	DISPLACEMENT 
	ANK	A2,/F8 
	RF(NZ)	SET:CR	NOT FIRST IN SECTOR
FTREAD	EQU	*
	ECR	A2,A5	SECTOR NUMBER
	ANK	A2,/FF 
	AD	A2,FSATBA,A9	BASE SECTOR
	CF	A14,FMREAD
	LDK	A2,0	DISPLACEMENT IN BUFFER
SET:CR	EQU	*
	ADKL	A14,4	UPDATE STACK POINTER
	ADK	A4,0	SET CR
	ABR*	A14	RETURN
* 
	EJECT		FMCDEF
* 
* 
**********
* VTCPAR *
**********
* 
*   GET FSAT LENGTH IN BYTES TO WORK AREA 
*       FSAT BASE SECTOR TO WORK AREA 
*       VTOC BASE SECT
*       LAST VTOC SECTOR NUMBER TO WORK AREA
* 
*   INPUT :  A8 = FM:ECB ADDRESS
*            A2 = FILE CODE 
*   OUTPUT:  A4 = 0 IF READ OK
*            A4<> 0 IF READ NOT OK
*            CR SET ACCORDING TO A4 
*   USED REGISTERS A1, A2, A3, A4, A7 
* 
VTCPAR	EQU	*
	SC	A2,ECBFC,A8	PREPARE ECB 
	LDK	A2,0	READ SECTOR ZERO = VOLUME LABEL 
	CF	A14,FMREAD
	RB(NZ)	SET:CR	READ ERROR 
	LDKL	A2,FM:BUF	BUFFER ADDRESS
	LD	A1,VOL:EB,A2	VTOC BASE
	ST	A1,FSATBA,A9	FSAT BASE SECTOR 
	LD	A3,VOL:EL,A2	VTOC LENGTH
	LD	A2,VOL:FS,A2	FSAT LENGTH
	ADR	A3,A1
	ADR	A1,A2
	ECR	A2,A2
* 
	EJECT		FMCDEF
* 
* 
	IFT	CPU852=1 
	ST	A1,VTCSEC,A9	VTOC ENTRIES BASE
	ST	A2,FSATLE,A9	FSAT LENGTH IN BYTES 
	ST	A3,VTCEND,A9	VTOC END SECTOR
	XIF
* 
	IFT	CPU852=0 
	MS	3,VTCSEC,A9 
	XIF
* 
	RB	SET:CR
* 
	EJECT		FMCDEF
* 
* 
**********
* CHKFIL *
**********
* 
* 
*   CHECKS IF FILE EXISTS IN VOLUMES SPECYFIED BY FPB 
* 
*   INPUT :  A5 = START VOLUME IN FILCOD
*            FILCOD - AREA WITH FILE CODES
*   OUTPUT:  A2 = 0 IF NO FILE FOUND
*            A2 <> 0 IF FILE FOUND
*            CR SET ACCORDING TO A2 
*             A1-A7 AND A11-A13 ARE USED
* 
* 
CHKFIL	EQU	*
	SUK	A5,3	FILE CODE POINTER 
CHKF10	EQU	*
	LC	A2,FILCOD+3,A5	GET FILE CODE
	ANK	A2,/FF 
	RF(Z)	CHKF20	NEXT FILE CODE
	LDR	A6,A9
	SUKL	A6,FWTNAM 
	CF	A14,FNDVTC
	ADK	A4,0 
	ABL(NZ)	CDEXIT	DISC ERROR
	ADK	A2,0 
	RB(NZ)	SET2CR	FILE IN ONE OF VOLUMES 
CHKF20	EQU	*
	ADK	A5,1 
	RB(NP)	CHKF10	NEXT ENTRY IN FILCOD 
	RB	SET2CR
* 
	END

Full view