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

⟦cca2cf3c1⟧

    Length: 62010 (0xf23a)
    Notes: pts_type(SC)
    Names: »FMTASK.SC«

Derivation

└─⟦f350e1b7a⟧ Bits:30009678 Philips computer tape "600219"
    └─⟦this⟧ »MONGEN/FMTASK.SC« 

PTS(SC)

	IDENT FMTASK 	REL 11.0 81-05-13 870105041100 

			=7, FDBMEC NOT SET IN SYSTEMS WITHOUT DM 
			=7, REL 11.0 81-02-04
			=6,EDM INITIALIZATION 3 DISCS
			=6, REL 11.0 81-02-03
			=5, ADM INITIALIZATION 
			REL 11.0  81-01-21 
			=4, NO NVL BITS FOR DM TASKS 
			PRR 11.0  80-11-27  CHLO 
			=3, SPLIT EXTENT HANDELING NOT WORKING 
			PRR 11.0  80-11-20  CHLO 
			=2, EDM INITIALIZATION ALLWAYS HALTED
			PRR 11.0  80-11-19  CHLO 
			=1, HALT IF TTAB NOT FOUND 
			PRR 11.0  80-11-19  POHO 
* 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS                  *
* 
*   FMTASK = TOSS FILE MANAGEMENT TASK           *
* 
* 
* 
* 
**************************************************
* 
* 
*   TOSS FILE MANAGEMENT TASK CONTAINS THE
*   FOLLOWING FILE ADMINISTRATION MODULES:
* 
*   - FMOPEN   OPEN FILE
*   - FMCLOS   CLOSE FILE 
*   - FMRPAR   READ FILE PARAMETERS 
*   - FMSPLI   READ/WRITE (SPLIT I/O) 
* 
*   FMTASK ALSO CONTAINS THE FILE MANAGEMENT
*   SYSTEM INITIALIZATION ROUTINE, FMINIT.
*   FMINIT ALSO HOLDS THE EDM INITIALIZATION ROUTINE. 
* 
* 
	EJECT			FMTASK 
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	OPEN	OPEN FILE 
	ENTRY	OPEXT	OPEN EXTENDED FILE (CALLED FROM EXTEND)
	ENTRY	DLCLO1	CLOSE FILE (CALLED FROM DELETE) 
	ENTRY	DLCLO2	CLOSE FILE (CALLED FROM DELETE) 
	ENTRY	FMTASK	FMTASK ACTIVATION ADDRESS 
	ENTRY	FMINIT	FILE MANAGEMENT INITIALIZATION
	ENTRY	FMREAD	FMTASK READ DISC SECTOR ROUTINE 
	ENTRY	FM:PWR	FMTASK WRITE DISC SECTOR ROUTINE
	ENTRY	FM:IO	FMTASK I/O ROUTINE 
	ENTRY	FM:ECB	FM ECB ADDRESS
	ENTRY	FMEXIT	FMTASK SET RETURN CODE EXIT 
	ENTRY	FM:INE	FMTASK ILLEGAL NAME EXIT
	ENTRY	FM:RQE	FMTASK REQUEST ERROR EXIT 
	ENTRY	FNDNAM	FIND VOLUME NAME ADDRESS IN DISC DWT
	ENTRY	FNDVTC	FIND ONE FILE EXTENT (VTOC) 
	ENTRY	FNDVT2	FNDVTC 2ND ENTRY
	ENTRY	RDVTO2	READ VTOC, FIRST EXTENT 
	ENTRY	FM:MOV	MOVE STRING 
	ENTRY	FM:MV4	MOVE 4 CHARACTERS 
	ENTRY	FM:MV8	MOVE 8 CHARACTERS 
	ENTRY	CMPSTR	COMPARE STRINGS 
	ENTRY	CMPDWD	COMPARE TWO DOUBLE WORDS
	ENTRY	FILCOD	FILE CODE TABLE 
	ENTRY	VOLUME	CURRENT VOLUME FILE CODE POINTER
	ENTRY	FM:BUF	FMTASK DISC SECTOR BUFFER 
	ENTRY	TTABFM	FMTASK TTAB 
	ENTRY	FEXTNO	NO OF FILE EXTENTS
	ENTRY	RETCOD	ACKUMULATED RETURN CODE 
	EJECT			FMTASK 
* 
	ENTRY	FWTVTC	VTOC SECTOR NUMBER (FIRST EXTENT) 
	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	FWTVOL	VOLUME FILE CODE
	ENTRY	FWTEXB	EXTENT BASE (FIRST EXTENT)
	ENTRY	FWTNAM	FILE NAME 
	ENTRY	FWTQUE	QUEUE ANCHOR FOR FILE I/O REQUESTS
	ENTRY	FWTSEX	FILE SECTION AND EXTENT NUMBER
	ENTRY	FPB:RL	RECORD LENGTH 
	ENTRY	FPB:BF	BLOCK FACTOR
	ENTRY	FPB:FO	FILE ORGANIZATION 
	ENTRY	FPB:DT	DEVICE TYPE	=1
	ENTRY	FPB:BO	BASIC ORDERS
	ENTRY	FPB:NO	FILE NUMBER	=1
	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 
* 
* 
	ENTRY	EWTEXL	EXTENT LENGTH 
	ENTRY	EWTEXB	EXTENT BASE 
	ENTRY	EWTVOL	VOLUME FILE CODE
	ENTRY	EWTSEX	FILE SECTION AND EXTENT NUMBER
	ENTRY	VOL:VN	VOLUME NAME 
	ENTRY	VOL:EL	VTOC EXTENT LENGTH
	ENTRY	VOL:EB	VTOC EXTENT BASE
	ENTRY	VOL:RL	VTOC RECORD LENGTH
	ENTRY	VOL:FS	FSAT LENGTH 
	ENTRY	VTOCRL	VTOC RECORD LENGTH
	ENTRY	VTOCBF	VTOC BLOCK FACTOR 
	ENTRY	VTC:FN	FILE NAME 
	ENTRY	VTC:MN	MONITOR NUMBER (L-FILE) 
	ENTRY	VTC:FS	FILE SECTION NUMBER (S-FILE)
	ENTRY	VTC:SN	SOP SWITCH NUMBER 
	ENTRY	VTC:EN	FILE EXTENT NUMBER
	ENTRY	VTC:EL	FILE EXTENT LENGTH
	ENTRY	VTC:EB	FILE EXTENT BASE
	ENTRY	VTC:LR	LAST RECORD NUMBER
	ENTRY	VTC:RL	RECORD LENGTH 
	ENTRY	VTC:BF	BLOCK FACTOR
	ENTRY	VTC:FO	FILE ORGANIZATION 
	ENTRY	VTC:CD	CREATION DATE 
	ENTRY	VTC:RP	RETENTION PERIOD
	ENTRY	VTC:IF	NUMBER OF INDEX FILES 
	ENTRY	VTC:KA	KEY ADDRESS IN RECORD 
	ENTRY	VTC:NE	NO OF FILE EXTENTS
	ENTRY	VTC:ST	STATUS BYTE 
	EJECT			FMTASK 
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	CREATE	FM CREATE FILE
	EXTRN	EXTEND	FM EXTEND FILE
	EXTRN	DELETE	FM DELETE FILE
	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	FINDTT	FIND DATA MANAGEMENT TASK	=1
	EXTRN	FNDDWD	FIND DISC DWT ADDRESS 
	EXTRN	ACTOT	ACTIVATE TASK
	EXTRN	SDMINI	DM INITIALIZATION ROUTINE 
	EXTRN	TIOMXI	CONVERT LOGICAL ADDRESS TO PHYSICAL 
	EXTRN	DET:FM	FILE MANAGEMENT DETACH
	EXTRN	FCHEC2	CHECK ACCESS PAR. AND RETURN FWT ADDRESS
	EXTRN	TIODM	(E)DM ADDRESS BLOCK
	EXTRN	SEXTNO	START EXTENT NUMBER (EXTEND)
	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	(E)DM TASKS IN SYSTEM 
	EXTRN	SCTMOX	DISPATCH ADDRESS TABLE POINTER
	EXTRN	DWDM01	(E)DM SYSTEM DWT/FWT
	EXTRN	NVLTAB	NVL TABLE 
	EXTRN	NVLEND	END OF NVLTAB 
	EXTRN	NVLBIT	NVL BIT MASK
	EJECT			FMTASK 
* 
* 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTADR	ADDRESS TO ADDRESS BLOCK
	EXTRN	DWTMEC	MMU ECB ADDRESS 
	EXTRN	DWTVOL	VOLUME NAME 
	EXTRN	DWTNVL	NVL INDICATOR 
	EXTRN	DWTPAB	PARAMETER BLOCK ADDRESS 
	EXTRN	FDBMEC	FDB MMU ECB DISPLACEMENT IN FWT 
	EXTRN	TTB:MT	MMU TABLE 
	EXTRN	TTB:SA	DISPATCH ADDRESS
	EXTRN	ECBFC	ECB FILE CODE
	EXTRN	ECBFN	ECB FILE NUMBER
	EXTRN	ECBBA	ECB BUFFER ADDRESS (FPB ADDRESS) 
	EXTRN	ECBRL	ECB REQUESTED LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE LENGTH 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	ECBCW1	CONTROL WORD 1
	EXTRN	ECBCW2	CONTROL WORD 2
	EXTRN	HALT 
	EJECT			FMTASK 
* 
* 
*************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
*************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	1
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	0
* 
* 
*	A PROGRAM VERSION USING TOSS DISC PAGING
*	IS OBTAINED BY SETTING DSKPAG EQU 1.
* 
DSKPAG	EQU	1
* 
* 
*	A PROGRAM VERSION INCLUDING CREATE/DELETE FILE
*	IS OBTAINED BY SETTING FMCDEF (X:A) EQU 1.
* 
X:A	EQU	0 
FMCDEF	EQU	00000
* 
	EJECT			FMTASK 
* 
* 
*	A PROGRAM VERSION SUPPORTING DATA MANAGEMENT
*	IS OBTAINED BY SETTING DM (X:B) EQU 1.
* 
X:B	EQU	0 
SDM	EQU	00001 
* 
* 
*	A PROGRAM VERSION SUPPORTING EXTENDED DATA MANAGEMENT 
*	IS OBTAINED BY SETTING EDM (X:C) EQU 1. 
* 
X:C	EQU	0 
EDM	EQU	X:C 
* 
* 
*	A PROGRAM VERSION SUPPORTING ABRIDGED DATA MANAGEMENT	=5
*	IS OBTAINED BY SETTING X:D EQU 1	=5 
* 
* 
X:D	EQU	0 
ADM	EQU	00000 
* 
* 
*	COMBINED CONDITION ADMEDM	=5
	IFF	ADM+EDM=0	=5 
ADMEDM	EQU	1		=5
	XIF		=5
	IFT	ADM+EDM=0		=5
ADMEDM	EQU	0		=5
	XIF			=5 
* 
	EJECT			FMTASK 
* 
* 
*	THE ATTACH/DETACH FILE FUNCTION 
*	IS OBTAINED BY SETTING ATTDET EQU 1.
* 
ATTDET	EQU	1
X:E	EQU	ATTDET
* 
* 
*	THE MULTIPLE EXTENT I/O FUNCTION
*	IS OBTAINED BY SETTING MULEXT EQU 1.
* 
MULEXT	EQU	1
X:F	EQU	MULEXT
* 
	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 
* 
* 
******************
* VTOC 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:NE	EQU	40	NO OF FILE EXTENTS
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 
FWTQUE	EQU	FWTBAS+/1A	QUEUE ANCHOR FOR FILE I/O REQUESTS
* 
	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:DT	EQU	4	DEVICE TYPE	=1 
FPB:BO	EQU	5	BASIC ORDERS 
FPB:NO	EQU	6	FILE NUMBER	=1 
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
* 
	IFF	MMUPAG+DSKPAG=0
	DATA	0	CURRENT SEGMENT BASE (DUMMY)
	DATA	0	SEGMENT TABLE ADDRESS (DUMMY) 
	DATA	0	SEGMENT BLOCK ADDRESS (DUMMY) 
	XIF
* 
	DATA	0	ACB ADDRESS (DUMMY) 
* 
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 
	DATA	2	TASK DEVICE TABLE (DUMMY) 
* 
	EJECT			FMTASK 
* 
* 
***************************** 
* ECB, STACK AND DATA AREAS * 
***************************** 
* 
* 
FM:ECB	DATA	/8000,0,0	FMTASK ECB AREA 
	DATA	0,0,0,0 
* 
	DATA	0,0	FMTASK STACK (5 LEVELS) 
	DATA	0,0 
	DATA	0,0 
	DATA	0,0 
	DATA	0,0 
FM:STB	EQU	*-2	FMTASK STACK BASE
* 
FEXTNO	DATA	0	NO OF FILE EXTENTS
FILCOD	DATA	0,0	FILE CODE TABLE 
RETCOD	DATA	0	ACKUMULATED RETURN CODE 
TTAB	DATA	0	TTAB ADDRESS CALLING TASK 
VOLUME	DATA	0	CURRENT VOLUME FILE CODE POINTER
* 
	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). 
*   FMINIT ALSO HOLDS INITIALIZATION ROUTINES FOR 
*   (EXTENDED) DATA MANAGEMENT. 
*   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
* 
*	FMTASK DISC SECTOR BUFFER 
* 
FM:BUF	EQU	FMINIT+2	INITIALIZATION ROUTINE USED AS BUFFER 
* 
FMINI2	EQU	*	INITIALIZATION ROUTINE ENTRY 
	RES	125
* 
	EJECT			FMTASK 
* 
*	PERFORM INITIALIZATION
* 
FMI:00	EQU	*
	RORG	FMINI2	PUT THE CODE BELOW INTO FM:BUF 
	LD	A1,SCTFWT	FWT CHAIN START ADDRESS 
	LD	A4,SCTNOF	NUMBER OF FILES 
	LDK	A5,0 
	LDKL	A6,/8000	DWT BUSY BIT 
* 
FMI:30	EQU	*
* 
	IFF	ADMEDM+SDM=0	=7
	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 
* 
	IFF	ADMEDM+SDM=0		=7 
	IFT	MMUPAG=1 
	ST	A8,DWTMEC,A2	SET MMU ECB ADDRESS
	XIF
* 
	IFF	ADMEDM+SDM=0 
	LDKL	A7,TIODM		=5
	ST	A7,DWTADR,A2		=5
	XIF			=5 
	RB	FMI:30	CONTINUE WITH NEXT FWT 
* 
				=4
	EJECT			FMTASK 
* 
*	COMPUTE NVL BIT MASK
* 
FMI:50	EQU	*
	LDK	A1,0		=4 
	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	*
	ADR	A2,A2
	ADK	A3,2	INCREMENT NVLTAB POINTER
	CWK	A3,NVLEND	CHECK IF END OF NVLTAB 
	RB(NE)	FMI:80	NOT END OF NVLTAB
	ORR	A1,A2	ADD ONE BIT FOR USER TASKS 
	ST	A1,NVLBIT	SET NVL BIT MASK
* 
	IFT	SDM=1
	ABL	SDMINI	PERFORM DM INITIALIZATION AND RETURN
	XIF
* 
				=2
	EJECT			FMTASK 
* 
* 
	IFT	EDM=1
* 
*	INITIALIZE ALL EDM TASKS
* 
	LDKL	A1,DWDM01	PARAMETER BLOCK ADDRESS 
	ADKL	A1,DWTPAB 
	LDK	A2,2	INDICATE INITIALIZATION 
	SCR	A2,A1
	LDKL	A7,'$D'	TASK ID,FIRST EDM TASK
	LD	A3,SCTDMT	EDM TASKS IN SYSTEM 
* 
FMI:90	EQU	*
	SRC	A3,1 
	RF(NN)	FMI:99	NEXT TASK
	CF	A15,FNDTID	FIND (E)DM TASK TTAB ADDRESS 
	LDR	A5,A2
	RF(Z)	FMIHLT	TTAB NOT FOUND	=2 
* 
	EJECT			FMTASK 
* 
* 
	LD	A4,SCTMOX	ADDRESS OF DISPATCH ADDRESS TABLE 
	LDR	A2,A4
	ADR*	A2,A4	END ADDRESS 
	SUK	A4,2	ADJUST POINTER
* 
FMI:95	EQU	*
	ADK	A4,4	NEXT ENTRY
	CWR*	A7,A4 
	RB(NE)	FMI:95	NOT SAME ID
	LD	A2,2,A4	DISPATCH ADDRESS
	CF	A15,ACTOT	ACTIVATE EDM TASK 
* 
FMI:99	EQU	*
	ADK	A7,1	NEXT EDM TASK 
	ANK	A3,/FF		=6 
	RB(NZ)	FMI:90	MORE TASKS TO ACTIVATE 
	XIF
* 
	RTN	A15	FM/EDM INITIALIZATION COMPLETED, RETURN
* 
*	TTAB NOT FOUND			=2 
* 
FMIHLT	EQU	*		=2
	LDK	A1,/11	DM ERROR	=2 
	CF	A15,HALT		=2
	RORG	FMI:00	END OF RELOCATION
* 
	EJECT			FMTASK 
* 
* 
**********
* FMTASK *
**********
* 
* 
*   THE FILE MANAGEMENT TASK PERFORMS 
*   FILE ADMINISTRATION FUNCTIONS. IT 
*   IS ACTIVATED BY THE FILE MANAGEMENT 
*   LKM PROCESSOR 'TIOFM' AT ENTRY FMTASK BELOW.
*   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) 
*   - FMRPAR   READ FILE PARAMETERS           (   "   : 0)
* 
*   NOTICE THAT FUNCTIONS CREATE/EXTEND/DELETE ARE SITUATED 
*   IN MODULE 'FMCDEF' BUT LOGICALLY BELONG TO OPEN/CLOSE.
* 
*   A SPECIAL ENTRY IS USED FOR I/O 
*   FUNCTIONS WHERE REQUESTED SECTORS ARE 
*   SPLIT OVER TWO OR MORE FILE EXTENTS:
* 
*   - FMSPLI   READ/WRITE (SPLIT I/O)         (OPTIONS: 0)
* 
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = ORDER OPTION AND CODE (RFP/OPEN/CLOSE) 
*      = PARAMETER BLOCK ADDRESS (SPLIT I/O)
*   A3 = TTAB ADDRESS OF CALLING TASK 
*   A4 = FUNCTION INDEX (0 = RFP, 2 = OPEN, 4 = CLOSE, 6 = SPLIT I/O) 
*   A8 = FM:ECB ADDRESS 
* 
	EJECT			FMTASK 
* 
* 
FMTASK	EQU	*	FMTASK ACTIVATION ENTRY
* 
*	PERFORM SOME HOUSEKEEPING 
* 
	CM	ECBCW1,A8	CLEAR 1ST CW
	LDR	A5,A3	TTAB ADDRESS OF CALLING TASK 
	ST	A5,TTAB	SAVE TTAB ADDRESS CALLING TASK
	LDR	A7,A1	SAVE PARAMETER 
* 
	IFT	CPU852=1 
	LDKL	A2,FM:BUF	FMTASK DISC SECTOR BUFFER 
	ST	A2,ECBBA,A8	SET BUFFER ADDRESS IN ECB 
	LDKL	A2,256
	ST	A2,ECBRL,A8	SET REQUESTED LENGTH IN ECB 
	XIF
* 
	IFT	CPU852=0 
	MLK	3
	DATA	/8000,FM:BUF,256
	MSR	3,A8	INITIALIZE FM:ECB 
	LDR	A1,A7	RESTORE PARAMETER
	XIF
* 
	CM	RETCOD	RESET RETURN CODE
	LD	A9,TTB:SA+16,A5	USER ECB ADDRESS
	LDKL	A14,FM:STB	FMTASK STACK BASE
* 
	IFT	MMUPAG=0 
	LD	A10,ECBBA,A9	FPB/BUFFER 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 
	EL	A10,ECBBA,A9	USER FPB/BUFFER ADDRESS
	XIF
* 
	EJECT			FMTASK 
* 
*   BRANCH TO APPROPRIATE FUNCTION HANDLER. 
* 
*   THE FOLLOWING PARAMETERS ARE SUPPLIED TO
*   THE RESP. FUNCTION HANDLER: 
* 
*   A1 = ORDER OPTION 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A7 = COMPLETE PARAMETER FROM A1 
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
	ANK	A1,/FF	ORDER OPTION
	ABI	ORDTAB,A4	BRANCH TO FUNCTION HANDLER 
* 
ORDTAB	EQU	*	ADDRESSES TO FUNCTION HANDLERS 
	DATA	FMRPAR	READ FILE PARAMETERS 
	DATA	FMOPEN	OPEN/CREATE/EXTEND FILE
	DATA	FMCLOS	CLOSE/DELETE FILE
* 
	IFT	MULEXT=1 
	DATA	FMSPLI	SPLIT I/O
	XIF
* 
	IFT	MULEXT=0 
	DATA	FM:RQE	SPLIT I/O NOT INCLUDED 
	XIF
* 
	EJECT			FMTASK 
* 
* 
**********
* FMOPEN *
**********
* 
* 
*   FILE MANAGEMENT ADMINISTRATION FUNCTIONS: 
*   OPEN/CREATE/EXTEND FILE 
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = ORDER OPTION 
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
FMOPEN	EQU	*	OPEN/CREATE/EXTEND FILE
	LDR	A13,A1	SAVE ORDER OPTION 
* 
	IFT	MMUPAG=1 
* 
*	MOVE USER FPB TO SYSTEM FPB (FM:FPB)
* 
	LDR	A1,A10	USER FPB ADDRESS
	LDKL	A2,FM:FPB	FM FPB ADDRESS
	LDR	A10,A2	SAVE IT 
	LDK	A3,FPBLEN	FPB LENGTH (BYTES) 
	MVUS	A3	MOVE USER FPB TO FM:FPB
	XIF
* 
	EJECT			FMTASK 
* 
* 
	LDKL	A5,FILCOD	FILE CODE TABLE ADDRESS 
	LDK	A7,FPB:V1	1ST VOLUME NAME DISPLACEMENT IN FPB
* 
*	CHECK IF ANY VOLUME NAME SPECIFIED
* 
FMOP00	EQU	*
	LDR	A2,A10	FPB ADDRESS 
	ADR	A2,A7	POINT TO VOLUME NAME 
	LDR*	A2,A2	FIRST WORD OF VOLUME NAME 
	RF(Z)	FMOP20	NO VOLUME NAME SPECIFIED
	SUKL	A2,/2020	CHECK IF SPACES
	RF(Z)	FMOP20	NO VOLUME NAME SPECIFIED
	LDKL	A4,DFTAB-1	DISC FILE CODE TABLE ADDRESS-1 
* 
*	CONVERT VOLUME NAME TO FILE CODE
* 
FMOP10	EQU	*
	LDK	A2,0 
	ADK	A4,1	POINT TO NEXT FILE CODE 
	CWK	A4,DFTABE	CHECK IF END OF DFTAB
	RF(E)	FM:INE	FILE CODE NOT FOUND, RETURN 
	LCR	A2,A4	NEXT FILE CODE 
	CF	A14,FNDNAM	FIND VOLUME NAME ADDRESS 
	LDR	A2,A10	FPB ADDRESS 
	ADR	A2,A7	POINT TO CURRENT VOLUME NAME IN FPB
	LDK	A3,6	VOLUME NAME LENGTH
	CF	A14,CMPSTR	COMPARE VOLUME NAMES 
	RB(NE)	FMOP10	VOLUME NAMES NOT EQUAL 
	LCR	A2,A4	FILE CODE
	SC	A3,DWTNVL+1,A6	CLEAR NVL BITS (A3 = 0 FROM CMPSTR)
* 
	EJECT			FMTASK 
* 
*	STORE FILE CODE (OR ZERO) IN FILE CODE TABLE (FILCOD) 
* 
FMOP20	EQU	*
	SCR	A2,A5	SAVE FILE CODE 
	ADK	A5,1 
	ADK	A7,FPB:V2-FPB:V1	NEXT VOLUME NAME DISPLACEMENT 
	CWK	A5,FILCOD+4	CHECK IF END OF TABLE
	RB(NE)	FMOP00	MORE VOLUMES TO CHECK
	SUK	A5,4	FILE CODE TABLE ADDRESS 
* 
*	GET FILE CODE OF FIRST SPECIFIED VOLUME 
* 
FMOP30	EQU	*
	LCR	A7,A5	ONE FILE CODE
	ANK	A7,/FF 
	RF(NZ)	FMOP40	FIRST FILE CODE TO TREAT 
	ADK	A5,1	POINT TO NEXT FILE CODE 
	CWK	A5,FILCOD+4	CHECK IF END OF TABLE
	RB(NE)	FMOP30	CHECK NEXT FILE CODE 
* 
*	VOLUME/FILE NOT FOUND 
* 
FM:INE	EQU	*	VOLUME/FILE NOT FOUND
	LDKL	A4,/8800	RETURN CODE
	RF	ER:RTN
* 
	EJECT			FMTASK 
* 
*	CHECK ORDER OPTION
* 
FMOP40	EQU	*
	ST	A5,VOLUME	CURRENT VOLUME FILE CODE ADDRESS
	LDR	A4,A13	ORDER OPTION
	RF(Z)	OPEN	OPEN FILE 
* 
	IFT	FMCDEF=1 
	SUK	A4,1 
	ABL(Z)	EXTEND	EXTEND FILE
	SUK	A4,1 
	ABL(Z)	CREATE	CREATE FILE
	XIF
* 
*	REQUEST ERROR 
* 
FM:RQE	EQU	*	REQUEST ERROR EXIT 
	LDKL	A4,/8000	RETURN CODE
	RF	ER:RTN
* 
	EJECT			FMTASK 
* 
* 
********
* OPEN *
********
* 
* 
*   ENTRY PARAMETERS: 
* 
*   A4 = 0
*   A5 = VOLUME FILE CODE ADDRESS IN FILCOD 
*   A7 = FILE CODE, FIRST VOLUME
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
OPEN	EQU	*	OPEN FILE
* 
	EJECT			FMTASK 
* 
*	CHECK IF FILE IS ALREADY OPENED AND 
*	FIND FWT ADDRESS
* 
	LD	A12,SCTFWT	FWT CHAIN START ADDRESS
* 
OP:005	EQU	*
	LDK	A2,1 
* 
OP:010	EQU	*
	LDR	A6,A12	NEXT FWT ADDRESS
	RF(Z)	OP:060	NO MORE FWT:S AVAILABLE 
	LDR*	A12,A6	FIRST WORD OF FWT
	TM	A12,A2	CHECK IF USED
	RF(NZ)	OP:015	USED, CHECK FILE NAME
	ADK	A4,0	CHECK IF FREE FWT ADDRESS ALREADY SAVED 
	RB(NZ)	OP:010	YES, DON'T SAVE IT 
	LDR	A4,A6	NO, SAVE THIS FWT ADDRESS
	RB	OP:010	CONTINUE SEARCH
* 
OP:015	EQU	*
	XRR	A12,A2	RESET FWT USED BIT
	LDR	A2,A10	FPB ADDRESS 
	ADK	A2,FPB:FN
	CF	A14,CMPFIL	COMPARE FILE NAMES 
	RB(NE)	OP:005	FILE NAMES NOT EQUAL 
	CC	A7,FWTVOL,A6	CHECK FILE CODE OF FIRST EXTENT
	RB(NE)	OP:005	NOT THIS FILE
* 
	EJECT			FMTASK 
* 
*	FILE IS ALREADY OPENED: 
*	CHECK ATTACH PARAMETER AND NUMBER OF USERS
* 
	IFT	ATTDET=1 
	LC	A1,FPB:SH,A10	SHAREABILITY PARAMETER
	ANK	A1,/FF 
	RF(Z)	OP:020	NO ATTACH REQUESTED 
	LD	A2,FWTTAB,A6	ATTACH WORD (TTAB ADDRESS) 
	RF(Z)	OP:018	FILE NOT ATTACHED 
	CW	A2,TTAB	CHECK IF ATTACHED BY THIS TASK
	RF(NE)	OP:040	NO, ATTACHED TO ANOTHER TASK 
* 
OP:018	EQU	*
	LD	A5,TTAB	TTAB ADDRESS CALLING TASK 
	ST	A5,FWTTAB,A6	INDICATE ATTACHED
	XIF
* 
OP:020	EQU	*
	LC	A1,FWTPAR,A6	ACCESS PARAMETERS
	LDR	A2,A1
	ANK	A1,/3F	NUMBER OF USERS 
	SUK	A1,/3F 
	ABL(NZ)	OPEXIT 
* 
	EJECT			FMTASK 
* 
*	ERROR EXITS 
* 
	LDKL	A4,/0210	RETURN CODE (TOO MANY USERS) 
	RF	ER:RTN
* 
OP:030	EQU	*	NO FREE FWT AVAILABLE
	LDKL	A4,/8400	RETURN CODE
* 
	IFT	ATTDET=1 
	RF	ER:RTN
* 
OP:040	EQU	*	FILE ATTACHED
	LDK	A4,/40	RETURN CODE 
	XIF
* 
ER:RTN	EQU	*
	ORS	A4,RETCOD	PREPARE RETURN CODE
	ABL	FMEXIT	RETURN
* 
	EJECT			FMTASK 
* 
*	FILE IS NOT OPENED BEFORE:
*	FIND ALL FILE EXTENTS, BUILD FWT AND EWT:S
* 
*	MOVE FILE NAME FROM FPB TO FWT
* 
OP:060	EQU	*
	LDR	A6,A4	FREE FWT ADDRESS 
	RB(Z)	OP:030	NO FREE FWT AVAILABLE 
	LDR	A1,A10	FPB ADDRESS 
	ADK	A1,FPB:FN
	LDR	A3,A6	FWT ADDRESS
	ADK	A3,FWTNAM
	CF	A14,FM:MV8	MOVE FILE NAME 
	LDR	A2,A7	RESTORE FILE CODE
* 
	EJECT			FMTASK 
* 
* 
********* 
* OPEXT * 
********* 
* 
* 
*   OPEN EXTENDED FILE (CALLED FROM EXTEND) 
* 
*   A2 = DISC FILE CODE 
*   A6 = FWT ADDRESS
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
OPEXT	EQU	*	ENTRY USED BY EXTEND FILE 
OP:070	EQU	*
* 
*	FIND ONE FILE EXTENT
* 
	CM	FEXTNO	RESET NO OF FILE EXTENTS 
	LD	A5,TTAB	TTAB ADDRESS OF CALLING TASK
	CF	A14,FNDVTC	FIND VTOC ENTRY
* 
OP:075	EQU	*
	LDR	A11,A2	SAVE CURRENT VTOC SECTOR NUMBER 
	RF(NZ)	OP:080	ONE FILE EXTENT FOUND
	ADK	A4,0	CHECK DISC RETURN CODE
	RF(Z)	OP:160	NO MORE FILE EXTENTS ON THIS VOLUME 
	ABL	OPCLOS	DISC ERROR, CLOSE FILE
* 
	EJECT			FMTASK 
* 
*	MOVE EXTENT LENGTH AND EXTENT BASE
*	TO FWT AND/OR EWT BLOCKS
* 
OP:080	EQU	*
	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 
	SLL	A2,6 
	ORR	A2,A3	FILE SECTION AND EXTENT NUMBER 
	ECR	A2,A2
* 
	IFT	FMCDEF=1 
	LC	A4,TTB:SA+14,A5	ORDER OPTION
	SRC	A4,1	CHECK IF EXTEND 
	RF(NN)	OP:085	NOT EXTEND 
	CW	A3,SEXTNO	CHECK IF VTOC ALREADY TREATED 
	RF(NG)	OP:110	YES, SKIP THIS VTOC
	XIF
* 
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:095	FIRST FILE EXTENT 
* 
OP:090	EQU	*
	INH
	CF	A15,GETBLK	EWT BLOCK 1
	RF	OP:100
* 
	EJECT			FMTASK 
* 
* 
OP:095	EQU	*
	LC	A4,VTC:NE,A13	NO OF FILE EXTENTS
	ANK	A4,/FF 
	NGR	A4,A4	NEGATE VALUE 
	ADS	A4,FEXTNO
	LD	A4,FWTVTC,A6	VTOC SECTOR NUMBER, FIRST EXTENT 
	RB(NZ)	OP:090	FIRST EXTENT ALREADY FOUND 
	ST	A2,FWTEXL-2,A6	STORE FILE EXTENT LENGTH, FIRST EXTENT 
	ST	A1,FWTEXL,A6
* 
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 
	OR	A3,FWTVTC,A6	CHECK IF FIRST EXTENT
	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	*
	IM	FEXTNO	INDICATE ONE MORE EXTENT FOUND 
	RF(Z)	OP:160	NO MORE FILE EXTENTS ON THIS VOLUME 
	CF	A14,FNDVT3	FIND NEXT VTOC ENTRY 
	RB	OP:075
* 
	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
* 
*	CHECK IF MORE VOLUMES SPECIFIED 
* 
OP:160	EQU	*
	IM	VOLUME	NEXT VOLUME FILE CODE ADDRESS
	LD	A7,VOLUME	VOLUME FILE CODE ADDRESS
	CWK	A7,FILCOD+4	CHECK IF END OF TABLE
	RF(E)	OP:170	ALL VOLUMES CHECKED 
* 
	EJECT			FMTASK 
* 
* 
	IFT	FMCDEF=1 
	LDKL	A2,-1 
	ST	A2,SEXTNO	RESET START EXTENT NUMBER 
	XIF
* 
	LCR	A2,A7	NEXT FILE CODE 
	ANK	A2,/FF 
	RB(NZ)	OP:070	NEXT VOLUME
	RB	OP:160
* 
OP:170	EQU	*
	LD	A2,FWTVTC,A6	VTOC SECTOR NUMBER, FIRST EXTENT 
	ABL(Z)	FM:INE	NO FILE EXTENT FOUND 
* 
	IFT	FMCDEF=1 
	LC	A2,TTB:SA+14,A5	ORDER OPTION
	SRC	A2,1	CHECK IF EXTEND 
	RF(N)	FM:270	YES, RETURN 
	XIF
* 
*	CHECK ATTACH PARAMETER
* 
	IFT	ATTDET=1 
	LC	A2,FPB:SH,A10	SHAREABILITY PARAMETER
	ANK	A2,/FF 
	RF(Z)	OP:240	NO ATTACH REQUESTED 
	LDR	A2,A5	TTAB ADDRESS 
* 
OP:240	EQU	*
	ST	A2,FWTTAB,A6	SET ATTACH WORD
	XIF
* 
	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: 
*	CHECK BASIC ORDERS PARAMETER, INCREMENT NUMBER OF USERS 
*	BY ONE AND RETURN FILE NUMBER FOR THIS FILE TO THE USER 
* 
OPEXIT	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
* 
	IFT	MMUPAG=0 
	LD	A4,FWTFNR,A6	FILE NUMBER
	SC	A4,ECBFN,A9	SET FILE NUMBER IN ECB
	XIF
* 
	IFT	MMUPAG=1 
	ELR	A4,A9
	LC	A4,FWTFNR,A6	FILE NUMBER
	ESR	A4,A9	SET FILE NUMBER IN ECB 
	XIF
* 
FM:270	EQU	*
	RF	OCEXIT	RETURN VIA OPEN/CLOSE EXIT 
* 
	EJECT			FMTASK 
* 
* 
**********
* FMCLOS *
**********
* 
* 
*   FILE MANAGEMENT ADMINISTRATION FUNCTIONS: 
*   CLOSE/DELETE FILE 
* 
*   ENTRY PARAMETERS: 
* 
*   CR = 0 IF CLOSE, ELSE CR > 0
*   A1 = ORDER OPTION 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
FMCLOS	EQU	*	CLOSE/DELETE FILE
* 
*	CHECK ORDER OPTION
* 
	IFT	FMCDEF=0 
	ABL(NZ)	FM:RQE	ILLEGAL ORDER OPTION
	XIF
* 
	IFT	FMCDEF=1 
	RF(Z)	CLOSE	CLOSE FILE 
	SUK	A1,2 
	ABL(Z)	DELETE	DELETE FILE
	ABL	FM:RQE	ILLEGAL ORDER OPTION
	XIF
* 
	EJECT			FMTASK 
* 
* 
********* 
* CLOSE * 
********* 
* 
*   ENTRY PARAMETERS: 
* 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
* 
CLOSE	EQU	*	CLOSE FILE
	CF	A14,RDVTOC	READ VTOC RECORD (FIRST EXTENT)
	ADK	A4,0	CHECK RETURN CODE 
	RF(NZ)	CL:000	ERROR
	LD	A3,FWTPAR,A6	ACCESS PARAMETERS
	RF(NN)	CL:005	NOT NVL
	LDK	A4,/20	SET NVL IN RETURN CODE
* 
*	ERROR AT CLOSE: CHECK HOW SERIOUS 
* 
CL:000	EQU	*
	ORS	A4,RETCOD	PREPARE RETURN CODE
* 
	IFT	ATTDET=1 
	SUK	A4,/40 
	RF(Z)	OCEXIT	FILE ATTACHED, DON'T CLOSE
	XIF
* 
	ADK	A6,0	CHECK FWT ADDRESS 
	RF(Z)	OCEXIT	NO FWT FOUND, RETURN
	RF	CL:010	DON'T WRITE VTOC 
* 
	EJECT			FMTASK 
* 
*	MOVE FRN FROM FPB TO VTOC 
* 
CL:005	EQU	*
	IFT	MMUPAG=0 
	IFT	CPU852=1 
	LD	A1,FPB:FR,A10	FILE RECORD NUMBER
	LD	A2,FPB:FR+2,A10 
	ST	A1,VTC:LR,A13	SET LRN IN VTOC RECORD
	ST	A2,VTC:LR+2,A13 
	XIF
* 
	IFT	MMUPAG=0 
	IFT	CPU852=0 
	ML	2,FPB:FR,A10	FILE RECORD NUMBER 
	MS	2,VTC:LR,A13	SET LRN IN VTOC RECORD 
	XIF
* 
	IFT	MMUPAG=1 
	EL	A1,FPB:FR,A10	FILE RECORD NUMBER
	EL	A2,FPB:FR+2,A10 
	MS	2,VTC:LR,A13	SET LRN IN VTOC RECORD 
	XIF
* 
*	WRITE VTOC TO DISC WITH NEW FILE RECORD NUMBER IF REQUESTED 
* 
	ORR	A1,A2	CHECK FILE RECORD NUMBER 
	RF(Z)	CL:010	FRN ZERO, DON'T WRITE VTOC
	LDK	A7,/95	PHYSICAL WRITE
	CF	A14,FM:IO	WRITE VTOC RECORD TO DISC 
* 
	EJECT			FMTASK 
* 
*	DECREMENT NUMBER OF USERS FOR THIS FILE BY ONE. 
*	FWT AND EWT ARE RELEASED IF NO USER REMAINS.
* 
CL:010	EQU	*
	LC	A1,FWTPAR,A6	ACCESS PARAMETERS
	LDR	A2,A1
	ANK	A2,/3F	NUMBER OF USERS 
	SUK	A2,1	DECREMENT NO OF USERS BY ONE
* 
	IFT	MMUPAG=0 
	SC	A2,FPB:US,A10	RETURN REMAINING NO OF USERS
	XIF
* 
	IFT	MMUPAG=1 
	EL	A3,FPB:US,A10 
	ANK	A3,/FF 
	ECR	A2,A2	NUMBER OF USERS TO LEFT BYTE 
	ORR	A3,A2
	ES	A3,FPB:US,A10	RETURN REMAINING NO OF USERS
	SRL	A2,8	NUMBER OF USERS TO RIGHT BYTE 
	XIF
* 
	RF(P)	DLCLO2	DON'T RELEASE FWT IF ANY USER LEFT
* 
	EJECT			FMTASK 
* 
* 
**********
* DLCLO1 *
* OPCLOS *
**********
* 
* 
*   RELEASE FWT AND EWT BLOCKS
* 
*   INPUT:  A6 = FWT ADDRESS
*           A9 = USER ECB ADDRESS 
* 
DLCLO1	EQU	*	ENTRY USED BY DELETE FILE
	LDK	A2,1 
	XRRS	A2,A6	RESET USED BIT IN FWT 
* 
OPCLOS	EQU	*	ENTRY USED BY OPEN FILE
	LD	A4,FWTEW2,A6	ADDRESS TO FIRST EWT STRUCTURE 
	RF(Z)	CL:030	NO MORE BLOCKS TO RELEASE 
* 
*	RETURN EWT BLOCKS TO MONITOR BLOCK POOL 
* 
CL:020	EQU	*
	INH
	CF	A15,FREBLK	RELEASE EWT BLOCK
	ENB
	LDR	A4,A3	EWT BLOCK ADDRESS
	RB(NZ)	CL:020
	CM	FWTEW2,A6	RESET EWT STRUCTURE POINTER 
* 
CL:030	EQU	*
	CM	FWTVTC,A6	RESET VTOC SECTOR NUMBER
	RF	CL:050	RETURN 
* 
	EJECT			FMTASK 
* 
* 
DLCLO2	EQU	*	ENTRY USED BY DELETE FILE
	ANK	A1,/C0	SKIP NUMBER OF USERS
	ORR	A1,A2	PUT TOGETHER ACCESS PARAMETERS 
	SC	A1,FWTPAR,A6
* 
*	DETACH FILE 
* 
CL:050	EQU	*
	IFT	FMCDEF=1 
	LD	A5,TTAB	TTAB ADDRESS OF CALLING TASK
	XIF
* 
	IFT	ATTDET=1 
	INH
	CF	A15,DET:FM	DETACH FILE
	XIF
* 
OCEXIT	EQU	*	OPEN/CLOSE COMMON EXIT LABEL 
	ABL	FMEXIT 
* 
	EJECT			FMTASK 
* 
* 
**********
* FMRPAR *
**********
* 
* 
*   FILE MANAGEMENT ADMINISTRATION FUNCTIONS: 
*   READ FILE PARAMETERS
* 
*   ENTRY PARAMETERS: 
* 
*   CR = 0 IF LEGAL ORDER OPTION
*   A1 = ORDER OPTION 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = FPB ADDRESS
* 
FMRPAR	EQU	*	READ FILE PARAMETERS 
* 
*	CHECK ORDER OPTION
* 
	ABL(NZ)	FM:RQE	ILLEGAL ORDER OPTION
* 
	IFT	MMUPAG=1 
	LDKL	A10,FM:FPB	SYSTEM FPB ADDRESS 
	XIF
* 
	EJECT			FMTASK 
* 
* 
	CF	A14,RDVTOC	READ VTOC RECORD (FIRST EXTENT)
	ADK	A4,0	CHECK RETURN CODE 
	RF(NZ)	FMEXIT	ERROR, RETURN
	SC	A4,FPB:BO,A10	RESET BASIC ORDER PARAMETER 
* 
*	MOVE SPACES TO VOLUME NAMES 
*	AND RESET FILE SECTION SIZES. 
* 
	IFT	CPU852=1 
	LDR	A1,A10	FPB ADDRESS 
	ADK	A1,FPB:V1	1ST VOLUME NAME
	LDK	A2,4	LOOP COUNTER, OUTER LOOP
	LDK	A4,/20	SPACE 
* 
FMR:02	EQU	*	OUTER LOOP ENTRY 
	LDK	A3,6	LOOP COUNTER, INNER LOOP
* 
FMR:04	EQU	*	INNER LOOP ENTRY 
	SCR	A4,A1	MOVE SPACES TO VOLUME NAME 
	ADK	A1,1 
	SUK	A3,1 
	RB(P)	FMR:04 
	CMR	A1	RESET FILE SECTION SIZE 
	CM	2,A1
	ADK	A1,FPB:V2-FPB:S1	NEXT VOLUME NAME
	SUK	A2,1 
	RB(P)	FMR:02 
	XIF
* 
	IFT	CPU852=0 
	MLK	3
	DATA	/2020,/2020,/2020 
	LDK	A5,0	(A4 = 0 FROM RDVTOC)
	MS	5,FPB:V1,A10
	MS	5,FPB:V2,A10
	MS	5,FPB:V3,A10
	MS	5,FPB:V4,A10
	XIF
* 
	EJECT			FMTASK 
* 
*	MOVE PARAMETERS FROM VTOC AND FWT TO FPB
* 
	IFT	CPU852=1 
	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 
	XIF
* 
	IFT	CPU852=0 
	ML	4,VTC:LR,A13	LRN, RECORD LENGTH AND BLOCK FACTOR
	MS	2,FPB:FR,A10
	STR	A3,A10 
	ST	A4,FPB:BF,A10 
	LD	A1,VTC:MN,A13	MONITOR AND SOP SWITCH NUMBER 
	ECR	A1,A1
	LDR	A2,A1
	LC	A2,VTC:IF,A13	NUMBER OF INDEX FILES 
	LD	A3,VTC:KA,A13	KEY ADDRESS IN RECORD 
	MS	3,FPB:MN,A10
	XIF
* 
	IFT	ATTDET=1 
	LD	A1,FWTTAB,A6	SHAREABILITY PARAMETER 
	RF(Z)	FMR:05	NOT ATTACHED
	LDK	A1,1 
	XIF
* 
	IFT	ATTDET=0 
	LDK	A1,0	NOT ATTACHED
	XIF
* 
FMR:05	EQU	*
	SC	A1,FPB:SH,A10	SET ATTACH PARAMETER
* 
	EJECT			FMTASK 
* 
* 
	LD	A1,FWTPAR,A6	ACCESS PARAMETERS
	SLL	A1,1 
	RF(NN)	FMR:10	PHYSICAL ORDERS FOR THIS FILE
	LDK	A2,1 
	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 
* 
*	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,FM:MOV	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
	CF	A14,FM:MV8	MOVE FILE NAME 
	ADK	A6,FWTEW1	ADDRESS TO FIRST EWT STRUCTURE 
	LDR	A11,A6 
	LDR*	A12,A11	ADDRESS TO 2ND EWT BLOCK
* 
	EJECT			FMTASK 
* 
*	MOVE VOLUME NAME FROM DWT TO FPB
* 
FMR:20	EQU	*
	LDR	A3,A10	FPB ADDRESS 
	ADK	A3,FPB:V1-10 
	LD	A1,EWTSEX,A11	FILE SECTION AND EXTENT NUMBER
	SLC	A1,2 
	ANK	A1,3	FILE SECTION NUMBER 
* 
FMR:30	EQU	*
	ADK	A3,FPB:V2-FPB:V1	COMPUTE VOLUME NAME DISPLACEMENT
	SUK	A1,1 
	RB(NN)	FMR:30
	LC	A2,EWTVOL,A12	DISC FILE CODE
	LDR	A13,A2	SAVE FILE CODE
	CF	A14,FNDNAM	FIND VOLUME NAME ADDRESS 
	CF	A14,FM:MOV	MOVE VOLUME NAME 
* 
	IFT	CPU852=1 
	LD	A1,EWTEXL-2,A11	FILE EXTENT LENGTH
	ANK	A1,/FF 
	LD	A2,EWTEXL,A11 
	XIF
* 
	IFT	CPU852=0 
	ML	2,EWTEXL-2,A11	FILE EXTENT LENGTH 
	ANK	A1,/FF 
	XIF
* 
	EJECT			FMTASK 
* 
*	COMPUTE FILE SECTION SIZE 
* 
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
	RB	FMR:35
* 
FMR:50	EQU	*
	MSR	2,A3	STORE FILE SECTION SIZE IN FPB
	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
	RB	FMR:35
* 
FMR:50	EQU	*
	STR	A1,A3	STORE FILE SECTION SIZE IN FPB 
	ST	A2,2,A3 
	XIF
* 
	LDR	A4,A11	CHECK EWT BLOCK ADDRESS 
	RB(NZ)	FMR:20	NOT END OF EWT CHAIN 
* 
	EJECT			FMTASK 
* 
* 
	IFT	MMUPAG=1 
* 
*   MOVE SYSTEM FPB (FM:FPB) TO 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 
* 
* 
**********
* FMEXIT *
**********
* 
* 
*   SET RETURN CODE IN USER ECB, QUEUE TASK 
*   AND PERFORM EXIT ON FMTASK. 
* 
*   INPUT:  A9 = USER ECB ADDRESS 
* 
FMEXIT	EQU	*	GENERAL RETURN CODE EXIT 
	LD	A4,RETCOD	RETURN CODE 
* 
	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
* 
	LD	A5,TTAB	RESTORE TTAB ADDRESS CALLING TASK 
	ABL	QMEXIT	QUEUE TASK AND EXIT FMTASK
* 
	EJECT			FMTASK 
* 
* 
**********
* FMSPLI *
**********
* 
* 
*   FILE MANAGEMENT I/O FUNCTIONS:
*   FMSPLI IS ENTERED WHEN THE REQUESTED
*   SECTORS ARE SPLIT OVER TWO OR MORE
*   FILE EXTENTS. 
* 
*   A5 = TTAB ADDRESS OF CALLING TASK 
*   A7 = PARAMETER BLOCK ADDRESS
*   A8 = FM:ECB ADDRESS 
*   A9 = USER ECB ADDRESS 
*  A10 = USER BUFFER ADDRESS
* 
FMSPLI	EQU	*	BASIC AND PHYSICAL READ/WRITE
	IFT	MULEXT=1 
	LDR	A4,A7	PARAMETER BLOCK ADDRESS
	INH
	CF	A15,FREBLK	RELEASE BLOCK AND GET PARAMETERS 
	LDR	A13,A2	2ND EWT BLOCK ADDRESS 
	CF	A15,FCHEC2	CHECK ACCESS PAR. AND RETURN FWT ADDRESS 
	ENB
	ORS	A4,RETCOD
	RB(NZ)	FMEXIT	ERROR, RETURN
	LDR	A7,A1	ORDER CODE 
* 
	EJECT			FMTASK 
* 
* 
	IFT	MMUPAG=0 
	IFT	CPU852=1 
	LD	A1,ECBCW1,A9	SECTOR NUMBER
	LD	A2,ECBCW2,A9
	ST	A10,ECBBA,A8	SET BUFFER ADDRESS 
	LD	A10,ECBRL,A9	TOTAL REQUESTED LENGTH 
	LDR	A11,A10	SAVE IT
* 
*	SET ECB PARAMETERS AND PERFORM DISC I/O 
* 
FMSP00	EQU	*	MAIN I/O LOOP ENTRY
	ST	A1,ECBCW1,A8	SET SECTOR NO IN ECB 
	ST	A2,ECBCW2,A8
	XIF
* 
	IFT	MULEXT=1 
	IFT	MMUPAG=0 
	IFT	CPU852=0 
	ML	2,ECBCW1,A9	SECTOR NUMBER 
	ST	A10,ECBBA,A8	SET BUFFER ADDRESS 
	LD	A10,ECBRL,A9	TOTAL REQUESTED LENGTH 
	LDR	A11,A10	SAVE IT
* 
FMSP00	EQU	*	MAIN I/O LOOP ENTRY
	MS	2,ECBCW1,A8	SET SECTOR NO IN ECB
	XIF
* 
	IFT	MULEXT=1 
	IFT	MMUPAG=1 
	INH			=3 
	CF	A15,TIOMXI	CONVERT LOGICAL ADDRESS TO PHYSICAL
	ENB			=3 
	EL	A1,ECBCW1,A9	SECTOR NUMBER
	EL	A2,ECBCW2,A9
	EL	A10,ECBRL,A9	TOTAL REQUESTED LENGTH 
	LDR	A11,A10
* 
FMSP00	EQU	*	MAIN I/O LOOP ENTRY
	MS	2,ECBCW1,A8	SET SECTOR NO IN ECB
	XIF
* 
	IFT	MULEXT=1 
	LC	A1,EWTVOL,A13	DISC FILE CODE
	SC	A1,ECBFC,A8	SET FILE CODE IN ECB
	ST	A3,ECBRL,A8	SET REQUESTED LENGTH IN ECB 
	CF	A14,FM:IO	PERFORM DISC I/O
	RF(NZ)	FMSP50	DISC ERROR 
	LD	A4,ECBEL,A8	EFFECTIVE LENGTH
	SUR	A11,A4	UPDATE REMAINING LENGTH 
	RF(Z)	FMSP50	I/O COMPLETED 
* 
	EJECT			FMTASK 
* 
*	UPDATE BUFFER ADDRESS 
* 
	IFT	MMUPAG=0 
	ADS	A4,ECBBA,A8	UPDATE BUFFER ADDRESS
	XIF
* 
	IFT	MULEXT=1 
	IFT	MMUPAG=1 
	LDK	A3,0	MOST SIGNIFICANT PART OF LENGTH	=3
	SRL	A4,1	WORD MODE	=3
	MLR	2,A8	BUFFER ADDRESS
	SLC	A1,4 
	SRL	A2,1	WORD MODE 
	DAR	A3		=3 
	SLL	A2,1	BYTE MODE 
	SRC	A1,4 
	MSR	2,A8	SET UPDATED BUFFER ADDRESS IN ECB 
	XIF
* 
	EJECT			FMTASK 
* 
*	GET PARAMETERS FROM NEXT EWT STRUCTURE
*	AND COMPUTE NEW REQUESTED LENGTH
* 
	IFT	MULEXT=1 
	LDR*	A13,A13	NEXT EWT STRUCTURE
	RF(Z)	FMSP40	END OF EWT STRUCTURE
	ECR	A3,A11	CONVERT REMAINING LENGTH TO SECTORS 
* 
	IFT	CPU852=1 
	LD	A1,EWTEXL-1,A13	EXTENT LENGTH, PART 1 
	ANK	A1,/FF 
	RF(NZ)	FMSP30	EXTENT LARGE ENOUGH
	LD	A2,EWTEXL,A13	EXTENT LENGTH, PART 2 
	XIF
* 
	IFT	MULEXT=1 
	IFT	CPU852=0 
	ML	2,EWTEXL-1,A13	EXTENT LENGTH
	ANK	A1,/FF 
	RF(NZ)	FMSP30	EXTENT LARGE ENOUGH
	XIF
* 
	EJECT			FMTASK 
* 
* 
	IFT	MULEXT=1 
	CWR	A3,A2
	RF(NG)	FMSP30	EXTENT LARGE ENOUGH
	LDR	A3,A2	NO OF SECTORS IN THIS I/O
* 
FMSP30	EQU	*
	ECR	A3,A3	CONVERT LENGTH TO BYTES
	LDR*	A13,A13	2ND EWT BLOCK 
* 
	IFT	CPU852=1 
	LD	A1,EWTEXB-1,A13	EXTENT BASE 
	ANK	A1,/FF 
	LD	A2,EWTEXB,A13 
	RB	FMSP00
	XIF
* 
	IFT	MULEXT=1 
	IFT	CPU852=0 
	ML	2,EWTEXB-1,A13	EXTENT BASE
	ANK	A1,/FF 
	RB	FMSP00
	XIF
* 
	EJECT			FMTASK 
* 
* 
FMSP40	EQU	*	ILLEGAL REQUESTED LENGTH 
	IFT	MULEXT=1 
	LDKL	A1,/2000	RETURN CODE
	ORS	A1,RETCOD
* 
FMSP50	EQU	*
	SUR	A10,A11	COMPUTE EFFECTIVE LENGTH 
* 
	IFT	MMUPAG=0 
	ST	A10,ECBEL,A9	SET EFFECTIVE LENGTH IN USER ECB 
	XIF
* 
	IFT	MULEXT=1 
	IFT	MMUPAG=1 
	ES	A10,ECBEL,A9	SET EFFECTIVE LENGTH IN USER ECB 
	XIF
* 
	IFT	MULEXT=1 
	RB	FMEXIT	RETURN 
	XIF
* 
	EJECT			FMTASK 
* 
* 
**********
* FM:PWR *
* FMREAD *
**********
* 
* 
*   INPUT:  A2 = SECTOR NUMBER, PART 2
*           A8 = FM:ECB/FMECB2 ECB ADDRESS
* 
*   OUTPUT: CR = 0 IF OK, ELSE
*             <> 0 IF DISC ERROR
*           A4 = DISC RETURN CODE (EXCEPT RETRY BIT)
*	   A7 IS DESTROYED
* 
FM:PWR	EQU	*	PHYSICAL WRITE ENTRY 
	LDK	A7,/95	ORDER CODE
	RF	FM:LKM
* 
FMREAD	EQU	*	PHYSICAL READ ENTRY
	LDK	A7,/91	ORDER CODE
* 
FM:LKM	EQU	*	COMMON I/O ROUTINE ENTRY 
	ST	A2,ECBCW2,A8	SET SECTOR NUMBER IN ECB 
* 
FM:IO	EQU	* 
	ADKL	A14,4	ADJUST STACK POINTER
	LKM
	DATA	1 
	LD	A4,ECBRC,A8	RETURN CODE 
	ORS	A4,RETCOD	PREPARE RETURN CODE
	ANKL	A4,/FEFF	SKIP RETRY BIT 
	ABR*	A14	RETURN (WITHOUT CHANGING CR)
* 
	EJECT			FMTASK 
* 
* 
**********
* FNDNAM *
**********
* 
* 
*   FNDNAM WILL CONVERT THE SUPPLIED FILE CODE
*   TO VOLUME NAME ADDRESS IN THE DISC DWT. 
* 
*   INPUT:  A2 = FILE CODE
* 
*   OUTPUT: A1 = VOLUME NAME ADDRESS
*	   A2 = 6 
*	   A6 = DISC DWT ADDRESS + DOUBLE INDEX 
* 
FNDNAM	EQU	*	FIND VOLUME NAME ADDRESS 
	INH
	CF	A15,FNDDWD	FIND DISC DWT ADDRESS
	ENB
* 
*	CHECK IF DISC RECOVERY GOING ON AND IN THAT CASE
*	SWITCH TASK WHILE WAITING FOR RECOVERY COMPLETION 
* 
FNAM05	EQU	*
	LD	A1,DWTST,A6 
	ANK	A1,1 
	RF(NZ)	FNAM10	POWER ON COMPLETED FOR THIS DISC 
	LKM		WAIT FOR RECOVERY COMPLETION
	DATA	0	SWITCH TASKS
	RB	FNAM05	CHECK DISC AGAIN 
* 
	EJECT			FMTASK 
* 
* 
FNAM10	EQU	*
	LDR	A1,A6	DISC DWT ADDRESS 
	LDR	A6,A2	DISC INDEX 
	ADR	A6,A6	DOUBLE INDEX 
	ADR	A6,A1	ADD DWT ADDRESS
* 
*	COMPUTE VOLUME NAME ADDRESS IN DWT
* 
FNAM20	EQU	*
	ADK	A1,6	NEXT VOLUME NAME IN DWT 
	SUK	A2,1	DECREMENT INDEX 
	RB(NN)	FNAM20
	LDK	A2,6 
	ADKL	A1,DWTVOL-6 
	RTN	A14
* 
	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 
*	   A8 = FM:ECB ADDRESS
*           A9 = USER ECB ADDRESS 
* 
*   OUTPUT: A1 = 0 IF FIRST FILE EXTENT FOUND 
*           A2 = VTOC SECTOR NUMBER (FIRST EXTENT)
*	   A4 = RETURN CODE (=0 IF OK)
*           A6 = FWT ADDRESS
*          A13 = VTOC RECORD ADDRESS IN FM:BUF
*           A3, A7, A11 ARE DESTROYED 
* 
RDVTOC	EQU	*	CHECK ACCESS PAR. AND READ VTOC RECORD 
	INH
	CF	A15,FCHEC2	CHECK ACCESS PAR. AND RETURN FWT ADDRESS 
	ENB
	RF(NZ)	RDVT20	ERROR, RETURN
* 
	EJECT			FMTASK 
* 
* 
	LC	A4,FWTVOL,A6	DISC FILE CODE (FIRST EXTENT)
	STR	A4,A8
	LD	A2,FWTVTC,A6	VTOC SECTOR NUMBER (FIRST EXTENT)
* 
RDVTO2	EQU	*	ENTRY USED BY FMCDEF 
	CF	A14,FNDVT2	READ VTOC SECTOR AND ONE VTOC RECORD 
* 
RDVT10	EQU	*
	ADK	A4,0	CHECK RETURN CODE 
	RF(NZ)	RDVT20	DISC ERROR, RETURN 
	LD	A1,VTC:EN,A13	FILE EXTENT NUMBER
	RF(Z)	RDVT20	FIRST EXTENT FOUND
	CF	A14,FNDVT3	READ NEXT VTOC RECORD FOR THIS FILE
	RB	RDVT10	CHECK IF THIS IS THE FIRST EXTENT
* 
RDVT20	EQU	*
	ORS	A4,RETCOD	PREPARE RETURN CODE
	RTN	A14
* 
	EJECT			FMTASK 
* 
* 
**********
* FNDVTC *
**********
* 
* 
*   FNDVTC SEARCHES THE REQUESTED 
*   FILE SPECIFIED IN THE FPB.
*   RETURN IS MADE WHEN ONE EXTENT
*   HAS BEEN FOUND OR WHEN THE COMPLETE 
*   VTOC HAS BEEN SEARCHED WITHOUT MATCH. 
* 
*   INPUT:  A2 = FILE CODE
*	   A6 = FWT ADDRESS 
*	   A8 = FM:ECB ADDRESS
* 
*   OUTPUT: A2 = VTOC SECTOR NUMBER IF FOUND, ELSE
*              = 0 IF NO FILE EXTENT FOUND
*	   A4 = DISC RETURN CODE (=0 IF OK) 
*          A13 = VTOC RECORD ADDRESS IN FM:BUF
*           A1, A3, A7, A11-A12 ARE DESTROYED 
* 
FNDVTC	EQU	*	FIND VTOC ENTRY
* 
*	READ VOLUME LABEL (SECTOR 0)
* 
	SC	A2,ECBFC,A8	SET FILE CODE IN ECB
	LDK	A2,0	SECTOR NUMBER 
	CF	A14,FMREAD	READ SECTOR 0
	RF(NZ)	FVTC40	DISC ERROR, RETURN 
	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 
* 
*	READ NEXT VTOC SECTOR 
* 
FNDVT2	EQU	*	ENTRY USED BY RDVTOC/FMCDEF
	CF	A14,FMREAD	READ ONE VTOC SECTOR 
	RF(NZ)	FVTC40	DISC ERROR, RETURN 
	LDKL	A13,FM:BUF	FM:BUF ADDRESS 
	LDK	A7,VTOCBF	VTOC BLOCK FACTOR
* 
FVTC20	EQU	*
	LD	A1,VTC:ST,A13	VTOC STATUS BYTE
	ANK	A1,/FF 
	RF(NZ)	FVTC50	VTOC USED
* 
FNDVT3	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)	FNDVT2	NOT LAST VTOC SECTOR 
* 
FVTC40	EQU	*	ERROR RETURN 
	LDK	A2,0	RETURN CODE 
	RTN	A14
* 
*	VTOC USED: COMPARE FILE NAMES AND RETURN IF EQUAL 
* 
FVTC50	EQU	*
	LDR	A2,A13	VTOC ADDRESS
	CF	A14,CMPFIL	COMPARE FILE NAMES 
	RB(NE)	FNDVT3	FILE NAMES NOT EQUAL 
	LD	A2,ECBCW2,A8	CURRENT VTOC SECTOR NUMBER 
	RTN	A14	ONE FILE EXTENT FOUND
* 
	EJECT			FMTASK 
* 
* 
**********
* CMPFIL *
* CMPSTR *
* CPMDWD *
**********
* 
* 
*   CMPFIL COMPARES ONE CHARACTER STRING
*   WITH THE FILE NAME IN SPECIFIED FWT 
*   AND SETS THE CR ACCORDING TO THE RESULT.
* 
*   CMPSTR COMPARES TWO CHARACTER STRINGS 
*   AND SETS THE CR ACCORDING TO THE RESULT.
* 
*   CMPDWD COMPARES TWO DOUBLE WORDS
*   AND SETS THE CR ACCORDING TO THE RESULT.
* 
*   INPUT:  A1 = ADDRESS OF CHARACTER STRING 1 (CMPSTR/CMPDWD ONLY) 
*           A2 =    "    "      "       "    2
*           A3 = NO OF CHARACTERS TO COMPARE (CMPSTR ONLY)
*	   A6 = FWT ADDRESS (CMPFIL ONLY) 
* 
*   OUTPUT: CR = 0 IF STRINGS EQUAL, ELSE 
*              > 0 IF STRING 1 GREATER THAN STRING 2, ELSE
*              < 0 IF STRING 1 LESS THAN STRING 2 
*           A1-A3, A11 ARE DESTROYED
* 
	EJECT			FMTASK 
* 
* 
CMPFIL	EQU	*	COMPARE FILE NAMES 
	LDR	A1,A6	FWT ADDRESS
	ADK	A1,FWTNAM	POINT TO FILE NAME 
	LDK	A3,8	FILE NAME LENGTH
* 
CMPSTR	EQU	*	COMPARE CHARACTER STRINGS
	ADKL	A14,4	ADJUST STACK POINTER
* 
*	COMPARE STRINGS CHARACTER BY CHARACTER
* 
CMP:10	EQU	*
	LCR	A11,A1	ONE CHARACTER FROM STRING 1 
	CCR	A11,A2	COMPARE WITH CORR. CHAR. IN STRING 2
	ABR(NE)*	A14	STRINGS NOT EQUAL, RETURN 
	ADK	A1,1	INCREMENT STRING POINTERS 
	ADK	A2,1 
	SUK	A3,1	DECREMENT LOOP COUNTER
	RB(P)	CMP:10	CONTINUE IF NOT END OF STRINGS
	ABR*	A14	STRINGS EQUAL, RETURN 
* 
CMPDWD	EQU	*	COMPARE TWO DOUBLE WORDS 
	LDK	A3,4	LENGTH
	RB	CMPSTR
* 
	EJECT			FMTASK 
* 
* 
**********
* FM:MOV *
**********
* 
* 
*   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 
* 
FM:MV8	EQU	*	MOVE 8 CHARACTERS
	LDK	A2,8	LENGTH
	RF	FM:MOV
* 
FM:MV4	EQU	*	MOVE 4 CHARACTERS
	LDK	A2,4	LENGTH
* 
*	MOVE STRING CHARACTER BY CHARACTER
* 
FM:MOV	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)	FM:MOV	CONTINUE MOVE 
	RTN	A14
* 
* 
* 
	END

Full view