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

⟦632bd69c9⟧

    Length: 46124 (0xb42c)
    Notes: pts_type(SC)
    Names: »FMTASK.SC«

Derivation

└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
    └─⟦this⟧ »TOSSWORK/FMTASK.SC« 

PTS(SC)

	IDENT FMTASK 	REL 10.0 80-03-15 870105041000 

* 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS                  *
* 
*   FMTASK = TOSS FILE MANAGEMENT TASK           *
* 
* 
* 
* 
**************************************************
* 
* 
*   TOSS FILE MANAGEMENT TASK CONTAINS THE
*   FOLLOWING FILE ADMINISTRATION MODULES:
* 
*   - FMOPEN   OPEN/CREATE/EXTEND FILE
*   - FMCLOS   CLOSE/DELETE FILE
*   - FMRDFP   READ FILE PARAMETERS 
* 
*   A SPECIAL ENTRY IS USED FOR I/O 
*   FUNCTIONS WHERE REQUESTED SECTORS ARE 
*   SPLIT OVER TWO OR MORE FILE EXTENTS:
* 
*   - FMRDWR   READ/WRITE (SPLIT EXTENT I/O)
* 
*   FMTASK ALSO CONTAINS THE FILE MANAGEMENT
*   SYSTEM INITIALIZATION ROUTINE, FMINIT.
* 
* 
	EJECT			FMTASK 
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	FMRDWR	READ/WRITE (SPLIT EXTENT I/O) 
	ENTRY	FM:ADM	FM ADMINISTRATION FUNCTIONS 
	ENTRY	FMINIT	FILE MANAGEMENT INITIALIZATION
	ENTRY	TTABFM	FMTASK TTAB 
	ENTRY	FWTPAR	FILE ACCESS PARAMETERS
	ENTRY	FWTFNR	FILE NUMBER 
	ENTRY	FWTTAB	TTAB FOR TASK WITH EXCLUSIVE ACCESS 
	ENTRY	FWTEW1	POINTER TO 2ND EWT BLOCK IN FWT 
	ENTRY	FWTEXB	FILE EXTENT BASE, FIRST EXTENT
	ENTRY	FWTVOL	VOLUME FILE CODE
	ENTRY	EWTEXL	EXTENT LENGTH 
	ENTRY	EWTEXB	EXTENT BASE 
	ENTRY	EWTVOL	VOLUME FILE CODE
* 
	EJECT			FMTASK 
* 
* 
	ENTRY	FPB:RL	RECORD LENGTH 
	ENTRY	FPB:BF	BLOCK FACTOR
	ENTRY	FPB:FO	FILE ORGANIZATION 
	ENTRY	FPB:BO	BASIC ORDERS
	ENTRY	FPB:FN	FILE NAME 
	ENTRY	FPB:EL	ENLARGE 
	ENTRY	FPB:V1	VOLUME NAME 1 
	ENTRY	FPB:S1	SIZE 1
	ENTRY	FPB:V2	VOLUME NAME 2 
	ENTRY	FPB:S2	SIZE 2
	ENTRY	FPB:V3	VOLUME NAME 3 
	ENTRY	FPB:S3	SIZE 3
	ENTRY	FPB:V4	VOLUME NAME 4 
	ENTRY	FPB:S4	SIZE 4
	ENTRY	FPB:FR	FILE RECORD NUMBER
	ENTRY	FPB:US	NUMBER OF USERS 
	ENTRY	FPB:SH	SHAREABILITY
	ENTRY	FPB:MN	MONITOR NUMBER
	ENTRY	FPB:SN	SOP SWITCH NUMBER 
	ENTRY	FPB:IF	NUMBER OF INDEX FILES 
	ENTRY	FPB:KA	KEY ADDRESS IN RECORD 
	ENTRY	FPB:CD	CREATION DATE 
	ENTRY	FPB:RP	RETENTION PERIOD
	EJECT			FMTASK 
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	QMEXIT	QUEUE TASK AND EXIT MONITOR TASK
	EXTRN	GETBLK	STORE PARAMETERS IN MONITOR BLOCK 
	EXTRN	FREBLK	GET PARAMETERS FROM MONITOR BLOCK 
	EXTRN	FNDTID	FIND TTAB ADDRESS FROM TASK ID
	EXTRN	FNDDWD	FIND DISC DWT ADDRESS 
	EXTRN	FCHECK	CHECK ACCESS PAR. AND RETURN FWT ADDRESS
	EXTRN	FCHEC2	FCHECK 2ND ENTRY
	EXTRN	LKMERR	HALT SYSTEM DUE TO FATAL LKM ERROR
	EXTRN	TIODM	DM ADDRESS BLOCK 
	EXTRN	DFTAB	DISC FILE CODE TABLE 
	EXTRN	DFTABE	END OF DFTAB
	EXTRN	SCTNOF	NUMBER OF FILES 
	EXTRN	SCTFWT	FWT CHAIN START ADDRESS 
	EXTRN	SCTFWL	FILE WORK TABLE LENGTH
	EXTRN	SCTDMT	DM TASKS IN SYSTEM
	EXTRN	NVLTAB	NVL TABLE 
	EXTRN	NVLDMT	DM TASK NVL TABLE 
	EXTRN	NVLEND	END OF NVLTAB 
	EXTRN	NVLBIT	NVL BIT MASK
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTADR	ADDRESS TO ADDRESS BLOCK
	EXTRN	DWTMEC	MMU ECB ADDRESS 
	EXTRN	DWTVOL	VOLUME NAME 
	EXTRN	DWTNVL	NVL INDICATOR 
	EXTRN	FDBMEC	FDB MMU ECB DISPLACEMENT IN FWT 
* 
	EJECT			FMTASK 
* 
* 
	EXTRN	TTB:MT	MMU TABLE 
	EXTRN	TTB:SA	SAVE AREA 
	EXTRN	ECBFC	ECB FILE CODE (FILE NUMBER)
	EXTRN	ECBBA	ECB BUFFER ADDRESS (FPB ADDRESS) 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	ECBCW1	CONTROL WORD 1
	EXTRN	ECBCW2	CONTROL WORD 2
	EJECT			FMTASK 
* 
* 
*************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
*************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
* 
*	A PROGRAM VERSION SUPPORTING SPLIT EXTENT I/O 
*	IS OBTAINED BY SETTING XTSPLI EQU 1.
* 
XTSPLI	EQU	0
* 
	EJECT			FMTASK 
* 
* 
********************
* VL DISPLACEMENTS *
********************
* 
*	VOLUME LABEL DISPLACEMENTS
* 
VOL:VN	EQU	0	VOLUME NAME
VOL:EL	EQU	6	VTOC EXTENT LENGTH 
VOL:EB	EQU	10	VTOC EXTENT BASE
VOL:RL	EQU	12	VTOC RECORD LENGTH
VOL:FS	EQU	46	FSAT LENGTH 
* 
* 
************* 
* CONSTANTS * 
************* 
* 
* 
VTOCRL	EQU	42	VTOC RECORD LENGTH
VTOCBF	EQU	6	VTOC BLOCK FACTOR
* 
	EJECT			FMTASK 
* 
* 
**********************
* VTOC DISPLACEMENTS *
**********************
* 
*	VOLUME TABLE OF CONTENTS DISPLACEMENTS
* 
VTC:FN	EQU	0	FILE NAME
VTC:MN	EQU	8	MONITOR NUMBER (L-FILE)
VTC:FS	EQU	8	FILE SECTION NUMBER (S-FILE) 
VTC:SN	EQU	9	SOP SWITCH NUMBER
VTC:EN	EQU	10	FILE EXTENT NUMBER
VTC:EL	EQU	12	FILE EXTENT LENGTH
VTC:EB	EQU	16	FILE EXTENT BASE
VTC:LR	EQU	20	LAST RECORD NUMBER
VTC:RL	EQU	24	RECORD LENGTH 
VTC:BF	EQU	26	BLOCK FACTOR
VTC:FO	EQU	27	FILE ORGANIZATION 
VTC:CD	EQU	28	CREATION DATE 
VTC:RP	EQU	34	RETENTION PERIOD
VTC:IF	EQU	37	NUMBER OF INDEX FILES 
VTC:KA	EQU	38	KEY ADDRESS IN RECORD 
VTC:ST	EQU	41	STATUS BYTE 
* 
	EJECT			FMTASK 
* 
* 
********************* 
* FWT DISPLACEMENTS * 
********************* 
* 
*	FILE WORK TABLE DISPLACEMENTS 
* 
FWTLNK	EQU	/00	LINK NEXT FWT
* 
	IFT	MMUPAG=0 
FWTBAS	EQU	FWTLNK+/10 
	XIF
* 
	IFT	MMUPAG=1 
FWTBAS	EQU	FWTLNK+/14 
	XIF
* 
FWTVTC	EQU	FWTBAS+/00	VTOC SECTOR NUMBER (FIRST EXTENT) 
FWTPAR	EQU	FWTBAS+/02	FILE ACCESS PARAMETERS
FWTFNR	EQU	FWTBAS+/03	FILE NUMBER 
FWTTAB	EQU	FWTBAS+/04	TTAB FOR TASK WITH EXCLUSIVE ACCESS 
FWTEW1	EQU	FWTBAS+/06	POINTER TO 2ND EWT BLOCK IN FWT 
FWTSEX	EQU	FWTBAS+/08	FILE SECTION/EXTENT NUMBER
FWTEXL	EQU	FWTBAS+/0A	EXTENT LENGTH IN SECTORS (FIRST EXTENT) 
FWTEW2	EQU	FWTBAS+/0C	POINTER TO NEXT EWT STRUCTURE 
FWTVOL	EQU	FWTBAS+/0E	VOLUME FILE CODE (FIRST EXTENT) 
FWTEXB	EQU	FWTBAS+/10	EXTENT BASE (FIRST EXTENT)
FWTNAM	EQU	FWTBAS+/12	FILE NAME 
* 
	EJECT			FMTASK 
* 
* 
********************* 
* EWT DISPLACEMENTS * 
********************* 
* 
*	EXTENT WORK TABLE DISPLACEMENTS 
* 
EWTLNK	EQU	0	LINK NEXT EWT BLOCK
* 
*	BLOCK 1 
* 
EWTSEX	EQU	2	FILE SECTION/EXTENT NUMBER 
EWTEXL	EQU	4	EXTENT LENGTH IN SECTORS 
* 
*	BLOCK 2 
* 
EWTVOL	EQU	2	VOLUME FILE CODE 
EWTEXB	EQU	4	EXTENT BASE
* 
EWTLEN	EQU	6	EXTENT WORK TABLE BLOCK LENGTH 
* 
	EJECT			FMTASK 
* 
* 
********************* 
* FPB DISPLACEMENTS * 
********************* 
* 
*	FILE PARAMETER BLOCK DISPLACEMENTS
* 
FPB:RL	EQU	0	RECORD LENGTH
FPB:BF	EQU	2	BLOCK FACTOR 
FPB:FO	EQU	3	FILE ORGANIZATION
FPB:BO	EQU	5	BASIC ORDERS 
FPB:FN	EQU	8	FILE NAME
FPB:EL	EQU	17	ENLARGE 
FPB:V1	EQU	18	VOLUME NAME 1 
FPB:S1	EQU	24	SIZE 1
FPB:V2	EQU	28	VOLUME NAME 2 
FPB:S2	EQU	34	SIZE 2
FPB:V3	EQU	38	VOLUME NAME 3 
FPB:S3	EQU	44	SIZE 3
FPB:V4	EQU	48	VOLUME NAME 4 
FPB:S4	EQU	54	SIZE 4
FPB:FR	EQU	58	FILE RECORD NUMBER
FPB:US	EQU	62	NUMBER OF USERS 
FPB:SH	EQU	64	SHAREABILITY
FPB:MN	EQU	65	MONITOR NUMBER
FPB:SN	EQU	66	SOP SWITCH NUMBER 
FPB:IF	EQU	67	NUMBER OF INDEX FILES 
FPB:KA	EQU	68	KEY ADDRESS IN RECORD 
FPB:CD	EQU	70	CREATION DATE 
FPB:RP	EQU	76	RETENTION PERIOD
* 
FPBLEN	EQU	80	FILE PARAMETER BLOCK LENGTH 
* 
	EJECT			FMTASK 
* 
*	TTABFM (FMTASK TTAB)
* 
	IFT	MMUPAG=1 
	RES	16	FMTASK MMU TABLE
	XIF
* 
	DATA	0	CURRENT SEGMENT BASE (DUMMY)
VOLUME	DATA	0	CURRENT VOLUME NAME DISPLACEMENT
	DATA	0	SEGMENT BLOCK ADDRESS 
* 
TTABFM	EQU	*	TTABFM ENTRY 
	DATA	0	DISPATCHER QUEUE LINK 
	DATA	'#A'	TASK IDENTIFICATION
	DATA	49	PRIORITY LEVEL 
	DATA	0	PENDING POINTER 
	DATA	/C4C0	PSW (PROGRAM STATUS WORD) 
	DATA	0	DISPATCH ADDRESS
	DATA	0,0,0,0,0,0,0	REGISTER SAVE AREA, A1-A14
	DATA	FM:ECB	A8 = FM:ECB ADDRESS
	DATA	0,0,0,0,0,0 
* 
	EJECT			FMTASK 
* 
*	FMTASK DATA AREAS 
* 
FM:ECB	DATA	/8000,FM:BUF,256	FMTASK ECB AREA
	DATA	0,0,0,0 
* 
	RES	6	FMTASK STACK 
FM:STB	EQU	*-2	FMTASK STACK BASE
* 
	IFT	MMUPAG=1 
FM:FPB	RES	40	FILE PARAMETER BLOCK AREA 
	XIF
* 
	EJECT			FMTASK 
* 
* 
**********
* FMINIT *
**********
* 
* 
*   FMINIT IS THE FILE MANAGEMENT INITIALIZATION ROUTINE. 
*   IT IS CALLED FROM PFINIT AFTER IPL AND AT POWER ON. 
*   WHEN CALLED AT POWER ON, AN IMMEDIATE RETURN IS MADE. 
* 
*   FMINIT WILL ZEROIZE THE FWT AREA, AND LINK THE FWT:S
*   TOGETHER. THE POINTER FWTEW1 IS ALSO INITIALIZED, AS
*   WELL AS FWTFNR (FILE NUMBER). 
*   THE PART OF FMINIT THAT IS NOT EXECUTED AT POWER ON 
*   WILL BE USED AS THE INTERNAL BUFFER FOR THE FMTASK. 
* 
FMINIT	EQU	*	FMINIT ENTRY 
	LDKL	A1,/F03E	RTNA15 INSTRUCTION CODE
	ST	A1,FMINIT	CLOSE THE DOOR
* 
	EJECT			FMTASK 
* 
* 
FM:BUF	EQU	FMINIT+2	START OF FMTASK INTERNAL BUFFER 
* 
*	PERFORM INITIALIZATION
* 
	LD	A1,SCTFWT	FWT CHAIN START ADDRESS 
	LD	A4,SCTNOF	NUMBER OF FILES 
	LDK	A5,0 
	LDKL	A6,/8000	DWT BUSY BIT 
	LDKL	A7,TIODM	DM ADDRESS BLOCK 
* 
FMI:30	EQU	*
	IFT	MMUPAG=1 
	LDKL	A8,FDBMEC	FDB MMU ECB DISPLACEMENT IN FWT 
	ADR	A8,A1	MMU ECB ADDRESS
	XIF
* 
	LDR	A2,A1	CURRENT FWT ADDRESS
	LDR	A3,A1
	AD	A3,SCTFWL	NEXT FWT ADDRESS
	ADK	A5,1	NEXT FILE NUMBER
	SUK	A4,1 
	RF(N)	FMI:50	INITIALIZATION COMPLETED
	RF(Z)	FMI:40	ONE FWT LEFT TO INITIALIZE
	STR	A3,A1	LINK CURRENT FWT TO THE NEXT FWT 
	ADK	A1,2	INCREMENT FWT POINTER 
* 
	EJECT			FMTASK 
* 
* 
FMI:40	EQU	*
	CMR	A1 
	ADK	A1,2	INCREMENT FWT POINTER 
	CWR	A1,A3	CHECK IF END OF THIS FWT 
	RB(NE)	FMI:40	NOT END OF THE FWT 
	SU	A3,SCTFWL 
	ADK	A3,FWTEW2	FWTEW2 ADDRESS 
	ST	A3,FWTEW1,A2	INITIALIZE FWTEW1 POINTER
	ST	A5,FWTFNR,A2	SET FILE NUMBER IN FWT 
	ST	A6,DWTST,A2	INDICATE FWT NOT BUSY 
	ST	A7,DWTADR,A2	DM ADDRESS BLOCK (ACTIVATION ADDRESS)
* 
	IFT	MMUPAG=1 
	ST	A8,DWTMEC,A2	SET MMU ECB ADDRESS
	XIF
* 
	RB	FMI:30	CONTINUE WITH NEXT FWT 
* 
	EJECT			FMTASK 
* 
*	FILL IN NVLTAB WITH DM TTAB ADDRESSES (IF ANY)
* 
FMI:50	EQU	*
	LD	A1,SCTDMT	DM TASKS IN SYSTEM
	RF(Z)	FMI:75	NO DM TASKS IN SYSTEM 
	LDK	A3,4	LOOP COUNTER
	LDKL	A4,NVLDMT	DM TASK NVL TABLE 
	LDKL	A7,'#D'	TASK ID 1ST DM TASK 
* 
FMI:60	EQU	*
	SRC	A1,1 
	RF(NN)	FMI:70	THIS DM TASK NOT IN SYSTEM 
	CF	A15,FNDTID	FIND DM TASK TTAB ADDRESS
	STR	A2,A4	STORE IN NVLTAB
* 
FMI:70	EQU	*
	ADK	A4,2	INCREMENT NVLTAB POINTER
	ADK	A7,1	NEXT DM TASK ID 
	SUK	A3,1	DECREMENT LOOP COUNTER
	RB(P)	FMI:60 
* 
	EJECT			FMTASK 
* 
*	COMPUTE NVL BIT MASK
* 
FMI:75	EQU	*
	LDK	A1,0	INITIALIZE BIT MASK 
	LDK	A2,1 
	LDKL	A3,NVLTAB	NVLTAB ADDRESS
* 
FMI:80	EQU	*
	LDR*	A4,A3	GET ONE ENTRY FROM NVLTAB 
	RF(Z)	FMI:85	THIS ENTRY NOT USED 
	ORR	A1,A2	INDICATE TTAB PRESENT
* 
FMI:85	EQU	*
	SLL	A2,1 
	ADK	A3,2	INCREMENT NVLTAB POINTER
	CWK	A3,NVLEND	CHECK IF END OF NVLTAB 
	RB(NE)	FMI:80	NOT END OF NVLTAB
* 
FMI:90	EQU	*
	ORR	A1,A2	ADD ONE BIT FOR USER TASKS 
	ST	A1,NVLBIT	SET NVL BIT MASK
	RTN	A15
* 
	IFT	MMUPAG=0 
	RES	57 
	XIF
* 
	IFT	MMUPAG=1 
	RES	52 
	XIF
* 
	EJECT			FMTASK 
* 
* 
**********
* FMTASK *
**********
* 
* 
*   THE FILE MANAGEMENT TASK PERFORMS 
*   FILE ADMINISTRATION FUNCTIONS. IT 
*   IS ACTIVATED BY THE FILE MANAGEMENT 
*   LKM PROCESSOR AT ENTRY FM:ADM.
*   AFTER SOME HOUSEKEEPING THE FOLLOWING 
*   MODULES WILL PERFORM THE FILE ADMINISTRATION: 
* 
*   - FMOPEN   OPEN/CREATE/EXTEND FILE        (OPTIONS: 0, 2, 1)
*   - FMCLOS   CLOSE/DELETE FILE              (   "   : 0, 2) 
*   - FMRDFP   READ FILE PARAMETERS           (   "   : 0)
* 
*   A SPECIAL ENTRY IS USED FOR I/O 
*   FUNCTIONS WHERE REQUESTED SECTORS ARE 
*   SPLIT OVER TWO OR MORE FILE EXTENTS:
* 
*   - FMRDWR   READ/WRITE (SPLIT EXTENT I/O)  (OPTIONS: 0)
* 
* 
	EJECT			FMTASK 
* 
* 
**********
* FM:ADM *
**********
* 
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = ORDER CODE AND OPTION
*   A3 = TTAB ADDRESS OF CALLING TASK 
*   A4 = USER ECB ADDRESS 
* 
FM:ADM	EQU	*	FM ADMINISTRATION FUNCTIONS ENTRY
	LDR	A5,A3	TTAB ADDRESS OF CALLING TASK 
	LDR	A7,A1	ORDER CODE/OPTION
	LDR	A9,A4	USER ECB ADDRESS 
	LDKL	A14,FM:STB	FMTASK STACK BASE
* 
	IFT	MMUPAG=0 
	LD	A10,ECBBA,A9	FPB ADDRESS
	XIF
* 
	IFT	MMUPAG=1 
	LDKL	A3,TTABFM	FMTASK TTAB ADDRESS 
	TL	TTB:MT,A5	USER MMU TABLE
	TS	TTB:MT,A3	STORE IN FMTASK MMU TABLE 
* 
*	MOVE USER FPB TO SYSTEM AREA (FM:FPB) 
* 
	EL	A1,ECBBA,A9	USER FPB ADDRESS
	LDKL	A2,FM:FPB	FM FPB ADDRESS
	LDR	A10,A2	SAVE IT 
	LDK	A4,FPBLEN 	FPB LENGTH
	MVUS	A4	MOVE USER FPB TO FM:FPB
	XIF
* 
	EJECT			FMTASK 
* 
*   CHECK WHAT FUNCTION THAT IS REQUESTED 
*   AND BRANCH TO APPROPRIATE FUNCTION HANDLER. 
* 
*   THE FOLLOWING PARAMETERS ARE SUPPLIED TO
*   THE RESP. FUNCTION HANDLER: 
* 
*   A1 = ORDER OPTION 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
	ECR	A1,A7	ORDER CODE AND OPTION
	ANK	A7,/7F	ORDER CODE
	SUK	A7,/03 
	ABL(Z)	FMRDFP	READ FILE PARAMETERS 
	SUK	A7,/22-/03 
	ABL(Z)	FMCLOS	CLOSE/DELETE 
* 
	EJECT			FMTASK 
* 
* 
**********
* FMOPEN *
**********
* 
* 
*   FILE MANAGEMENT ADMINISTRATION FUNCTIONS: 
*   OPEN/CREATE/EXTEND FILE 
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = ORDER OPTION 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
FMOPEN	EQU	*	OPEN/CREATE/EXTEND FILE
	ANK	A1,/FF	ORDER OPTION
	ABL(NZ)	FM:RQE	ILLEGAL ORDER OPTION
* 
	EJECT			FMTASK 
* 
* 
********
* OPEN *
********
* 
* 
OPEN	EQU	*	OPEN FILE
	LDK	A7,FPB:V1	1ST VOLUME NAME DISPLACEMENT 
	ST	A7,VOLUME 
	CF	A14,FNDVOL	FIND VOLUME
	LDR	A12,A2	SAVE FILE CODE
	RF(Z)	OP:055	VOLUME NOT FOUND
	CF	A14,FNDFWT	FIND FWT ADDRESS 
	ADK	A6,0	SET CR
	RF(Z)	OP:030	NO FREE FWT AVAILABLE 
	LDR*	A1,A6	FIRST WORD OF FWT 
	ANK	A1,1	CHECK IF ALREADY OPENED 
	RF(Z)	OP:060	NOT OPENED
* 
*	FILE IS ALREADY OPENED
	CC	A1,FPB:SH,A10	SHAREABILITY PARAMETER
	RF(E)	OP:040	NOT EA WHEN ALREADY OPENED
	LD	A2,FWTTAB,A6	TTAB ADDRESS FOR EA TASK 
	RF(NZ)	OP:040	FILE PROTECTED 
	LC	A1,FWTPAR,A6	ACCESS PARAMETERS
	LDR	A2,A1
	ANK	A1,/3F	NUMBER OF USERS 
	SUK	A1,/3F 
	ABL(NZ)	OP:250 
* 
	EJECT			FMTASK 
* 
*	ERROR EXITS 
* 
	LDKL	A4,/0210	RETURN CODE (TOO MANY USERS) 
	RF	OP:RTN
* 
OP:030	EQU	*	NO FREE FWT AVAILABLE
	LDKL	A4,/8400	RETURN CODE
	RF	OP:RTN
* 
OP:040	EQU	*	FILE PROTECTED 
	LDK	A4,/40	RETURN CODE 
	RF	OP:RTN
* 
OP:050	EQU	*	VOLUME/FILE NOT FOUND
	CF	A14,RELBLK	RELEASE EWT STRUCTURE BLOCKS 
* 
OP:055	EQU	*
	LDKL	A4,/8800	RETURN CODE
* 
OP:RTN	EQU	*
	ABL	FM:RTC	FMOPEN ERROR EXIT 
* 
	EJECT			FMTASK 
* 
*	FILE IS NOT OPENED BEFORE:
*	FIND ALL FILE EXTENTS, BUILD FWT AND EWT:S
* 
OP:060	EQU	*
* 
*	MOVE FILE NAME FROM FPB TO FWT
* 
	LDR	A1,A10	FPB ADDRESS 
	ADK	A1,FPB:FN
	LDR	A3,A6	FWT ADDRESS
	ADK	A3,FWTNAM
	LDK	A2,8	NO OF CHARACTERS TO MOVE
	CF	A14,MOVE	MOVE FILE NAME 
	LDR	A2,A12	RESTORE FILE CODE 
	RF	OP:075
* 
*	FIND ONE VOLUME 
* 
OP:070	EQU	*
	ST	A7,VOLUME	SAVE VOLUME NAME DISPLACEMENT 
	CF	A14,FNDVOL	FIND VOLUME
	ADK	A2,0 
	RB(Z)	OP:050	VOLUME NOT FOUND
* 
	EJECT			FMTASK 
* 
*	FIND ONE FILE EXTENT
* 
OP:075	EQU	*
	CF	A14,FNDVTC	FIND VTOC ENTRY
	LDR	A11,A2	SAVE CURRENT VTOC SECTOR NUMBER 
	RB(Z)	OP:050	NO FILE EXTENT FOUND
* 
OP:080	EQU	*
	LDR	A1,A6	SAVE FWT ADDRESS 
	LDR*	A2,A8	DISC FILE CODE
	INH
	CF	A15,FNDDWD	DISC DWT ADDRESS AND INDEX 
	ENB
	ADR	A2,A2	DOUBLE INDEX 
	ADR	A2,A6	ADD DWT ADDRESS
	LDK	A3,0 
	SC	A3,DWTNVL+1,A2	CLEAR NVL BITS 
	LDR	A6,A1	RESTORE FWT ADDRESS
	LD	A3,VTC:EN,A13	FILE EXTENT NUMBER
	LD	A2,VTC:FO,A13	FILE ORGANIZATION 
	ANK	A2,/FF 
	SUK	A2,'L' 
	RF(Z)	OP:085	L-FILE
	LD	A2,VTC:FS,A13	FILE SECTION NUMBER 
	SRC	A2,2 
	ECR	A3,A3	FILE EXTENT NUMBER NOW IN LEFT BYTE
	ORR	A2,A3
	LDR	A3,A2
* 
	EJECT			FMTASK 
* 
* 
OP:085	EQU	*
	LC	A2,VTC:EL+1,A13	FILE EXTENT LENGTH
	LD	A1,VTC:EL+2,A13 
	ADK	A3,0	SET CR
	RF(Z)	OP:090	FIRST FILE EXTENT 
	INH
	CF	A15,GETBLK	EWT BLOCK 1
	RF	OP:100
* 
OP:090	EQU	*
	ST	A2,FWTEXL-2,A6	STORE FILE EXTENT LENGTH, FIRST EXTENT 
	ST	A1,FWTEXL,A6
* 
	EJECT			FMTASK 
* 
* 
OP:100	EQU	*
	LDR*	A2,A8	VOLUME FILE CODE
	ECR	A2,A2	FILE CODE NOW IN LEFT BYTE 
	LC	A2,VTC:EB+1,A13	FILE EXTENT BASE
	LD	A1,VTC:EB+2,A13 
	ADK	A3,0	SET CR
	RF(NZ)	OP:120	NOT FIRST FILE EXTENT
	ST	A2,FWTEXB-2,A6	STORE FILE EXTENT BASE, FIRST EXTENT 
	ST	A1,FWTEXB,A6
	ST	A11,FWTVTC,A6	STORE VTOC SECTOR NUMBER, FIRST EXTENT
* 
*	FIND REMAINING EXTENTS FOR THIS FILE
* 
OP:110	EQU	*
	CF	A14,FVTC30	FIND NEXT VTOC ENTRY 
	LDR	A11,A2	SAVE CURRENT VTOC SECTOR NUMBER 
	RF(Z)	OP:160	NO MORE FILE EXTENTS ON THIS VOLUME 
	RB	OP:080
* 
	EJECT			FMTASK 
* 
*	INSERT NEW EWT BLOCKS IN EWT CHAIN
* 
OP:120	EQU	*
	LDR	A3,A4	ADDRESS EWT BLOCK 1
	CF	A15,GETBLK	EWT BLOCK 2
	ENB
	STR	A4,A3	LINK EWT2 TO EWT1
	LDR	A1,A6	FWT ADDRESS
	ADK	A1,FWTEW2
* 
OP:130	EQU	*
	LDR*	A2,A1	ADDRESS NEXT EWT STRUCTURE
	RF(NZ)	OP:150
* 
OP:140	EQU	*
	STR	A2,A4	INSERT NEW EWT BLOCK 
	STR	A3,A1
	RB	OP:110	CONTINUE 
* 
OP:150	EQU	*
	LC	A11,EWTSEX,A2	FILE SECTION AND EXTENT NUMBER
	CC	A11,EWTSEX,A3 
	RB(G)	OP:140	INSERT NEW EWT BLOCKS 
	LDR*	A1,A2	ADDRESS TO 2ND EWT BLOCK
	RB	OP:130
* 
	EJECT			FMTASK 
* 
* 
OP:160	EQU	*
	LD	A7,VOLUME	CURRENT VOLUME NAME DISPLACEMENT
	CWK	A7,FPB:V4
	RF(E)	OP:170	ALL VOLUMES CHECKED 
	ADK	A7,FPB:V2-FPB:V1 
	LDR	A1,A10	FPB ADDRESS 
	ADR	A1,A7	POINT TO VOLUME NAME 
	LDR*	A1,A1	CHECK IF MORE VOLUMES SPECIFIED 
	RF(Z)	OP:170	NO MORE VOLUMES 
	SUKL	A1,/2020	SPACES IF NO MORE VOLUMES
	RB(NZ)	OP:070	FIND NEXT VOLUME 
* 
OP:170	EQU	*
* 
*	ALL VOLUMES FOUND.
*	SCAN EWT STRUCTURE CHAIN AND CHECK
*	THAT ALL FILE EXTENTS ARE PRESENT.
* 
	LD	A1,FWTVTC,A6	VTOC SECTOR NUMBER, FIRST EXTENT 
	RB(Z)	OP:050	FIRST FILE EXTENT MISSING 
	LDR	A1,A6	FWT ADDRESS
	ADK	A1,FWTEW1
	LDK	A4,0	FILE SECTION AND EXTENT NUMBER
* 
	EJECT			FMTASK 
* 
* 
OP:180	EQU	*
	LDR*	A1,A1	ADDRESS TO 2ND EWT BLOCK
	LDR*	A1,A1	ADDRESS TO NEXT EWT STRUCTURE 
	RF(Z)	OP:230	END OF EWT CHAIN
	LC	A13,EWTSEX,A1	FILE SECTION AND EXTENT NUMBER
	LDR	A3,A13 
	ANK	A3,/C0	FILE SECTION NUMBER 
	LDR	A7,A4
	ANK	A7,/C0	FILE SECTION NUMBER 
	SUR	A7,A3	COMPARE FILE SECTION NUMBERS 
	RF(Z)	OP:190	FILE SECTION NUMBERS EQUAL
	ADK	A7,/40	MAXIMUM DIFFERENCE = 1
	RF(NZ)	OP:200	FILE SECTION MISSING 
	LDR	A3,A13 
	ANK	A3,/3F	EXTENT NUMBER SHOULD BE ZERO
	RF	OP:200
* 
OP:190	EQU	*
	LDR	A3,A13 
	ANK	A3,/3F	FILE EXTENT NUMBER
	ANK	A4,/3F	FILE EXTENT NUMBER
	SUR	A4,A3	COMPARE FILE EXTENT NUMBER 
	ADK	A4,1	DIFFERENCE SHOULD BE ONE
* 
OP:200	EQU	*
	ABL(NZ)	OP:050	FILE EXTENT MISSING 
	LDR	A4,A13	SAVE LAST FILE SECTION AND EXTENT NUMBER
	RB	OP:180
* 
	EJECT			FMTASK 
* 
* 
OP:230	EQU	*
	LC	A2,FPB:SH,A10	SHAREABILITY PARAMETER
	ANK	A2,/FF 
	RF(Z)	OP:240	NO EA REQUESTED 
	ST	A5,FWTTAB,A6	SET TTAB ADDRESS IN FWT
* 
OP:240	EQU	*
	IMR	A6	INDICATE FWT USED (BIT 15 IN 1ST WORD)
	LDK	A2,/40	PREPARE FOR BASIC ORDERS
* 
	EJECT			FMTASK 
* 
*	COMMON EXIT FOR ACCEPTED OPEN REQUESTS
* 
OP:250	EQU	*
	LD	A1,FPB:BO,A10	BASIC ORDERS PARAMETERS 
	ANK	A1,/FF 
	RF(NZ)	OP:260	BASIC ORDERS WANTED, NO ACTION 
	ANK	A2,/BF	PHYSICAL ORDERS REQUESTED 
* 
OP:260	EQU	*
	ADK	A2,1	ADD ONE USER TO THIS FILE 
	SC	A2,FWTPAR,A6	SET NEW ACCESS PARAMETERS
	LD	A4,FWTFNR,A6	FILE NUMBER
* 
	IFT	MMUPAG=0 
	SC	A4,ECBFC,A9	SET FILE NUMBER IN ECB
	XIF
* 
	IFT	MMUPAG=1 
	ELR	A2,A9
	ANKL	A2,/FF00
	ANK	A4,/FF	FILE NUMBER 
	ORR	A2,A4
	ESR	A2,A9	SET FILE NUMBER IN ECB 
	XIF
* 
	LDK	A4,0	RETURN CODE 
	ABL	FM:RTC 
* 
	EJECT			FMTASK 
* 
* 
**********
* CREATE *
**********
* 
* 
CREATE	EQU	*	CREATE FILE
*			TO BE IMPLEMENTED 
	EJECT			FMTASK 
* 
* 
**********
* EXTEND *
**********
* 
* 
EXTEND	EQU	*	EXTEND FILE
*			TO BE IMPLEMENTED 
	EJECT			FMTASK 
* 
* 
**********
* FMCLOS *
**********
* 
* 
*   FILE MANAGEMENT ADMINISTRATION FUNCTIONS: 
*   CLOSE/DELETE FILE 
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = ORDER OPTION 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
FMCLOS	EQU	*	CLOSE/DELETE FILE
	ANK	A1,/FF	ORDER OPTION
	ABL(NZ)	FM:RQE	ILLEGAL ORDER OPTION
* 
	EJECT			FMTASK 
* 
* 
********* 
* CLOSE * 
********* 
* 
* 
CLOSE	EQU	*	CLOSE FILE
	CF	A14,RDVTOC	READ VTOC RECORD (FIRST EXTENT)
	ADK	A1,0	CHECK RETURN CODE 
	RF(Z)	CL:005	OK, CONTINUE
	ST	A4,ECBRC,A8	SET RETURN CODE IN ECB
	SUK	A1,/20	CHECK IF NVL
	RF(Z)	CL:010	NVL, DON'T WRITE VTOC 
	ABL	FM:RTC	ERROR 
* 
CL:005	EQU	*
	LD	A1,FPB:FR,A10	FILE RECORD NUMBER
	LD	A3,FPB:FR+2,A10 
	ST	A1,VTC:LR,A13	SET LRN IN VTOC RECORD
	ST	A3,VTC:LR+2,A13 
	ORR	A1,A3	CHECK FILE RECORD NUMBER 
	RF(Z)	CL:010	FRN ZERO, DON'T WRITE VTOC
	LD	A1,FWTPAR,A6	ACCESS PARAMETERS
	RF(NN)	CL:007	NOT NVL
	LDK	A1,/20	SET NVL IN RETURN CODE
	ST	A1,ECBRC,A8 
	RF	CL:010
* 
CL:007	EQU	*
	CF	A14,FM:PWR	WRITE VTOC RECORD TO DISC
* 
	EJECT			FMTASK 
* 
* 
CL:010	EQU	*
	LC	A1,FWTPAR,A6	ACCESS PARAMETERS
	LDR	A2,A1
	ANK	A1,/C0	SKIP NUMBER OF USERS
	ANK	A2,/3F	NUMBER OF USERS 
	SUK	A2,1	DECREMENT NO OF USERS BY ONE
	SC	A2,FPB:US,A10	RETURN REMAINING NO OF USERS
	RF(P)	CL:020	DON'T RELEASE FWT IF ANY USER LEFT
* 
	EJECT			FMTASK 
* 
*	RELEASE FWT AND EWT BLOCKS
* 
	LDK	A2,1 
	XRRS	A2,A6	RESET USED BIT IN FWT 
	CF	A14,RELBLK	RELEASE EWT STRUCTURE BLOCKS 
	RF	CL:030
* 
CL:020	EQU	*
	ORR	A1,A2	PUT TOGETHER ACCESS PARAMETERS 
	SC	A1,FWTPAR,A6
* 
CL:030	EQU	*
	LD	A4,ECBRC,A8	RETURN CODE 
	RF	FMEXIT	RETURN 
* 
CL:040	EQU	*	ENTRY USED BY FM:LKM 
	ADKL	A14,4	ADJUST STACK POINTER
	RB	CL:010
* 
	EJECT			FMTASK 
* 
* 
**********
* DELETE *
**********
* 
* 
DELETE	EQU	*	DELETE FILE
*			TO BE IMPLEMENTED 
	EJECT			FMTASK 
* 
* 
**********
* FMRDFP *
**********
* 
* 
*   FILE MANAGEMENT ADMINISTRATION FUNCTIONS: 
*   READ FILE PARAMETERS
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = ORDER OPTION 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
FMRDFP	EQU	*	READ FILE PARAMETERS 
	ANK	A1,/FF	ORDER OPTION
	RF(NZ)	FM:RQE	ILLEGAL ORDER OPTION 
	CF	A14,RDVTOC	READ VTOC RECORD (FIRST EXTENT)
	ADK	A1,0	CHECK RETURN CODE 
	RF(NZ)	FM:RTC	ERROR
* 
*	CLEAR FPB AREA
* 
	LDR	A1,A10	FPB ADDRESS 
	LDK	A2,FPBLEN 	FPB AREA LENGTH 
* 
FMR:00	EQU	*
	CMR	A1 
	ADK	A1,2 
	SUK	A2,2 
	RB(P)	FMR:00 
* 
	EJECT			FMTASK 
* 
* 
	LDR	A1,A10	FPB ADDRESS 
	ADK	A1,FPB:V2	2ND VOLUME NAME
	LDK	A2,3	LOOP COUNTER, OUTER LOOP
	LDKL	A4,/2020	SPACES 
* 
FMR:02	EQU	*	OUTER LOOP ENTRY 
	LDK	A3,3	LOOP COUNTER, INNER LOOP
* 
FMR:04	EQU	*	INNER LOOP ENTRY 
	STR	A4,A1	MOVE SPACES TO VOLUME NAME 
	ADK	A1,2 
	SUK	A3,1 
	RB(P)	FMR:04 
	ADK	A1,FPB:V2-FPB:S1	NEXT VOLUME NAME
	SUK	A2,1 
	RB(P)	FMR:02 
* 
	EJECT			FMTASK 
* 
*	MOVE PARAMETERS FROM VTOC AND FWT TO FPB
* 
	LD	A1,VTC:RL,A13	RECORD LENGTH 
	STR	A1,A10 
	LD	A1,VTC:BF,A13	BLOCK FACTOR AND FILE ORGANIZATION
	ST	A1,FPB:BF,A10 
	LD	A1,VTC:LR,A13	LAST RECORD NUMBER
	ST	A1,FPB:FR,A10 
	LD	A1,VTC:LR+2,A13	LRN, PART 2 
	ST	A1,FPB:FR+2,A10 
	LD	A1,VTC:MN,A13	MONITOR AND SOP SWITCH NUMBER 
	ECR	A1,A1
	SC	A1,FPB:MN,A10	STORE MONITOR NUMBER
	LC	A1,VTC:IF,A13	NUMBER OF INDEX FILES 
	ST	A1,FPB:IF,A10 
	LD	A1,VTC:KA,A13	KEY ADDRESS IN RECORD 
	ST	A1,FPB:KA,A10 
	LDK	A2,1 
	LD	A1,FWTTAB,A6	SHAREABILITY PARAMETER 
	RF(Z)	FMR:05	NO EA 
	SC	A2,FPB:SH,A10	INDICATE OPENED EXCLUSIVELY 
* 
FMR:05	EQU	*
	LD	A1,FWTPAR,A6	ACCESS PARAMETERS
	SLL	A1,1 
	RF(NN)	FMR:10	PHYSICAL ORDERS FOR THIS FILE
	SC	A2,FPB:BO,A10	INDICATE BASIC ORDERS 
* 
FMR:10	EQU	*
	SLC	A1,7 
	ANK	A1,/3F	NUMBER OF USERS 
	SC	A1,FPB:US,A10 
* 
	EJECT			FMTASK 
* 
*	MOVE CREATION DATE AND RETENTION PERIOD 
* 
	LDR	A1,A13	VTOC ADDRESS
	ADK	A1,VTC:CD
	LDR	A3,A10	FPB ADDRESS 
	ADK	A3,FPB:CD
	LDK	A2,9	NO OF CHARACTERS TO MOVE
	CF	A14,MOVE	MOVE CREATION DATE AND RETENTION PERIOD
* 
*	MOVE FILE NAME FROM FWT TO FPB
* 
	LDR	A1,A6	FWT ADDRESS
	ADK	A1,FWTNAM
	SUK	A3,FPBLEN-FPB:FN-1	POINT TO FILE NAME
	LDK	A2,8	NO OF CHARACTERS TO MOVE
	CF	A14,MOVE	MOVE FILE NAME 
	ADK	A3,FPB:V1-FPB:FN-8 
	ADK	A6,FWTEW1	ADDRESS TO FIRST EWT STRUCTURE 
	LDR	A11,A6 
	LDR*	A12,A11	ADDRESS TO 2ND EWT BLOCK
* 
	EJECT			FMTASK 
* 
*	READ VOLUME NAME AND COMPUTE SIZE OF FILE SECTION 
* 
FMR:20	EQU	*
	LC	A2,EWTVOL,A12	DISC FILE CODE
	LDR	A13,A2	SAVE FILE CODE
	CF	A14,FNDNAM	FIND VOLUME NAME ADDRESS 
* 
*	MOVE VOLUME NAME FROM DWT TO FPB
* 
	LDR	A1,A6	VOLUME NAME ADDRESS
	CF	A14,MOVE	MOVE VOLUME NAME 
	LD	A1,EWTEXL-2,A11	FILE EXTENT LENGTH
	ANK	A1,/FF 
	LD	A2,EWTEXL,A11 
* 
	EJECT			FMTASK 
* 
*	COMPUTE FILE SECTION SIZE(S)
* 
FMR:35	EQU	*
	LDR*	A11,A12	ADDRESS TO NEXT EWT STRUCTURE 
	RF(Z)	FMR:50	END OF EWT CHAIN
	LD	A6,EWTEXL-2,A11	FILE EXTENT LENGTH
	ANK	A6,/FF 
	LD	A7,EWTEXL,A11 
	LDR*	A12,A11	ADDRESS TO 2ND EWT BLOCK
	CC	A13,EWTVOL,A12	CHECK FILE CODE
	RF(NE)	FMR:50	END OF THIS FILE SECTION 
* 
	IFT	CPU852=0 
	DAR	A6	ACKUMULATE FILE SECTION LENGTH
	XIF
* 
	IFT	CPU852=1 
	ADR	A1,A6	ACKUMULATE FILE SECTION LENGTH 
	ADR	A2,A7
	RF(O)	FMR:45	OVERFLOW
	RB	FMR:35
* 
FMR:45	EQU	*
	ADK	A1,1	OVERFLOW CORRECTION 
	ANKL	A2,/7FFF
	XIF
* 
	RB	FMR:35
* 
FMR:50	EQU	*
	STR	A1,A3	STORE FILE SECTION SIZE IN FPB 
	ST	A2,2,A3 
	ADK	A3,FPB:V2-FPB:S1	INCREMENT FPB POINTER 
	LDR	A4,A11	CHECK EWT BLOCK ADDRESS 
	RB(NZ)	FMR:20	NOT END OF EWT CHAIN 
* 
	EJECT			FMTASK 
* 
* 
**********
* FMEXIT *
**********
* 
* 
*	COMMON EXIT FOR FILE MANAGEMENT 
*	ADMINISTRATION FUNCTIONS
* 
FMEXIT	EQU	*
	IFT	MMUPAG=1 
* 
*   MOVE SYSTEM FPB (FM:FPB) TO USER AREA (USER FPB)
* 
*   INPUT:  A9 = USER ECB ADDRESS 
*          A10 = FM:FPB ADDRESS 
* 
	LDR	A1,A10	FM:FPB ADDRESS
	EL	A2,ECBBA,A9	USER FPB ADDRESS
	LDK	A3,FPBLEN 	FPB LENGTH
	MVSU	A3	MOVE FM:FPB TO USER FPB
	XIF
* 
	EJECT			FMTASK 
* 
* 
**********
* FM:RTC *
* FM:RQE *
**********
* 
* 
*   SET RETURN CODE IN USER ECB 
* 
*   INPUT:  A4 = RETURN CODE
*	   A5 = TTAB ADDRESS OF CALLING TASK
*	   A9 = USER ECB ADDRESS
* 
FM:RTC	EQU	*	GENERAL RETURN CODE EXIT 
	IFT	MMUPAG=0 
	ST	A4,ECBRC,A9	SET RETURN CODE IN ECB
	XIF
* 
	IFT	MMUPAG=1 
	ES	A4,ECBRC,A9	SET RETURN CODE IN ECB
	XIF
* 
	ABL	QMEXIT	QUEUE TASK AND EXIT FMTASK
* 
FM:RQE	EQU	*	REQUEST ERROR EXIT 
	LDKL	A4,/8000	RETURN CODE
	RB	FM:RTC
* 
	EJECT			FMTASK 
* 
* 
**********
* FM:PWR *
* FMREAD *
**********
* 
* 
*   INPUT:  A2 = SECTOR NUMBER, PART 2
*           A5 = TTAB ADDRESS OF CALLING TASK 
*           A8 = FMTASK ECB ADDRESS 
*           A9 = USER ECB ADDRESS 
* 
*   OUTPUT: A4 = 0
*	   A7 IS DESTROYED
* 
FM:PWR	EQU	*	PHYSICAL WRITE ENTRY 
	LDK	A7,/95	PHYSICAL WRITE
	RF	FM:LKM
* 
FMREAD	EQU	*	PHYSICAL READ ENTRY
	LDK	A7,/91	PHYSICAL READ 
* 
	EJECT			FMTASK 
* 
* 
FM:LKM	EQU	*	COMMON I/O ROUTINE ENTRY 
	ST	A2,ECBCW2,A8	SET SECTOR NUMBER IN ECB 
	LKM
	DATA	1 
	LD	A4,ECBRC,A8	RETURN CODE 
	ANKL	A4,/FEFF	SKIP RETRY BIT 
	RF(Z)	FM:RTN	RETURN IF OK
* 
*	ERROR: CHECK WHY AND DECIDE IF REQUEST TO BE ABORTED
* 
	LDK	A7,/A2	CLOSE ORDER 
	CC	A7,TTB:SA+15,A5	CHECK IF CLOSE ORDER RUNNING
	ABL(E)	CL:040	YES, COMPLETE CLOSE ACTION 
	SUK	A7,1	OPEN ORDER
	CW	A7,TTB:SA+14,A5	CHECK IF OPEN ORDER RUNNING 
	RB(NE)	FM:RTC	ABORT IF NOT OPEN
	LDK	A7,/20	NEW VOLUME LOADED BIT 
	TM	A4,A7	CHECK RETURN CODE 
	RB(Z)	FM:RTC	NOT NVL, ABORT
	RB	FMREAD	NVL AT OPEN, REPEAT REQUEST
* 
FM:RTN	EQU	*
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
**********
* RELBLK *
**********
* 
* 
*   RELBLK WILL RELEASE THE MONITOR BLOCKS
*   THAT ARE USED IN THE EWT STRUCTURE. 
* 
*   INPUT:  A6 = FWT ADDRESS
* 
*   OUTPUT: A1-A4 ARE DESTROYED 
* 
RELBLK	EQU	*	RELEASE EWT STRUCTURE BLOCKS 
	LD	A4,FWTEW2,A6	ADDRESS TO FIRST EWT STRUCTURE 
	RF(Z)	REL:20	NO MORE BLOCKS TO RELEASE 
* 
REL:10	EQU	*
	INH
	CF	A15,FREBLK	RELEASE EWT BLOCK
	ENB
	LDR	A4,A3	EWT BLOCK ADDRESS
	RB(NZ)	REL:10
* 
REL:20	EQU	*
	CM	FWTVTC,A6	RESET VTOC SECTOR NUMBER
	CM	FWTTAB,A6	RESET TTAB ADDRESS (EA PARAMETER) 
	CM	FWTEW2,A6	RESET EWT STRUCTURE POINTER 
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
**********
* FNDNAM *
**********
* 
*   FNDNAM WILL CONVERT THE SUPPLIED FILE CODE
*   TO VOLUME NAME ADDRESS IN THE DISC DWT. 
* 
*   INPUT:  A2 = FILE CODE
* 
*   OUTPUT: A2 = 6
*           A6 = VOLUME NAME ADDRESS
*           A4 = DESTROYED
* 
FNDNAM	EQU	*	FIND VOLUME NAME ADDRESS 
	ANK	A2,/FF 
	INH
	CF	A15,FNDDWD	FIND DISC DWT ADDRESS
	ENB
* 
FNAM05	EQU	*
	LD	A4,DWTST,A6 
	ANK	A4,1 
	RF(NZ)	FNAM10	POWER ON COMPLETED FOR THIS DISC 
	LKM
	DATA	0	SWITCH TASKS
	RB	FNAM05	CHECK DISC AGAIN 
* 
FNAM10	EQU	*
	ADK	A6,6	NEXT VOLUME NAME IN DWT 
	SUK	A2,1	DECREMENT INDEX 
	RB(NN)	FNAM10
	LDK	A2,6 
	ADKL	A6,DWTVOL-6 
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
**********
* FNDVOL *
**********
* 
* 
*   FNDVOL SEARCHES THE REQUESTED 
*   VOLUME SPECIFIED IN THE FPB.
* 
*   INPUT:  A7 = VOLUME NAME DISPLACEMENT IN FPB
*          A10 = FPB ADDRESS
* 
*   OUTPUT: A2 = DISC FILE CODE IF FOUND, ELSE
*              = 0 IF VOLUME NOT FOUND
*	   A1, A3-A4, A12 ARE DESTROYED 
* 
FNDVOL	EQU	*	FIND VOLUME (FILE CODE)
	LDKL	A1,DFTAB-1	DISC FILE CODE TABLE ADDRESS-1 
	LDR	A12,A6	SAVE FWT ADDRESS
* 
FVOL10	EQU	*
	ADK	A1,1	POINT TO NEXT FILE CODE 
	CWK	A1,DFTABE	CHECK IF END OF DFTAB
	RF(E)	FVOL30	END OF DFTAB
	LCR	A2,A1	NEXT FILE CODE 
	CF	A14,FNDNAM	FIND VOLUME NAME ADDRESS 
	LDR*	A3,A6	FIRST WORD OF VOLUME NAME 
	RB(Z)	FVOL10	NO VOLUME 
* 
	EJECT			FMTASK 
* 
* 
	LDR	A3,A10	FPB ADDRESS 
	ADR	A3,A7	ADD VOLUME NAME DISPLACEMENT 
* 
FVOL20	EQU	*	COMPARE VOLUME NAMES 
	LDR*	A4,A6 
	CWR*	A4,A3 
	RB(NE)	FVOL10	VOLUME NAMES NOT EQUAL 
	ADK	A3,2	INCREMENT POINTERS
	ADK	A6,2 
	SUK	A2,2 
	RB(P)	FVOL20 
	LCR	A2,A1	FILE CODE
* 
FVOL25	EQU	*
	LDR	A6,A12	RESTORE FWT ADDRESS 
	RTN	A14
* 
FVOL30	EQU	*	VOLUME NOT FOUND 
	LDK	A2,0	RETURN CODE 
	RB	FVOL25
* 
	EJECT			FMTASK 
* 
* 
**********
* RDVTOC *
**********
* 
* 
*   RDVTOC WILL CALL FCHEC2 FOR CHECK OF THE
*   ACCESS PARAMETERS AND READ THE VTOC RECORD
*   OF THE FIRST FILE EXTENT. 
* 
*   INPUT:  A5 = TTAB ADDRESS 
*           A9 = USER ECB ADDRESS 
* 
*   OUTPUT: A6 = FWT ADDRESS
*          A13 = VTOC RECORD ADDRESS IN FM:BUF
*           A1-A4, A7, A11 ARE DESTROYED
* 
RDVTOC	EQU	*	CHECK ACCESS PAR. AND READ VTOC RECORD 
	IFT	MMUPAG=0 
	LDR*	A2,A9	FILE NUMBER 
	XIF
* 
	IFT	MMUPAG=1 
	ELR	A2,A9	FILE NUMBER
	XIF
* 
	INH
	CF	A15,FCHEC2	CHECK ACCESS PAR. AND RETURN FWT ADDRESS 
	ENB
	LDR	A4,A1	RETURN CODE
	RF(NZ)	RDVT20	ERROR, RETURN
* 
	EJECT			FMTASK 
* 
* 
	LDR	A6,A3	FWT ADDRESS
	LC	A2,FWTVOL,A6	DISC FILE CODE (FIRST EXTENT)
	SC	A2,ECBFC,A8 
	LD	A2,FWTVTC,A6	VTOC SECTOR NUMBER (FIRST EXTENT)
	CF	A14,FVTC10	READ VTOC SECTOR AND ONE VTOC RECORD 
* 
RDVT10	EQU	*
	LD	A1,VTC:EN,A13	FILE EXTENT NUMBER
	RF(Z)	RDVT20	FIRST EXTENT FOUND
	CF	A14,FVTC30	READ NEXT VTOC RECORD FOR THIS FILE
	RB	RDVT10	CHECK IF THIS IS THE FIRST EXTENT
* 
RDVT20	EQU	*
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
**********
* FNDVTC *
**********
* 
* 
*   FNDVTC SEARCHES THE REQUESTED 
*   FILE SPECIFIED IN THE FPB.
*   RETURN IS MADE WHEN ONE EXTENT
*   HAS BEEN FOUND. 
* 
*   INPUT:  A2 = FILE CODE
*           A5 = TTAB ADDRESS 
*	   A6 = FWT ADDRESS 
*           A9 = USER ECB ADDRESS 
* 
*   OUTPUT: A2 = VTOC SECTOR NUMBER IF FOUND, ELSE
*              = 0 IF NO FILE EXTENT FOUND
*          A13 = VTOC RECORD ADDRESS IN FM:BUF
*           A1, A3-A4, A7, A11-A12 ARE DESTROYED
* 
FNDVTC	EQU	*	FIND VTOC ENTRY
	SC	A2,ECBFC,A8	SET FILE CODE IN ECB
	LDK	A2,0	SECTOR NUMBER 
	CF	A14,FMREAD	READ SECTOR 0
	LD	A2,FM:BUF+VOL:EB	VTOC EXTENT BASE 
	LDR	A12,A2 
	AD	A2,FM:BUF+VOL:FS	SKIP FSAT SECTORS
	AD	A12,FM:BUF+VOL:EL	LAST VTOC SECTOR+1
* 
	EJECT			FMTASK 
* 
* 
FVTC10	EQU	*	ENTRY USED BY RDVTOC 
	CF	A14,FMREAD	READ ONE VTOC SECTOR 
	LDKL	A13,FM:BUF	FM:BUF ADDRESS 
	LDK	A7,VTOCBF	VTOC BLOCK FACTOR
* 
FVTC20	EQU	*
	LD	A4,VTC:ST,A13	VTOC STATUS BYTE
	ANK	A4,/FF 
	RF(NZ)	FVTC50	VTOC USED
* 
FVTC30	EQU	*	ENTRY USED BY OPEN 
	LD	A2,ECBCW2,A8	CURRENT VTOC SECTOR NUMBER 
	ADKL	A13,VTOCRL	NEXT VTOC ADDRESS
	SUK	A7,1 
	RB(P)	FVTC20	MORE VTOC:S IN THIS SECTOR
	ADK	A2,1	NEXT VTOC SECTOR
	CWR	A2,A12	CHECK IF END OF VTOC EXTENT 
	RB(NE)	FVTC10	NOT LAST VTOC SECTOR 
	LDK	A2,0	RETURN CODE 
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
FVTC50	EQU	*
	LDR	A1,A6	FWT ADDRESS
	ADK	A1,FWTNAM
	LDR	A3,A13	VTOC ADDRESS
	LDK	A4,4	LOOP COUNTER
* 
FVTC60	EQU	*	COMPARE FILE NAMES 
	LDR*	A11,A3
	CWR*	A11,A1
	RB(NE)	FVTC30	FILE NAMES NOT EQUAL 
	ADK	A1,2	INCREMENT POINTERS
	ADK	A3,2 
	SUK	A4,1 
	RB(P)	FVTC60 
	RTN	A14	ONE FILE EXTENT FOUND
* 
	EJECT			FMTASK 
* 
* 
**********
* FNDFWT *
**********
* 
* 
*   FNDFWT IS USED TO FIND OUT IF THE SPECIFIED 
*   FILE IS ALREADY OPENED, AND IF SO RETURN
*   THE FWT ADDRESS FOR THE FILE. 
*   IF NOT OPENED, A FREE FWT ADDRESS IS RETURNED.
* 
*   INPUT: A10 = FPB ADDRESS
*	  A12 = DISC FILE CODE, FIRST EXTENT
* 
*   OUTPUT: A6 = FWT ADDRESS (=0 IF NO FREE FWT AVAILABLE)
*	   A1-A4, A7, A11 ARE DESTROYED 
* 
FNDFWT	EQU	*
	LDK	A3,0 
	LD	A7,SCTFWT	FWT CHAIN START ADDRESS 
* 
FNDF10	EQU	*
	LDK	A2,1 
* 
FNDF15	EQU	*
	LDR	A6,A7	NEXT FWT ADDRESS 
	RF(Z)	FNDF40	NO MORE FWT:S AVAILABLE 
	LDR*	A7,A6	FIRST WORD OF FWT 
	TM	A7,A2	CHECK IF USED 
	RF(NZ)	FNDF20	USED, CHECK FILE NAME
	ADK	A3,0	CHECK IF FREE FWT ADDRESS ALREADY SAVED 
	RB(NZ)	FNDF15	YES, DON'T SAVE IT 
	LDR	A3,A6	NO, SAVE THIS FWT ADDRESS
	RB	FNDF15	CONTINUE SEARCH
* 
	EJECT			FMTASK 
* 
* 
FNDF20	EQU	*	POINT TO FILE NAMES
	LDK	A1,4	LOOP COUNTER
	LDR	A2,A6	FWT ADDRESS
	ADK	A2,FWTNAM
	LDR	A4,A10	FPB ADDRESS 
	ADK	A4,FPB:FN
	SUK	A7,1	SKIP FWT USED BIT 
* 
FNDF30	EQU	*	COMPARE FILE NAMES 
	LDR*	A11,A2
	CWR*	A11,A4
	RB(NE)	FNDF10	FILE NAMES NOT EQUAL 
	ADK	A2,2	INCREMENT POINTERS
	ADK	A4,2 
	SUK	A1,1 
	RB(P)	FNDF30 
	CC	A12,FWTVOL,A6	CHECK FILE CODE OF FIRST EXTENT 
	RB(NE)	FNDF10	NOT THIS FILE
	RTN	A14	FILE FOUND, RETURN 
* 
FNDF40	EQU	*	FILE NOT FOUND 
	LDR	A6,A3	FREE FWT ADDRESS 
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
********
* MOVE *
********
* 
* 
*   INPUT:  A1 = INPUT BUFFER ADDRESS 
*           A2 = NUMBER OF CHARACTERS TO MOVE 
*           A3 = OUTPUT BUFFER ADDRESS
* 
*   OUTPUT: A2 = 0
*           A1, A3 = ADDRESSES OF LAST MOVED CHARACTERS+1 
*           A4 IS DESTROYED 
* 
MOVE	EQU	*	MOVE STRING
	LCR	A4,A1	MOVE ONE CHARACTER 
	SCR	A4,A3
	ADK	A1,1	INCREMENT BUFFER POINTERS 
	ADK	A3,1 
	SUK	A2,1	DECREMENT LOOP COUNTER
	RB(P)	MOVE 
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
**********
* FMRDWR *
**********
* 
* 
*	FILE MANAGEMENT I/O FUNCTIONS.
*	FMRDWR IS ENTERED WHEN THE REQUESTED
*	SECTORS ARE SPLIT OVER MORE THAN
*	ONE EXTENT. 
* 
FMRDWR	EQU	*	BASIC AND PHYSICAL READ/WRITE
	IFT	XTSPLI=0 
	ABL	LKMERR	NOT INCLUDED IN THIS VERSION
	XIF
* 
	IFT	XTSPLI=1 
	ABL	LKMERR	TO BE IMPLEMENTED 
	XIF
* 
* 
* 
	END

Full view