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

⟦99463989c⟧

    Length: 26834 (0x68d2)
    Notes: pts_type(SC)
    Names: »DMSUBR.SC«

Derivation

└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
    └─⟦this⟧ »TOSSWORK/DMSUBR.SC« 
└─⟦781e933ac⟧ Bits:30009686 Philips computer tape "600310"
    └─⟦this⟧ »M:92T1/DMSUBR.SC« 

PTS(SC)

	IDENT DMSUBR 	REL 9.2 79-11-16  870105040920 

			=1 CLEAR ECB 
			REL 9.1 79-04-06 
* 
****************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   DMSUBR = COMMON DM-ROUTINES 
* 
* 
* 
* 
* 
* 
****************************************************
****THIS MODULE IS ACTIVATED FROM :*****************
* 
*   DMTASK,TIODM,DMTASS 
* 
*************** 
*   ENTRIES   * 
*************** 
* 
* 
	ENTRY	EATEST,EASETB,EARELB,CRNGET
	ENTRY	CALSNO 
	ENTRY	GTBKBU,GTLGRN
	ENTRY	DMTIOT 
	ENTRY	CHKIND,REQEND
	ENTRY	DMTIOZ 
	ENTRY	MOV:US	MOVE FROM USER TO SYSTEM AREA 
	ENTRY	MOV:SU	MOVE FROM SYSTEM TO USER AREA 
* 
***************** 
*   EXTERNALS   * 
***************** 
* 
* 
	EXTRN	FDBEAL,FDBTNR,FDBCRL,FDBRLE,FDBSNR,FDBRRO
	EXTRN	FDBCEX,FDBBLF,FDBEXT 
	EXTRN	FDBECB,DWTECB,DWTOR,EXTDMI,BUFSTA,BUFDMI,BUFOR 
	EXTRN	ECBRC,ECBFC,ECBCW,ECBBA
	EXTRN	TTB:ID	TASK ID 
	EXTRN	DWTTDM,DWTTQ 
	EXTRN	QTJOB
	EXTRN	ECBRL,SECTLE 
	EXTRN	DIVMOD,MPYMOD
	EXTRN	EXTELE 
	EXTRN	CRNTID 
	EXTRN	DMTGBU 
	EXTRN	EXTLEN,EXTBAS
	EXTRN	CRNQUE,GETBLK,FREQUE 
	EXTRN	HALT 
	EXTRN	CRBUFL 
	EXTRN	IHRET2,IHRTN,FDBADF,DWTST
	EXTRN	FDBDBR 
	EXTRN	QIRN,QIRR
	EXTRN	TASHLT	SYSTEM HALT ROUTINE 
	EJECT			DMSUBR			TOSSIO
* 
* 
***************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
***************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
	EJECT			DMSUBR 
* 
*   CHKIND IS USED FROM FNDDWT TO SELECT DM-DWT 
*   INDEX FILE (INDEX 0) SHALL BE SELECTED FOR
*   DX,IX,XR,XN, DATA FILE OTHERWISE
* 
CHKIND	EQU	*
	STR	A1,A15 
	STR	A2,A15 
	LDK	A2,1	INDEX FOR DATA FILE 
	LDR	A1,A7	ORDER
	ANK	A1,/3F 
	CWK	A1,/20 
	RF(E)	FND320	DELETE INDEX
	CWK	A1,/1A 
	RF(E)	FND320	INDEXED READ
	ANK	A1,/3E	REMOVE BIT 15 
	SUK	A1,/1E	
	RF(E)	FND320	INSERT INDEX OR INDEXED READ NEXT 
	RF	FND340
FND320	LDK	A2,0	INDEX FOR INDEX FILE
FND340	EQU	*
	CCR	A2,A6	INDEX
	RF(E)	FND390	ENTRY FOUND 
	LDK	A1,2 
	ADS	A1,8,A15	RETURN+2 WHEN NOT FOUND 
FND390	ABL	IHRET2 
	EJECT			DMSUBR 
* 
*   REQEND IS USED IN TENDIO TO RESET REQUEST BUSY BIT
*   FOR ALL FILES 
*   AND TO RESOLVE ALL QUEUES 
* 
REQEND	EQU	*
	LC	A2,TTB:ID,A5	GET TASK ID
	CCK	A2,'##'
	RF(E)	TEN117	JUMP IF DMTASK CALLING
* 
*   RESET REQUEST BUSY BIT FOR ALL FILES
* 
	LDK	A2,10	MAX NO OF FILES * 2
	STR	A4,A15	SAVE A4 (USED BY TENDIO!!)
TEN112	EQU	*
	SUK	A2,2 
	RF(N)	TEN115	NO MORE FILES 
	LDR	A3,A6
	ADR	A3,A2
	LD	A3,FDBADF,A3	FDB ADDR 
	RB(Z)	TEN112 
	CWR	A3,A6	DWT ADDR 
	RF(E)	TEN114	MASTER DWT
	LD	A5,DWTTQ,A3 
	RF(Z)	TEN113	NO QUEUE
	LDR*	A4,A5 
	ST	A4,DWTTQ,A3	NEW ANCHOR
	CF	A15,QTJOB	REPEAT REQUEST
TEN113	LD	A5,DWTTDM,A6	RESTORE
TEN114	EQU	*
	LDKL	A4,/BFFF	REQUEST BUSY BIT 
	ANS	A4,DWTST,A3	RESET
	LDKL	A4,/8000	 
	ORS	A4,DWTST,A3	DEVICE NOT BUSY
	RB	TEN112
TEN115	EQU	*
	LDR*	A4,A15	RESTORE A4 
* 
TEN117	EQU	*
	ABL	IHRTN
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   EATEST WILL SEARCH THE EA-LINK FOR A LOG RECORD NO. 
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = FDB ADRESS 
*   A2,A3 = LOG RECORD NO 
* 
*   CF   A14,EATEST 
* 
****EXIT PARAMETERS*********************************
* 
*   A1-A3 = UNCHANGED 
*   A4 = 0   NO EA AT ALL 
*      = +1  EA FOUND FOR ACTUAL TASK 
*      = -1  EA FOUND FO R OTHER TASK 
* 
****USED REGISTERS**********************************
* 
*   A1 - A4 
	EJECT			DMSUBR 
EATEST	EQU	*
	LD	A4,FDBEAL,A1	BUFFER QUEUE 
	RF	EAT030
EAT020	EQU	*
	LDR*	A4,A4	NEXT BUFFER ADR 
EAT030	EQU	*
	RF(Z)	EAT100	EMPTY QUEUE,NO EA 
* 
*   SEARCH LOG REC NO 
* 
	CC	A2,3,A4	FIRST CHAR
	RB(NE)	EAT020
	CW	A3,4,A4	2 AND 3 CHAR
	RB(NE)	EAT020
* 
*   RECORD NO FOUND 
* 
	LC	A4,2,A4 
	CC	A4,FDBTNR,A1	TASK ID
	RF(E)	EAT060 
	LDKL	A4,-1	EA OTHER TASK 
	RF	EAT100
EAT060	EQU	*
	LDK	A4,1	EA SAME ATASK 
EAT100	EQU	*
	RTN	A14
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   EASETB WILL UNCONDITIONALLY PUT A NEW EA BUFFER IN EA-LINK
*   IF NO BUFFERS ARE AVAILABLE THE SYSTEM WILL HALT AND LITE SOP-LAMPS 
* 
****ENTRY PARAMETERS********************************
* 
*   A6 = FDB ADDR 
*   A2,A3 = LOGICAL RECORD NO 
* 
*   CF   A14,EASETB 
* 
****EXIT PARAMETERS*********************************
* 
*   A6 = FDB ADDR 
* 
****USED REGISTERS**********************************
* 
*   A1-A4,A6
* 
******************************************************* 
	EJECT			DMSUBR 
EASETB	EQU	*
	ECR	A2,A2
	LC	A2,FDBTNR,A6	TASK ID
	ECR	A2,A2
	LDR	A1,A3	LOG REC NO 
	INH
	CF	A15,GETBLK	GET BUFF AND STORE A1,A2 
* 
*   LINK BUFFER TO FDB
* 
	LD	A2,FDBEAL,A6	LINK ROOT
	STR	A2,A4	THREAD 
	ST	A4,FDBEAL,A6	NEW ROOT 
	RTN	A14
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   EARELB WILL RELEASE EA BUFFERS AND CONNRECT THEM
*   TIO THE FREE LINK.
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = FDB-ADDRESS
*   A2,A3 = LOGICAL RECORD NO 
*   A2: BIT 0=1,BIT 1=1  ALL BUFFERS WITH TASK ID SAME AS FDB 
*                        IS REMOVED.
*       BIT 0=1,BIT 1=0  ALL BUFFERS ON FDB IS REMOVED. 
*       BIT 0=0          THE FIRST BUFFER WITH TASK ID AND LOG REC NO 
*                        AS SPEC IS REMOVED.
* 
****EXIT PARAMETERS*********************************
* 
*   A1 = UNCHANGED
* 
****USED REGISTERS**********************************
* 
*   A1 - A5 
	EJECT			DMSUBR 
EARELB	EQU	*
	LDR	A5,A1
	ADKL	A5,FDBEAL	ROOT ADR
	LDR*	A4,A5	EA ROOT 
	RF	EAR030
EAR020	EQU	*
	LDR	A5,A4	SAVE OLD ROOT
	LDR*	A4,A4	NEXT BUFFER ADR 
EAR030	EQU	*
	RF(Z)	EAR100	EA LINK END 
	LDR	A2,A2	REC NO 
	RF(N)	EAR050	RELEASE MANY BUFFERS
* 
*   SEARCH LOG REC NO 
* 
	CC	A2,3,A4 
	RB(NE)	EAR020
	CW	A3,4,A4	
	RB(NE)	EAR020
	RF	EAR060
EAR050	EQU	*
	CWK	A2,/A000	CHECK BIT 1 
	RF(L)	EAR080	BIT 1 ZERO,ALL BUFFERS REMOVED
EAR060	EQU	*
* 
*   SEARCH TASK IDENT 
* 
	LC	A3,FDBTNR,A1	TAK ID 
	CC	A3,2,A4 
	RB(NE)	EAR020
* 
*   EA BUFFER FOUND 
* 
EAR080	EQU	*
	LDR*	A3,A4	NEXT BUFADR 
	STR	A3,A5	REMOVE BUFFER FROM LINK
* 
*   RETURN BUFFER TO POOL 
* 
	INH
	LD	A3,FREQUE 
	STR	A3,A4	NEXT FREE
	ST	A4,FREQUE	NEW ROOT
	LDR	A4,A5	BUFFER ROOT
	LDR	A2,A2
	RB(N)	EAR020	RELEASE MORE
EAR100	EQU	*
	RTN	A14
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   CRNGET WILL SEARCH THE CRN-LINK FOR TASK ID. IF NO BUFFER IS
*   FOUND A NEW IS FETCHED FROM THE FREE LINK AND B FILLED WITH 
*   ZEROES AND PUT ON THE CRN LINK. IF NO FREE BUFFERS ARE AVAILABLE
*   THE SYSTEM WILL HALT AND LITE SOP-LAMPS.
*   TASK ID IS PLACED IN THE BUFFER 
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = FDB ADDRESS DATA FILE
* 
****EXIT PARAMETERS*********************************
* 
*   A1 = UNCHANGED
*   A2 = ADDRESS OF FOUND CRN-BUFFER
* 
****USED REGISTERS**********************************
* 
*   A1 - A4 
	EJECT			DMSUBR 
CRNGET	EQU	*
	LD	A2,FDBCRL,A1	CRN ROOT 
	RF	CRN030
CRN020	EQU	*
	LDR*	A2,A2	NEXT BUFFER 
CRN030	EQU	*
	RF(Z)	CRN100	LINK END
* 
*   CHECK ATASK IDENT 
* 
	LC	A3,FDBTNR,A1	TASK ID
	CC	A3,CRNTID,A2
	RB(NE)	CRN020	OTHER TASK 
	RF	CRN200	BUFFER FOUND 
* 
*   GET NEW BUFFER
* 
CRN100	EQU	*
	INH
	LD	A2,CRNQUE	FREE LINK ROOT
	RF(NZ)	CRN120
	LDK	A1,3	LAMP 10 AND 11
	CF	A15,HALT	NO MORE BUFFERS
CRN120	EQU	*
	LDR*	A3,A2	NEXT FREE 
	ST	A3,CRNQUE	UPD ROOT
* 
*   FILL BUFFER WITH ZEROES 
* 
	LDKL	A3,CRBUFL	BUFFER LENGTH IN BYTES
CRN140	EQU	*
	SUK	A3,2	ZEROE WORDS 2 - N 
	RF(NP)	CRN160	BUFFER ZEROED
	LDR	A4,A2	BUFFER ADR 
	ADR	A4,A3	OFFSET IN BUFFER 
	CMR	A4 
	RB	CRN140	MORE WORDS 
* 
*   CONNECT NEW BUFFER TO LINK
* 
CRN160	EQU	*
	LC	A3,FDBTNR,A1
	SC	A3,CRNTID,A2	TASK ID
	LD	A3,FDBCRL,A1	LINK ROOT
	STR	A3,A2	THREAD 
	ST	A2,FDBCRL,A1	NEW ROOT 
CRN200	EQU	*
	RTN	A14
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   CALSNO WILL CONVERT A LOGICAL RECORD NO TO
*   SECTOR AND OFFSET 
* 
****ENTRY PARAMETERS********************************
* 
*   A1,A2 = LOGICAL RECORD NO 
*   A6 = FDB ADDR 
* 
*   CF   A14,CALSNO 
* 
****EXIT PARAMETERS*********************************
* 
*   A1 =  0 OK
*     NE 0 , ERROR =/20=END OF MEDIUM 
*   A4 = EXTENT ADDRESS 
*   A6 = UNCHANGED
*   IN FDB : FDBSNR = SECTOR NR 
*             FDBRRO = OFFSET IN SECTOR 
*             FDBCEX = CURRENT EXTENT 
* 
****USED REGISTERS**********************************
* 
*   A1 - A9 
	EJECT			DMSUBR 
CALSNO	EQU	*
* 
*   FIND SECTOR NO WITHIN FILE
* 
	LDR	A5,A6	SAVE FDB ADDR
	LDK	A6,0 
	LC	A6,FDBBLF,A5	BLOCKING FACTOR
	CF	A14,DIVMOD	A2=A1,A2//A6,A1=REMAINDER
	RF(O)	TIOD99	OVERFLOW
	LDR	A3,A2	QUOTIENT 
	LDR	A6,A5	FDB ADDR 
	LDR	A2,A1	REMAINDER
	RF(Z)	TIOD30	REST = 0
	ADK	A3,1	RECORD IN NEXT SECTOR 
	RF	TIOD40
TIOD30	LC	A2,FDBBLF,A6	LAST REC IN SECTOR 
* 
*   FIND FILE EXTENT
* 
TIOD40	EQU	*
	LDR	A4,A6
	ADKL	A4,FDBEXT	FIRST FILE EXTENT 
	LD	A9,EXTLEN,A4	LENGTH OF FIRST EXTENT 
	LDK	A5,4	NUMBER OF EXTENTS 
TIOD45	CWR	A3,A9
	RF(NG)	TIOD55	SECTOR IN THIS EXTENT
	SUK	A5,1	NO
	RF(NP)	TIODMO	EOF   ERROR RETURN 
	ADK	A4,6	NEXT EXTENT BLOCK 
	AD	A9,EXTLEN,A4	ADD LENGTH OF NEXT EXTENT
	RB	TIOD45
* 
*   SAVE CURRENT EXTENT BLOCK POINTER 
* 
TIOD55	ST	A4,FDBCEX,A6
* 
*   FIND LOGICAL SECTOR NUMBER ON DISC
* 
	SU	A9,EXTLEN,A4	NO OF SECTORS IN PREVIOUS EXTENTS
	SUR	A3,A9	SECTOR NO WITHIN EXT 
	SUK	A3,1	START FROM ZERO 
	RF(N)	TIODMO	BEFORE MEDIUM 
	AD	A3,EXTBAS,A4	SECTOR NO ON DISC
	ST	A3,FDBSNR,A6	SAVE LOGICAL SECTOR NUMBER 
*   FIND RELATIVE RECORD OFFSET WITHIN SECTOR 
* 
	LDK	A3,0 
TIOD60	SUK	A2,1	A2=RELATIVE REC NO
	RF(Z)	TIOD65	REL REC OFFS IN A3 NOW
	AD	A3,FDBRLE,A6	NO  ADD RECORD LENGTH
	ADK	A3,1	SKIP STATUS BYTE
	RB	TIOD60
TIOD99	LDR	A6,A5	FDB
TIODMO	LDK	A1,/20	END OF MEDIUM 
	RF	TIODMF
* 
*   STORE RELATIVE REC OFFSET IN FBDRRO 
* 
TIOD65	EQU	*
	LDK	A1,0	OK
	ST	A3,FDBRRO,A6
TIODMF	EQU	*
	RTN	A14
	EJECT			DMSUBR 
* 
**************
*   DMTIOT
**************
* 
*   ENTRY   DMTIOT   CHECK RETURN CODES FROM PHYS DISC I/O
* 
*   INPUT   A1 = FDB ADDRESS
* 
*   OUTPUT  A6 = FDB ADDRESS
*           A1 = 0 WHEN OK
*              = ERROR CODE ELSE
*           A9 = DM ECB ADDRESS 
*           A8 = PHYS I/O ECB ADDRESS 
*           A2 WILL BE DESTROYED
* 
*   USED REGISTERS : A1,A2,A6,A8,A9 
* 
* 
DMTIOT	EQU	*
	LDR	A6,A1	FDB ADDRESS
	LDKL	A8,FDBECB 
	ADR	A8,A6
	LD	A9,DWTECB,A6	DM ECB ADDRESS 
DMTIT0	EQU	*
	LD	A1,ECBRC,A8 
	RF(Z)	DMTIOX	DISC I/O OK 
	ANKL	A1,/FEFF
	RF(NZ)	DMTIT1	NOT ONLY RETRIES 
	LDKL	A2,/100 
	ORS	A2,ECBRC,A9	USER RC
	RF	DMTIOX
DMTIT1	EQU	*
	LD	A2,FDBDBR,A6
	ANKL	A2,/C0FF
	ST	A2,FDBDBR,A6	RELEASE BUFFER 
	LD	A2,ECBBA,A8 
*            GET BUFFER ADDR
	SUK	A2,8	BUFSTA
	CM	BUFDMI,A2	CLEAR VOL IDENT IN BUFFER 
	LDK	A1,/02	DISC IO ERROR 
	LDKL	A2,/FF7E	NOT BIT 8 OR 15
	AN	A2,ECBRC,A8 
	RF(NZ)	DMTIOX
	LD	A1,ECBRC,A8	BIT 8 OR 15 
DMTIOX	RTN	A14
	EJECT
* 
*   DMTIOZ HAS ALMOST THE SAME FUNCTION AS DMTIOT BUT 
*   ECB ADDR IS INPUT PARAM 
* 
*  IN: A1 = FDB ADDR
*   A8 = ECB ADDR 
*   OUT:
*   A1 = RET CODE 
*   A2 = DESTROYED
*   A6 = FDB ADDR 
*   A8 = ECB ADDR 
*   A9 == USER ECB
* 
DMTIOZ	LDR	A6,A1
	LD	A2,DWTOR,A6	ORDER 
	ANK	A2,/3F 
	CWK	A2,QIRN
	RF(E)	DMTIZ1	INDEXED READ NEXT 
	CWK	A2,QIRR
	RF(E)	DMTIZ1	INDEXED RANDOM READ 
	LD	A1,FDBADF,A6	FDB DATA FILE
DMTIZ1	EQU	*
	LD	A9,DWTECB,A1	USER ECB 
	RB	DMTIT0
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   GTBKBU WILL GET A BLOCK BUFFER FOR DISC I/O AND 
*   PREPARE IT. ECB IS PREPARED FOR PHYS I/O. 
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = FDB ADDRESS
*                    FDB-CEX,ECB,SNR,RRO
*                    ECB-FC,CW,BA,DWT-OR,ECB,EXTDMI 
*   A8 = ECB ADDR 
* 
****EXIT PARAMETERS*********************************
* 
*   A1 = A6 = FDB ADDR
*   A2 = FDBRRO WHEN SECTOR IS FOUND IN CORE
*                               = -1 WHEN NO DATA IS FOUND IN 
*                                 THE FOUND CORE BUFFER 
*   A3 = BUFFER ADDRESS 
*   A5 = ORDE R CODE
*   A8 = ECB ADDR 
*   A9 = DM ECB ADDR
* 
****USED REGISTERS**********************************
* 
*   A1 - A9 
* 
******************************************************
GTBKBU	EQU	*
	LDR	A6,A1	A6 = FDB ADDRESS 
	LD	A4,FDBCEX,A6	CURRENT EXTENT BLOCK POINTER 
	LD	A1,EXTDMI,A4	DMIDENT, FC
	LD	A2,FDBSNR,A6	SECTOR NUMBER
	LD	A9,DWTECB,A6	DM ECB 
	ANK	A1,/FF		=1 
	STR	A1,A8	DISC VOL FILE CODE	=1
	LDR	A4,A2	SAVE 
	LDKL	A5,SECTLE 
	ST	A5,ECBRL,A8	SECTOR LENGTH 
	CF	A14,DMTGBU	A3 := BUFFER ADDRESS 
	RF	GTB100	RETURN IF SECTOR FOUND IN BUFFER 
*			RETURN IF SECTOR MUST BE READ FROM DISC 
	LDKL	A2,-1	RET CODE
GTB040	EQU	*
	ST	A4,ECBCW,A8	SECTOR NR 
	LDR	A5,A3
	ADKL	A5,BUFSTA	A5 = DATA BUFFER START ADDRESS
	ST	A5,ECBBA,A8 
	LD	A5,DWTOR,A6 
	ANK	A5,/3F 
	LDR	A1,A6	FDB ADDRESS AS PARAMETER 
	RTN	A14
GTB100	EQU	*
	LD	A2,FDBRRO,A6	REC OFFS IN BUFFER 
	RB	GTB040	STORE ORDER CODE 
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   GTLGRN WILL CONVERT FDBSNR AND FDBRRO TO A LOGICAL RECORD NO
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = FDB ADDRESS
*            FDBSNR,FDBRRO,FDBCEX 
* 
****EXIT PARAMETERS*********************************
* 
*   A1=A5=A6= FDB ADDRESS 
*   A2,A3 = LOG RECORD NO 
* 
****USED REGISTERS**********************************
* 
*   A1 - A7 
* 
******************************************************
	EJECT			DMSUBR 
GTLGRN	EQU	*
	LDK	A6,0 
	LDKL	A3,FDBEXT 
	ADKL 	A3,EXTLEN
	ADR	A3,A1	ADDR FIRST EXT LENGTH
	LD	A7,FDBCEX,A1	EXT ADDR 
	ADKL	A7,EXTLEN	ADDR TO LAST LENGTH 
GTL050	EQU	*
	CWR	A3,A7
	RF(E)	GTL100	ALL PREVIOUS EXTENTS COUNTED
*   NOTE THAT ONLY (E) CAN BE TESTED
	ADR*	A6,A3	NO OF SECT IN EXTENT
	ADKL	A3,EXTELE	EXT ENTRY LENGTH
	RB	GTL050	NEXT EXTENT
GTL100	EQU	*
	LD	A7,FDBCEX,A1	EXT ADDR 
	SU	A6,EXTBAS,A7	TOTAL NO OF SECTORS
	AD	A6,FDBSNR,A1	TOTAL NR OF SECTORS
* 
*   CONVERT FDBRRO TO NO OF RECORDS 
* 
	LDK	A7,0 
	LC	A7,FDBBLF,A1	BLOCK FACTOR 
	LDR	A5,A1	SAVE FDB ADDR
	CF	A14,MPYMOD	A1,A2=A6*A7
	LD	A4,FDBRLE,A5
	ADK	A4,1	RECORD LENGTH 
	LDK	A7,0	RECORD COUNTER
	LD	A6,FDBRRO,A5	OFFSET IN SECTOR 
	ADK	A6,1 
GTL150	EQU	*
	ADK	A7,1	RECORD COUNTER
	SUR	A6,A4
	RB(NN)	GTL150	COUNT RECORDS IN SECTOR
* 
*   ADD SECT*BLOCFACT AND RECINCURRSECT 
* 
	ADR	A2,A7
	RF(O)	GTL160	OVERFLOW
	RF	GTL170
GTL160	EQU	*
	ANKL	A2,/7FFF	DELETE OVERFLOWBIT 
	ADK	A1,1	ADD CARRY 
GTL170	EQU	*
	LDR	A3,A2
	LDR	A2,A1
	LDR	A1,A5	FDB ADDR 
	LDR	A6,A5
	RTN	A14
	EJECT			DMSUBR 
* 
* 
	IFT	MMUPAG=1 
* 
*	M O V : U S 
* 
* THIS ROUTINE MOVES DATA FROM THE USER AREA (SENDING BUFFER) TO
* THE SYSTEM AREA (RECEIVING BUFFER). DIFFERENT WAYS OF MOVING THE DATA 
* ARE USED, DEPENDING ON WHETHER THE BUFFER ADDRESSES ARE EVEN OR NOT.
* 
* INPUT:  A1 = ADDRESS OF SENDING BUFFER (USER AREA)
*         A2 = ADDRESS OF RECEIVING BUFFER (SYSTEM AREA)
*         A3 = NUMBER OF BYTES TO BE MOVED
* 
* OUTPUT: A1-A4 ARE DESTROYED 
* 
MOV:US	LDR	A3,A3	CHECK REQUESTED LENGTH 
	RF(NP)	MVUS35	NO MOVE IF REQUESTED LENGTH <= 0 
	STR	A5,A14	SAVE A5 
	LDR	A4,A1	CHECK USER BUFFER ADDRESS
	ANK	A4,1 
	RF(NZ)	MVUS40	USER BUFFER ADDRESS UNEVEN?
	LDR	A4,A2	NO, CHECK SYSTEM BUFFER ADDRESS
	ANK	A4,1 
	RF(NZ)	MVUS55	SYSTEM BUFFER ADDRESS UNEVEN?
* 
MVUS10	LDR	A4,A3	CHECK REQUESTED LENGTH 
	ANK	A4,1 
	RF(NZ)	MVUS60	REQUESTED LENGTH UNEVEN? 
* 
MVUS20	MVUS	A3
* 
MVUS30	LDR*	A5,A14	RESTORE A5 
* 
MVUS35	RTN	A14
* 
	EJECT			DMSUBR 
* 
* 
MVUS40	EQU	*	USER BUFFER ADDRESS WAS UNEVEN 
	LDR	A4,A2	CHECK SYSTEM BUFFER ADDRESS
	ANK	A4,1 
	RF(NZ)	MVUS80	SYSTEM BUFFER ADDRESS UNEVEN?
	ELR	A4,A1	NO, GET FIRST CHAR. FROM USER BUFFER 
* 
MVUS50	SCR	A4,A2	STORE CHAR. IN SYSTEM BUFFER 
	ADK	A2,1	UPDATE SYSTEM BUFFER ADDRESS
	SUK	A3,1	DECREMENT REQUESTED LENGTH
	RB(NP)	MVUS30	LAST CHAR. MOVED?
	ADK	A1,2	NO, UPDATE USER BUFFER ADDRESS
* 
MVUS55	ELR	A4,A1	GET NEXT TWO CHAR. FROM USER BUFFER
	ECR	A5,A4
	SCR	A5,A2	STORE ONE CHAR. IN SYSTEM BUFFER 
	ADK	A2,1	UPDATE SYSTEM BUFFER ADDRESS
	SUK	A3,1	DECREMENT REQUESTED LENGTH
	RB(P)	MVUS50	MORE CHAR. TO MOVE? 
	RB	MVUS30	NO, RETURN 
* 
	EJECT			DMSUBR 
* 
* 
MVUS60	EQU	*	REQUESTED LENGTH WAS UNEVEN
	SUK	A3,1	MAKE REQUESTED LENGTH EVEN
	RF(NP)	MVUS70	ONLY ONE CHAR. TO MOVE?
	LDR	A4,A1	NO, SAVE A1
	LDR	A5,A3	SAVE A3
	MVUS	A3
	ADR	A4,A5	UPDATE USER BUFFER ADDRESS 
	ELR	A5,A4	GET LAST CHAR. FROM USER BUFFER
* 
MVUS65	ECR	A5,A5
	SCR	A5,A2	STORE LAST CHAR. IN SYSTEM BUFFER
	RB	MVUS30	RETURN 
* 
MVUS70	ELR	A5,A1	GET LAST CHAR. FROM USER BUFFER
	RB	MVUS65
* 
MVUS80	EQU	*	BOTH BUFFER ADDRESSES WERE UNEVEN
	ELR	A4,A1	GET FIRST CHAR. FROM USER BUFFER 
	SCR	A4,A2	STORE FIRST CHAR. IN SYSTEM BUFFER 
	ADK	A1,1	UPDATE BUFFER ADDRESSES 
	ADK	A2,1 
	SUK	A3,1	DECREMENT REQUESTED LENGTH
	RB(P)	MVUS10	MORE CHAR. TO MOVE? 
	RB	MVUS30	NO, RETURN 
* 
	EJECT			DMSUBR 
* 
*	M O V : S U 
* 
* THIS ROUTINE MOVES DATA FROM THE SYSTEM AREA (SENDING BUFFER) TO
* THE USER AREA (RECEIVING BUFFER). DIFFERENT WAYS OF MOVING THE DATA 
* ARE USED, DEPENDING ON WHETHER THE BUFFER ADDRESSES ARE EVEN OR NOT.
* 
* INPUT:  A1 = ADDRESS OF SENDING BUFFER (SYSTEM AREA)
*         A2 = ADDRESS OF RECEIVING BUFFER (USER AREA)
*         A3 = NUMBER OF BYTES TO BE MOVED
* 
* OUTPUT: A1-A4 ARE DESTROYED 
* 
MOV:SU	EQU	*
	LDR	A3,A3	CHECK REQUESTED LENGTH 
	RF(NP)	MVSU35	NO MOVE IF REQUESTED LENGTH <= 0 
	STR	A5,A14	SAVE A5 
	LDR	A4,A2	CHECK USER BUFFER ADDRESS
	ANK	A4,1 
	RF(NZ)	MVSU40	USER BUFFER ADDRESS UNEVEN?
	LDR	A4,A1	NO, CHECK SYSTEM BUFFER ADDRESS
	ANK	A4,1 
	RF(NZ)	MVSU60	SYSTEM BUFFER ADDRESS UNEVEN?
* 
MVSU10	LDR	A4,A3	CHECK REQUESTED LENGTH 
	ANK	A4,1 
	RF(NZ)	MVSU90	REQUESTED LENGTH UNEVEN? 
* 
MVSU20	MVSU	A3
* 
MVSU30	LDR*	A5,A14	RESTORE A5 
* 
MVSU35	RTN	A14
* 
	EJECT			DMSUBR 
* 
* 
MVSU40	EQU	*	USER BUFFER ADDRESS WAS UNEVEN 
	LDR	A4,A1	CHECK SYSTEM BUFFER ADDRESS
	ANK	A4,1 
	RF(NZ)	MVSU80	SYSTEM BUFFER ADDRESS UNEVEN?
	ELR	A4,A2	NO, GET FIRST CHAR. FROM USER BUFFER 
	RF	MVSU65
* 
MVSU60	EQU	*	SYSTEM BUFFER ADDRESS WAS UNEVEN 
	LCR	A4,A1	GET ONE CHAR. FROM SYSTEM BUFFER 
	ECR	A4,A4
	ADK	A1,1	UPDATE SYSTEM BUFFER ADDRESS
	SUK	A3,1	DECREMENT REQUESTED LENGTH
	RF(NP)	MVSU70	IS THIS LAST CHARACTER?
* 
MVSU65	LCR	A4,A1	NO, GET NEXT CHAR. FROM SYSTEM BUFFER
	ESR	A4,A2	STORE TWO CHAR. IN USER BUFFER 
	ADK	A1,1	UPDATE BUFFER ADDRESSES 
	ADK	A2,2 
	SUK	A3,1	DECREMENT REQUESTED LENGTH
	RB(P)	MVSU60	MORE CHAR. TO MOVE? 
	RB	MVSU30	NO, RETURN 
* 
MVSU70	ELR	A3,A2	GET LAST CHAR. FROM USER BUFFER
	ANK	A3,/FF	SKIP LEFT CHARACTER 
	ANKL	A4,/FF00	SKIP RIGHT CHARACTER 
	ORR	A3,A4
	ESR	A3,A2	STORE LAST CHAR. IN USER BUFFER
	RB	MVSU30	RETURN 
* 
	EJECT			DMSUBR 
* 
* 
MVSU80	EQU	*	BOTH BUFFER ADDRESSES WERE UNEVEN
	LDR*	A4,A1	GET FIRST CHAR. FROM SYSTEM BUFFER
	ELR	A5,A2	GET FIRST CHAR. FROM USER BUFFER 
	ANK	A4,/FF	SKIP LEFT CHARACTER 
	ANKL	A5,/FF00	SKIP RIGHT CHARACTER 
	ORR	A4,A5
	ESR	A4,A2	STORE FIRST CHAR. IN USER BUFFER 
	ADK	A1,1	UPDATE BUFFER ADDRESSES 
	ADK	A2,1 
	SUK	A3,1	DECREMENT REQUESTED LENGTH
	RB(P)	MVSU10	MORE CHARACTERS TO MOVE?
	RB	MVSU30	NO, RETURN 
* 
MVSU90	EQU	*	REQUESTED LENGTH WAS UNEVEN
	SUK	A3,1	MAKE REQUESTED LENGTH EVEN
	RF(NP)	MVSU95	ONLY ONE CHAR. TO MOVE?
	LDR	A4,A1	NO, SAVE A1
	LDR	A5,A3	SAVE A3
	MVSU	A3
	ADR	A4,A5	UPDATE BUFFER ADDRESSES
	ADR	A2,A5
	LDR*	A4,A4	GET LAST CHAR. FROM SYSTEM BUFFER 
	RB	MVSU70
* 
MVSU95	LDR*	A4,A1	GET LAST CHAR. FROM SYSTEM BUFFER 
	RB	MVSU70
	XIF
* 
	IFT	MMUPAG=0 
MOV:US	EQU	*	DUMMY LABELS FOR NON-MMU SYSTEMS 
MOV:SU	EQU	*
	ABL	TASHLT	HALT SYSTEM DUE TO SYSGEN ERROR 
	XIF
* 
* 
	END

Full view