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

⟦00870c233⟧

    Length: 96914 (0x17a92)
    Notes: pts_type(SC)
    Names: »SYSLDM.SC«

Derivation

└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
    └─⟦this⟧ »M:DE10/SYSLDM.SC« 
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
    └─⟦this⟧ »M:DE10/SYSLDM.SC« 

PTS(SC)

	IDENT SYSLDM 	REL 10.0 80-03-31 870105041000 

			REL 10.0 80-03-17 ST 
			=5,FAULTY DISPL. TO MMU BIT MAP
			REL 10.0 80-03-14 ST 
			=4,MEM. OVERFL. NOT DET. WHEN GEN. TTAB:S
			PRR 10.0 80-01-18
			=3,SEGTAB NOT GEN. IF MMU PAGING ONLY
			PRR 10.0 79-12-21
			=2,SEGBLK/PAGBLK NOT GEN. FOR CORE RES. SEGM.
			PRR 10.0 79-12-07
			=1,UNEVEN LENGTH POSS. OF INTERNAL BUFFER
	ENTRY	SYSLDM 
*************************** 
*                         * 
*  ENTRIES AND EXTERNALS  * 
*                         * 
*************************** 
	EXTRN	FREQUE 
	EXTRN	INTLT1 
	EXTRN	INTAS
	EXTRN	INTSL
	EXTRN	REL
	EXTRN	SCLASS 
	EXTRN	SCTADA 
	EXTRN	SCTANO 
	EXTRN	SCTBLK 
	EXTRN	SCTBUG 
	EXTRN	SCTCDT 
	EXTRN	SCTDCT 
	EXTRN	SCTDMI 
	EXTRN	SCTDMT 
	EXTRN	SCTEFA 
	EXTRN	SCTFWL 
	EXTRN	SCTFWT 
	EXTRN	SCTIOE 
	EXTRN	SCTLAC 
	EXTRN	SCTLAP 
	EXTRN	SCTNFT 
	EXTRN	SCTNOF 
	EXTRN	SCTNOP 
	EXTRN	SCTOPT 
	EXTRN	SCTPAG 
	EXTRN	SCTIPL 
	EXTRN	STTPSZ 
	EXTRN	SCTPSZ 
	EXTRN	SCTSFA 
	EXTRN	SCTSTL 
	EXTRN	SCTSWB 
	EXTRN	SCTTCT 
	EXTRN	SYSBAS 
	EXTRN	SYSLOD 
	EXTRN	TCLASS 
	EXTRN	TTMJOB 
	EXTRN	DWTECH 
	EXTRN	DWTSQ
	EJECT
	EXTRN	M:REL
	EXTRN	ERROR
	EXTRN	MOVE 
	EXTRN	MULT 
	EXTRN	CMPADR 
	EXTRN	CONVRT 
	EXTRN	NXTBLK 
	EXTRN	SYSLDX 
	EXTRN	SAVE01 
	EXTRN	SAVE02 
	EXTRN	SAVE03 
	EXTRN	SAVE04 
	EXTRN	SAVE05 
	EXTRN	SAVE06 
	EXTRN	SAVE07 
	EXTRN	SAVE08 
	EXTRN	SAVE09 
	EXTRN	SAVE10 
	EXTRN	SAVE11 
	EXTRN	SAVE12 
	EXTRN	SAVE13 
	EXTRN	SAVE14 
	EXTRN	SAVE15 
	EXTRN	SAVE16 
	EXTRN	SAVE17 
	EXTRN	SAVE18 
	EXTRN	SAVE19 
	EXTRN	SAVE20 
	EXTRN	SAVE21 
	EXTRN	NUMSEG 
	EXTRN	SAVE23 
	EXTRN	SAVE24 
	EXTRN	SAVE25 
	EXTRN	SAVE26 
	EXTRN	SAVE27 
	EXTRN	SAVE28 
	EXTRN	SAVE29,SAVE30
	EXTRN	BUFSIZ 
	EXTRN	SYSBUF 
	EXTRN	PRGLG1 
	EXTRN	APPTYP 
	EXTRN	I:RSTE	DISPL. IN P:MTAB TO 
			INTERPRETER RESTART ENTRY
* 
*  TTAB DISPLACEMENTS 
* 
	EXTRN	TTB:CB	CURRENT SEGMENT BASE POINTER
	EJECT
* 
*  EXTERNAL SUBROUTINES 
* 
	EXTRN	NXTCOM 
	EXTRN	GETNUM 
	EJECT


*************************************** 
* CONDITIONAL ASSEMBLY                * 
*************************************** 

MMUPAG	EQU	0	MEMORY MANAGEMENT UNIT 
SWPBLK	EQU	0	SWAPPABLE WORK BLOCKS
DSKPAG	EQU	1	DSKPAG APPLICATION 
	EJECT
				
* 
*  CONSTANTS
* 
S:BTAB	EQU	40	DISPL. TO S:BTAB ADDRESS
UP:REC	EQU	6	RECORD LENGTH IN INITIAL S:BTAB
UPNAME	EQU	4	PROTOTYPE NAME 
WBLEN	EQU	-4	LENGTH OF WORKBLOCK
				
				
******************************* 
* SAVE01URATION FILE (SAVE01) * 
******************************* 
			 
* TASK DEFINITION BLOCK:
TDBBT	EQU	0	1A BLOCK TYPE 
TDBNT	EQU	TDBBT+1	2N NUMBER OF TASKS
TDBID	EQU	TDBNT+2	6A TASK ID START VALUE
TDBMC	EQU	TDBID+6	6A MATCHING TASK CLASS
TDBTL	EQU	TDBMC+6	6A TASK LEVEL 
TDBNC	EQU	TDBTL+6	2N NUMBER OF TERMINAL DEVICE CLASSES
* 
TDBFST	EQU	TDBNC+2	FIRST TERM DEF 
TDC	EQU	7	TERMINAL DEVICE CLASS 
TLC	EQU	6	LINE CONNECTION 
TDBREC	EQU	TDC+TLC	TDB-RECORD LENGTH
* 
SDC	EQU	7	SPECIAL DEVICE CLASS-RECORD 
* 
* COMMON DEVICE DEF. BLOCK: 
CDBBT	EQU	0	1A BLOCK TYPE 
CDBNC	EQU	CDBBT+1	2N NUMBER OF SPEC. DEV. CLASSES 
SDCFST	EQU	CDBNC+2	FIRST SDC-RECORD 
* 
* 
* USER WORK BLOCK TYPE DEF. BLOCK 
UDBBT	EQU	0	1A BLOCK TYPE 
UDBNU	EQU	UDBBT+1	3A NUMBER OF UWB TYPES
* 
UDBFST	EQU	UDBNU+3	FIRST UDB-RECORD 
NAMUWB	EQU	3	NAME OF UWB
NUMUBL	EQU	3	NUMBER OF BLOCKS 
UDBREC	EQU	NAMUWB+NUMUBL	UDB RECORD-LENGTH
	EJECT
****************
* SOP-HANDLING *
****************
SOP	EQU	/2E	DEVICE ADDRESS

LMP1	EQU	/400	LAMP 1 CODE 
LMP2	EQU	/200 
LMP3	EQU	/100 
LMP4	EQU	/80
LMP5	EQU	/40
LMP6	EQU	/20
LMP7	EQU	/10
LMP8	EQU	8
LMP9	EQU	4
LMP10	EQU	2 
LMP11	EQU	1 
			 
***************************************************************** 
*  CALL-FORMAT, PERFORMS:  CFR      A14,A13                     * 
*                          DATA     [REL-ADDRESS]               * 
*                                                               * 
***************************************************************** 
			 
			 
			 
CALL	FORM	16=/F697,16 
	EJECT
***************************************************************** 
*                CONSTANTS USED IN SYSLOD PART M                * 
***************************************************************** 
* 
*                ********** 
*                *  TTAB  * 
*                ********** 
* 
TTB:AT	EQU	-46	DISPLACEMENT TO MMU BIT MAP	=5 
TTB:MT	EQU	-38
TTB:SP	EQU	-4 
TTB:SB	EQU	-2 
TTB:ID	EQU	2
TTB:ST	EQU	4
TTB:PP	EQU	6
TTB:PW	EQU	8
TTB:SA	EQU	10 
TTB:TD	EQU	40 
	EJECT
* 
*               ********* 
*               *  DWT  * 
*               ********* 
* 
DWTCHP	EQU	0	CHANNEL PARAMETER
DWTST	EQU	2	STATUS
DWTECB	EQU	4	ECB ADDRESS
DWTOR	EQU	6	ORDER 
DWTADR	EQU	8	ADDRESS BLOCK
DWTTAB	EQU	10	TTAB ADDRESS
DWTWAT	EQU	12	WAIT/ACTIVATE INDICATOR 
DWTTQ	EQU	14	TERMINAL QUEUE 
DWTUEC	EQU	16	USER ECB ADDRESS
DWTMEC	EQU	18	MONITOR ECB ADDRESS 
	EJECT
* 
*                  ***********
*                 *  PAGTAB  *
*                  ***********
* 
PAGQF	EQU	0 
PAGQB	EQU	2 
PAGPA	EQU	4 
PAGSB	EQU	6 
	EJECT
* 
*                    *************
*                    *  SEGTAB   *
*                    *************
* 
SEGPB	EQU	6 
SEGSB	EQU	6 

	EJECT
* 
*                 ******************* 
*                 *  MISCELLANOUES  * 
*                 ******************* 
* 
BUFLEN	EQU	-4 
DEVIND	EQU	-2 
DWTLEN	EQU	6
TDCDD1	EQU	5
TDCDD2	EQU	6
LCND1	EQU	10
LCND2	EQU	11
SWBLEN	EQU	4	DISPL. TO LENGTH OF SWB
SWBSEC	EQU	6	DISPL. TO LENGTH IN SECTORS
ASZLEN	EQU	32	LENGTH OF ASCU4Z INTERRUPT TABLE
SCZLEN	EQU	16	LENGTH OF SALCUZ INTERRUPT TABLE
ASZBUF	EQU	96	LENGTH OF TEMP TABLE FOR ASCU4Z 
SCZBUF	EQU	48	LENGTH OF TEMP TABLE FOR SALCUZ 
MINBUF	EQU	1984	LENGTH OF TEMP. INT. TABLE AREA 
	EJECT
******************************************************
*                                                    *
*                                                    *
*   THIS IS THE MONITOR CONFIGURATION PROGRAM ENTRY  *
*                                                    *
*   IT IS ENTERED FROM SYSLOD WITH THE FOLLOWING     *
*   PARAMETERS:                                      *
*                                                    *
*   A1 - POINTER TO CURRENT LOCATION OF SYSLDX       *
*   A2 - POINTER TO PREVIOUS LOCATION OF SYSLDX      *
*                                                    *
*                                                    *
******************************************************
SYSLDM	EQU	*
	ST	P,SCTSFA+2	SAVE LOCATION COUNTER
	LDKL	A11,SYSBAS	GET SYSBAS START ADDRESS 
	ST	A11,SCTSFA	UPDATE START OF FREE AREA
	LDR	A8,P	INIT STACK POINTER
	ADK	A1,2	RELOCATION ROUTINE ENTRY
	CFR	A8,A1
	ST	A13,SCTEFA	UPDATE END OF FREE AREA
	LDKL	A2,TCLASS	GET ADDRESS TO TCLASS 
	CWK	A2,SCLASS	SAME AS ADDRESS TO SCLASS? 
	RF(E)	NO:TCL	YES:DUMMY TCLASS! 
	CALL	CHPTRS	RELOCATE POINTERS IN TCLASS
	ST	A2,SAVE18,A13	SAVE RELOCATED POINTER TO TCLASS
NO:TCL	LDKL	A2,SCLASS	GET ADDRESS TO SCLASS 
	CALL	CHPTRS	RELOCATE POINTERS IN SCLASS
	ST	A2,SAVE11,A13	SAVE RELOCATED POINTER TO SCLASS
* 
*  CLEAR ALL WORDS IN SYSTEM AREA 
* 
	LD	A1,SCTEFA 
	LD	A2,SCTSFA 
CLRSYS	EQU	*
	SUK	A1,2 
	CMR	A1 
	CWR	A1,A2
	RB(NE)	CLRSYS
	LDKL	A1,CONMON 
	AD	A1,M:REL,A13
	ABR	A1 
	EJECT
*********************************************** 
*  CHPTRS - CHANGE POINTERS IN TCLASS/SCLASS  * 
*********************************************** 
* 
*  ENTRY:  A2 - POINTER TO TCLASS/SCLASS
*         A11 - SYSLOD START ADDRESS
*         A12 - RELOCATION CONSTANT 
* 
*  EXIT:   A2 - POINTER TO MOVED TCLASS/SCLASS
* 
*  WORK REGISTER:A1-A7
* 
*  SUBROUTINES: 
* 
CHPTRS	EQU	*
	ADR	A2,A12	RELOCATE POINTER
	LDR	A3,A2	GET POINTER TO ORIGIN TCLASS/SCLASS
	LDR*	A4,A3	GET LENGTH OF TCLASS/SCLASS 
CHPT10	EQU	*
	SUK	A4,2	MOORE ENTRIES I TCLASS/SCLASS ? 
	RF(Z)	CHPT30	NO! 
	ADK	A3,2	NEXT ENTRY
	LDR*	A5,A3	GET POINTER TO CLASS
	ADR	A5,A12	RELOCATE
	STR	A5,A3	STORE
	LDR*	A6,A5	GET LENGTH OF CLASS 
CHPT20	EQU	*
	SUK	A6,4	MOORE DEVICES IN THIS CLASS?
	RB(NP)	CHPT10	NO!
	ADK	A5,4	NEXT DEVICE 
	LDR*	A7,A5	GET DWT-ADDRESS 
	LDR	A9,A7	GET DWT-ADDRESS
	CALL	CMPADR	COMPARE ADDRESSES
	RB(G)	CHPT20	DWT IN DRIVER!
	ADR	A7,A12	RELOCATE
	STR	A7,A5	STORE RELOCATED DW-ADDRESS 
	LD	A8,SCTOPT	GET OPTION WORD 
	ANKL	A8,1	MMU IN SYSTEM? 
	RB(Z)	CHPT20	NO! 
	LD	A8,DWTMEC,A7	GET MONITOR ECB ADDRESS
	LDR	A9,A8	GET MONITOR ECB ADDRESS
	ANKL	A9,1	ADDRESS ALREADY RELOCATED? 
	RB(NZ)	CHPT20	YES! 
	ADR	A8,A12	RELOCATE
	ADKL	A8,1	INDICATE DWT-ADDRESS RELOCATED 
	ST	A8,DWTMEC,A7	STORE RELOCATED ADDRESS
	RB	CHPT20
CHPT30	EQU	*
	RTN	A14
 EJECT
**************************************************
*  B:TCT - BUILD TASK CONTROL TABLE              *
**************************************************
* 
*  REFERENCED IN: MONCON
* 
*  ENTRY: SAVE01 - START OF SAVE01URATION DATA
* 
*  EXIT:  A6 - START OF TC:TAB
*         A7 - LENGTH OF TC:TAB 
* 
*  WORK REGISTERS:  A2,A3 
* 
*  SUBROUTINES: 
* 
*               TASK CONTROL TABLE LAYOUT 
*               _________________________ 
*              I       LENGTH            I
*               _________________________ 
*              I       TTMJOB            I
*               _________________________ 
*              I    MONITOR TASKS        I
*               _________________________ 
*              I      USER TASKS         I
*              __________________________ 
* 
	EJECT
B:TCT	EQU	* 
	ST	P,SAVE03,A13	TEMPORARY STORAGE FOR ASCU4Z I.T.
	LD	A11,SAVE01,A13	GET START OF SAVE01URATION DATA
	LD	A7,SCTSFA	GET START OF FREE AREA
	LDR	A6,A7	SAVE 
	LDKL	A2,TTMJOB	GET TTMJOB ADDRESS
	ST	A2,2,A7	STORE IN TC:TAB 
	ADK	A7,4	CONTINUE WITH MONITOR TASKS 
	LD	A2,SCTOPT	ANY OPTIONS AVALIABLE?
	RF(Z)	BTCT15	NO! 
*********************************************************** 
*  RESERV ENTRIES IN TC:TAB IF CERTAIN OPTIONS AVALIABLE  * 
*  - TO BE PROVIDED                                       * 
*********************************************************** 
	EJECT
BTCT15	EQU	*
	LD	A2,SCTDMT	DATA MANAGEMENT?
BTCT20	ANK	A2,/F	MOORE DM-TASKS?
	RF(Z)	BTCT30	NO! 
	SRC	A2,1	CHECK NEXT
	RF(NN)	BTCT25	NOT INCLUDED 
	ADK	A7,2	RESERV ENTRY FOR DM-TASK D0 
BTCT25	RB	BTCT20
BTCT30	EQU	*
* 
*  COMPUTE NUMBER OF TASKS AND RESERV SPACE IN TC:TAB 
* 
*  A11 - POINTER TO TASK DEFINITION BLOCK 
* 
	ST	A7,SAVE13,A13	SAVE CURRENT USER TASK ENTRY
	ST	A7,SAVE02,A13	FIRST USER TASK ENTRY 
	LCR	A2,A11	GET BLOCK TYPE
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RF(E)	BTCT35	YES 
	LDKL	A1,LMP4	FORMAT ERROR
	CALL	ERROR	HALT
BTCT35	EQU	*
* 
*  COMPUTE NUMBER OF TASK IN EACH TASK CLASS
* 
BTCT40	EQU	*
	CALL	GETTSK	GET NUMBER OF TASKS
BTCT50	EQU	*
	ADK	A7,2	RESERV ANOTHER ENTRY IN TC:TAB
	CW	A7,SCTEFA	CHECK IF MEMORY LEFT
	RF(NE)	BTCT55	YES! 
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
BTCT55	EQU	*
	SUK	A1,1	MOORE TASKS IN THIS CLASS?
	RB(P)	BTCT50	YES 
	CALL	NXTBLK	SKIP TO NEXT BLOCK 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	BTCT40	YES 
* 
*  ENTRIES FOR ALL USER TASKS RESERVED IN TC:TAB
* 
	ST	A7,SCTSFA	UPDATE END OF FREE AREA 
	SUR	A7,A6	LENGTH OF TC:TAB 
	STR	A7,A6	STORE LENGTH IN TC:TAB 
	ST	A6,SCTTCT	STORE POINTER TO TC:TAB 
	RTN	A14
	EJECT
*************************************************** 
*                                                 * 
*          B:FWT - BUILD FILE WORK TABLE          * 
*          =============================          * 
*                                                 * 
*************************************************** 
*                                                 * 
*  REFERENCED IN:  CONMON                         * 
*                                                 * 
*  ENTRY:  SCTNFT - NUMBER OF FM-FILES PER TASK   * 
*          SCTNOF - NUMBER OF GENERAL FM-FILES    * 
*          SCTFWL - FILE WORK TABLE LENGTH IN     * 
*                   BYTES                         * 
*                                                 * 
*  EXIT:   SCTFWT - ADDRESS TO FIRST FWT          * 
*          SCTNOF - TOTAL NUMBER OF FM-FILES      * 
*                                                 * 
*  WORK REGISTERS:  A2,A3                         * 
*                                                 * 
*  SUBROUTINES:  ERROR,MULT                       * 
*                                                 * 
*  FUNCTIONAL DESCRIPTION:                        * 
*  THIS SUBROUTINE RESERVES MEMORY AREA FOR       * 
*  FILE WORK TABLES.                              * 
*  SIZE OF THE AREA RESERVED IS GIVEN BY THE      * 
*  FORMULA:  A=L*(G+N*T)                          * 
*  WHERE     A=AREA SIZE IN BYTES                 * 
*            L= FWT LENGTH IN BYTES               * 
*            G=NUMBER OF GENERAL FM-FILES         * 
*            T=NUMBER OF FM-FILES PER TASK        * 
*            N=NUMBER OF USER TASKS               * 
*                                                 * 
*************************************************** 
	EJECT
B:FWT	EQU	* 
	LD*	A2,SCTTCT	GET LENGTH OF TCTAB
	AD	A2,SCTTCT	COMPUTE END OF TCTAB
	SU	A2,SAVE02,A13	LENGTH OF USER PART 
	SRL	A2,1	NUMBER OF USER TASKS
	LD	A3,SCTNFT	GET NUMBER OF FM-FILES PER TASK 
	CALL	MULT	MULTIPLY 
	AD	A3,SCTNOF	ADD NUMBER OF GENERAL FM-FILES
	ST	A3,SCTNOF	STORE TOTAL NUMBER OF FM-FILES
	LD	A2,SCTFWL	GET FILE WORK TABLE LENGTH
	CALL	MULT	MULTIPLY 
	SRL	A3,1	NUMBER OF WORDS TO BE RESERVED
	ADK	A3,0	ANY FWT:S AT ALL? 
	RF(Z)	FWT70	NO!
	ST	A3,SAVE05,A13	SAVE FWT AREA SIZE IN WORDS 
	LD	A2,SCTSFA	GET START OF FREE AREA
	ST	A2,SCTFWT	STORE ADDRESS TO FIRST FWT
FWT50	CW	A2,SCTEFA	MEMORY OVERFLOW? 
	RF(NE)	FWT60	NOT YET!
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
FWT60	ADK	A2,2	RESERVE ANOTHER WORD 
	SUK	A3,1	DECREMENT WORD COUNTER
	RB(NZ)	FWT50	CHECK IF MEMORY OVERFLOW
	ST	A2,SCTSFA	UPDATE START OF FREE AREA 
FWT70	RTN	A14 
	EJECT
**************************************
*  MONBLK - GENERATE MONITOR BLOCKS  *
**************************************
* 
*  NUMBER OF BLOCKS TO BE GENERATED:
*  20+N*(NUMBER OF TASKS IN SYSTEM) 
*  WHERE N IS A SYSTEM CONSTANT 
*  DEFINED AT SYSTEM GENERATION 
* 
* 
*  REFERENCED IN: SYSLOD
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
*          SCTEFA - END OF FREE AREA
* 
*  EXIT:   BLOCKS - POINTER TO FIRST BLOCK
* 
*  WORK REGISTERS:  A1,A2,A7,A12
* 
*  SUBROUTINES:  BLKGEN 
* 
	EJECT
MONBLK	EQU	*
	LDK	A1,0 
	LD	A12,SCTSFA	START OF FREE AREA 
	ST	A12,FREQUE	SAVE POINTER TO FIRST BLOCK
* 
*  GET NUMBER OF TASKS IN SYSTEM
* 
	LD*	A7,SCTTCT	GET LENGTH OF TC:TAB 
* 
*  GET NUMBER OF BLOCKS PER TASK TO GENERATE
* 
	LD	A2,SCTBLK 
MON:10	EQU	*
	SUK	A7,2	MOORE TASKS?
	RF(Z)	MON:20	 NO 
	CALL	BLKGEN
	RB	MON:10
MON:20	EQU	*
* 
*  GENERATE 19 MOORE BLOCKS 
* 
	LDK	A2,19
	CALL	BLKGEN
* 
*  GENERATE END BLOCK 
* 
	STR	A1,A12 
	ST	A1,2,A12
	ST	A1,4,A12
* 
*  CHECK IF BUFFER GREATER THAN 3 WORDS RESERVED FOR SYSLOD PART A
*  IF NOT - USE LAST MONITOR BLOCK AS BUFFER
* 
	LD	A1,BUFSIZ,A13	GET BUFFER SIZE 
	CWK	A1,6	>6? 
	RF(NL)	MON:30	NOT LESS ANYWAY! 
	LDK	A1,6	BUFFER  SIZE
	ST	A1,BUFSIZ,A13	STORE 
	ST	A12,SYSBUF,A13	START OF BUFFER
MON:30	EQU	*
	ADKL	A12,6 
	LD	A2,SCTSFA 
	SUK	A2,2 
MON:40	ADK	A2,2 
	CW	A2,SCTEFA 
	RF(NE)	MON:50
	LDKL	A1,LMP3 
	CALL	ERROR 
MON:50	CWR	A2,A12 
	RB(NE)	MON:40
	ST	A12,SCTSFA	UPDATE END OF FREE AREA
	RTN	A14
	EJECT
************************************* 
*  BLKGEN - GENERATE MONITOR BLOCK  * 
************************************* 
* 
*  REFERENCED IN:  MONBLK 
* 
*  ENTRY:  A1=0 
*          A2 - NUMBER OF BLOCKS TO BE GENERATED
*         A12 - NEXT FREE ENTRY 
* 
*  EXIT:  A1=0
*        A12 - NEXT FREE ENTRY
* 
*  WORK REGISTES: A3
* 
*  SUBROUTINES: 
* 
*                       MONITOR BLOCK LAYOUT
*                       --------------------
*                       I     DATA  *+6    I
*                       --------------------
*                       I     DATA  0      I
*                       --------------------
*                       I     DATA  0      I
*                       --------------------
* 
	EJECT
BLKGEN	EQU	*
	LDR	A3,A2		
BLK:10	EQU	*
	RF(Z)	BLKEX
	ADKL	A12,6 
	ST	A12,-6,A12
	ST	A1,-4,A12 
	ST	A1,-2,A12 
	SUK	A3,1 
	RB	BLK:10
BLKEX	EQU	* 
	RTN	A14
	IFF	MMUPAG+DSKPAG=0	=3 
	EJECT
************************************
*   SEGGEN - BUILD SEGMENT TABLE   *
************************************
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
*          SCTEFA - END OF FREE AREA
*          SCTLAC - START OF APPLICATION
* 
*  EXIT:  SCTPAG - ADDRESS TO PAGE TABLE
* 
*  WORK REGISTERS:  A1-A12
* 
*  SUBROUTINES:  GETCON 
* 
	EJECT
SEGGEN	EQU	*
* 
*  CHECK APPLICATION TYPE 
* 
	LD	A1,APPTYP,A13	GET LANGUAGE TYPE 
	CWK	A1,'CR'
	RF(E)	SEG:05	CREDIT APPLICATION
	CWK	A1,'CO'
	RF(E)	SEG:05	COBOL APPLICATION 
	RF	SEGEX 
* 
*  BUILD SEGMENT TABLE
* 
SEG:05	LD	A12,SCTSFA	START OF FREE AREA 
	LD	A1,SCTIPL	GET PROGRAM LOAD DEVICE 
	STR	A1,A12	STORE IN SEGTAB 
	ADKL	A12,2	START OF SEGMENT BLOCKS 
	LD	A1,SAVE29,A13	GET NUMBER OF SEGMENTS
	STR	A1,A12	SAVE
	ADKL	A12,2 
	ST	A12,SAVE30,A13	START OF SEGMENT TABLE 
	LDKL	A1,/8400	STATUS FOR FIRST BLOCK 
	STR	A1,A12	STORE IN FIRST BLOCK
	LD	A2,SCTLAC	GET LOGICAL ADDRESS TO COMMON PART
	CALL	GETCON	GET POINTER TO P:MTAB
	LDR	A2,A1	SAVE POINTER 
	ADKL	A2,6	ADDRESS TO P:BAS 
	CALL	GETCON	GET P:BAS
	ST	A1,2,A12	 STORE IN FIRST BLOCK
	ADKL	A12,8	BYPASS FIRST BLOCK
	LD	A2,SCTLAC	GET LOGICAL ADDRESS TO COMMON PART
	ADKL	A2,NUMSEG	GET NUMBER OF SEGMENTS
	LD	A4,SAVE29,A13	GET NUMBER OF SEGMENTS
	RF(Z)	SEG:50	NO SEGMENTS!
	ADK	A2,2	FIRST SEGMENT BLOCK 
SEG:10	EQU	*		
	LDK	A7,0	STATUS
	CALL	GETCON
*	LDR	A3,A1	SAVE DISC ADDRESS	=REL 11 
*	ANK	A3,/FF	CLEAR LEFT BYTE	=REL 11
	SRL	A1,8	PROGRAM TYPE TO RIGHT BYTE	=2 
	CCK	A1,'RR'	CORE RESIDENT SEGMENT? 
	RF(E)	SEG:30	YES!
	LD	A1,SCTOPT	GET OPTION WORD 
	ANK	A1,2	DISC PAGING?
	RF(NZ)	SEG:35	YES! 
	XRR	A3,A3
	LDKL	A7,/8800
	ADK	A2,2 
	RF	SEG:40
SEG:30	EQU	*
	LDKL	A7,/8800	INDICATE LOADED IN CORE
SEG:35	EQU	*
	ADK	A2,2	SEGMENT ADDRESS 
	CALL	GETCON
* 
	AD	A1,SCTADA+2 
	RF(O)	SEG:36 
	RF	SEG:38
SEG:36	ADK	A3,1 
	ANKL	A1,/7FFF
SEG:38	AD	A3,SCTADA 
	CWK	A3,255 
	RF(NG)	SEG:40
	LDKL	A1,LMP10
	CALL	ERROR 
SEG:40	EQU	*
*	ORR	A7,A3		=REL 11
	STR	A7,A12 
	ST	A1,2,A12
	ADK	A2,2	EFFECTIVE LENGTH
	CALL	GETCON
	ST	A1,4,A12	SAVE EFFECTIVE LENGTH
	ADKL	A12,8	NEXT SEGMENT BLOCK
	ADK	A2,2	NEXT BLOCK IN S:GTAB
	SUK	A4,1	DECREMENT NUMBER OF SEGMENTS
	RB(P)	SEG:10 
SEG:50	LD	A2,SCTSFA 
	SUK	A2,2 
SEG:60	ADK	A2,2 
	CW	A2,SCTEFA 
	RF(NE)	SEG:70
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
SEG:70	CWR	A2,A12 
	RB(NE)	SEG:60
	ST	A12,SCTSFA
SEGEX	EQU	* 
	RTN	A14	RETURN 
	XIF
	IFT	SWPBLK=1 
	EJECT
*************************************************************** 
*                                                             * 
*                                                             * 
*                                                             * 
*          B:SWBT - BUILD SWAPPABLE WORK BLOCK TABLE          * 
*          =========================================          * 
*                                                             * 
*          REFERENCED IN:  SYSLDM                             * 
*                                                             * 
*          ENTRY:                                             * 
*                                                             * 
*          EXIT:                                              * 
*                                                             * 
*          WORK REGISTERS:  A1-A12                            * 
*                                                             * 
*          REGISTER USAGE:  A8 - DISC ADDRESS TO FIRST COPY   * 
*                           A9 - ADDRESS TO S:BTAB PROTOTYPE  * 
*                           A10 - SWB BLOCK POINTER           * 
*                           A11 - POINTER IN CONF. FILE       * 
*                           A12 - ADDRESS TABLE POINTER       * 
*                                                             * 
*          SUBROUTINES:  ERROR,GETNUM,GETCON                  * 
*                                                             * 
*                                                             * 
*************************************************************** 
	EJECT
B:SWBT	EQU	*
	LD	A12,SCTSFA	START OF FREE AREA 
	LD	A11,SAVE01,A13	START OF CONFIGURATION FILE
* 
*  SEARCH FOR SWB TYPE DEFINITION BLOCK IN CONF. FILE 
* 
BSWT10	CALL	NXTBLK	GET NEXT BLOCK 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	BSWT10	YES!
	CCK	A2,'CC'	COMMON DEVICE DEFINITION BLOCK?
	RF(NE)	BSWT20	NO!
	ADKL	A11,1 
	CALL	NXTCOM	SKIP COMMON BLOCK
BSWT20	CCK	A2,'UU'	UWB TYPE DEFINITION BLOCK? 
	RF(NE)	BSWT40	NO!
	ADKL	A11,1	NUMBER OF TYPES 
	LDR	A6,A11 
	CALL	GETNUM	NUMBER OF UWB RECORDS
	LDR	A1,A5	SAVE 
	RF(Z)	SWBERR	ILLEGAL NUMBER!!! 
	ADKL	A11,UDBFST-1	FIRST UWB RECORD 
BSWT30	ADKL	A11,6	BYPASS UWB RECORD 
	SUK	A1,1	DECR. NUMBER OF TYPES 
	RB(P)	BSWT30	MOORE LEFT
	LCR	A2,A11	GET NEXT CHAR. IN CONF.FILE 
BSWT40	CCK	A2,'SS'	SWB TYPE DEFINITION BLOCK
	RF(E)	BSWT44	YES!
	LDKL	A1,0	NO SWB DEFINITION BLOCK! 
	ST	A1,SCTSWB	CLEAR SWB POINTER 
	RTN	A14
BSWT44	ADKL	A11,1	NUMBER OF TYPES 
	ST	A11,SAVE23,A13	START OF CONF. DATA
	LDR	A6,A11 
	CALL	GETNUM	GET 3 DIGITS 
	LDR	A5,A5	ZERO?
	RF(Z)	SWBERR	ILLEGAL NUMBER!!! 
	ST	A5,SAVE24,A13	SAVE NUMBER OF RECORDS
	LD	A8,SCTSWB	GET ADDRESS TO $SWAPP 
	RF(NZ)	BSWT48	FILE CREATED 
SWBERR	LDKL	A1,LMP6	SWB ERROR!
	CALL	ERROR 
BSWT48	ST	A12,SCTSWB	SAVE ADDRESS TO ADDRESS TABLE
	CM	SAVE14,A13	RESET SWP-BLOCK COUNTER
	ADKL	A12,2	FIRST POINTER 
	LDR	A10,A12	SAVE 
BSWT50	ADKL	A10,2	BYPASS POINTER
	SUK	A5,1	DECREMENT NUMBER OF TYPES 
	RB(P)	BSWT50 
* 
*  GET ADDRESS TO S:BTAB PROTOTYPE
* 
	LD	A2,SCTLAC	S:GTAB ADDRESS
	CALL	GETCON	GET P:MTAB ADDRESS 
	LDR	A2,A1	SAVE 
	ADKL	A2,S:BTAB	DISPL. TO S:BTAB ADDRESS
	CALL	GETCON	GET S:BTAB ADDRESS 
	LDR	A2,A1	GET ADDRESS TO PROT. S:BTAB
	RB(Z)	SWBERR	NO SWB:S IN APPLICATION!
	ADK	A1,2	ADDRESS TO NAME 
	ST	A1,SAVE21,A13	SAVE
	SUK	A2,2	ADDRESS TO LENGTH OF PROT. S:BTAB 
	CALL	GETCON	GET LENGTH OF PROT. S:BTAB 
	LDR	A4,A1	SAVE 
	SUK	A4,2	SKIP LENGTH WORD
	LDKL	A9,0	RESET BLOCK COUNTER
BSWT60	STR	A10,A12	SAVE POINTER TO BLOCK
	ST	A4,SAVE19,A13	SAVE
	LD	A11,SAVE23,A13	START OF CONF. DATA
	LD	A7,SAVE24,A13	NUMBER OF SWB RECORDS 
BSWT65	LD	A2,SAVE21,A13	NAME RECORD IN PROT.
	CALL	GETCON	GET TWO FIRST CHAR.
	ADKL	A11,NAMUWB	NAME IN CONF. FILE 
	LCR	A3,A11	GET FIRST CHAR. 
	SLL	A3,8	MOVE TO LEFT BYTE 
	LC	A3,1,A11	GET SECOND CHAR. 
	CWR	A1,A3	TWO FIRST CHAR. EQUAL? 
	RF(NE)	BSWT70	NO!
	ADK	A2,2	NEXT CHAR. IN PROT. 
	CALL	GETCON	GET THIRD CHAR.
	SRL	A1,8	ISOLATE CHAR. 
	LC	A3,2,A11	GET THIRD CHAR. FROM CONF. FILE
	ANK	A3,/FF	ISOLATE CHAR. 
	CWR	A1,A3	THIRD CHAR. EQUAL? 
	RF(E)	BSWT75	YES!
BSWT70	ADKL	A11,NAMUWB	SKIP NAME
	SUK	A7,1	DECREMENT NUMBER OF TYPES 
	RB(P)	BSWT65	NEXT TYPE 
* 
*  NO MATCHING NAME IN CONFIGURATION FILE - RESET ALL WORDS IN THIS BLOCK 
* 
	STR	A7,A10	1:ST WORD 
	ST	A7,2,A10	2:ND WORD
	ST	A7,4,A10	3:RD WORD
	ST	A7,6,A10	4:TH WORD
	RF	BSWT95
BSWT75	EQU	*
* 
*  MATCHING NAME FOUND
* 
	ADKL	A11,NAMUWB	NUMBER OF COPIES 
	LDR	A6,A11 
	LDR	A3,A2	SAVE POINTER 
	CALL	GETNUM	GET NUMBER OF COPIES 
	SLL	A5,8	NUMBER OF COPIES IN LEFT BYTE 
	OR	A5,SAVE26,A13	DISC ADDRESS BITS 0-7 IN RIGHT BYTE 
	STR	A5,A10	STORE IN SWB BLOCK
	SRL	A5,8	NUMBER OF COPIES TO RIGHT BYTE
	LD	A8,SAVE25,A13	GET DISC ADDRESS BITS 8-22
	ST	A8,2,A10	SAVE 
	LDR	A2,A3	RESTORE POINTER
	SUK	A2,UPNAME	PROTOTYPE ADDRESS
	CALL	GETCON	GET PROTOTYPE ADDRESS
	LDR	A2,A1	SAVE 
	SUK	A2,UPNAME	LENGTH OF WORKBLOCK
	CALL	GETCON
	ST	A1,SWBLEN,A10	STORE LENGTH OF SWB 
BSWT85	LD	A3,SWBLEN,A10	GET LENGTH OF BLOCK 
	LDK	A1,0	RESET SECTOR COUNTER
BSWT86	IM	SAVE25,A13	INCREMENT SECTOR ADDRESS 
	RF(O)	BSWT88 
	RF	BSWT90
BSWT88	IM	SAVE26,A13
	CM	SAVE25,A13
BSWT90	EQU	*
	ADK	A1,1	INCREMENT SECTOR COUNTER
	SUKL	A3,256	DECREMENT LENGTH 
	RB(P)	BSWT86	MOORE SECTORS?
	SUK	A5,1	MOORE COPIES? 
	RB(P)	BSWT85	YES!
	ST	A1,SWBSEC,A10	STORE SECTOR LENGTH 
	IM	SAVE14,A13	INCREMENT SWP-BLOCK COUNTER
	LD	A8,SAVE26,A13 
	CW	A8,SAVE28,A13 
	RB(G)	SWBERR	$SWAP-FILE TOO SMALL! 
	RF(L)	BSWT95 
	LD	A8,SAVE25,A13 
	CW	A8,SAVE27,A13 
	RF(G)	BSWT98	SWAPP-FILE TOO SMALL! 
BSWT95	ADKL	A10,8	START OF NEXT BLOCK 
	ADKL	A12,2	NEXT POINTER
	ADKL	A9,1	INCREMENT BLOCK COUNTER
	LD	A2,SAVE21,A13	CURRENT RECORD IN PROT. S:BTAB
	ADK	A2,UP:REC	NEXT RECORD IN PROT. S:BTAB
	ST	A2,SAVE21,A13	SAVE
	LD	A4,SAVE19,A13	GET LENGTH OF PROT. S:BTAB
	SUK	A4,UP:REC	DECREMENT
	RB(P)	BSWT60	MOORE TYPES 
	LD	A8,SAVE14,A13	ANY BLOCKS GENERATED? 
	RF(NE)	BSWT99	YES
BSWT98	LDKL	A1,LMP6 
	CALL	ERROR	SWB ERROR!
BSWT99	ST*	A9,SCTSWB	SAVE NUMBER OF SWB TYPES 
	ST	A10,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14
	XIF
	EJECT
************************************************* 
*   B:DMTT - BUILD DATA MANAGEMENT TASK TABLES  * 
************************************************* 
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
*          SCTTCT - ADDRESS TO TC:TAB 
*          SCTDMT - DATA MANAGEMENT INDICATOR 
* 
*  EXIT:
* 
*  WORK REGISTERS:  A1,A3,A5,A7,A12 
* 
*  SUBROUTINES: DMTGEN
* 
B:DMTT	EQU	*
	LD	A12,SCTSFA	GET START OF FREE AREA 
	LD	A7,SCTTCT	GET POINTER TO TC:TAB 
	ADK	A7,4	FIRST DM-TASK ENTRY 
	LD	A3,SCTDMT	 DATA MANAGEMENT? 
	LD	A6,SCTDMI	GET INDEX BUFFER RECORD SIZE
	LDKL	A5,'#D'	DM-TASK ID
DMTT20	EQU	*
	ANK	A3,/F	MOORE DM-TASKS?
	RF(Z)	DMTTEX	NO! 
	SRC	A3,1 
	RF(NN)	DMTT30
	CALL	DMTGEN
DMTT30	EQU	*
	ADK	A5,1 
	RB	DMTT20
DMTTEX	EQU	*
	RTN	A14
	EJECT
**************************************************
*  DMTGEN - GENERATE DATA MANAGEMENT TASK TABLE  *
**************************************************
* 
*  ENTRY:  A1 - TASK ID 
*          A6 - INDEX RECORD BUFFER SIZE
*          A7 - TCTAB ENTRY FOR CURRENT TASK
*         A12 - START OF FREE AREA
* 
*  EXIT:
* 
*  WORK REGISTERS: A2,A4
* 
*  SUBROUTINES: 
* 
DMTGEN	EQU	*
	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,1	MMU OPTION? 
	RF(Z)	DMTG20	NO! 
	LDK	A4,0	RESET PAGE POINTER
DMTG10	EQU	*
	CWK	A4,/4000	LAST PAGE?
	RF(E)	DMTG30	YES!
	STR	A4,A12	STORE PAGE POINTER
	ADKL	A4,/400	INCREMENT PAGE POINTER
	ADKL	A12,2	INCREMENT MMU ENTRY POINTER 
	RB	DMTG10
DMTG20	EQU	*
	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,2	DISC PAGING?
	RF(Z)	DMTG40	NO! 
DMTG30	EQU	*
	LD	A1,SAVE30,A13	GET ADDRESS TO SEG.TABLE
	STR	A1,A12	STORE TTB:SP
	ADKL	A12,6 
DMTG40	EQU	*
	STR	A12,A7	STORE TTAB ENTRY POINTER IN TC:TAB
	ADK	A7,2	NEXT ENTRY IN TC:TAB
	ST	A5,TTB:ID,A12	TASK IDENTIFICATION 
	LDKL	A1,/0031	TASK LEVEL 
	ST	A1,TTB:ST,A12	STORE 
	SLL	A1,10	MOVE LEVEL TO LEFT BYTE
	ORKL	A1,/00C0	PROGRAM STATUS 
	ST	A1,TTB:PW,A12	STORE IN TTAB 
	ADKL	A12,40	TERMINAL DEVICES 
	LDK	A1,6	LENGTH
	STR	A1,A12	STORE 
	ADKL	A12,40	TASK STACK+2 
	LDR	A1,A6	GET INDEX RECORD BUFFER SIZE 
	SLL	A1,2	MULTIPLY BY 4 
	ADR	A12,A1	RESERV SPACE FOR BUFFERS
	LD	A2,SCTSFA 
	SUK	A2,2 
DMTG50	ADK	A2,2 
	CW	A2,SCTEFA	CHECK IF MEMORY OVERFLOW
	RF(NE)	DMTG60	NO!
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
DMTG60	CWR	A2,A12 
	RB(NE)	DMTG50
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14
	EJECT
******************************
*  B:TT - BUILD TASK TABLES  *
******************************
* 
*  REFERENCED IN: MONCON
* 
*  ENTRY:  SAVE01 - START OF SAVE01URATION DATA 
* 
*  EXIT:  TC:TAB CONTAIN POINTERS TO ALL TASK TABLES
* 
*  WORK REGISERS:  A1-A12 
* 
*  SUBROUTINES:  CONVRT,GETTSK,TETTDC,GETCLN,GETSDC 
* 
*                 TASK TABLE LAYOUT 
*             ________________________
*             I        MMU           I
*             I       TABLE          I
*             I         16           I
*             I        WORDS         I
*             I______________________I
*   TTB:SB    I   SEGMENT POINTER    I
*             ------------------------
*  TASK ENTRY I       QUEUE          I
*             ------------------------
*   TTB:ID    I TASK IDENTIFICATION  I
*             ------------------------
*   TTB:ST    I    STATUS/LEVEL      I
*             ------------------------
*   TTB:PP    I    PENDING QUEUE     I
*             ------------------------
*   TTB:PW    I PROGRAM STATUS WORD  I
*             ------------------------
*   TTB:SA    I    DISPATCH ADDRESS  I
*             ------------------------
*             I       REGISTER       I
*             I       SAVE           I
*             I       AREA           I
*             I       14             I
*             I       WORDS          I
*             ------------------------
*  TTB:TD     I       TASK           I
*             I    SAVE01URATION     I
*             I        TABLE         I
*             :                      :
*             :                      :
*             I______________________I
	EJECT
*             TASK SAVE01URATION TABLE LAYOUT 
*             ______________________________
*             I           LENGTH           I
*             ------------------------------
*             I       INDEX/FILCODE        I
*             ------------------------------
*             I        DWT-ADDRESS         I
*             ------------------------------
*             :                            :
*             :                            :
*             ------------------------------
*             I       INDEX/FILECODE       I
*             ------------------------------
*             I        DWT-ADDRESS         I
*             ------------------------------
	EJECT
B:TT	EQU	*
	ST	P,SAVE04,A13	SAVE LOCATION COUNTER
	LD	A12,SCTSFA	GET START OF FREE AREA 
	LD	A11,SAVE01,A13	GET START OF SAVE01URATION DATA
	ST	A12,SAVE10,A13	SAVE START OF FREE AREA
BTT10	EQU	* 
	LCR	A2,A11	GET FIRST BLOCK TYPE
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RF(E)	BTT20	YES
	LDKL	A1,LMP4	FORMAT ERROR
	CALL	ERROR 
BTT20	EQU	* 
* 
*  GET NUMBER OF TASKS IN THIS CLASS
* 
	CALL	GETTSK
	ST	A1,SAVE19,A13	SAVE
* 
*  GET TASK ID START VALUE
* 
	LC	A5,TDBID+4,A11	GET FIRST ID CHAR
	SLL	A5,8	MOVE TO LEFT BYTE 
	LC	A5,TDBID+5,A11	GET SECOND ID DIGIT
	ST	A5,SAVE16,A13	SAVE TASK ID START VALUE
* 
*  CHECK IF CREDIT APPLICATION
* 
	LD	A5,APPTYP,A13	CREDIT? 
	CWK	A5,'CR'
	RF(NE)	BTT21 
	EJECT
* 
*  GET TASK CLASS TO MATCH VALUE
* 
	LC	A5,TDBMC+4,A11	GET FIRST CHAR IN TCL
	SLL	A5,8	MOVE TO LEFT BYTE 
	LC	A5,TDBMC+5,A11	GET SECOND CHAR IN TCL 
	CALL	GETTCL	GET TCL START VALUE
	ST	A5,SAVE17,A13	SAVE
BTT21	EQU	* 
	EJECT
* 
*  GET TASK LEVEL 
* 
	LC	A5,TDBTL+4,A11	GET FIRST DIGIT IN LEVEL 
	SLL	A5,8	MOVE TO LEFT BYTE 
	LC	A5,TDBTL+5,A11	GET SECOND DIGIT IN LEVEL
	CALL	CONVRT	CONVERT TO BINARY
	ST	A1,SAVE24,A13	SAVE
	EJECT
* 
*  COMPUTE SIZE OF SAVE01URATION DEPENDENT PART OF TASK TABLE 
* 
	LDKL	A10,TTB:TD	STANDARD LENGTH
	LD	A5,SCTOPT	GET OPTION WORD 
	ANK	A5,/11	CHECK IF EMM AND MMU PAGING INCLUDED
	XRK	A5,/11	BOTH INCLUDED?
	RF(NZ)	BTT22	NO! 
	SUKL	A10,TTB:AT	INCLUDE BIT MAP IN LENGTH
	SUKL	A12,TTB:AT	RESERV SPACE FOR BIT MAP 
	RF	BTT30 
BTT22	LD	A5,SCTOPT
	SRC	A5,1	MMU PAGING? 
	RF(NN)	BTT25	NO
	SUKL	A10,TTB:MT	16+2 WORD EXTRA IF MMU 
	SUKL	A12,TTB:MT	RESERV SPACE FOR EXTRA WORDS 
	RF	BTT30 
BTT25	EQU	* 
	SRC	A5,1	DISC PAGING?
	RF(NN)	BTT30	NO! 
	SUKL	A10,TTB:CB	ONE WORD EXTRA IF DISC PAGING
	SUKL	A12,TTB:CB	RESERV SPACE FOR EXTRA WORD
BTT30	EQU	* 
* 
*  ADD ONE WORD FOR LENGTH OF TASK SAVE01URATION TABLE
* 
	ADKL	A10,2 
	EJECT
* 
*  COMPUTE SIZE OF TERMINAL DEVICE CLASS DEPENDENT PART 
*  OF TASK SAVE01URATION TABLE
* 
	LDK	A6,0	RESET LENGTH
	LDR	A9,A11	INIT SUB-POINTER IN TASK DEFINITION BLOCK 
	ADKL	A9,TDBFST	TERMINAL DEVICE CLASS DEFINITION
	CALL	GETTDC	GET NUMBER OF TDC:S
	LDR	A7,A1	SAVE 
BTT35	EQU	* 
	RF(Z)	BTT40
	CALL	GETCLN	GET CLASS NUMBER (1-99)
	ADR	A1,A1	2*(BINARY CLASS NUMBER)
	LD	A8,SAVE18,A13	GET POINTER TO TCLASS 
	LDR*	A2,A8 
	SUK	A2,2 
	CWR	A1,A2
	RF(NG)	BTT37 
	LDKL	A1,LMP4 
	CALL	ERROR	INDICATE FORMAT ERROR 
BTT37	EQU	* 
	ADR	A8,A1	GET ENTRY IN TCLASS
	LDR*	A8,A8	GET POINTER TO CLASS
	LDR*	A8,A8	GET LENGTH OF CLASS 
	SUKL	A8,2	EXCLUDE LENGTH WORD
	ADR	A10,A8	ADD TO TOTAL TTAB LENGTH
	ADR	A6,A8	ADD TO TASK CONF. TABLE LENGTH 
	ADKL	A9,TDC+TLC	NEXT CLASS 
	SUK	A7,1	DECREMENT NUMBER OF TDC:S 
	RB	BTT35 
	EJECT
BTT40	EQU	* 
* 
*  COMPUTE SIZE OF SPECIAL DEVICE CLASS DEPENDENT PART OF 
*  TASK SAVE01URATION TABLE 
* 
	CALL	GETSDC	GET NUMBER OF SPECIAL DEVICE CLASSES 
	ADKL	A9,2	FIRST SDC RECORD 
	LDR	A7,A1	SAVE 
BTT50	EQU	* 
	RF(Z)	BTT55	NO MOORE SDC:S 
	CALL	GETCLN	GET CLASS NUMBER (1-99)
	ADR	A1,A1	2*(BINARY CLASS NUMBER)
	LD	A8,SAVE11,A13	GET POINTER TO SCLASS 
	LDR*	A2,A8 
	SUK	A2,2 
	CWR	A1,A2
	RF(NG)	BTT52 
	LDKL	A1,LMP4 
	CALL	ERROR	INDICATE FORMAT ERROR 
BTT52	EQU	* 
	ADR	A8,A1	GET ENTRY IN SCLASS
	LDR*	A8,A8	GET POINTER TO CLASS
	LDR*	A8,A8	GET LENGTH OF CLASS 
	SUKL	A8,2	EXCLUDE LENGTH WORD
	ADR	A10,A8	ADD TO TOTAL TTAB LENGTH
	ADR	A6,A8	ADD TO TASK CONF. TABLE LENGTH 
	ADKL	A9,SDC	NEXT CLASS 
	SUK	A7,1	DECREMENT NUMBER OF SDC:S 
	RB	BTT50 
BTT55	EQU	* 
	ADK	A6,2	INCLUDE LENGTH WORD 
	LD	A7,SAVE13,A13	GET CURRENT ENTRY IN TC:TAB 
	LD	A8,SAVE19,A13	GET NUMBER OF TASKS IN THIS CLASS 
BTT60	EQU	* 
	RF(Z)	BTT70
* 
	EJECT			=4 
*			=4
*  MEMORY OVERFLOW CHECK			=4 
*			=4
	LDR	A1,A11	SAVE REGISTER A11	=4
	LDR	A5,A9	SAVE REGISTER A9	=4
	LDR	A11,A12	GET TTAB ADDRESS	=4
	ADR	A11,A10	COMPUTE END OF TTAB	=4 
	LD	A9,SCTEFA	GET END OF FREE AREA	=4 
	CALL	CMPADR	END OF TTAB<END OF FREE AREA?	=4 
	RF(L)	BTT62	YES!	=4
	LDKL	A1,LMP3		=4 
	CALL	ERROR	INDICATE MEMORY OVERFLOW	=4 
BTT62	LDR	A11,A1	RESTORE A11	=4 
	LDR	A9,A5	RESTORE A9	=4
	EJECT			=4 
*  STORE LENGTH OF TASK SAVE01URATION TABLE IN TTAB 
* 
	ST	A6,TTB:TD,A12 
* 
*  STORE TASK LEVEL IN RIGHT BYTE OF STATUS/LEVEL WORD
* 
	LD	A5,SAVE24,A13	GET TASK LEVEL
	ST	A5,TTB:ST,A12	STORE IN TTAB 
* 
*  STORE TASK LEVEL IN LEFT BYTE OF PROGRAM STATUS WORD 
* 
	SLL	A5,10	MOVE LEVEL TO LEFT BYTE
	ORKL	A5,/00C0
	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,1	MMU OPTION? 
	ORR	A5,A2	SET BIT 15 IF MMU
	ST	A5,TTB:PW,A12	STORE IN TTAB 
* 
*  STORE TASK IDENTIFICATION IN TTAB
* 
	LD	A5,SAVE16,A13	GET THIS TASK ID
	ST	A5,TTB:ID,A12	STORE IN TTAB 
	ADK	A5,1	INCREMENT TASK ID 
	ST	A5,SAVE16,A13	SAVE TO NEXT TASK IN SAME CLASS 
	IFF	MMUPAG+DSKPAG=0	=3 
* 
*  STORE SEGMENT TABLE ADDRESS IN TTAB
* 
	LD	A5,SAVE30,A13	GET SEGMENT TABLE ADDRESS 
	ST	A5,TTB:SP,A12	STORE IN TTAB 
	XIF
	LD	A5,APPTYP,A13	GET APPLICATION TYPE
	CWK	A5,'CR'	CREDIT?
	RF(NE)	BTT65	NO
* 
*  STORE TASK CLASS TO MATCH IN TTAB
* 
	LD	A5,SAVE17,A13	GET TCL START VALUE 
	ST	A5,TTB:PP,A12	SAVE IN TTAB
	ADK	A5,1	INCREMENT  TCL
	ST	A5,SAVE17,A13	SAVE
BTT65	EQU	* 
	STR	A12,A7	SAVE TTAB ADDRESS IN TC:TAB 
	ADK	A7,2	NEXT ENTRY IN TC:TAB
	ST	A7,SAVE13,A13	SAVE CURRENT USER TASK ENTRY
	LDR	A5,A10	GET TTAB LENGTH 
	ADS	A5,SAVE10,A13	UPDATE START OF FREE AREA
	ADR	A12,A10	NEXT TTAB ENTRY IN THIS TASK CLASS 
	SUKL	A8,1	DECREMENT NUMBER OF TASKS IN THIS CLASS
	RB	BTT60 
	EJECT
BTT70	EQU	* 
* 
*  RESET POINTER TO START OF FREE AREA
* 
	LD	A12,SAVE10,A13
BTT90	EQU	* 
	CALL	NXTBLK	GET NEXT BLOCK 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RF(NE)	BTT95 
	LDKL	A2,BTT20
	SUKL	A2,REL
	ADR	A2,A13 
	ABR	A2 
BTT95	EQU	* 
				=4
				=4
				=4
				=4
				=4
				=4
				=4
				=4
				=4
	ST	A12,SCTSFA	SAVE START OF FREE AREA
	RTN	A14	RETURN 
	EJECT
************************************************************************
*  B:DWTS - BUILD DWT:S FOR SPECIAL DEVICES AND CONNECT TO TASK TABLES
************************************************************************
* 
*  REFERENCED IN: MONCON
* 
*  ENTRY: SCTSFA - START OF FREE ARE (X)
*         SAVE01 - START OF SAVE01URATION FILE
*         SCTEFA - END OF FREE AREA 
* 
*  EXIT:
* 
*  WORK REGISTERS:  A1-A12
* 
*  SUBROUTINES: GETTSK,GETTDC,GETSDC,GETCLN,NXTBLK,ERROR
* 
	EJECT
B:DWTS	EQU	*
* 
*  GET START OF SAVE01URATION FILE
* 
	LD	A11,SAVE01,A13	START OF SAVE01URATION FILE
	LD	A12,SCTSFA	START OF FREE AREA 
* 
*  CHECK IF FIRST BLOCK IS A TASK DEFINITION BLOCK
* 
	LCR	A2,A11	GET FIRST CHARACTER 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RF(E)	DWTS	YES 
	LDKL	A1,LMP4	FORMAT ERROR
	CALL	ERROR 
DWTS	EQU	*
* 
*  GET ADDRESS TO TC:TAB
* 
	LD	A7,SAVE02,A13	FIRST USER TASK ENTRY 
	SUK	A7,2 
	EJECT
DWTS10	EQU	*
* 
*  GET NUMBER OF TASKS IN THIS TASK CLASS 
* 
	CALL	GETTSK
DWTS20	EQU	*
	ST	A1,SAVE19,A13	SAVE
* 
*  GET CORRESPONDING TASK TABLE (TTAB)
* 
DWTS25	EQU	*
	ADK	A7,2	NEXT ENTRY IN TC:TAB
	LDR*	A10,A7	GET TTAB ADDRESS 
	ADKL	A10,TTB:TD+2	TASK SAVE01URATION TABLE ENTRY 
* 
*  INIT SUB-POINTER IN TASK DEFINITION BLOCK
* 
	LDR	A9,A11	START OF TASK DEFINITION BLOCK
	ADKL	A9,TDBFST	START OF TDC DEFINITION 
	EJECT
* 
*  GET NUMBER OF TERMINAL DEVICES IN THIS CLASS 
* 
	CALL	GETTDC
	LDR	A6,A1
DWTS30	EQU	*
	RF(Z)	DWTS40 
	CALL	GETCLN	GET TDC ID 
	ADR	A1,A1
	LD	A8,SAVE18,A13	GET POINTER TO TCLASS 
	ADR	A8,A1	GET CLASS ENTRY
	LDR*	A8,A8	GET POINTER TO CLASS
	LDR*	A8,A8	GET LENGTH OF CLASS 
	SUKL	A8,2	EXCLUDE LENGTH WORD
	ADR	A10,A8	INCREMENT POINTER IN TTAB 
	ADKL	A9,TDBREC	BYPASS NEXT TDC DEF. RECORD 
	SUK	A6,1	DECREMENT NUMBER OF TDC:S 
	RB	DWTS30
DWTS40	EQU	*
* 
*  GET NUMBER OF SPECIAL DEVICE CLASSES 
* 
	CALL	GETSDC
	ADKL	A9,SDCFST-CDBNC 
	LDR	A1,A1
DWTS50	EQU	*
	RF(Z)	DWTS90 
	ST	A1,SAVE17,A13	SAVE
* 
*  GET SPECIAL DEVICE CLASS NUMBER OM 
* 
	CALL	GETCLN
* 
*  GET CORRESPONDING SPECIAL DEVICE CLASS IN SCLASS 
* 
	ADR	A1,A1
	LD	A6,SAVE11,A13	POINTER TO SCLASS 
	ADR	A6,A1	SELECT ENTRY 
	LDR*	A6,A6	GET POINTER TO CLASS
	LDR	A5,A6	SAVE 
	LDR*	A6,A6	GET LENGTH
	SUK	A6,2	EXCLUDE LENGTH WORD 
DWTS60	EQU	*
	ADK	A5,4	GET DEVICE
	LDR*	A1,A5	GET ADDRESS TO TYPE DWT 
	LD	A3,DWTLEN,A1	GENERATION OF DWT? 
	RF(Z)	DWTS70	NO
* 
*  COPY DWT 
* 
	LDR	A2,A12	TO-ADDRESS
	ADR	A12,A3	UPDATE POINTER TO FREE AREA 
	CALL	MOVE	COPY DWT 
	EJECT
* 
*  RELOCATE MONITOR ECB ADDRESS IF MMU IN SYSTEM
* 
	LD	A3,SCTOPT	GET OPTION WORD 
	ANK	A3,1	MMU IN SYSTEM?
	RF(Z)	DWTS65	NO! 
	LDR	A3,A1	GET PROTOTYPE DWT-ADDRESS
	SUR	A3,A2	COMPUTE RELOCATION CONSTANT
	LD	A4,DWTMEC,A2	GET MONITOR ECB-ADDRESS
	SUR	A4,A3	RELOCATE 
	ANKL	A4,/FFFE	MAKE EVEN ADDRESS
	ST	A4,DWTMEC,A2	STORE IT BACK
DWTS65	EQU	*
	LDR	A1,A2	DT-ADDRESS TO BE USED
DWTS70	EQU	*
* 
*  STORE FILE-CODE AND DWT-ADDRESS IN TTAB
* 
	ST	A1,2,A10	STORE DWT-ADDRESS
	LD	A1,-2,A5	GET INDEX/FILECODE 
	STR	A1,A10	SAVE IN TTAB
	ADKL	A10,4	UPDATE TASK SAVE01URATION POINTER 
DWTS80	EQU	*
	SUK	A6,4	DECREMENT NUMBER OF DEVICES 
	RB(P)	DWTS60	NEXT DEVICE 
	EJECT
* 
*  CHECK IF MOORE SPECIAL DEVICES IN THIS CLASS 
* 
	ADKL	A9,SDC		
	LD	A1,SAVE17,A13 
	SUK	A1,1 
	RB	DWTS50
DWTS90	EQU	*
* 
*  CHECK IF MOORE TASKS WITH THE SAME SAVE01URATION 
* 
	LD	A1,SAVE19,A13 
	SUK	A1,1 
	RB(P)	DWTS20 
* 
*  CHECK IF MOORE TASK DEFINITION BLOCKS
* 
	CALL	NXTBLK
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	DWTS10	YES 
	LD	A2,SCTSFA 
	SUK	A2,2 
DWTS95	ADK	A2,2 
	CW	A2,SCTEFA 
	RF(NE)	DWTS99
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
DWTS99	CWR	A2,A12 
	RB(NE)	DWTS95
	ST	A12,SCTSFA
	RTN	A14	RETURN 
	EJECT
************************************************
*  B:DWTT - BUILD TERMINAL DEVICE WORK TABLES  *
************************************************
************************************************
* 
*  REFERENCED IN: MONCON
* 
*  ENTRY: 
* 
*  EXIT:
* 
*  WORK REGISTERS: A1-A12 
* 
*  SUBROUTINES:  ERROR,GETTSK,GETTDC,GETCLN,GETLCN,DWTGEN,NXTBLK
* 
	EJECT
B:DWTT	EQU	*
* 
*  CLEAR WORK AREA TO BE USED FOR ECHO DEVICE 
*  AND TEMPORARY INTERRUPT TABLES 
* 
	LDR	A1,P	GET LOCATION COUNTER
	ST	P,SAVE10,A13	SAVE LOCATION COUNTER
BDWT00	CMR	A1	CLEAR MEMORY WORD 
	CW	A1,SCTSFA+2	ALL WORDS CLEARED?
	RF(E)	BDWT05	YES!
	SUK	A1,2	DECREMENT POINTER 
	RB	BDWT00
BDWT05	EQU	*
	LD	A11,SAVE05,A13	GET FWT AREA SIZE IN WORDS 
	CWK	A11,896	LARGE ENOUGTH FOR TEMP. INT. TABLES? 
	RF(L)	BDWT08	NO! 
	LD	A1,SCTEFA	SAVE END OF FREE AREA 
	LD	A11,SCTFWT	START OF FWT AREA
	LDR	A9,A11 
	ADKL	A9,896+896	END OF T.I.T.
	ST	A9,SCTEFA 
	RF	BDWT25
BDWT08	EQU	*
* 
*  ALLOCATE TEMPORARY WORK AREA IN USED PART OF SYSLDM IF POSSIBLE
* 
	LD	A11,SAVE10,A13	GET END OF TEMP. INT. TABLE
	SU	A11,SCTSFA+2	COMPUTE SIZE OF AVALIABLE AREA 
	CWK	A11,MINBUF	IS IT BIG ENOUGH? 
	RF(L)	BDWT09	TOO SMALL!
	LD	A1,SCTEFA	SAVE REAL END OF FREE AREA
	LD	A11,SAVE10,A13	GET END OF TEMP. WORK AREA 
	ST	A11,SCTEFA	SAVE 
	SUKL	A11,896+896	START OF TEMP. WORK AREA
	LDR	A7,A11	SAVE
	SUK	A7,SCZBUF	START OF TEMP BUFFER FOR SALCUZ
	ST	A7,SAVE04,A13	SAVE
	SUK	A7,ASZBUF	START OF TEMP BUFFER FOR ASCU4Z
	ST	A7,SAVE03,A13	SAVE
	RF	BDWT25
BDWT09	EQU	*
* 
*  ALLOCATE MEMORY FOR TEMPORARY INTERRUPT TABLE AT END OF FREE AREA
* 
	LD	A11,SCTEFA	GET END OF FREE AREA 
	LD	A9,SCTSFA	GET START OF FREE AREA
	LDK	A7,0	RESET WORD COUNTER
BDWT10	EQU	*
	CWR	A11,A9	MEMORY OVERFLOW?
	RF(NE)	BDWT15	NO 
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
BDWT15	EQU	*
	CWK	A7,896	ALL WORDS RESERVED? 
	RF(E)	BDWT20	YES 
	SUKL	A11,2	RESERV ANOTHER WORD 
	ADK	A7,1	INCREMENT WORD COUNTER
	RB	BDWT10
BDWT20	EQU	*
* 
*  INIT POINTERS TO THE TEMPORARY INTERRUPT TABLES
* 
	LDR	A1,A11 
BDWT25	LD	A7,SAVE10,A13 
BDWT30	EQU	*
	STR	A11,A7	SAVE INTERRUPT TABLE ADDRESS
	ADK	A7,2	NEXT ADDRESS TABLE ENTRY
	ADKL	A11,224	NEXT INTERRUPT TABLE ADDRESS
	CW	A11,SCTEFA	ALL POINTERS INTIATED? 
	RB(NE)	BDWT30	NO 
	ST	A1,SCTEFA	UPDATE END OF FREE AREA 
	EJECT
* 
*  INIT DWT POINTER 
* 
	LD	A11,SAVE01,A13
	LD	A12,SCTSFA	GET START OF FREE AREA 
* 
*  INIT TC:TAB ENTRY POINTER TO POINT AT FIRST USER TASK ENTRY
* 
	LD	A5,SAVE02,A13	GET FIRST USER TASK ENTRY 
	ST	A5,SAVE13,A13	STORE IN CURRENT USER TASK ENTRY
BDWT40	EQU	*
* 
*  GET NUMBER OF TASKS IN THIS TASK CLASS 
* 
	CALL	GETTSK	GET NUMBER OF TASKS
BDWT50	EQU	*
	ST	A1,SAVE19,A13	SAVE BINARY VALUE 
* 
*  GET NUMBER OF TERMINAL DEVICE CLASSES IN THIS TASK CLASS 
* 
	CALL	GETTDC
* 
*  CHECK IF TASK WITHOUT DEVICES
* 
	LDR	A1,A1	ANY TERMINAL DEVICES?
	RF(Z)	BDW100	NO
	ST	A1,SAVE15,A13	SAVE NUMBER OF TERMINAL DEVICESS
	LD*	A10,SAVE13,A13	GET TTAB ADDRESS
	ADKL	A10,TTB:TD	DISPLACEMENT TO TASK CONF. TABLE 
* 
*  GET TERMINAL DEVICE CLASS NUMBER 
* 
	LDR	A9,A11	START OF TASK DEFINITION BLOCK
	ADKL	A9,TDBFST	TERMINAL DEVICE CLASS DEFINITION
BDWT55	EQU	*
	CALL	GETCLN	GET CLASS NUMBER 
	ST	A1,SAVE14,A13	SAVE BINARY VALUE 
* 
*  GET LINE CONNECTION NUMBER FOR THIS TERMINAL DEVICE CLASS
*  IN THIS TASK 
* 
	CALL	GETLCN	GET LINE CONNECTION NUMBER 
	LDR	A6,A1	SAVE BINARY VALUE
	ADK	A1,1	INCREMENT LINE CONNECTION NUMBER
	CALL	BINASC	CONVERT INCREMENTED VALUE TO ASCII 
	SC	A5,TDC+4,A9	STORE RIGHT ASCII DIGIT 
	SRL	A5,8	MOVE LEFT ASCII DIGIT TI RIGHT BYTE 
	SC	A5,TDC+3,A9	STORE LEFT ASCII DIGIT
* 
*  FIND CORRESPONDING TERMINAL DEVICE CLASS IN TCLASS 
* 
	LD	A2,SAVE14,A13	GET BINARY VALUE OF CLASS ID
	ADR	A2,A2	2*ID 
	LD	A7,SAVE18,A13	POINTER TO TCLASS 
	ADR	A7,A2	GET ENTRY
* 
*  CHECK IF THIS IS AN ENTRY IN TCLASS -TO BE SUPPLIED
* 
	LDR*	A7,A7	GET POINTER TO CLASS
	EJECT
* 
*  GENERATE DWT:S FOR THIS CLASS
*  A6 - LINE CONNECTION NUMBER (BINARY VALUE) 
*  A7 - POINTER TO TERMINAL DEVICE CLASS
* 
*  THE ENTRY IN TEMPORARY INTERRUPT TABLE 
*  IS DERIVED FROM LINE CONNECTION NUMBER,
*  DEVICE ADDRESS AND TYPE OF DEVICE (INPUT OR OUTPUT)
* 
	CALL	DWTGEN
BDWT90	EQU	*
	LD	A1,SAVE15,A13	GET NUMBER OF TERMINAL DEVICE CLASSES 
	SUK	A1,1	ANY MOORE IN THIS TASK CLASS? 
	RF(Z)	BDW100	NO
	ST	A1,SAVE15,A13	SAVE REMAINING NUMBER 
	ADKL	A9,TDC+TLC	NEXT TDC RECORD
	RB	BDWT55
BDW100	EQU	*
	CALL	ECHO
	LD	A1,SAVE13,A13	GET CURRENT ENTRY IN TC:TAB 
	ADK	A1,2	INCREMENT ENTRY POINTER 
	ST	A1,SAVE13,A13	SAVE
	LD	A1,SAVE19,A13	GET NUMBER OF TASKS IN THIS CLASS 
	SUK	A1,1	ANY MOORE TASKS LEFT
	RB(P)	BDWT50 
*  CHECK IF MOORE TASK DEFINITION BLOCKS
* 
	CALL	NXTBLK	SKIP TO NEXT BLOCK 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	BDWT40	YES 
* 
*  ALL TERMINAL DEVICE WORK TABLES GENERATED
* 
	LD	A2,SCTSFA 
	SUK	A2,2 
BDW105	ADK	A2,2 
	CW	A2,SCTEFA 
	RF(NE)	BDW110
	LDKL	A1,LMP3 
	CALL	ERROR 
BDW110	CWR	A2,A12 
	RB(NE)	BDW105
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14	RETURN 
	EJECT	 
****************************************
*  B:CDT - BUILD COMMON DEVICE TABLE   *
****************************************
* 
*  REFERENCED IN:  MONCON 
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
*          SAVE01 - START OF SAVE01URATION DATA 
*          SCTEFA - END OF FREE AREA
* 
*  EXIT:  CDTAB - POINTER TO COMMON DEVICE TABLE
* 
*  WORK REGISTERS: A1-A12 
* 
*  SUBROUTINES:  NXTBLK,GETCTC,GETLCN,GETSDC,GETCLN,MOVE
* 
	EJECT
B:CDT	EQU	* 
	LD	A11,SAVE01,A13	START OF SAVE01URATION DATA
	LD	A12,SCTSFA	START OF FREE AREA 
	LDK	A7,0	RESET LENGTH
* 
*  GET COMMON DEVICE DEFINITION BLOCK 
* 
CDG:10	EQU	*
	CALL	NXTBLK
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	CDG:10	YES 
	CCK	A2,'CC'	COMMON DEV. DEF. BLOCK?
	RF(NE)	BCDTEX	NO 
	EJECT
* 
*  RESERVE AREA IN COMMON DEVICE TABLE FOR FILE-CODES 
*  AND DWT-ADDRESSES USED BY COMMON TERMINAL DEVICES
* 
	LDR	A9,A11	START OF COMMON DEFINITION BLOCK
	ADKL	A9,SDCFST	NUMBER OF COMMON TERMINAL CLASSES 
	CALL	GETCTC	GET NUMBER OF C.T.C. 
	LDR	A6,A1	SAVE 
B:CT10	RF(Z)	B:CT30	NO MOORE! 
	CALL	GETCLN	GET CLASS IDENT NUMBER (1-99)
	ADR	A1,A1	DISPLACEMENT TO CLASS POINTER
	LD	A5,SAVE18,A13	GET POINTER TO TCLASS 
	LDR*	A2,A5	GET LENGTH OF TCLASS
	SUK	A2,2	EXCLUDE LENGTH
	CWR	A1,A2	MAKE SURE CLASS EXISTS 
	RF(NG)	B:CT20	OK!
	LDKL	A1,LMP4	FORMAT ERROR! 
	CALL	ERROR 
B:CT20	ADR	A1,A5	SELECT ENTRY IN TCLASS 
	LDR*	A1,A1	GET POINTER TO CLASS
	LDR*	A1,A1	GET LENGTH OF CLASS 
	SUK	A1,2	EXCLUDE LENGTH WORD 
	ADR	A7,A1	INCREMENT CDTAB LENGTH 
	ADKL	A9,TDC+TLC	NEXT RECORD IN CONF. FILE
	SUK	A6,1	DECR. NBR OF C.T.C. 
	RB	B:CT10
	EJECT
B:CT30	EQU	*
* 
*  RESERVE AREA IN COMMON DEVICE TABLE FOR FILE-CODES 
*  AND DWT-ADDRESSES USED BY COMMON SPECIAL DEVICES 
* 
	CALL	GETSDC
	ADKL	A9,SDCFST-CDBNC 
	LDR	A6,A1
BCDT10	EQU	*
	RF(Z)	BCDTEX 
	CALL	GETCLN
	ADR	A1,A1
	LD	A5,SAVE11,A13	GET POINTER TO SCLASS 
	LDR*	A2,A5 
	SUK	A2,2 
	CWR	A1,A2
	RF(NG)	BCDT15
	LDKL	A1,LMP4 
	CALL	ERROR 
BCDT15	EQU	*
	ADR	A1,A5	SELECT ENTRY 
	LDR*	A1,A1	GET POINTER TO CLASS
	LDR*	A1,A1	GET LENGTH
	SUK	A1,2 
	ADKL	A9,SDC
	ADR	A7,A1
	SUK	A6,1 
	RB	BCDT10
BCDTEX	EQU	*
	EJECT
* 
*  RESERV ENTRIES IN COMMON DEVICE TABLE FOR FILE-CODES 
*  AND DWT-ADDRESSES USED FOR PHYSICAL I/O ON DISC
* 
*  ALSO RESERVE ENTRIES IN COMMON DEVICE TABLE FOR
*  FILE-CODES AND DWT-ADDRESSES USED FOR DATA COMMUNICATION 
* 
*  FILE-CODES AND DWT-ADDRESSES ARE STORED IN THE LAST CLASS IN SCLASS
* 
	LD	A1,SCTDCT	DATA COMMUNICATION? 
	LD	A6,SCTDMT	DATA MANAGEMENT 
	ORR	A6,A1	DM OR DC?
	LD	A1,SCTOPT	GET OPTION WORD 
	ANK	A1,/E	DISC PAGING OR SWB:S?
	ORR	A6,A1	COPY LAST SCLASS IF NOT ZERO 
	RF(Z)	CDG:15	NO! 
	LD	A6,SAVE11,A13	GET POINTER TO SCLASS 
	LDR*	A1,A6	GET LENGTH OF SCLASS
	SUK	A1,2	EXCLUDE LENGTH WORD 
	ADR	A6,A1	LAST ENTRY IN SCLASS 
	LDR*	A6,A6	GET POINTER TO LAST CLASS 
	LDR*	A6,A6	GET LENGTH OF LAST CLASS
	SUK	A6,2	EXCLUDE LENGTH WORD 
	ADR	A7,A6	ADD TO LENGTH OF CD:TAB
CDG:15	EQU	*
	ADK	A7,2 
	STR	A7,A12 
	ST	A12,SCTCDT
	ADR	A12,A7 
	EJECT
* 
* INIT POINTER TO START OF FREE AREA AND TO CDTAB 
* 
	LD	A10,SCTCDT	FIRST ENTRY IN SCTCDT
	LCR	A2,A11	COMMON DEVICE BLOCK?
	CCK	A2,'CC'
	RF(E)	CDG:18 
	ADKL	A10,2	FIRST FREE ENTRY IN CDTAB 
	LDKL	A8,0
	RF	CDGEX 
CDG:18	EQU	*
* 
*  GENERATE DEVICE WORK TABLES FOR COMMON TERMINAL DEVICES
* 
	LDR	A9,A11	START OF COMMON DEF. BLOCK
	ADKL	A9,SDCFST	NUMBER OF COMMON TERMINAL CLASSES 
	CALL	GETCTC	GET NUMBER OF C.T.C. 
	LDR	A1,A1	ANY COMMON TERMINAL CLASSES? 
B:CT40	RF(Z)	B:CT50	NO! 
	ST	A1,SAVE15,A13	SAVE
	CALL	GETCLN	GET CLASS IDENT NUMBER 
	ST	A1,SAVE14,A13	SAVE
	CALL	GETLCN	GET LINE CONNECTION NUMBER 
	LDR	A6,A1	SAVE 
	LD	A2,SAVE14,A13	GET CLASS IDENT NUMBER
	ADR	A2,A2	CONVERT TO DISPLACEMENT
	LD	A7,SAVE18,A13	GET POINTER TO TCLASS 
	ADR	A7,A2	SELECT ENTRY IN TCLASS 
	LDR*	A7,A7	GET POINTER TO CLASS
	CALL	DWTGEN	GENERATE DWT:S FOR THIS CLASS
	ADKL	A9,TDC+TLC	NEXT RECORD IN CONF. FILE
	LD	A1,SAVE15,A13	GET NUMBER OF C.T.C.
	SUK	A1,1	DECREMENT COUNTER 
	RB	B:CT40
B:CT50	CALL	ECHO
	ADKL	A10,2	NEXT FREE ENTRY IN CDTAB
	EJECT
* 
*  GET NUMBER OF SPECIAL DEVICE CLASSES 
* 
	CALL	GETSDC
	ADKL	A9,SDCFST-CDBNC 
	LDR	A8,A1
CDG:20	EQU	*
	RF(NP)	CDGEX 
* 
*  GET SPECIAL DEVICE CLASS NUMBER
* 
	CALL	GETCLN
* 
*  GET CORRESPONDING DEVICE CLASS IN SCLASS 
* 
	ADR	A1,A1		T 
	LD	A6,SAVE11,A13	GET POINTER TO SCLASS 
	ADR	A6,A1	SELECT CLASS 
	LDR*	A5,A6	SAVE POINTER TO CLASS 
	LDR*	A6,A6	GET POINTER TO CLASS
	LDR*	A6,A6	GET LENGTH OF CLASS 
	SUK	A6,2	EXCLUDE LENGTH WORD 
CDG:30	EQU	*
	ADK	A5,4	NEXT DEVICE 
	LDR*	A1,A5	GET DWT-ADDRESS 
	LD	A3,DWTLEN,A1	GENERATION OF DWT? 
	RF(Z)	CDG:40	NO
* 
*  COPY DWT 
* 
	LDR	A2,A12	TO-ADDRESS
	ADR	A12,A3	UPDATE POINTER TO FREE AREA 
	CALL	MOVE	COPY DWT 
* 
*  RELOCATE MONITOR ECB ADDRESS IF MMU IN SYSTEM
* 
	LD	A3,SCTOPT	GET OPTION WORD 
	ANK	A3,1	MMU IN SYSTEM?
	RF(Z)	CDG:35	NO! 
	LDR	A3,A1	GET PROTOTYPE DWT-ADDRESS
	SUR	A3,A2	COMPUTE RELOCATION CONSTANT
	LD	A4,DWTMEC,A2	GET MONITOR ECB-ADDRESS
	ANKL	A4,/FFFE	MAKE IT EVEN!
	SUR	A4,A3	RELOCATE 
	ST	A4,DWTMEC,A2	STORE IT BACK
CDG:35	EQU	*
	LDR	A1,A2	DWT-ADDRESS TO USE 
CDG:40	EQU	*
* 
*  STORE FILE-CODE AND DWT-ADDRESS IN TTAB
* 
	ST	A1,2,A10	STORE DWT-ADDRESS
	LD	A1,-2,A5	GET FILE CODE
	STR	A1,A10	STORE IN TTAB 
	ADKL	A10,4	NEXT ENTRY IN CD:TAB
	SUK	A6,4	DECREMENT DEVICE COUNTER
	RB(P)	CDG:30	NEXT DEVICE 
	EJECT
* 
*  CHECK IF MOORE SPECIAL DEVICE CLASSES
* 
	ADKL	A9,SDC
	SUKL	A8,1
	RB	CDG:20
CDGEX	EQU	* 
	RF(N)	CDG:EX	CD:TAB COMPLETE!
	LD	A1,SCTDMT	DATA MANAGEMENT 
	LD	A5,SCTDCT	DATA COMMUNICATION
	ORR	A1,A5	DM OR DC?
	LD	A5,SCTOPT	GET OPTION WORD 
	ANK	A5,/E	DISC PAGING OR SWB:S?
	ORR	A1,A5	COPY LAST SCLASS IF NOT ZERO 
	RF(Z)	CDG:EX	NO! 
	LD	A5,SAVE11,A13	GET POINTER TO SCLASS 
	LDR*	A1,A5	GET LENGTH OF SCLASS
	SUK	A1,2	EXCLUDE LENGTH WORD 
	ADR	A5,A1	GET LAST ENTRY 
	LDR*	A5,A5	GET POINTER TO LAST CLASS 
	LDR*	A6,A5	GET LENGTH OF LAST CLASS
	SUK	A6,2	EXCLUDE LENGTH WORD 
	RB	CDG:30
CDG:EX	EQU	*
	LD	A2,SCTSFA 
	SUK	A2,2 
CDG:50	ADK	A2,2 
	CW	A2,SCTEFA 
	RF(NE)	CDG:60
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
CDG:60	CWR	A2,A12 
	RB(NE)	CDG:50
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14	RETURN 
	EJECT
**********************************************************************
*  DWTGEN - GENERATE DEVICE WORK TABLES FOR A TERMINAL DEVICE CLASS 
**********************************************************************
* 
*  ENTRY:  A1 - LINE CONNECTION NUMBER (BINARY) 
*          A7 - POINTER TO TERMINAL DEVICE CLASS IN TCLASS
*          A6 - LINE CONNECTION NUMBER
* 
*  EXIT:
* 
*  WORK REGISTERS: A1-A8
* 
*  SUBROUTINES: I:CHP,MOVE
* 
	EJECT
DWTGEN	EQU	*
	ST	A6,SAVE08,A13	SAVE LINE CONNECTION NUMBER 
	LDR*	A8,A7	GET LENGTH OF THIS CLASS
	SUKL	A8,2	EXCLUSIVE LENGTH WORD
	ADK	A7,2	FIRST FILECODE
DWT05	EQU	* 
	LD	A1,2,A7	 GET ADDRESS OF PROTOTYPE DWT 
	LD	A6,SAVE08,A13	GET LINE CONNECTION NUMBER
* 
*  CHECK CONNECTION TYPE
* 
	LC	A4,TDC+5,A9	GET LINE CONNECTION TYPE
	CCK	A4,'SS'	SALCUZ CONNECTION? 
	RF(NE)	DWT10	NO! 
	CALL	B:ITSZ	BUILD INTERRUPT TABLE FOR SALCUZ 
	RF	DWT31 
DWT10	CCK	A4,'AA'	ASCU4Z CONNECTION?
	RF(NE)	DWT11	NO! 
	CALL	B:ITAZ	BUILD INTERRUPT TABLE FOR AUSCU4Z
	RF	DWT31 
DWT11	EQU	* 
* 
*  DERIVE CONTENT OF CHANNEL PARAMETER AND ALSO 
*  THE ENTRY TO BE USED IN TEMPORARY INTERRUPT TABLE
*  FROM LINE CONNECTION NUMBER AND PROTOTYPE DWT
* 
	CALL	I:CHP 
* 
*  GET CORRECT INTERRUPT TABLE USING SAVE05 (SELECTS TABLE) 
*  AND SAVE06 (SELECTS ENTRY) 
* 
*  SAVE05 HOLDS 2*(NUMBER STORED IN BIS 4-6)
*  SAVE06 HOLDS THE NUMBER STORED IN BITS 12-15 
*  OF THE GENERATED CHANNEL PARAMETER 
	LD	A4,SAVE05,A13	GET SAVED NUMBER IN BITS 4-6
	AD	A4,SAVE10,A13	SELECT INTERRUPT TABLE
	LDR*	A4,A4	GET INTERRUPT TABLE ADDRESS 
	LD	A3,SAVE06,A13	LINE PARAMETER

DWT15	EQU	* 
	RF(Z)	DWT17	LINE ENTRY FOUND 
	ADK	A4,28	NEXT LINE
	SUK	A3,1	DECREMENT LINE PARAMETER
	RB	DWT15 
	EJECT
DWT17	EQU	* 
	ST	A4,SAVE07,A13	SAVE INTERRUPT TABLE LINE ENTRY 
* 
*  GET DEVICE ADDRESS:
*  USE DEVICE ADDRESSES 1-7 FOR INPUT DEVICE
*  OR DEVICE WITHOUT DATA REQUEST 
*  USE DEVICE ADDRESSES 8-14 FOR OUTPUT DEVICES 
* 
	LDR*	A6,A1	GET FIRST WORD OF PROTOTYPE DWT 
	LDR	A2,A6	SAVE 
	ANKL	A6,/7100	GET DEVICE ADDRESS AND DEVICE TYPE BIT 
	SLC	A6,7	CHECK IF INPUT DEVICE 
	RF(N)	DWT20	YES! 
* 
*  NOT INPUT DEVICE - CHECK IF DEVICE WITH DATA REQUEST 
* 
	ANKL	A2,/8000	DATA REQUEST BIT SET?
	RF(Z)	DWT20	NO!
	SRL	A6,2 
	ADK	A6,12
	RF	DWT30 
DWT20	EQU	* 
	SRL	A6,2 
	SUK	A6,2 
DWT30	EQU	* 
	ANK	A6,/1E 
* 
*  CHECK IF DWT ALREADY GENERATED ON THIS LINE
* 
	ADR	A6,A4	TABLE ENTRY
DWT31	LDR*	A2,A6	DWT ALREADY GENERATED? 
	RF(Z)	DWT32	NO!
	CALL	DWT50 
	LDKL	A1,DWT70
	AD	A1,M:REL,A13
	ABR	A1 
* 
*  CHECK IF DWT IN DRIVER 
* 
DWT32	LDKL	A2,SYSLOD
	TNM	A1,A2
	RF(NN)	DWT34 
	CWR	A1,A2
	RF	DWT36 
DWT34	CWR	A2,A1 
DWT36	RF(L)	DWT38 
	STR	A1,A6
	LDR	A2,A1	DWT IN DRIVER
	RF	DWT70 
DWT38	EQU	* 
	STR	A12,A6	SAVE DWT-ADDRESS
* 
*  COPY DEVICE TYPE DWT 
* 
	LDR	A2,A12	TO-ADDRESS
	LD	A3,DWTOR,A1	LENGTH
	ADR	A12,A3	NEXT FREE ENTRY 
	CALL	MOVE
	EJECT
* 
*  A1 - ADDRESS TO PROTOTYPE DWT
*  A2 - ADDRESS TO REAL DWT 
* 
	STR	A5,A2	STORE CHANNEL PARAMETER
* 
*  CHECK IF INPUT DEVICE
* 
	LDR*	A3,A1	GET FIRST WORD OF TYPE DWT
	ANKL	A3,/0100	INPUT DEVICE?
	RF(Z)	DWT45	NO 
* 
*  INPUT DEVICE:
*  CHECK IF KEYBOARD
* 
	LD	A3,DWTADR,A1		
	LD	A3,DEVIND,A3
	CWK	A3,6 
	RF(NE)	DWT60	NOT KEYBOARD
* 
*  INPUT DEVICE = KEYBOARD
*  IF ECHO: 
* 
*  STORE ADDRESS OF KEYBOARD RUNTIME-DWT
*  AND ECHO DEVICE PROTOTYPE-DWT IN ECHO DEVICE TABLE 
* 
* 
	LD	A5,DWTECH,A1	ECHO?
	RF(Z)	DWT40	NO 
	AD	A5,M:REL,A13
	LD*	A3,SCTSFA+2	GET LENGTH OF ECHO DEVICE TABLE
	RF(NZ)	DWT392	NOT FIRST ECHO DEVICE
	ADK	A3,2	INCLUDE LENGTH OF ECHO DEVICE TABLE 
DWT392	LDR	A4,A3	SAVE LENGTH
	AD	A4,SCTSFA+2	NEXT FREE ENTRY 
	STR	A2,A4	SAVE RUNTIME DWT-ADDRESS FOR INPUT DEVICE
	ST	A5,2,A4	SAVE PROTOTYPE DWT ADDRESS FOR OUTPUT DEVICE
	ADK	A3,4	UPDATE LENGTH 
	ST*	A3,SCTSFA+2	SAVE NEW LENGTH
	EJECT
DWT40	EQU	* 
* 
*  RELOCATE POINTERS TO CIRCULAR INPUT BUFFER 
* 
	LDR	A5,A2	GET DWT-ADDRESS
	ADKL	A5,DWTSQ	DISPLACEMENT TO START OF BUFFER
	ST	A5,DWTSQ-4,A2	STORE POINTER 
	ST	A5,DWTSQ-2,A2	STORE POINTER 
* 
*  IF DOUBLE KEYBOARD:
*  ADD 1 TO DWT-ADDRESS AND SAVE IT IN TEMPORARY INTERRUPT TABLE
*  IN ENTRY CORRESPONDING TO SECOND DEVICE ADDRESS
* 
	LDR*	A3,A1	GET FIRST WORD OF TYPE DWT
	ANK	A3,/F	GET FOUR RIGHTMOST BITS
	RF(Z)	DWT60	NOT DOUBLE KEYBOARD
	LDR	A5,A2	GET REAL DWT-ADDRESS 
	ADK	A5,1	ADD ONE 
	SUK	A3,1	DISPLACEMENT=0 IF DEVICE ADDRESS=1
	ADR	A3,A3	BYTE DISPLACEMENT
	AD	A3,SAVE07,A13	ENTRY IN INTERRUPT TABLE
	STR	A5,A3	STORE DEVICE-ADDRESS 
	RF	DWT60 
	EJECT
DWT45	CALL	DWT50
	RF	DWT60 
DWT50	EQU	* 
* 
*  OUTPUT DEVICE* 
*  IF ADDRESS OF PROTOTYPE DWT IS ODD,
*  THE DEVICE IS TO BE USED FOR ECHOING ON. 
*  THE ADDRESSES OF THE PROTOTYPE- AND RUNTIME-DWT
*  IS THEN STORED IN THE ECHO DEVICE TABLE. 
* 
	LD	A5,DWTTAB,A1	GET DEVICE TYPE CHARACTERS 
	RF(NN)	DWT59	NO ECHOING ON THIS DEVICE 
	LD*	A3,SCTSFA+2	GET LENGTH OF ECHO DEVICE TABLE
	RF(NZ)	DWT55	ALREADY INITIALIZED!
	ADK	A3,2	INCLUDE LENGTH
DWT55	LDR	A4,A3	SAVE LENGTH 
	AD	A4,SCTSFA+2	NEXT FREE ENTRY 
	STR	A1,A4	STORE ADDRESS OF PROTOTYPE DWT 
	ST	A2,2,A4	STORE ADDRESS OF RUNTIME DWT
	ADK	A3,4	UPDATE LENGTH 
	ST*	A3,SCTSFA+2	STORE NEW LENGTH 
DWT59	RTN	A14 
DWT60	EQU	* 
* 
*  CHECK IF PAGING
* 
	LD	A5,SCTOPT	GET OPTION WORD 
	ANK	A5,1	MMU PAGING? 
	RF(Z)	DWT70
	EJECT
	LD	A5,DWTMEC,A2	GET MONITOR ECB ADDRESS
	LDR	A4,A1	GET PROTOTYPE DWT-ADDRESS
	SUR	A4,A2	COMPUTE RELOCATION CONSTANT
	SUR	A5,A4	RELOCATE MONITOR ECB ADDRESS 
	ANKL	A5,/FFFE	MAKE EVEN ADDRESS
	ST	A5,DWTMEC,A2	STORE IT BACK
* 
*  PAGING: CHECK IF INTERNAL BUFFER SHOULD BE ALLOCATED 
* 
	LD	A5,DWTADR,A2	GET ADDRESS BLOCK
	LD	A4,BUFLEN,A5	GET LENGTH OF INTERNAL BUFFER
	RF(Z)	DWT70	ALLOCATE NO BUFFER!
* 
*  ALLOCATE INTERNAL BUFFER AND STORE ADDRESS IN SECOND WORD OF INTERNAL
* 
	LD	A5,DWTMEC,A2	GET MONITOR ECB-ADDRESS
	LDR	A3,A12	INTERNAL BUFFER ADDRESS 
	ADK	A3,1		 
	ANKL	A3,/FFFE	MAKE SURE OF EVEN ADDRESS
	ST	A3,2,A5	 SAVE 
	LDR	A3,A4	GET LENGTH 
	ADK	A3,3	ADD BO FERMS CONSTANT+1	=1
	ANKL	A3,/FFFE	MAKE SURE OF EVEN LENGTH	=1
	EJECT
* 
*  CHECK IF INTERNAL BUFFER SIZE IS GREATER THAN
*  THE SIZE OF BUFFER RESERVED FOR SYSLOD PART A. 
*  IF YES,THAN STORE THE ADDRESS AND SIZE OF THE
*  INTERNAL BUFFER IN SYSBUF AND BUFSIZ.
* 
	CW	A3,BUFSIZ,A13		 
	RF(NG)	DWT65 
	ST	A3,BUFSIZ,A13 
	ST	A12,SYSBUF,A13
DWT65	EQU	* 
	ADR	A12,A3	NEXT FREE ENTRY 
				=1
				=1
	EJECT
DWT70	EQU	* 
* 
*  STORE FILE-CODE AND DWT-ADDRESS IN TTAB
* 
	ADKL	A10,2	NEXT ENTRY IN TTAB
	LDR*	A5,A7	GET INDEX/FILECODE
	STR	A5,A10	STORE IN TASK CONF. TABLE 
	ADKL	A10,2	NEXT ENTRY IN TTAB
	STR	A2,A10	STORE DWT-ADDRESS 
* 
*  CHECK IF MOORE DEVICES IN THIS CLASS 
* 
	SUKL	A8,4
	RF(Z)	DWTEX
	ADK	A7,4	NEXT DEVICE 
	LDKL	A1,DWT05
	AD	A1,M:REL,A13
	ABR	A1 
DWTEX	EQU	* 
	RTN	A14
	EJECT
* 
*  SCAN ECHO DEVICE TABLE - FOR EVERY COINCIDENCE 
*  BETWEEN THE FIRST POINTER IN ONE POINTER-SET 
*  AND SECOND POINTER IN THE OTHER POINTER-SET: 
*  STORE SECOND POINTER OF FIRST POINTER-SET
*  IN RUNTIME-DWT POINTED AT BY FIRST POINTER 
*  OF SECOND POINTER-SET AND CLEAR POINTERS OF
*  SECOND POINTER-SET.
*  WHEN ALL POINTER-SET HAS BEEN SCANNED,THE LENGTH 
*  OF ECHO DEVICE TABLE IS CLEARED. 
* 
ECHO	LD*	A3,SCTSFA+2	GET LENGTH OF ECHO DEVICE TABLE
	RF(Z)	DWT160	NO ECHO DEVICES!
	AD	A3,SCTSFA+2	COMPUTE END OF ECHO DEVICE TABLE
	LD	A1,SCTSFA+2	GET START OF ECHO DEVICE TABLE
	ADK	A1,2	BYPASS LENGTH 
DWT90	LD	A2,SCTSFA+2	GET START OF ECHO DEVICE TABLE 
	ADK	A2,2	BYPASS LENGTH 
DWT100	LD	A4,2,A1	GET SECOND POINTER IN FIRST SET 
DWT110	CWR*	A4,A2	COMPARE WITH FIRST POINTER IN SECOND SET
	RF(E)	DWT130	COINCIDENCE!
	ADK	A2,4	NEXT POINTER-SET
	CWR	A2,A3	END OF ECHO DEVICE TABLE 
	RB(NE)	DWT110	NO:CHECK NEXT SET
	RF	DWT140
DWT130	LD	A4,2,A2	ADDRESS TO OUTPUT DEVICE RUNTIME-DWT
	LDR*	A2,A1	ADDRESS TO INPUT DEVICE RUNTIME-DWT 
	ST	A4,DWTECH,A2	STORE DEVICE-ADDRESS TO ECHO-DEVICE
	CMR	A1	CLEAR FIRST POINTER 
	CM	2,A1	CLEAR SECOND POINTER 
DWT140	ADK	A1,4	NEXT POINTER-SET
	CWR	A1,A3	END OF ECHO DEVICE TABLE 
	RB(NE)	DWT90	NO! 
DWT150	CM*	SCTSFA+2	CLEAR LENGTH
DWT160	RTN	A14	RETURN 
	EJECT
************************************* 
*  I:CHP - INIT CHANNEL PARAMETER   * 
************************************* 
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A6 - LINE CONNECTION NUMBER
*          A9 - POINTER TO TDC RECORD 
* 
*  EXIT:   A5 - CHANNEL PARAMETER 
*          SAVE05 - SELECTS INTERRUPT TABLE (INTLT1-INTRT4) 
*          SAVE06 - SELECTS LINE ENTRY (1-8)
* 
*  WORK REGISTERS:  A3,A4,A5
* 
*  SUBROUTINES: 
* 
	EJECT
I:CHP	EQU	* 
	LD	A6,SAVE08,A13	GET LINE CONNECTION NUMBER
	CWK	A6,0032	CONNECTION NUMBER <= 32? 
	RF(G)	NUMERR	NO! 
	CWK	A6,0001	CONNECTION NUMBER >=01?
	RF(L)	NUMERR	NO! 
	SUK	A6,1	MODIFY LINE CONNECTION NUMBER 
	LDR*	A5,A1	GET FIRST WOED OF PROTOTYPE DWT 
	ANKL	A5,/F1F0	CLEAR BITS TO MODIFY 
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	LC	A4,TDC+5,A9	CHECK TYPE OF LINE
	CCK	A4,'LL'	LOCAL LINE?
	RF(NE)	I:CHPR	NO: REMOTE 
I:CHPL	EQU	*
	ANK	A3,7	GET BITS 13-15
	ST	A3,SAVE06,A13	SAVE
	SLL	A3,9	MOVE TO BITS 4-6
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	LDR	A3,A6	GET LINE CONNECTION NUMBER 
	ANK	A3,/18	GET BITS 11-12
	SRL	A3,2	MOVE TO BITS 13-14
	ST	A3,SAVE05,A13	SAVE
	SRL	A3,1	MOVE TO BITS 14-15
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	RF	I:CHPE
	EJECT
I:CHPR	EQU	*
* 
*  REMOTE LINE
* 
	ANK	A3,3	GET BITS 14-15
	RF(NZ)	I:CH10
	ANKL	A5,/F1FF	CLEAR BITS 4-6 (= STORE ZERO)
	ST	A3,SAVE06,A13	SAVE ENTRY SELECTOR 
	RF	I:CH50
I:CH10	EQU	*
	ANK	A3,2	GET BIT 14
	RF(NZ)	I:CH20
	ORKL	A5,/0800	STORE 4 IN BITS 4-6
	LDK	A3,4	ENTRY SELECTOR
	ST	A3,SAVE06,A13	SAVE
	RF	I:CH50
I:CH20	EQU	*
	LDR	A3,A6	GET LINE CONNECTION
	ANK	A3,1	GET BIT 15
	RF(NZ)	I:CH30
	ORKL	A5,/0200	STORE 1 IN BITS 4-6
	LDK	A3,1	ENTRY SELECTOR
	ST	A3,SAVE06,A13	SAVE
	RF	I:CH50
I:CH30	EQU	*
	ORKL	A5,/0A00	STORE 5 IN BITS 4-6
	LDK	A3,5	ENTRY SELECTOR
	ST	A3,SAVE06,A13	SAVE
	EJECT
I:CH50	EQU	*
	LDR	A3,A6	GET LINE CONNECTION
	LDK	A4,4	INIT COUNTER
I:CH60	EQU	*
	SUK	A3,2	DECREMENT LINE CONNECTION NUMBER
	RF(N)	I:CH70 
	ADK	A4,1	INCREMENT TABLE SELECTOR
	RB	I:CH60
I:CH70	EQU	*
	ORR	A5,A4	STORE COMPUTED BITS 12-15
	SUK	A4,4 
	ANK	A4,6 
	ADK	A4,8 
	ST	A4,SAVE05,A13	SAVE
I:CHPE	EQU	*
	RTN	A14	RETURN 
NUMERR	EQU	*
	LDKL	A1,LMP4	INDICATE FORMAT ERROR 
	CALL	ERROR 
	EJECT
******************************************************
*                                                    *
*  B:ITAS - BUILD INTERRUPT TABLES FO ASCU4Z/SALCUZ  *
*  ================================================  *
*                                                    *
******************************************************
*                                                    *
*  REFERENCED IN:  DWTGEN                            *
*                                                    *
*  ENTRY:  A1 - POINTER TO PROTOTYPE-DWT             *
*          A6 - LINE CONNECTION NUMBER               *
*          A9 - POINTER TO TDC RECORD                *
*                                                    *
*  EXIT:   A5 - CHANNEL PARAMETER                    *
*          A6 - LINE ENTRY                           *
*                                                    *
*  WORK REGISTERS:  A2,A3,A4,A5,A6                   *
*                                                    *
*  SUBROUTINES:                                      *
*                                                    *
******************************************************
	EJECT
B:ITAZ	EQU	*
	CWK	A6,0016	CONNECTION NUMBER <= 16? 
	RB(G)	NUMERR	NO! 
	CWK	A6,0001	CONNECTION NUMBER >= 01? 
	RB(L)	NUMERR	NO! 
	LDKL	A4,INTAS	GET ENTRY IN MONTAB
	LD	A2,INTAS	TABLE ALREADY INITIALIZED? 
	RF(NZ)	BITZ10	YES
	ADK	A2,ASZLEN	FIXED NUMBER OF ENTRIES
	ST	A2,INTAS	SAVE 
BITZ10	LD	A5,SAVE03,A13	FIRST LINE ENTRY
	RF	BITZ30
B:ITSZ	EQU	*
	CWK	A6,0004	CONNECTION NUMBER <= 4?
	RB(G)	NUMERR	NO! 
	CWK	A6,0001	CONNECTION NUMBER >= 01? 
	RB(L)	NUMERR	NO! 
	LDKL	A4,INTSL	GET ENTRY IN MONTAB
	LD	A2,INTSL	TABLE ALREADY INITIALIZED? 
	RF(NZ)	BITZ20	YES! 
	ADK	A2,SCZLEN	FIXED NUMBER OF ENTRIES
	ST	A2,INTSL	SAVE 
BITZ20	LD	A5,SAVE04,A13	FIRST LINE ENTRY? 
BITZ30	ADR	A2,A5	END OF TABLE 
	SUK	A6,1 
	SLL	A6,1	CONVERT TO DISPLACEMENT 
	ADR	A6,A5	SELECT ENTRY 
	LDR*	A3,A6	ANY DEVICES ON THIS LINE? 
	RF(NZ)	BITZ40	YES! 
	LDR	A3,A2	GET END OF TABLE 
	SUR	A3,A6	COMPUTE RELATIVE DISPLACEMENT
	STR	A3,A6	STORE IN LINE ENTRY
	LDK	A3,6	TABLE INCREMENT 
	ADR*	A3,A4	UPDATE LENGTH 
	STR	A3,A4	STORE NEW LENGTH 
	LDR*	A3,A6	GET DISPLACEMENT
BITZ40	ADR	A6,A3	GET START OF LINE CONF. TABLE
	LDR*	A3,A1	GET CHANNEL PARAMETER 
	SLC	A3,5	DEVICE ADDRESS TO BIT 12-14 
	ANK	A3,6	ONLY DEVICE ADDRESS 1,2 OR 3 ALLOWED
	SUK	A3,2	MAKE DISPLACEMENT 
	ADR	A6,A3	SELECT ENTRY IN LINE CONF. TABLE 
	LD	A4,SAVE08,A13	GET LINE CONNECTION NUMBER
	SUK	A4,1	LINE NUMBER 0-15
	LDR	A3,A4	SAVE LINE NUMBER 
	SRL	A3,3	SELECT ASCU4Z CARD
	LC	A2,TDC+5,A9	GET CONNECTION TYPE 
	CCK	A2,'AA'	ASCU4Z CONNECTION? 
	RF(E)	BITZ50	YES 
	LDK	A3,3	SALCUZ CONNECTION 
BITZ50	ADK	A3,/C	CHANNEL INDEX
	ANK	A3,/F	ISOLATE CHANNEL INDEX
	ANK	A4,7	ISOLATE LINE NUMBER 
	SRC	A4,7	MOVE TO BITS 4-6
	ORR	A4,A3	MERGE LINE NO AND CH. PARAM. 
	LDR*	A5,A1	GET PROTOTYPE CHANNEL PARAMETER 
	ANKL	A5,/F1F0	GET DATA REQ.,DEV. ADDR. AND INP. DEV. BITS
	ORR	A5,A4	COMPLETE CHANNEL PARAMETER 
	RTN	A14
	EJECT
**********************************************
*  B:ITAB - BUILD REAL-TIME INTERRUPT TABLE  *
**********************************************
* 
*  REFERENCED IN:  DWTGEN 
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
* 
*  EXIT:  INTLT1-INTRT4 - REAL TIME INTERRUPT TABLES
* 
*  REGISTER USE:  A1 - WORK REGISTER
*                 A2 -      " 
*                 A3 -      " 
*                 A4 - LENGTH OF LINE SAVE01URATION TABLE 
*                 A5 - DEVICE COUNTER 
*                 A6 - LINE COUNTER 
*                 A7 - DISPLACEMENT IN SAVE21 
*                 A10- ADDRESS TO TEMPORARY INTERRUPT TABLE 
*                 A11- POINTER IN LINE CONF. PART OF REAL INT. TABLE
*                 A12- LINE ENTRY IN REAL INTERRUPT TABLE 
* 
*  SUBROUTINES
* 
	EJECT
B:ITAB	EQU	*
	LD	A12,SCTSFA	INIT POINTER TO FIRST R. I. T. 
	LDR	A11,A12
	LDK	A7,0	RESET POINTER IN IABAT
BIT10	EQU	* 
	LDK	A1,0 
	ST	A1,SAVE24,A13 
	ST	A12,SAVE21,A13	SAVE 
	ADKL	A11,16	INIT POINTER TO LINE CONF. TABLE 
* 
*  GET ADDRESS TO TEMPORARY INTERRUPT TABLE 
* 
	LD	A10,SAVE10,A13
	ADR	A10,A7 
	LDR*	A10,A10 
	LDK	A6,0	RESET LINE ENTRY POINTER
BIT20	EQU	* 
* 
*  SAVE POINTER TO START OF LINE SAVE01URATION TABLE
*  IN TEMPORARY AREA AND RESET LENGTH OF LINE SAVE01URATION TABLE 
* 
	ST	A11,SAVE23,A13	SAVE START OF LINE SAVE01URATION TABLE 
	LDK	A4,0	RESET LENGTH OF LINE CONF.TABLE 
* 
*  INIT POINTER IN TEMPORARY INTERRUPT TABLE
*  TO POINT AT LAST INPUT DEVICE ENTRY
* 
	ADKL	A10,12
	LDK	A5,7 
	ADKL	A11,14
	EJECT
* 
*  CHECK INPUT PART OF TEMPORARY INTERUPT TABLE STARTING
*  WITH THE LAST DEVICE ENTRY 
* 
BIT30	EQU	* 
	LDR*	A1,A10	OCCUPIED ENTRY?
	RF(NZ)	BIT40	YES 
BIT35	EQU	* 
	SUK	A5,1	NO; CHECK IF LAST DEVICE ENTRY
	RF(Z)	BIT50	YES
* 
*  NO ENTRIES IN THE INPUT DEVICE PART OF THE TEMPORARY 
*  INTERRUPT TABLE HAS BEEN OCCUPIED SO FAR 
* 
	SUKL	A10,2	NEXT ENTRY IN TEMP. INT. TABLE
	SUKL	A11,2	NEXT ENTRY IN REAL INT. TABLE 
	RB	BIT30 
* 
*  AN OCCUPIED ENTRY IN THE TEMPORARY INTERRUPT TABLE HAS OCURRED.
*  COPY THE CONTENTS OF THE INPUT DEVICE PART (INCLUDING ZEROES)
*  OF THE TEMPORARY INTERRUPT TABLE UP TO AND INCLUDING THIS ENTRY. 
* 
BIT40	EQU	* 
	STR	A1,A11	STORE CONTENT IN R. I. T. 
	ADK	A4,2	INCREMENT LENGTH
	SUK	A5,1	LAS DEVICE ENTRY? 
	RF(Z)	BIT50	YES
	SUKL	A10,2	NEXT ENTRY IN T.I.T.
	SUKL	A11,2	NEXT ENTRY IN R.I.T.
	LDR*	A1,A10	GET CONTENT OF NEXT ENTRY
	RB	BIT40 
	EJECT
BIT50	EQU	* 
* 
*  ALL ENTRIES OF THE INPUT DEVICE PART IN TEMPORARY INTERRUPT
*  TABLE HAS BEEN SCANNED.
*  -INIT POINTER TO FIRST ENTRY IN OUTPUT DEVICE PART 
*   OF THE TEMPORARY INTERRUPT TABLE. 
*  -INIT DEVICE COUNTER.
* 
	ADKL	A10,14
	LDK	A5,7 
* 
*  SCAN ENTRIES IN OUTPUT DEVICE PART OF THE TEMPORARY INTERRUPT TABLE. 
*  -IF AN OCCUPIED ENTRY OCCUR: 
*  FIND FIRST UNOCCUPIED ENTRY (CONTENT=ZERO) IN THE LINE SAVE01URATION 
*  TABLE OF THE REAL INTERRUPT TABLE AND STORE CONTENT IN THIS ENTRY. 
*  -IF THIS EXTENDS THE LINE SAVE01URATION TABLE: 
*  INCREMENT LENGTH 
* 
BIT70	EQU	* 
	LDR*	A1,A10	OCCUPIED ENTRY?
	RF(NZ)	BIT90	YES 
	SUK	A5,1	LAST ENTRY
	RF(Z)	BIT120	YES 
BIT80	EQU	* 
	ADKL	A10,2	NEXT ENTRY
	RB	BIT70 
BIT90	EQU	* 
* 
*  AN OCCUPIED ENTRY IN OUPUT DEVICE PART OF THE TEMPORARU INTERRUPT TAB
*  HAS OCURRED. FIND FIRST UNOCCUPIED ENTRY IN LINE SAVE01URATION TABLE 
*  OF REAL INTERRUPT TABLE. 
* 
	LDR*	A2,A11
	RF(Z)	BIT100 
	ADKL	A11,2 
	RB	BIT90 
	EJECT
BIT100	EQU	*
* 
*  AN UNOCCUPIED ENTRY HAS BEEN FOUND IN LINE SAVE01URATION TABLE.
*  -STORE THE CONTENT IN THIS ENTRY.
*  -UPDATE LENGTH IF TABLE WAS EXTENDED.
* 
	STR	A1,A11	STORE CONTENT 
	LD	A1,SAVE23,A13	GET START OF L.C.T. 
	LDR	A3,A11	GET CURRENT ENTRY 
	SUR	A3,A1	COMPUTE LENGTH 
	CWR	A3,A4	L.C.T. EXTENDED? 
	RF(NG)	BIT110
	LDR	A4,A3	SAVE NEW LENGTH
BIT110	EQU	*
	SUK	A5,1	LAST ENTRY? 
	RB(P)	BIT80	NO 
BIT120	EQU	*
* 
*  ALL ENTRIES OF THIS LINE IN TEMPORARY INTERRUPT TABLE HAS BEEN SCANNE
*  -IF ANY ENTRY WAS OCCUPIED (LENGTH>0): STORE POINTER TO LINE 
*   SAVE01URATION TABLE IN THIS LINE ENTRY AND STORE LENGTH IN FIRST WOR
* 
	LDR	A4,A4	ANY ENTRY OCCUPIED?
	RF(Z)	BIT130	NO
	IM	SAVE24,A13	INDICATE DEVICE PRESENT! 
	LD	A1,SAVE23,A13	GET POINTER TO L.C.T. 
	STR	A1,A12	STORE IN LINE ENTRY 
	STR	A4,A1	STORE LENGTH IN FIRST WORD OF L.C.T. 
	LDR	A11,A1	START OF L.C.T. 
	ADR	A11,A4	LAST OCCUPIED ENTRY IN L.C.T. 
	ADKL	A11,2	NEXT FREE ENTRY 
	RF	BIT140
	EJECT
BIT130	EQU	*
* 
*  NO DEVICES ON THIS LINE. 
*  -NO LINE SAVE01URATION TABLE GENERATED 
*  -SKIP LENGTH WORD
*  -LINE ENTRY CONTAIN ZERO 
* 
	SUKL	A11,2	SKIP LENGTH WORD
BIT140	EQU	*
	ADKL	A10,2	NEXT ENTRY IN T.I.T.
	ADK	A6,1	INCREMENT LINE COUNTER
	CWK	A6,8	ALL LINES SCANNED?
	RF(E)	BIT150	YES 
	ADKL	A12,2	NEXT LINE ENTRY 
	RB	BIT20 
BIT150	EQU	*
* 
*  STORE ADDRESS TO THIS INTERRUPT TABLE IN MONTAB
*  IF ANY DEVICE PRESENT ON ANY LINE
* 
	LD	A1,SAVE24,A13	ANY DEVICE PRESENT? 
	RF(Z)	BIT155	NO! 
	LD	A1,SAVE21,A13	GET INTERRUPT TABLE ADDRESS 
	ST	A1,INTLT1,A7	SAVE 
	RF	BIT158
BIT155	EQU	*
	LD	A11,SAVE21,A13	GET START OF FREE AREA 
BIT158	EQU	*
* 
*  ALL LINES OF THIS INTERRUPT TABLE HAS BEEN SCANNED.
*  -CHECK IF ALL INTERRUPT TABLES (INTLT1-INTRT4) HAS BEEN GENERATED
* 
	ADK	A7,2	NEXT ENTRY IN ITAB
	CWK	A7,16	LAST ENTRY?
	RF(E)	BIT160	YES 
	LDR	A12,A11	GET NEXT FREE ENTRY
	RB	BIT10 
BIT160	EQU	*
* 
*  ALL ENTRIES IN THE TEMPORARY INTERRUPT TABLE HAS BEEN SCANNED
*  AND ALL THE REAL INTERRUPT TABLES HAS BEEN GENERATED.
*  POINTERS TO THE REAL INTERRUPT TABLES HAS BEEN INSERTED IN MOXTAB. 
* 
* 
*  MOVE INTERRUPT TABLE FOR SALCUZ AND ASCU4Z 
*  TO CONCATENATE INTERRUPT TABLES FOR CHLT/CHRT DEVICES
* 
	LD	A3,INTAS	ANY ASCU4Z CONNECTION? 
	RF(Z)	BIT180	NO! 
	LDR	A2,A11	GET TO-ADDRESS
	ADR	A11,A3	END OF TO-AREA
	LD	A1,SAVE03,A13	GET FROM-ADDRESS
	CALL	MOVE
	ST	A2,INTAS	STORE ADDRESS TO INTERRUPT TABLE 
	ADK	A2,ASZLEN	LAST LINE ENTRY+2
BIT170	SUK	A2,2	DECREMENT ENTRY POINTER 
	LDR*	A1,A2	ANY CONNECTION ON THIS LINE?
	RF(Z)	BIT175	NO! 
	ADRS	A2,A2	RELOCATE POINTER
BIT175	CW	A2,INTAS	ALL POINTERS RELOCATED?
	RB(NE)	BIT170	NO!
BIT180	LD	A3,INTSL	ANY SALCUZ CONNECTION? 
	RF(Z)	BIT200	NO! 
	LDR	A2,A11	GET TO-ADDRESS
	ADR	A11,A3	END OF INTERRUPT TABLE
	LD	A1,SAVE04,A13	GET FROM-ADDRESS
	CALL	MOVE	MOVE INTERRUPT TABLE 
	ST	A2,INTSL	STORE ADDRESS TO INTERRUPT TABLE 
	ADK	A2,SCZLEN	LAST LINE ENTRY+2
BIT190	SUK	A2,2	DECREMENT ENTRY POINTER 
	LDR*	A1,A2	ANY CONNECTION ON THIS LINE?
	RF(Z)	BIT195	NO! 
	ADRS	A2,A2	RELOCATE POINTER
BIT195	CW	A2,INTSL	ALL POINTERS RELOCATED?
	RB(NE)	BIT190	NO!
BIT200	EQU	*
	LD	A2,SCTSFA 
	SUK	A2,2 
BIT210	ADK	A2,2 
	CW	A2,SCTEFA	CHECK IF MEMORY OVERFLOW
	RF(NE)	BIT220
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
BIT220	CWR	A2,A11 
	RB(NE)	BIT210
	ST	A13,SCTEFA	SKIP TEMP. INTERRUPT TABLE 
	ST	A11,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14	RETURN 
	EJECT

Full view