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

⟦c3c380a9f⟧

    Length: 11174 (0x2ba6)
    Notes: pts_type(SC)
    Names: »TLDPGM.SC«

Derivation

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

PTS(SC)

	IDENT TLDPGM 	REL 11.0 81-01-26 870105041100 

************************************************************
*                                                          *
*                PHILIPS TERMINAL SYSTEM PTS               *
*                ===========================               *
*                                                          *
*  TLDPGM - LOAD/UNLOAD PROGRAM PROCESSOR                  *
*                                                          *
*  THIS MODULE CONTAINS THE LKM PROCESSOR USED IN TOSS     *
*  DISC PAGING SYSTEMS FOR RUNTIME PROGRAM LOADING &       *
*  UNLOADING.                                              *
*                                                          *
*  REQUEST:  LKM                                            * 
*            DATA  25                                       * 
*                                                           * 
*  REQUEST PARAMETERS:  A1=0 - UNLOAD PROGRAM REQUEST       * 
*                       A1<>0 - FILE NUMBER                 * 
*                       A7,A8 - SECTOR ADDRESS IN FILE      * 
*                                                           * 
*  RETURN PARAMETERS:  A7 UNCHANGED IF OK                   * 
*                      A7=-1 IF ILLEGAL FILE NUMBER         * 
*                                                          *
************************************************************
	EJECT
************* 
*  ENTRIES  * 
************* 
	ENTRY	TLDPGM	LOAD PROGRAM ENTRY

	EJECT
*************** 
*  EXTERNALS  * 
*************** 
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	QLTASK	QUEUE LOAD TASK ENTRY IN LDTASK 
	EXTRN	LD:ECB	LDTASK ECB AREA 
	EXTRN	LD:BUF	LOAD TASK DISC BUFFER 
	EXTRN	LD:BUE	DISC BUFFER END 
	EXTRN	LD:STB	LOAD TASK STACK BASE
	EXTRN	LKMQDI	QUEUE TASK FOR DISPATCHING
	EXTRN	QMEXIT	QUEUE TASK FOR DISPATCHING
	EXTRN	TTB:SP	SEGMENT TABLE POINTER IN TTAB 
	EXTRN	TTB:SB	SEGMENT BLOCK POINTER IN TTAB 
	EXTRN	TTB:AP	APPL. CONTROL BLOCK ADDRESS 
	EXTRN	TTB:SA	DISPATCH ADDRESS
	EXTRN	SEG:NS	NUMBER OF SEGMENTS IN SEGMENT TABLE 
	EXTRN	SEG:FC	VOLUME FILE CODE FOR SEGMENTS 
	EXTRN	SEG:EL	EFFECTIVE LENGTH
	EXTRN	FWTVOL	DISPL. TO VOLUME FILE CODE
	EXTRN	FWTEXB	FILE EXTENT BASE
	EXTRN	SCTFWT	START OF FILE WORK TABLE
	EXTRN	SCTFWL	FILE WORK TABLE LENGTH/TASK 
	EXTRN	SCTNOS	MAXIMUM NUMBER OF FILES/TASK
	EXTRN	SCTTCT	ADDRESS TO TASK CONTROL TABLE 
	EXTRN	ACBSEG	ADDRESS TO SEGMENT TABLE POOL 
	EJECT
************* 
*  EQUATES  * 
************* 
ECBFN	EQU	1	FILE NUMBER 
ECBBA	EQU	2	BUFFER ADDRESS
ECBRL	EQU	4	REQUESTED LENGTH
ECBEL	EQU	6	EFFECTIVE LENGTH
ECBRC	EQU	8	RETURN CODE 
ECBCW1	EQU	10	CONTROL WORD 1
ECBCW2	EQU	12	CONTROL WORD 2
* 
PHYRD	EQU	/91	PHYSICAL READ 
NUMSEG	EQU	10	DISPL. TO NUMBER OF SEGMENTS
	EJECT
TLDPGM	EQU	*
* 
*  SELECT LOAD/UNLOAD REQUEST 
* 
	ADK	A1,0 
	RF(NZ)	LOAD	LOAD PROGRAM REQUEST 
* 
*  UNLOAD PROGRAM PROCESSING
* 
ULD:10	EQU	*
	LD	A1,TTB:SP,A5	GET SEGMENT TABLE POINTER
	RF(Z)	ULD:40	NO PROGRAM LOADED 
	CM	TTB:SP,A5	CLEAR SEGMENT TABLE POINTER 
	CM	TTB:SB,A5	CLEAR SEGMENT BLOCK POINTER 
	LD	A2,SCTTCT	GET ADDRESS TO TCTAB
	LDR*	A3,A2	GET LENGTH OF TCTAB 
ULD:20	EQU	*
	SUK	A3,2	DECREMENT LENGTH
	RF(Z)	ULD:30	NO MOORE TASKS
	ADK	A2,2	NEXT ENTRY IN TCTAB 
	LDR*	A4,A2	GET NEXT TTAB-ADDRESS 
	LD	A4,TTB:SP,A4	GET SEGMENT TABLE POINTER
	CWR	A4,A1	SAME AS FOR CALLING TASK?
	RB(NE)	ULD:20	NO 
	RF	ULD:40
ULD:30	EQU	*
	CM	SEG:NS,A1	CLEAR NUMBER OF SEGMENTS
ULD:40	EQU	*
	ABL	LKMQDI	QUEUE TASK AND DISPATCH 
	EJECT
LOAD	EQU	*
* 
*  ACTIVATE LOAD TASK AT ENTRY LP:LST	DISPATCH ADDRESS
* 
	LDKL	A2,LP:LST	DISPATCH ADDRESS
	LDR	A3,A5	SAVE CALLING TASK TTAB-ADDRESS 
	INH
	CF	A15,QLTASK	ACTIVATE LOAD TASK 
	ENB
	ABL	TDISP	GO TO DISPATCHER 
	EJECT
* 
*  LOAD PROGRAM - RUNNING TASK IS LDTASK
* 
LP:LST	EQU	*
	LDKL	A14,LD:STB	LOAD A14 STACK BASE
	LDR	A5,A3	GET CALLING TASKS TTAB 
	ST	A1,LD:ECB+ECBFN	STORE FILE NUMBER IN ECB
	LD	A9,TTB:SA+14,A5	GET DISC ADDRESS BITS 0-15
	LD	A10,TTB:SA+16,A5	GET DISC ADDRESS BITS 16-30
	LD	A2,SCTFWT	START OF FILE WORK TABLE AREA 
LP:100	SUK	A1,1	FILE WORK TABLE FOUND?
	RF(Z)	LP:200	YES 
	AD	A2,SCTFWL	NEXT FILE WORK TABLE
	RB	LP:100
LP:200	EQU	*
	LDKL	A1,LD:BUF	GET BUFFER ADDRESS
	ST	A1,LD:ECB+ECBBA	STORE IN ECB
	LDKL	A1,256	REQUESTED LENGTH 
	ST	A1,LD:ECB+ECBRL	STORE IN ECB
	CF	A14,RDSFM	READ FIRST SECTOR 
	LC	A6,FWTEXB-1,A2	GET FILE EXTENT BASE (BITS 0-7)
	ANK	A6,/FF	ISOLATE ADDRESS 
	LD	A11,FWTEXB,A2	GET FILE EXTENT BASE (BITS 8-23)
	RF(NZ)	LP:300
	SUK	A6,1 
LP:300	SUKL	A11,1 
	CF	A14,CHIPLD	CHECK IF PROGRAM LOADED
	ADK	A1,0	A1=0 IF NO PROGRAM LOADED 
	RF(NZ)	LPMEND	PROGRAM ALREADY LOADED 
	CF	A14,GETFST	GET FREE SEGMENT TABLE 
	ADK	A1,0	A1=0 IF NO SEGMENT TABLE AVALIABLE
	RF(Z)	REQERR	IMPOSSIBLE TO LOAD PROGRAM
	LC	A2,FWTVOL,A2	GET VOLUME FILE CODE 
	SC	A2,SEG:FC+1,A1	STORE IN SEGMENT TABLE 
	LD	A3,LD:BUF+NUMSEG	GET NUMBER OF SEGMENTS 
	RF(Z)	REQERR	NO SEGMENTS!
	CW	A3,SCTNOS	COMPARE TO MAXIMUM NUMBER/TASK
	RF(G)	REQERR	TOO MANY SEGMENTS 
	ST	A3,SEG:NS,A1	STORE CURRENT NUMBER OF SEGMENTS 
	LDKL	A2,LD:BUF+NUMSEG	START OF SEGMENT BLOCKS
* 
*  STORE BLOCK 0
* 
	LDKL	A4,/8400	STATUS FOR SEGMENT 0 
	STR	A4,A1	STORE STATUS 
	CM	2,A1	CLEAR STATUS/DISC ADDRESS BIT 0-7
	CM	6,A1	CLEAR PAGE BLOCK ADDRESS 
	ADK	A1,8	START OF SEGMENT ONE
* 
*  INIT SEGMENT BLOCKS
* 
I:SBLK	SUK	A3,1 
	RF(N)	LPMEND	NO MOORE SEGMENTS!
	CF	A14,GETWSG	GET DISC ADDRESS 
	ANK	A4,/FF	CLEAR STATUS BYTE 
	ADR	A4,A6	RELOCATE DISC ADDRESS
	STR	A4,A1	STORE STATUS AND DISC ADDRESS
	ADK	A1,2	DISC ADDRESS BIT 8-22 
	CF	A14,GETWSG	GET DISC ADDRESS BITS 8-22 
	ADR	A4,A11	RELOCATE DISC ADDRESS 
	STR	A4,A1	STORE	 
	ADK	A1,2	SEGMENT LENGTH
	CF	A14,GETWSG	GET SEGMENT LENGTH 
	STR	A4,A1	STORE
	CM	2,A1	CLEAR PAGE BLOCK ADDRESS 
	ADK	A1,4	NEXT SEGMENT BLOCK
	RB	I:SBLK
	EJECT
LPMEND	EQU	*
	ABL	QMEXIT	QUEUE TASK FOR DISPATCHING

* 
*  ERROR ENTRY
* 
REQERR	LDKL	A7,-1	INDICATE REQUEST ERROR
DSKERR	ST	A7,TTB:SA+14,A5	SET RETURN CODE IN A7 
	RB	LPMEND
	EJECT
***************** INTERNAL SUBROUTINES *****************


* 
*  GETWSG - GET WORD IN S:GTAB
* 
*  ENTRY:  A2 - POINTER IN S:GTAB 
* 
*  EXIT:  A2 - ENTRY VALUE + 2
*         A4 - CONTENTS IN LOCATION POINTED AT BY A2
* 
*  SUBROUTINES:  RDSFM
* 
GETWSG	ADK	A2,2	INCREMENT S:GTAB POINTER
	CWK	A2,LD:BUE	END OF SECTOR? 
	RF(NE)	GETRTN	NOT YET
	CF	A14,RDSFM	READ NEXT SECTOR
	LDKL	A2,LD:BUF	START OF BUFFER 
GETRTN	LDR*	A4,A2	GET CONTENT 
	RTN	A14
	EJECT
* 
*  RDSFM - READ SECTOR VIA FILE MANAGEMENT
* 
*  ENTRY:  ECB CONTAINING FILE NUMBER,BUFFER ADDRESS
*          REQUESTED LENGTH AND SECTOR ADDRESS
* 
*  EXIT:  SECTOR ADDRESS IS INCREMENTED BY ONE
* 
*  WORK REGISTERS:  A7,A8 
* 
RDSFM	LDK	A7,PHYRD	LOAD ORDER 
	LDKL	A8,LD:ECB	LOAD ECB-ADDRESS
	ST	A9,LD:ECB+ECBCW1	STORE DISC ADDRESS BITS 0-15 
	ST	A10,LD:ECB+ECBCW2	STORE DISC ADDRESS BITS 16-30 
	LKM
	DATA	15
* 
*  CHECK RETURN CODE
* 
	LD	A7,LD:ECB+ECBRC	GET RETURN CODE 
	ANKL	A7,/FEFF	SKIP RETRY BIT 
	RF(Z)	RDSF10	OK! 
	ANK	A7,1	BIT 15=DISC NOT OPERABLE
	NGR	A7,A7	TAKE 2'S COMPLEMENT
	SUK	A7,2	SET ERROR RETURN CODE 
	RB	DSKERR
* 
*  INCREMENT SECTOR ADDRESS 
* 
RDSF10	ADKL	A10,1	INCR. LEAST SIGN. PART
	RF(NN)	RDSRET	OVERFLOW?
	ADKL	A9,1	INCR. MOST SIGN. PART
	RB(Z)	REQERR	ADDRESS OVERFLOW
	XRR	A10,A10	RESET CARRY
RDSRET	RTN	A14
	EJECT
* 
* 
*  CHIPLD - CHECK IF PROGRAM LOADED 
* 
*  ENTRY:  A6 - FILE EXTENT BASE BITS 0-7 
*         A11 - FILE EXTENT BASE BITS 8-23
*         LD:BUF CONTAINS FIRST SECTOR
* 
*  EXIT:  A1=0 - PROGRAM NOT LOADED 
*         A1<>0 - SEGMENT TABLE ADDRESS 
* 
*  WORK REGISTERS:  A1,A3,A4,A7,A8
* 
CHIPLD	EQU	*
	LD	A7,SCTTCT	GET ADDRESS TO TCTAB
	LDR*	A8,A7	GET LENGTH OF TCTAB 
CHPL10	EQU	*
	SUKL	A8,2	MOORE TASKS? 
	RF(Z)	CHPL50	NO! 
	ADK	A7,2	NEXT ENTRY IN TCTAB 
	LDR*	A1,A7	GET NEXT TTAB-ADDRESS 
	LD	A1,TTB:SP,A1	GET SEGMENT TABLE POINTER
	RB(Z)	CHPL10	NO SEGMENT TABLE ATTACHED 
	LD	A3,LD:BUF+12	GET DISC ADDRESS BITS 0-7
	ANK	A3,/FF	ISOLATE ADDRESS 
	ADR	A3,A6	RELOCATE ADDRESS 
	LD	A4,8,A1	GET DISC ADDRESS IN SEGMENT TABLE 
	ANK	A4,/FF	ISOLATE ADDRESS 
	CWR	A3,A4	MOST SIGNIFICANT BITS EQUAL? 
	RB(NE)	CHPL10	NO 
	LD	A3,LD:BUF+14	GET DISC ADDRESS BITS 8-23 
	ADR	A3,A11	RELOCATE
	LD	A4,10,A1	GET DISC ADDRES IN SEGMENT TABLE 
	CWR	A3,A4	LEAST SIGNIFICANT PART EQUAL?
	RB(NE)	CHPL10	NO 
	RF	CHPL90
CHPL50	EQU	*
	XRR	A1,A1	CLEAR SEGMENT TABLE POINTER
CHPL90	EQU	*
	ST	A1,TTB:SP,A5	STORE SEGMENT TABLE POINTER
	RTN	A14
	EJECT
* 
*  GETFST - GET FREE SEGMENT TABLE
* 
*  ENTRY: 
* 
*  EXIT:  A1 - SEGMENT TABLE POINTER
* 
*  WORK REGISTER:  A1,A3
* 
GETFST	EQU	*
	LD	A1,TTB:AP,A5	GET ADDRESS TO ACB 
	LD	A1,ACBSEG,A1	GET START OF SEGMENT TABLE POOL
	ADK	A1,4	SEGMENT BLOCK 0 
GFST10	EQU	*
	LD	A3,SEG:NS,A1	GET NUMBER OF SEGMENTS 
	RF(Z)	GFST30	NOT USED
GFST20	EQU	*
	LD	A1,SEG:EL,A1	GET SEGMENT TABLE LINK 
	RF(Z)	GFST40	NO MORE SEGMENT TABLES
	SUK	A1,4	ADJUST SEGMENT TABLE POINTER
	RB	GFST10	CHECK NEXT SEGTAB
GFST30	EQU	*
	ST	A1,TTB:SP,A5	STORE SEGMENT TABLE POINTER

GFST40	EQU	*
	RTN	A14	RETURN 
	END

Full view