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

⟦d03dbe9b2⟧

    Length: 30214 (0x7606)
    Notes: pts_type(SC)
    Names: »DMSUBR.SC«

Derivation

└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
    └─⟦this⟧ »TOSSWORK/DMSUBR.SC« 
└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
    └─⟦this⟧ »M:TU10/DMSUBR.SC« 
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
    └─⟦this⟧ »M:TU10/DMSUBR.SC« 

PTS(SC)

	IDENT DMSUBR 	REL 10.0 80-03-14 870105041000 

			=2 , COMMIT CHECK
			79-11-22 
			=1 , PARAM TEST COMMIT 
			79-11-05 
****************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   DMSUBR = COMMON DM-ROUTINES 
* 
* 
* 
* 
* 
* 
****************************************************
****THIS MODULE IS ACTIVATED FROM :*****************
* 
*   DMTASK,TIODM,DMTASS 
* 
*************** 
*   ENTRIES   * 
*************** 
* 
* 
	ENTRY	DMTEND,RELPRO
	ENTRY	DMTWM,DMTBM,DMTBMR,FNDFDB
	ENTRY	GETA14,DMTREM
	ENTRY	EATEST,EASETB,EARELB,CRNGET
	ENTRY	CALSNO 
	ENTRY	GTBKBU 
	ENTRY	DMTIOT 
	ENTRY	DMTIOZ 
	ENTRY	MOV:US	MOVE FROM USER TO SYSTEM AREA 
	ENTRY	MOV:SU	MOVE FROM SYSTEM TO USER AREA 
	ENTRY	MOVZUS,MOVZSU
* 
***************** 
*   EXTERNALS   * 
***************** 
* 
* 
	EXTRN	FDBEAL,FDBTNR,FDBCRL,FDBRLE,FDBSNR,FDBRRO
	EXTRN	FDBBLF,FDBADF
	EXTRN	FDBBLZ,FWTFNR
	EXTRN	FDBSTA,SCTTCT,TTB:SA,ECBEL 
	EXTRN	TTB:TD,SCTCDT,PRUN 
	EXTRN	FDBECB,DWTECB,DWTOR,BUFSTA,BUFDMI,BUFOR
	EXTRN	ECBRC,ECBFC,ECBCW,ECBBA
	EXTRN	DIVMOD,MPYMOD
	EXTRN	CRNTID 
	EXTRN	DMTGBU 
	EXTRN	CRNQUE,GETBLK,FREQUE 
	EXTRN	CRBUFL 
	EXTRN	FDBDBR 
	EXTRN	TASHLT	SYSTEM HALT ROUTINE 
	EXTRN	HALT,DSUMOD,ECBRL
	EXTRN	EOMERR,RETRIE
	EXTRN	REQER2,QTJOB,TDISP 
	EXTRN	DWTTAB,MONMMU,TTB:ID,TTB:MT
	EXTRN	QCL
	EJECT			DMSUBR			TOSSIO
* 
* 
***************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
***************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
	EJECT
* 
*   THIS ROUTINE RELEASES PROTECTION AT END OF TRANSACTION
* 
*   ENTRY : A9 = DM INTERNAL USER ID
* 
*   USED REGS A1 - A5 , A9
* 
* 
RELPRO	EQU	*	RELEASE PROTECTION 
	LDKL	A1,FDBSTA	FIRST FWT ADDR
REL050	EQU	*
	LDR*	A2,A1 
	ANK	A2,/1
	RF(Z)	REL053	NOT USED
	LDKL	A2,/C000	REMOVE BUFFERS FOR THIS TASK 
	LDKL	A5,/FF00		=2
	ANS	A5,FDBBLZ,A1	COMMIT CHECK	=2 
	CF	A14,EARELB
	ENB
REL053	EQU	*
	LDR*	A1,A1 
	ANKL	A1,/FFFE	SKIP USE BIT 
	RB(NZ)	REL050	MORE FDBS
	RTN	A14
	EJECT
*   HERE WE ENTERS FOM LKM DATA 16 , COMMIT 
* 
DMTEND	EQU	*	COMMIT 
	LDR	A6,A5	TTAB USER
	ANK	A7,/7F		=1 
	RF(Z)	DMTE10	OK ORDER
	LDKL	A7,REQER2	REQUES ERR
	RF	DMTE40	ERR
DMTE10	EQU	*
* 
*   DECIDE USER TASK ID 
* 
	LDK	A2,0 
DMTE20	LD	A1,SCTTCT	TCTAB ADDR
	ADR	A1,A2
	CW	A5,2,A1 
	RF(E)	DMTE30	FOUND 
	ADK	A2,2 
	RB	DMTE20	TRY NEXT 
DMTE30	LDR	A9,A2
	LDKL	A14,STACK	STACK BASE
	CF	A14,RELPRO	RELEASE PROTECT
DMTE40	EQU	*
	LDR	A5,A6	TTAB USER
	ST	A7,TTB:SA+14,A5	RET CODE IN A7
	INH
	CF	A15,QTJOB	RESTART USER
	ABL	TDISP
	DATA	0,0,0 
STACK	DATA	0	4 WORDS
	EJECT
* 
************
*   DMTWM  *
************
* 
*   ENTRY   DMTWM   WORD MOVE 
* 
*   INPUT   A1 = FROM ADDRESS 
*           A2 = NO OF BYTES TO BE MOVED
*           A3 = TO ADDRESS 
* 
*           A4 WILL BE DESTROYED
* 
* 
DMTWM	EQU	* 
	SUK	A2,2 
	RF(N)	DMTW10	LAST WORD MOVED 
	LDR*	A4,A1 
	STR	A4,A3
	ADK	A1,2 
	ADK	A3,2 
	RB	DMTWM 
DMTW10	ANK	A2,/01 
	RF(E)	DMTW20 
	LCR	A4,A1	MOVE LAST CHAR 
	SCR	A4,A3
DMTW20	RTN	A14
	EJECT
* 
************* 
*   DMTBM   * 
************* 
* 
*   ENTRY   DMTBM   BYTE MOVE 
* 
*   INPUT   A1 = FROM ADDRESS 
*           A2 = NO OF BYTES TO BE MOVED
*           A3 = TO ADDRESS 
* 
*           A4 WILL BE DESTROYED
* 
*   OUTPUT A3 = NEXT CHAR 
* 
* 
DMTBM	EQU	* 
	SUK	A2,1 
	RF(N)	DMTB10	LAST BYTE MOVED 
	LCR	A4,A1
	SCR	A4,A3
	ADK	A1,1 
	ADK	A3,1 
	RB	DMTBM 
DMTB10	RTN	A14
* 
*   DMTBMR HAS THE SAME FUNCTION AS DMTBM BUT 
*   MOVES FROM THE END
* 
DMTBMR	ADR	A1,A2
	ADR	A3,A2
DMTB20	SUK	A2,1 
	RB(N)	DMTB10 
	SUK	A1,1 
	SUK	A3,1 
	LCR	A4,A1
	SCR	A4,A3
	RB	DMTB20
	EJECT
****DESCRIPTION*************************************
* 
*   FNDFDB WILL SEARCH TTAB AND SCTCDT FOR A FILE CODE
* 
****ENTRY PARAMETERS********************************
* 
*   A1 = TTAB ADDR
*   A2 = FILE CODE TO SEARCH FOR
*   A5 NOT= 0  WHEN ONLY TTAB SHALL BE SEARCHED 
* 
****EXIT PARAMETERS*********************************
* 
*   A1 = UNCHANGED
*   A2 = FILE CODE. = 0 WHEN NO CODE IS FOUND 
*   A4 = TTAB/SCTCDT ENTRY ADDR WHEN CODE IS FOUND
*   A5 = 0 WHEN FOUND IN SCTCDT = 1 WHEN TTAB 
* 
****USED REGISTERS**********************************
* 
*   A1-A5 
* 
******************************************************
* 
*   LOOK FOR FILE CODE IN TTAB
* 
FNDFDB	EQU	*
	LD	A3,TTB:TD,A1	LENGTH DEV DESCR 
FND030	EQU	*
	SUK	A3,4	
	RF(NP)	FND040	FILE CODE NOT IN TTAB
	LDR	A4,A1
	ADKL	A4,TTB:TD	
	ADR	A4,A3
	CWR*	A2,A4	
	RB(NE)	FND030
	LDK	A5,1 
	RF	FND080	CODE FOUND IN TTAB 
* 
*   SEARCH FILE CODE IN SCTCDT
* 
FND040	EQU	*
	LDR	A5,A5
	RF(NZ)	FND060	ONLY TTAB IS SEACHED 
	LD*	A4,SCTCDT
FND050	EQU	*
	SUK	A4,4 
	RF(NP)	FND060	CODE NOT FOUND AT ALL
	LD	A3,SCTCDT 
	ADR	A3,A4
	CWR*	A2,A3	
	RB(NE)	FND050
	AD	A4,SCTCDT 
	RF	FND080	CODE FOUND 
FND060	EQU	*
	LDK	A2,0	NO CODE 
FND080	EQU	*
	RTN	A14
	EJECT
* 
**************
*   DMTREM   *
**************
* 
*   ENTRY   DMTREM   MOVE RECORD FROM BUFFER TO USER RECORD AREA
* 
*   INPUT   RELATIVE REC OFFSET IN FDBRRO,A6
*           BUFFER ADDRESS IN A5
*           USER REC AREA IN ECBBA,A9 
*           RECORD LENGTH IN A2 
* 
* 
* 
*   MOVE THE RECORD 
*   IF (FROM) AND (TO) ADDRESSES BOTH EVEN THEN WORD MOVE 
*   IF (FROM AND (TO) ADDRESSES BOTH ODD THEN MOVE FIRST BYTE 
*      WITH BYTE INSTRUCTIONS AND THE REST WITH WORD MOVE 
*   ELSE USE BYTE MOVE INSTRUCTIONS FOR THE WHOLE REC 
* 
DMTREM	EQU	*
	LD	A1,FDBRRO,A6
	ADR	A1,A5	FROM ADDRESS 
* 
	IFT	MMUPAG=0 
	LDR	A4,A1
	LD	A3,ECBBA,A9	TO ADDRESS
	XRR	A4,A3
	ANK	A4,/01 
	RF(Z)	DMT210	BOTH ODD OR BOTH EVEN 
	CF	A14,DMTBM	ONE ODD AND ONE EVEN
	RF	DMT225
* 
DMT210	LDR	A4,A1
	ANK	A4,/01 
	RF(E)	DMT220	BOTH EVEN 
	SUK	A2,1	BOTH ODD
	LCR	A4,A1
	SCR	A4,A3
	ADK	A1,1 
	ADK	A3,1 
DMT220	CF	A14,DMTWM	WORD MOVE 
DMT225	EQU	*
	XIF
* 
	IFT	MMUPAG=1 
	LD	A4,DWTTAB,A6	GET TTAB ADDRESS 
	LDR	A3,A2	GET LENGTH 
	LD	A2,ECBBA,A9	GET RECEIVING BUFFER ADDRESS
	CF	A14,MOV:SU	MOVE RECORD FROM SYSTEM TO USER AREA 
	XIF
* 
	RTN	A14
	EJECT
* 
*   SET UP A14 STACK
* 
GETA14	EQU	*
	LD	A14,PRUN	GET DM TTAB ADDRESS
	AD	A14,TTB:TD,A14	LENGTH DEVICE DESCR
	ADKL	A14,TTB:TD+32	STACK 
	RTN	A15	RETURN AND ENABLE
* 
	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 
	ENB
	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 
*       AND A9 = 0
*                        ARE REMOVED. 
*   A2: BIT 0=1,BIT 1=1 
*       AND A9 NOT EQ 0  ALL BUFFERS ON FDB WITH
*                        TASK ID AS SPEC IN A3 ARE RELEASED 
*       BIT 0=1,BIT 1=0  ALL BUFFERS ON FDB ARE REMOVED.
*       BIT 0=0          THE FIRST BUFFER WITH TASK ID AND LOG REC NO 
*                        AS SPEC IS REMOVED.
* 
****EXIT PARAMETERS*********************************
* 
*   A1 = UNCHANGED
* 
****USED REGISTERS**********************************
* 
*   A1 - A5,A9
* 
************************************************* 
* 
*   THE ROUTINE SETS INHIBIT
	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
	LDR	A3,A9	REQ TASK ID
	RF(NZ)	EAR065	TASK ID IN A3
EAR060	EQU	*
* 
*   SEARCH TASK IDENT 
* 
	LC	A3,FDBTNR,A1	TAK ID 
EAR065	EQU	*
	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	*
	ENB
	RTN	A14
	EJECT			DMSUBR 
****DESCRIPTION*************************************
* 
*   CALSNO WILL CONVERT A LOGICAL RECORD NO TO
*   RELATIVE
*   SECTOR AND OFFSET 
* 
****ENTRY PARAMETERS********************************
* 
*   A1,A2 = LOGICAL RECORD NO 
*   A6 = FDB ADDR 
* 
*   CF   A14,CALSNO 
* 
****EXIT PARAMETERS*********************************
* 
*   A1 =  0 OK
*     NE 0 , ERROR =/A000=END OF MEDIUM 
*   A6 = UNCHANGED
*   IN FDB : FDBSNR = SECTOR NR 
*            FDBRRO = OFFSET  IN BLOCK
* 
****USED REGISTERS**********************************
* 
*   A1 - A9 
	EJECT			DMSUBR 
CALSNO	EQU	*
* 
*   FIND BLOCK 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)	CALERR	OVERFLOW
	LDR	A3,A2	QUOTIENT 
	LDR	A9,A1	REMAINDER
	RF(Z)	TIOD30	REST = 0
	ADK	A3,1	RECORD IN NEXT BLOCK
	RF	TIOD40
TIOD30	LC	A9,FDBBLF,A5	LAST REC IN BLOCK
TIOD40	EQU	*
*   FIND LOGICAL SECTOR NUMBER ON DISC
* 
	LDR	A6,A3	BLOCK NR 
	RF(NP)	CALERR
	SUK	A6,1 
	LDK	A7,0 
	LC	A7,FDBBLZ,A5	NR OF SECT IN BLOCK
	CF	A14,MPYMOD
	ADK	A2,1 
	RF(O)	CAL050 
	RF	CAL090
CAL050	EQU	*
	ANKL	A2,/7FFF
	ADK	A1,1	CARRY 
CAL090	EQU	*
	ST	A1,FDBSNR,A5
	ST	A2,FDBSNR+2,A5	SECT NR
*   FIND RELATIVE RECORD OFFSET WITHIN BLOCK
* 
	LDK	A3,0 
	LDR	A2,A9	REL REC NR IN BLOCK
TIOD60	EQU	*
	SUK	A2,1	A2=REL REC NR 
	RF(Z)	TIOD65	REL REC OFFS IN A3 NOW
	AD	A3,FDBRLE,A5	NO  ADD RECORD LENGTH
	ADK	A3,1	SKIP STATUS BYTE
	RB	TIOD60
CALERR	LDKL	A1,EOMERR	OUT OF MEDIUM 
	RF	TIODMF
* 
*   STORE RELATIVE REC OFFSET IN FBDRRO 
* 
TIOD65	EQU	*
	LDK	A1,0	OK
	ST	A3,FDBRRO,A5
TIODMF	EQU	*
	LDR	A6,A5	FDB ADDR 
	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	*
	LDKL	A8,FDBECB 
	ADR	A8,A1
* 
*   DMTIOZ IS THE SAME AS DMTIOT WITH DIFFERENCE THAT ECB ADDR IS INPUT PAR 
* 
DMTIOZ	EQU	*
* 
*   RESTORE SECTOR NUMBER 
* 
	LD	A6,FDBSNR,A1
	ST	A6,ECBCW,A8 
	LD	A6,FDBSNR+2,A1
	ST	A6,ECBCW+2,A8 
	LDR	A6,A1
	LD	A9,DWTECB,A6	DM ECB ADDRESS 
	LD	A1,ECBRC,A8 
	RF(Z)	DMTIOX	DISC I/O OK 
	ANKL	A1,/FEFF
	RF(NZ)	DMTIT1	NOT ONLY RETRIES 
	LDKL	A2,RETRIE 
DMTIOC	EQU	*
	ORS	A2,ECBRC,A9	USER RC
	RF	DMTIOX
DMTIT1	EQU	*
	LD	A2,ECBBA,A8 
*            GET BUFFER ADDR
	SUKL	A2,BUFSTA	BUFSTA
	CM	BUFDMI,A2	CLEAR FILE NR IN BUFFER 
	LD	A2,DWTOR,A6 
	ANK	A2,/3F	ORDER 
	SUKL	A2,QCL
	RF(NZ)	DMTIOX	NOT CLOSE
	LDR	A2,A1
	LDK	A1,0 
	RB	DMTIOC
DMTIOX	RTN	A14
	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
*   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 
	LC	A1,FWTFNR,A6	FILE NR
	LD	A2,FDBSNR,A6	SECTOR NUMBER
	LD	A4,FDBSNR+2,A6
	LD	A9,DWTECB,A6	DM ECB 
	ANK	A1,/FF	
	STR	A1,A8	FILE NR
	LC	A5,FDBBLZ,A6
	SLL	A5,8	BLOCK SIZE IN BYTYE 
	ST	A5,ECBRL,A8	BLOCK LENGTH
	CF	A14,DMTGBU	A3 := BUFFER ADDRESS 
	RF	GTB100	RETURN IF SECTOR FOUND IN BUFFER 
*			RETURN IF SECTOR MUST BE READ FROM DISC 
	ST	A2,ECBCW,A8	SECT NR 
	LDKL	A2,-1	RET CODE
GTB040	EQU	*
	ST	A4,ECBCW+2,A8	SECT 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	*
	ST	A2,ECBCW,A8	SECT NR 
	LD	A2,FDBRRO,A6	REC OFFS IN BUFFER 
	RB	GTB040	STORE ORDER CODE 
	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
*         A4 = USER TTAB ADDRESS
* 
* OUTPUT: A1-A4 ARE DESTROYED 
* 
MOV:US	EQU	*
	INH
	TL	TTB:MT,A4	SET USER MMU
	LD	A4,PRUN 
	TS	TTB:MT,A4	
	ENB
	CF	A14,MOVZUS
	INH
	TL	MONMMU	SET SYSTEM MMU 
	LD	A4,PRUN 
	TS	TTB:MT,A4 
	ENB
	RTN	A14
MOVZUS	EQU	*
	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	EQU	*
	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
*         A4 = USER TTAB ADDRESS
* 
* OUTPUT: A1-A4 ARE DESTROYED 
* 
MOV:SU	EQU	*
	INH
	TL	TTB:MT,A4	SET USER MMU
	LD	A4,PRUN 
	TS	TTB:MT,A4 
	ENB
	CF	A14,MOVZSU
	INH
	TL	MONMMU	SET SYSTEM MMU 
	LD	A4,PRUN 
	TS	TTB:MT,A4 
	ENB
	RTN	A14
MOVZSU	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	*
MOVZSU	EQU	*
MOVZUS	EQU	*
	ABL	TASHLT	HALT SYSTEM DUE TO SYSGEN ERROR 
	XIF
* 
* 
	END

Full view