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

⟦c4bc44428⟧

    Length: 170382 (0x2998e)
    Notes: pts_type(SC)
    Names: »SYSLDM.SC«

Derivation

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

PTS(SC)

	IDENT SYSLDM 	REL 11.0 81-02-16 870105041100 

			=6,INIT UNUSED MMU ENTRIES,AND INIT ACBSTA 
			   AND ACBREL FOR MONITOR EXTENTS
			   REL 11.0 81-01-26 
			=5,CHANGES IN CONDITIONAL ASSEMBLY WHEN
			   BUILDING COMMON DEVICE TABLES 
			   PRR 11.0 80-12-11 
			=4,CLEAR WORK AREA FOR ECHO DEVICE TABLE 
			   EVEN IF   NO TERMINAL DEVICES 
			   PRR 11.0 80-12-03 
			=3,APPLICATION CONTROL BLOCK IS EXTENDED 
			   WITH 1 WORD 
			PRR 11.0 80-12-01
			=2,IF NO S-BLOCK IN CONF.DATA,PROCESS
			   EVEN NEXT CREDIT APPL.  CONVERT A 
			   BINARY VALUE >99 TO ASCII 
			   THE FIRST POINTER IN WORK STATION TABLE 
			   FOR PLC IS FOR WS NUMBER ZERO 
			   CHECK IF MEMORY OVERFLOW WHEN BUILDING
			   USER TASK TABLES
			   PRR 11.0 80-11-20 
			=1,IF NO D-BLOCK IN CONF. DATA, SKIP DCT-CREATION
			   PRR 11.0 80-11-19 
	ENTRY	SYSLDM 
* 
*  EXTERNALS DEFINED IN SYSTEM CONTROL TABLE
* 
	EXTRN	SCTANO	APPLICATION NUMBER
	EXTRN	SCTBLK	NUMBER OF BLOCKS PER TASK 
	EXTRN	SCTBUG	 DEBUGGER ADDRESS 
	EXTRN	SCTCDT	COMMON DEVICE TABLE ADDRESS 
	EXTRN	SCTDCT	DATA COMMUNICATION
	EXTRN	SCTDMI	DM: INDEX BUFFER RECORD SIZE
	EXTRN	SCTDMT	DATA MANAGEMENT TASKS 
	EXTRN	SCTEFA	END OF FREE AREA
	EXTRN	SCTFWL	FM: FILE WORK TABLE LENGTH
	EXTRN	SCTFWT	FM: FILE WORK TABLE ADDRESS 
	EXTRN	SCTMOX	MONITOR EXTENT START ADDRESS TABLE
	EXTRN	SCTMXS	MONITOR EXTENT&SEGMENT TABLE
	EXTRN	SCTNFT	DM/FM: NUMBER OF FILES/TASK 
	EXTRN	SCTNOF	DM/FM: NUMBER OF FILES
	EXTRN	SCTNOP	NUMBER OF PAGES 
	EXTRN	SCTNOS	NUMBER OF SEGMENTS/TASK (BASIC ONLY)
	EXTRN	SCTOPT	SYSTEM OPTIONS
	EXTRN	SCTPAG	PAGE TABLE ADDRESS
	EXTRN	SCTIPL	PROGRAM LOADING DEVICE
	EXTRN	SCTPSZ	PAGE SIZE 
	EXTRN	SCTSFA	START OF FREE AREA
	EXTRN	SCTTCT	TASK CONTROL TABLE
	EJECT
* 
*  EXTERNALS DEFINED IN MONTAB
* 
	EXTRN	FREQUE	FREE PAGES QUEUE ANCHOR 
	EXTRN	INTLT1	LOCAL CONNECTION
	EXTRN	INTRT1	REMOTE CONNECTION 
	EXTRN	INTVU1	VIDEO CONNECTION
	EXTRN	INTPL1	GENERAL CONNECTION
	EXTRN	INTAS1	ASYNCHRONOUS CONNECTION 
	EXTRN	INTSL1	SYNCHRONOUS CONNECTION
* 
*  MISCELLANOEUS EXTERNALS
* 
	EXTRN	REL	RELOCATION BASE IN SYSINI
	EXTRN	SCLASS	SPECIAL DEVICE CLASS TABLE
	EXTRN	TCLASS	TERMINAL DEVICE CLASS TABLE 
	EXTRN	SYSLOD	START OF SYSLOD 
	EXTRN	STKCOM	COMMON STACK AREA BASE
	EXTRN	STKEND	LOCAL STACK AREA BASE 
* 
*  EXTERNAL SUBROUTINES 
* 
	EXTRN	ERROR	ERROR HANDLING 
	EXTRN	MOVE	MOVE AREAS IN MEMORY
	EXTRN	MULT	MULTIPLY
	EXTRN	PSW	STORE PROGRAM STATUS WORD
	EXTRN	CMPADR	COMPARE ADDRESSES 
	EXTRN	CONVRT	CONVERT FROM ASCII TO BINARY
	EXTRN	NXTBLK	GET NEXT TASK DEF. BLOCK
	EXTRN	NXTCOM	GET NEXT COMMON DEFINITION BLOCK
	EXTRN	GETNUM	GET NUMBER
	EXTRN	INBIMA	INIT MMU ALLOCATION BIT MAP 
	EXTRN	PUSH	SAVE REGISTER A1-A14 ON STACK 
	EXTRN	POB	RESTORE REGISTER A1-A14 FROM STACK 
	EXTRN	GETAPP	GET NEXT APPLICATION OF SPECIFIED TYPE
	EJECT
* 
*  TTAB DISPLACEMENTS 
* 
	EXTRN	TTB:AM	MMU ALLOCATION BIT MAP
	EXTRN	TTB:MT	MMU TABLE 
	EXTRN	TTB:AP	APPLICATION CONTROL BLOCK 
	EXTRN	TTB:CB	CURRENT SEGMENT BASE POINTER
	EXTRN	TTB:SP	SEGMENT TABLE POINTER 
	EXTRN	TTB:SB	SEGMENT BLOCK POINTER 
	EXTRN	TTB:ID	TASK ID 
	EXTRN	TTB:ST	STATUS
	EXTRN	TTB:PP	PENDING POINTER 
	EXTRN	TTB:PW	PROGRAM STATUS WORD 
	EXTRN	TTB:SA	DISPATCH ADDRESS
	EXTRN	TTB:TD	DEVICE TABLE LENGTH 
* 
*	DWT PARAMETERS
* 
	EXTRN	DWTCHP	CHANNEL PARAMETER-1 
	EXTRN	DWTST	STATUS 
	EXTRN	DWTECB	ECB ADDRESS 
	EXTRN	DWTOR	ORDER
	EXTRN	DWTADR	ADDRESS BLOCK 
	EXTRN	DWTTAB	TTAB ADDRESS
	EXTRN	DWTWAT	WAIT/ACTIVATE INDICATOR 
	EXTRN	DWTTQ	TERMINAL QUEUE 
	EXTRN	DWTUEC	USER ECB ADDRESS
	EXTRN	DWTMEC	MONITOR ECB ADDRESS 
	EXTRN	DWTCP2	CHANNEL PARAMETER-2 
	EXTRN	DWTDEV	DEVICE STATUS 
	EXTRN	DWTECH	ECHO DEVICE 
	EXTRN	DWTSQ	START OF QUEUE 
	EJECT


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

MMUPAG	EQU	1	1 - MEMORY MANAGEMENT UNIT 
DSKPAG	EQU	1	1 - DISC PAGING
SWPBLK	EQU	0	1 - SWAPPABLE WORK BLOCK HANDLING
EDM	EQU	0	1 - EXTENDED DATA MANAGEMENT
X:A	EQU	1 
X:B	EQU	1 
X:C	EQU	1 
X:D	EQU	1 
X:E	EQU	1 
X:F	EQU	1 
X:G	EQU	1 
X:H	EQU	1 
X:I	EQU	1 
X:J	EQU	1 
X:K	EQU	0 
X:L	EQU	1 
X:M	EQU	0 
* 
SUML	EQU	01 
SUMR	EQU	01 
SALCUZ	EQU	00 
ASCU4Z	EQU	00 
FT80	EQU	00 
PLCL	EQU	00 
PLCR	EQU	00 
VIDEO	EQU	00
TEDVCL	EQU	01 
SPDVCL	EQU	01 
NOEXMB	EQU	X:K
FM	EQU	01 
DC	EQU	00 
	EJECT
* 
*  COMMON DISPLACEMENTS AND CONSTANTS 
* 
ACBLEN	EQU	26	APPL.CONTROL BLOCK LENGTH	=3
APLTAB	EQU	12	ADDRESS TO APPL. CONTROL TABLE
APPLNO	EQU	18	APPLICATION NUMBER
BUFSIZ	EQU	14	TEMPORARY BUFFER SIZE 
CONLEN	EQU	0	LENGTH OF CONFIGURATION DATA 
CONSTA	EQU	2	START OF CONFIGURATION DATA
DATEND	EQU	34	END OF DDIV PROTOTYPE 
FSTADR	EQU	20	1ST FREE ADDRESS WHEN ALLOCATING BUFFER 
FSTPAG	EQU	22	1ST FREE PAGE (PHYSICAL)
FYSPAG	EQU	24	LAST PHYSICAL PAGE NUMBER 
LSTADR	EQU	26	LAST ADDRESS WHEN BUILDING DATA PART
MAPLEN	EQU	30	LENGTH OF AREA TO MAP 
MMFROM	EQU	36	2ND MMU TABLE WORK AREA 
MMTO	EQU	38	1:ST MMU TABLE WORK AREA
M:REL	EQU	16	RELOCATION CONSTANT
SYSBUF	EQU	28	START OF TEMPORARY BUFFER 
SWBFSA	EQU	4	SWB-FILE START ADDRESS (2 WORDS) 
SWBFSE	EQU	8	SWB-FILE END ADDRESS (2 WORDS) 
TTAB	EQU	32	WORK AREA FOR MMU TABLE 
COM01	EQU	40	COMMON SAVE AREA 1 
COM02	EQU	42	COMMON SAVE AREA 2 
COM03	EQU	44	COMMON SAVE AREA 3 
TOTSGM	EQU	46	TOTAL NUMBER OF SEGMENTS
SWBFLG	EQU	48	SWAPPPABLE WORK BLOCK FLAG
COM04	EQU	50	COMMON SAVE AREA 4 
DCBLK	EQU	54	START OF DC CONF. DATA 
	EJECT
* 
*  DISPLACEMENT IN LOCAL STACK AREA 
* 
TCLA	EQU	0	ADDRESS TO TCLASS
SCLA	EQU	2	ADDRESS TO SCLASS
CUTENT	EQU	4	FIRST USER TASK ENTRY
FWTSIZ	EQU	6	FWT AREA SIZE IN WORDS 
APCTAB	EQU	8	CURRENT APPL CONTROL BLOCK 
SFASAV	EQU	10	SAVE START OF FREE AREA 
NBRTSK	EQU	12	NUMBER OF TASKS IN CLASS
TASKID	EQU	14	TASK IDENTIFICATION 
FWTFLG	EQU	16	FWT FLAG
TCLSAV	EQU	18	TASK CLASS
TSKLEV	EQU	20	TASK LEVEL
INTTAB	EQU	22	TEMP INTTERRUPT TABLE 
FWTSTA	EQU	24	START OF FWT AREA 
LIMIT	EQU	26	CURRENT END OF SYSTEM AREA 
NBRCOM	EQU	28	NUMBER OF COMMON TDC:S
CLASID	EQU	30	CLASS ID
CONTYP	EQU	32	CONNECTION TYPE 
LCNBR	EQU	34	LINE CONNECTION NUMBER 
CLANBR	EQU	36	CLASS NUMBER
MAXSGM	EQU	38	MAXIMUM SEGMENT SIZE
* 
WRK1	EQU	42	WORK AREA 1 
WRK2	EQU	44	WORK AREA 2 
WRK3	EQU	46	WORK AREA 3 
WRK4	EQU	48	WORK AREA 4 
BRDTAB	EQU	50	BOARD CONF TABLE
LCDSTA	EQU	52	CONFIGURATION DATA POINTER
NBRSDC	EQU	54	NUMBER OF SPECIAL DEVICE CLASSES
NBRTDC	EQU	56	NUMBER OF TERMINAL DEVICE CLASSES 
APLNO	EQU	58	NUMBR OF APPLICATIONS
ECHTAB	EQU	60	ECHO TABLE ADDRESS
SGMCNT	EQU	62	SEGMENT COUNTER 
NUMDTE	EQU	64	NUMBER OF DTE:S DEFINED 
DTENAM	EQU	66	SDTE IDENTIFICATION 
DTETYP	EQU	68	TYPE OF CONNECTION
NASTRT	EQU	70	START OF NETW. ADDR. IN CONF. DATA
NALNG	EQU	72	LENGTH OF NETWORK ADDRESS
DTENSA	EQU	74	NO OF SUBADDRESSES DEFINED
DTECOP	EQU	76	NO OF COPIES OF CURRENT DTE BLOCK 
NSAADR	EQU	78	START OF SUBADDRESSES(DC) 
APCSTA	EQU	APCTAB	CURRENT APPLICATION CONTROL BLOCK 
SCBTAB	EQU	APCTAB	CURRENT SEGMENT CONTROL BLOCK 
EXCTAB	EQU	SCBTAB	CURRENT EXTENT CONTROL BLOCK
NBRSWB	EQU	FWTSIZ	NUMBER OF SWB RECORDS 
SWBBLK	EQU	FWTFLG	START OF SWB CONF. DATA 
SWBNAM	EQU	FWTSTA	ADDRESS TO SWB NAME 
SWBTBL	EQU	NBRTSK	LENGTH OF S:BTAB
TCTEND	EQU	NBRTSK	LAST TCTAB ENTRY
SWBCNT	EQU	TASKID	NUMBER OF SWB:S 
	EJECT
* 
*  DISPLACEMENT IN APPLICATION CONTROL TABLE
* 
APLREL	EQU	18	APPLICATION RELOCATION BASE	=6
APLIOE	EQU	0	APPLICATION RESTART ADDRESS
APLLAC	EQU	14	APPLICATION LOAD ADDRESS
APLLAP	EQU	12	LOGICAL PAGE ADDRESS
APLLDA	EQU	0	APPL. LOAD ADDRESS (PHYSICAL)
APLMMC	EQU	10	APPL MMU START ENTRY
APLMMP	EQU	8	SEGMENT START MMU ENTRY
APLSEG	EQU	4	PHYSICAL START OF 1ST SEGMENT
APLNPE	EQU	6	NUMBER OF PAGE ENTRIES IN MMU
APLSWB	EQU	2	SWB TABLE ADDRESS
APLSTA	EQU	16	APPL PROGRAM START ADDRESS
APLTYP	EQU	8	APPLICATION TYPE 
APLADA	EQU	22	APPLICATION DISC ADDRESS (2 WORDS)	=3 
APLPSZ	EQU	20	APPLICATION SEGMENT SIZE	=3 
	EJECT
				
* 
*  CONSTANTS
* 
S:BTAB	EQU	40	DISPL. TO S:BTAB ADDRESS
SWBLEN	EQU	4	LENGTH OF SWB
SWBSEC	EQU	6	DISPL. TO SECTOR LENGTH
UP:REC	EQU	6	RECORD LENGTH IN INITIAL S:BTAB
UPNAME	EQU	4	PROTOTYPE NAME 
WBLEN	EQU	-4	LENGTH OF WORKBLOCK
				
				
******************************* 
* DISPLACEMENT IN CONFIGURATION DATA
******************************* 
			 
* 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	7	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
* 
*  DATA COMMUNICATION DEFINITION BLOCK
* 
IDLIM	EQU	4	ID DELIMITER OFFSET 
TYPOFS	EQU	7	START OF TYPE RECORD 
NANSA	EQU	2	NA-NSA RECORD QUALIFIER POS.
NAOFS	EQU	3	START OF NA NUMBER
NSAOFS	EQU	4	START OF NSA RECORD
DTEFIX	EQU	8	FIX PART OF DTE BLOCK
	EJECT
****************
* SOP-HANDLING *
****************
SOP	EQU	/2E	DEVICE ADDRESS

LMP1	EQU	/400	SYSLOD RUNS	LAMP 1 CODE 
LMP2	EQU	/200	NOT USED
LMP3	EQU	/100	MEMORY OVERFLOW 
LMP4	EQU	/80	ERROR IN CONFIGURATION DATA
LMP5	EQU	/40	NOT USED 
LMP6	EQU	/20	NOT USED 
LMP7	EQU	/10	NOT USED 
LMP8	EQU	8	NOT USED 
LMP9	EQU	4	NOT USED 
LMP10	EQU	2	NOT USED
LMP11	EQU	1	NOT USED
			 
***************************************************************** 
*  CALL-FORMAT, PERFORMS:  CFR      A14,A13                     * 
*                          DATA     [REL-ADDRESS]               * 
*                                                               * 
***************************************************************** 
			 
			 
			 
CALL	FORM	16=/F697,16 
	EJECT
* 
*  MXSTAB DISPLACEMENTS 
* 
MXSBL	EQU	6	SEGMENT BLOCK LENGTH
MXNOX	EQU	6	NUMBER OF EXTENTS 
MX:NOS	EQU	8	NUMBER OF SEGMENT TABLES 
MX:EBL	EQU	6	MONITOR EXTENT BLOCK LENGTH
MX:LEV	EQU	/0031	MONITOR TASK LEVEL 
MX:LEN	EQU	4	MONITOR EXTENT LENGTH
MX:DA1	EQU	2	MONITOR DISC ADDRESS BITS 0-15 
MX:DA2	EQU	MX:DA1+2	MONITOR DISC ADDRESS BITS 16-31 
MX:NOX	EQU	MX:DA2+2	NUMBER OF MONITOR EXTENTS 
MX:SBL	EQU	6	MONITOR EXTENT BLOCK LENGTH
MX:STA	EQU	2	MONITOR EXTENT START ADDRESS 
	EJECT
* 
*                  ***********
*                 *  PAGTAB  *
*                  ***********
* 
PAGQF	EQU	0	QUEUE POINTER FORWARD 
PAGQB	EQU	2	QUEUE POINTER BACKWARD
PAGPA	EQU	4	PAGE ADDRESS
PAGSB	EQU	6	SEGMENT BLOCK ADDRESS 
	EJECT
* 
*                    *************
*                    *  SEGTAB   *
*                    *************
* 
SEGPB	EQU	6	SEGMENT POINTER 
SEGSB	EQU	6	PAGE BLOCK ADDRESS

	EJECT
* 
*                 ******************* 
*                 *  MISCELLANOUES  * 
*                 ******************* 
* 
BUFLEN	EQU	-4 
DEVIND	EQU	-2 
DWTLEN	EQU	6
TDCDD1	EQU	5
TDCDD2	EQU	6
TDCLCN	EQU	10	DISP. TO LINE CON. NBR
SLL0	EQU	/3940	SLL A1,0 CONSTANT
NBRDPS	EQU	12	NUMBER OF DATA PAGES/TASK (BASIC ONLY)
	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	*
	LDR	A8,P	INIT STACK POINTER
	LDKL	A1,REL+2	RELOCATION ROUTINE ENTRY 
	AD	A1,STKCOM+M:REL	RELOCATE ADDRESS
	CFR	A8,A1
	LDKL	A11,SYSLOD	START OF SYSLOD
	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,STKEND+TCLA	SAVE RELOCATED POINTER TO TCLASS 
NO:TCL	LDKL	A2,SCLASS	GET ADDRESS TO SCLASS 
	CALL	CHPTRS	RELOCATE POINTERS IN SCLASS
	ST	A2,STKEND+SCLA	SAVE RELOCATED TO SCLASS 
	RF	CLEAR 
	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
CLEAR	EQU	* 
* 
*  CLEAR ALL WORDS IN SYSTEM AREA 
* 
	LD	A2,SCTSFA 
	LDR	A1,P	GET PROGRAM COUNTER 
CLRSYS	EQU	*
	SUK	A1,2 
	CMR	A1 
	CWR	A1,A2
	RB(NE)	CLRSYS
	LDKL	A1,CONMON 
	AD	A1,STKCOM+M:REL 
	ABR	A1 
 EJECT
**************************************************
*  B:TCT - BUILD TASK CONTROL TABLE              *
**************************************************
* 
*  REFERENCED IN: MONCON
* 
* 
*  ENTRY: 
* 
*  EXIT:
* 
*   WORK REGISTERS: A1-A7,A11,A12 
* 
*  SUBROUTINES: 
* 
*               TASK CONTROL TABLE LAYOUT 
*               _________________________ 
*              I       LENGTH            I
*               _________________________ 
*              I    MONITOR TASKS        I
*               _________________________ 
*              I      USER TASKS         I
*              __________________________ 
* 
	EJECT
B:TCT	EQU	* 
	LD	A12,SCTSFA	GET START OF FREE AREA 
	ST	A12,SCTTCT	STORE ADDRESS TO TCTAB 
	ADKL	A12,2	FIRST TTAB ADDRESS ENTRY
	IFF	EDM=0
* 
*  RESERVE ENTRIES IN TCTAB FOR MONITOR EXTENT
*  AND MONITOR SEGMENT TASKS
* 
	LD	A2,SCTMXS	GET ADDRESS TO MXSTAB 
	RF(Z)	BTCT20	NOT PRESENT!
	CALL	MX:TDB	GET FIRST MONITOR EXTENT TDB 
BTCT02	SUK	A7,1	DECREMENT NUMBER OF EXTENTS 
	RF(N)	BTCT05	NO MORE!
	LDR*	A4,A1	GET NUMBER OF TASK ID:S 
BTCT04	ADK	A1,2	NEXT TASK ID
	SUK	A4,1	DECREMENT NUMBER OF TASK ID:S 
	RB(N)	BTCT02	NO MORE!
	LDR*	A2,A1	GET TASK ID 
	CALL	RESTCT	RESERVE ENTRY IN TCTAB 
	RB	BTCT04
BTCT05	CALL	MX:STD	GET FIRST MONITOR SEGMENT TDB
BTCT06	SUK	A6,1	DECREMENT NUMBER OF MONITOR SEGMENT TABLES
	RF(N)	BTCT20	NO MORE!
	LDR*	A4,A1	GET NUMBER OF TASK ID:S 
BTCT08	ADK	A1,2	NEXT TASK ID
	SUK	A4,1	DECREMENT NUMBER OF TASK ID:S 
	RB(N)	BTCT06	NO MORE 
	LDR*	A2,A1	GET TASK ID 
	CALL	RESTCT	RESERVE ENTRY TCTAB
	RB	BTCT08
	XIF
	EJECT
* 
*  RESERVE ENTRIES IN TCTAB FOR USER TASKS
* 
BTCT20	EQU	*
	ST	A12,STKEND+CUTENT	SAVE CURRENT USER TASK ENTRY
	LD	A7,SYSLOD	GET NUMBER OF APPLICATIONS
	LDKL	A4,SYSLOD+2	FIRST APPLICATION CONTROL BLOCK 
BTCT30	SUK	A7,1	MORE APPLICATIONS?
	RF(N)	BTCT70	NO! 
	LD	A11,APLMMC,A4	GET START OF CONFIGURATION DATA 
	AD	A11,STKCOM+CONSTA	RELOCATE POINTER
	ST	A12,APLMMC,A4	STORE 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
	EJECT
BTCT35	EQU	*
* 
*  COMPUTE NUMBER OF TASK IN EACH TASK CLASS
* 
BTCT40	EQU	*
	CALL	GETTSK	GET NUMBER OF TASKS
BTCT50	EQU	*
	ADKL	A12,2	RESERV ANOTHER ENTRY IN TC:TAB
	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 
BTCT60	EQU	*
	ADK	A4,ACBLEN	NEXT APPL. CONTROL BLOCK 
	RB	BTCT30
* 
*  ENTRIES FOR ALL USER TASKS RESERVED IN TC:TAB
* 
BTCT70	ST	A12,SCTSFA	UPDATE END OF FREE AREA
	SU	A12,SCTTCT	COMPUTE LENGTH 
	ST*	A12,SCTTCT	STORE 
	RTN	A14
	IFF	EDM=0
	EJECT
***************************************************** 
*                                                   * 
*          RESTCT - RESERVE ENTRY IN TCTAB          * 
*          ===============================          * 
*                                                   * 
*  REFERENCED IN: B:TCT                             * 
*                                                   * 
*  ENTRY:  A2 - CURRENT TASK ID                     * 
*         A12 - NEXT FREE ENTRY IN TCTAB            * 
*                                                   * 
*  EXIT:  A12 - NEXT FREE ENTRY IN TCTAB            * 
*                                                   * 
*  WORK REGISTERS:  A3                              * 
*                                                   * 
*  SUBROUTINES:                                     * 
*                                                   * 
***************************************************** 
RESTCT	EQU	*
	LDR	A3,A12	GET END OF TCTAB
REST10	SUK	A3,2	NEXT ENTRY
	CW	A3,SCTTCT	ALL ENTRIES CHECKED?
	RF(NE)	REST30	NOT YET
	STR	A2,A12	STORE TASK ID IN TCTAB
	ADKL	A12,2	NEXT FREEE ENTRY IN TCTAB 
REST20	RTN	A14	RETURN 
REST30	CWR*	A2,A3	CHECK IF SAME TASK ID 
	RB(NE)	REST10	NOT THE SAME 
	RB	REST20	COINCIDENCE: RETURN
	XIF
	IFF	FM=0 
	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,STKEND+CUTENT	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,STKEND+FWTSIZ	SAVE FWT AREA SIZE IN WORDS
	LD	A2,SCTSFA	GET START OF FREE AREA
	ST	A2,SCTFWT	STORE ADDRESS TO FIRST FWT
	ST	A2,STKEND+FWTSTA	SAVE START OF FWT AREA 
	ST	P,STKEND+LIMIT	UPDATE END OF SYSTEM AREA
FWT50	CW	A2,STKEND+LIMIT	MEMORY OVERFLOW? 
	RF(NE)	FWT60	NOT YET!
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
FWT60	CMR	A2	CLEAR FWT AREA 
	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 
	SUK	A2,2 
	ST	A2,STKEND+INTTAB	SAVE ADDRESS TO T.I.T. 
FWT70	RTN	A14 
	XIF
	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 
	ST	P,STKEND+LIMIT	UPDATE END OF SYSTEM AREA
MON:10	EQU	*
	SUK	A7,2	MOORE TASKS?
	RF(Z)	MON:20	 NO 
	CALL	BLKGEN
	RB	MON:10
MON:20	EQU	*
* 
*  GENERATE EXTRA MONITOR BLOCKS
* 
	LDK	A2,19
	ADK	A2,NOEXMB
	AD	A2,SCTNOF 
	AD	A2,SCTNOF 
	CALL	BLKGEN
* 
*  GENERATE END BLOCK 
* 
	STR	A1,A12 
	ST	A1,2,A12
	ST	A1,4,A12
* 
*  CHECK IF BUFFER GREATER THAN 2 WORDS RESERVED FOR SYSLOD PART A
*  IF NOT - USE LAST MONITOR BLOCK AS BUFFER
* 
	LD	A1,STKCOM+BUFSIZ	GET BUFFER SIZE
	CWK	A1,4	>4? 
	RF(NL)	MON:30	NOT LESS ANYWAY! 
	LDK	A1,4	BUFFER  SIZE
	ST	A1,STKCOM+BUFSIZ	UPDATE MAX BUFFER SIZE 
	ADKL	A12,2 
	ST	A12,STKCOM+SYSBUF	UPDATE BUFFER ADDRESS 
MON:30	EQU	*
	ADKL	A12,6 

	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,A4 
* 
*  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
	LDK	A4,3	NUMBER OF WORDS/BLOCK 
BLK:20	CW	A12,STKEND+LIMIT	MEMORY OVERFLOW? 
	RF(NE)	BLK:30	NOT YET! 
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
BLK:30	ADKL	A12,2	RESERVE ANOTHER WORD
	SUK	A4,1	MORE WORDS WANTED?
	RB(NZ)	BLK:20	YES
	ST	A12,-6,A12
	ST	A1,-4,A12 
	ST	A1,-2,A12 
	SUK	A3,1 
	RB	BLK:10
BLKEX	EQU	* 
	RTN	A14
	IFF	EDM=0
	EJECT
******************************************************************* 
*                                                                 * 
*          B:MXTT - BUILD TTABS FOR MONITOR EXTENT TASKS          * 
*          =============================================          * 
*                                                                 * 
*  REFERENCED IN:  SYSLDM                                         * 
*                                                                 * 
*  ENTRY:                                                         * 
*                                                                 * 
*  EXIT:                                                          * 
*                                                                 * 
*  WORK REGISTERS: A4                                             * 
*                                                                 * 
*  SUBROUTINES:  MX:TDB,MXTTAB                                    * 
*                                                                 * 
******************************************************************* 
B:MXTT	EQU	*
	LD	A2,SCTMXS	GET ADDRESS TO MXSTAB 
	RF(Z)	BMX99	NOT PRESENT
	LDK	A4,2	DISPLACEMENT TO FIRST EXTENT TASK 
	ST*	A4,SCTTCT	IN TCTAB 
	CALL	MX:TDB	FIND FIRST MONITOR EXTENT TDB
	LD	A4,SCTMOX	GET ADDRESS TO START-ADDRESS TABLE
	RF(NZ)	BMX05	ALREADY DEFINED 
	LD	A4,SCTSFA	START OF FREE AREA
	ST	A4,SCTMOX	ADDRESS TO START-ADDRESS TABLE
	LDK	A4,2	INITIAL LENGTH OF START-ADDRESS TABLE 
	ST*	A4,SCTMOX	STORE IN FIRST WORD
	SUK	A4,2	RESET TASK ID COUNTER 
	LDR	A2,A1	GET POINTER TO TDB 
	LDR	A3,A7	GET NUMBER OF EXTENTS
	SUK	A2,2	
BMX01	SUK	A3,1	MORE EXTENTS?
	RF(N)	BMX03	NO 
	ADK	A2,2	ADDRESS NUMBER OF TASK ID:S 
	LDR*	A6,A2	GET NUMBER OF TASK ID:S 
	ADR*	A4,A2	ADD NUMBER OF TASK ID:S 
BMX02	SUK	A6,1	MORE TASK ID:S?
	RB(N)	BMX01	NO 
	ADK	A2,2	ADDRESS NEXT TASK ID
	RB	BMX02 
BMX03	SLL	A4,2	INCLUDE LENGTH 
	ADK	A4,2	INCLUDE LENGTH OF START-ADDRESS TABLE 
	AD	A4,SCTSFA	END OF START-ADDRESS TABLE
	ST	A4,SCTSFA	UPDATE START OF FREE AREA 
	LDR	A11,A4	GET TABLE END 
	LDR	A9,P	GET CURRENT LOCATION
	CALL	CMPADR	COMPARE ADDRESSES
	RF(NG)	BMXS05	OK 
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
BMXS05	ST	P,STKEND+LIMIT	UPDATE END OF SYSTEM AREA
BMX05	SUK	A1,2
BMX10	SUK	A7,1	DECREMENT NUMBER OF EXTENTS
	RF(N)	BMX99	NO MORE
	LD	A12,SCTSFA	GET START OF FREE AREA 
	ST	A12,STKEND+EXCTAB	SAVE ADDRESS TO CONTR. BLOCK
	ADKL	A12,ACBLEN	RESERVE AREA FOR CONTROL BLOCK 
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
	ADK	A1,2	NUMBER OF TASK ID:S 
	LDR*	A4,A1	GET NUMBER OF TASK ID:S 
BMX20	SUK	A4,1	DECREMENT NUMBER OF TASK ID:S
	RB(N)	BMX10	NO MORE
	ADK	A1,2	NEXT TASK ID
	CALL	MXTTAB
	RB	BMX20 
BMX99	RTN	A14	RETURN
	EJECT
********************************************************************
*                                                                  *
*          MXTTAB - GENERATE TTAB FOR MONITOR EXTENT TASK          *
*          ==============================================          *
*                                                                  *
*  ENTRY:  A1 -POINTER TO TASK ID IN MXSTAB                        *
*          A5 - POINTER TO MONITOR EXTENT BLOCK                    *
*         A12 - POINTER TO START OF FREE AREA                      *
*                                                                  *
*  EXIT:  A1 - POINTER TO TASK ID IN MXSTAB                        *
*         A5 - POINTER TO MONITOR EXTENT BLOCK                     *
*                                                                  *
*  WORK REGISTER:  A2                                              *
*                                                                  *
*  SUBROUTINES:  IMXTT,STRMOX,INBIMA                               *
*                                                                  *
********************************************************************
	EJECT
MXTTAB	EQU	*
	MSR	4,A15	SAVE REGISTER A1-A4 ON STACK 
	CALL	BMXSTT	BUILD MONITOR EXTENT TTAB
	CALL	IMXTT	INIT MMU TABLE
	LDR*	A2,A1	GET TASK ID 
	CALL	STRMOX	STORE IN MOXTAB
	LD	A2,MX:STA,A5	GET START ADDRESS
	LD	A3,STKEND+EXCTAB	GET CURRENT EXTENT BLOCK	=6
	ST	A2,APLSTA,A3	STORE START ADDRESS	=6 
	CALL	STRMOX	STORE IN MOXTAB
	LDR*	A2,A5	GET EXTENT ADDRESS
	ANKL	A2,/3FF	GET DISPLACEMENT
	SLL	A2,2	MAKE IT 12 BITS 
	ST	A2,TTB:CB,A12	STORE CURRENT SEGMENT BASE ADDRESS
	ADK	A2,12
	ST	A2,TTB:SA+26,A12	STORE IN A13 SAVE-AREA 
	LD	A3,STKEND+EXCTAB	GET CURRENT EXTENT CONTROL BLOCK 
	ST	A2,APLLAC,A3	STORE LOGICAL ADDR. TO COMMON PART 
	ST	A2,APLREL,A3	STORE RELOCATION BASE	=6 
	LDKL	A2,TTB:MT	DISPL. TO COMMON PART 
	ST	A2,APLMMC,A3	STORE IN EXTENT CONTROL BLOCK
	ST	A3,TTB:AP,A12	STORE EXTENT CONTROL BLOCK ADDRESS
	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,/20	EMM?
	RF(Z)	MXTT20	NO
	LD	A2,MX:LEN,A5	GET EXTENT LENGTH
	ST	A2,MAPLEN,A13	SAVE
	ST	A12,TTAB,A13	SAVE TTAB ADDRESS
	CALL	INBIMA	INIT BIP MAP 
MXTT20	MLR	4,A15	RESTORE REGISTERS
	RTN	A14	RETURN 
	EJECT
********************************************* 
*                                           * 
*  STRMOX - STORE START ADDRRESS IN MOXTAB  * 
*  =======================================  * 
*                                           * 
*  REFERENCED IN: MXTTAB                    * 
*                                           * 
*  ENTRY:  A2 - VALUE TO STORE              * 
*                                           * 
*  EXIT:                                    * 
*                                           * 
*  WORK REGISTERS:                          * 
*                                           * 
*  SUBROUTINES:                             * 
*                                           * 
********************************************* 
STRMOX	EQU	*
	LD*	A3,SCTMOX	GET CURRENT LENGTH 
	AD	A3,SCTMOX	ADDRESS TO NEXT FREE ENTRY
	STR	A2,A3	STORE START ADDRESS
	IM*	SCTMOX	INCREMENT LENGTH
	IM*	SCTMOX	TWICE 
	RTN	A14	RETURN 
	EJECT
****************************************************
*                                                  *
*  IMXTT - INIT MMU TABLE FOR MONITOR EXTENT TASK  *
*  ==============================================  *
*                                                  *
*  REFERENCED IN:  MXTTAB                          *
*                                                  *
*  ENTRY:  A1 - POINTER TO PHYSICAL ADDRESS        *
*         A12 - TTAB ENTRY POINTER                 *
*                                                  *
*  EXIT:                                           *
*                                                  *
*  WORK REGISTERS:  A2,A3,A4,A9,A11                *
*                                                  *
*  SUBROUTINES:  CMPADR                            *
*                                                  *
****************************************************
	EJECT
IMXTT	EQU	* 
	LDR	A2,A12	GET TTAB ENTRY
	ADKL	A2,TTB:MT	GET START OF MMU TABLE
	LDR*	A3,A5	GET PHYSICAL ADDRESS TO EXTENT
	LDR	A4,A3	SAVE 
	ANKL	A3,/FC00	PHYSICAL PAGE ADDRESS
	ANKL	A4,/3FF	DISPLACEMENT
	SLL	A4,2	MAKE IT 12 BITS 
	LDKL	A9,/1000	PHYSICAL PAGE SIZE 
	SUR	A9,A4	SAVE 
	LD	A11,MX:LEN,A5	GET EXTENT LENGTH 
	CALL	CMPADR	ENOUGTH SPACE IN CURRENT PAGE? 
	RF(G)	IMX10	NO!
	XRR	A11,A11	INDICATE SINGLE ENTRY
	RF	IMX20 
IMX10	SUR	A11,A9	SUBTRACT REMAINING AREA IN CURRENT PAGE
IMX20	STR	A3,A2	STORE PAGE ADDRESS
	ADKL	A3,/400	INCREMENT PAGE ADDRESS
	ADK	A2,2	INCREMENT ENTRY POINTER 
	ADKL	A11,0	ONE ENTRY ENOUGTH?
	RF(Z)	IMX99	YES! 
	RF(NN)	IMX30	<32KB 
	SUKL	A11,/1000	DECREMENT LENGTH
	RB	IMX20 
IMX30	STR	A3,A2	STORE PAGE ADDRESS
	ADKL	A3,/400	INCREMENT PAGE ADDRESS
	ADK	A2,2	INCREMENT ENTRY POINTER 
	SUKL	A11,/1000	DECREMENT LENGTH
	RB(P)	IMX30
IMX99	EQU	*		=6 
	LDR	A4,A12	GET TTAB ENTRY	=6 
	ADKL	A4,TTB:MT+32	GET END OF MMU-TABLE	=6
	LDKL	A3,/FC00		=6
IMX100	EQU	*	=6 
	CWR	A4,A2	ENTRIES LEFT IN MMU-TABLE?	=6
	RF(E)	IMX110	NO!	=6
	STR	A3,A2	STORE PAGE ERROR IN MMU-ENTRY	=6 
	ADK	A2,2	NEXT MMU-ENTRY	=6 
	RB	IMX100		=6
IMX110	EQU	*		=6
	RTN	A14		=6
	EJECT
********************************************************
*                                                      *
*  B:MSEG - BUILD MONITOR TASK SEGMENT TABLES & TTABS  *
*  ==================================================  *
*                                                      *
*  REFERENCED IN: SYSLDM                               *
*                                                      *
*  ENTRY:                                              *
*                                                      *
*  EXIT:                                               *
*                                                      *
*  WORK REGISTERS:  A1-A12                             *
*                                                      *
*  SUBROUTINES:  MX:MST,MX:STD,BMSTAB,CHKTAD,BMXSTT    *
*                                                      *
********************************************************
	EJECT
B:MSEG	EQU	*
	CALL	MX:MST	FIND FIRST MONITOR SEGMENT TABLE 
	ST	P,STKEND+LIMIT	UPDATE END OF SYSTEM AREA
	LDR	A4,A5	SAVE POINTER TO NUMBER OF SEGTABS
	LDR	A8,A1	SAVE POINTER TO FIRST MONITOR SEGMENT TABLE
	CALL	MX:STD	FIND FIRST MONITOR SEGMENT TABLE TASK
			DEFINITION BLOCK 
BMSG10	SUK	A6,1	DECREMENT NUMBER OF MONITOR SEGMENT TABLES
	RF(N)	BMSG99	NO MORE!
	CM	STKEND+SCBTAB	CLEAR ADDRESS TO SEGMENT CONTROL BLOCK
	CM	STKEND+MAXSGM	CLEAR MAXIMUM SEGMENT SIZE
	ADK	A4,2	INCREMENT POINTER TO NUMBER OF SEGMENTS 
	CALL	BMSTAB	BUILD MONITOR SEGMENT TABLE
	LDR*	A7,A1	GET NUMBER OF TASKS IN SEGTAB 
BMSG20	ADK	A1,2	NEXT TASK ID
	SUK	A7,1	DECREMENT NUMBER OF TASK ID:S 
	RB(N)	BMSG10	NO MORE!
	CALL	CHKTAD	CHECK IF TASK ALREADY DEFINED
	RF(NZ)	BMSG30	TASK ALREADY DEFINED!
	CALL	BMXSTT	BUILD TTAB FOR MONITOR SEGMENT TASK
	LD	A10,STKEND+SCBTAB	GET SEGMENT CONTROL BLOCK 
	RF(NZ)	BMSG25	SEGMENT CONTROL BLOCK GENERATED
	LD	A12,SCTSFA	GET START OF FREE AREA 
	LDR	A10,A12	SAVE 
	ADKL	A12,ACBLEN	RESERVE FOR SEGMENT CONTROL BLOCK
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
BMSG25	ST	A10,TTB:AP,A12	STORE ADDRESS TO SEGMENT CONTROL BLOCK 
BMSG30	ST	A5,TTB:SP,A12	STORE SEGMENT TABLE POINTER 
	LD	A10,TTB:AP,A12	GET ADDRESS TO SEGMENT CONTROL BLOCK 
	LD	A3,STKEND+MAXSGM	GET MAXIMUM SEGMENT SIZE 
	ADKL	A3,/FFFF	NUMBER OF 4K-MULTIPLES 
	ANKL	A3,/F000	ISOLATE NUMBER OF 4K-MULTIPLES 
	LDKL	A2,/F000	END OF LOGICAL MEMORY
	SUR	A2,A3	COMPUTE LOGICAL PAGE ADDRESS 
	LD	A3,STKEND+MAXSGM	GET MAXIMUM SEGMENT SIZE 
	ANKL	A3,/FFF	EVEN 4K-MULTIPLE? 
	RF(NZ)	BMSG40	NO!
	ADKL	A2,/1000	SAVE ONE MMU ENTRY 
BMSG40	ST	A2,APLLAP,A10	STORE IN SEGMENT CONTROL TABLE
	SRL	A2,12	MMU TABLE ENTRY
	LDK	A3,16	NUMBER OF MMU ENTRIES
	SUR	A3,A2	COMPUTE NUMBER OF PAGE ENTRIES 
	ST	A3,APLNPE,A10	STORE IN SEGMENT CONTROL TABLE
	SLL	A3,1	MULTIPLY BY TWO 
	NGR	A3,A3	MAKE NEGATIVE DISPLACEMENT 
	ADKL	A3,TTB:CB	DISPL TO END OF MMU TABLE 
	ST	A3,APLMMP,A10	STORE IN SEGMENT CONTROL TABLE
	LD	A3,STKEND+MAXSGM	GET MAXIMUM SEGMENT SIZE 
	ADKL	A3,/3FF	COMPUTE NUMBER OF 1K-MULTIPLES
	ANKL	A3,/FC00	ISOLATE NUMBER OF 1K-MULTIPLES 
	LDR	A11,A3	GET CURRENT SEGMENT SIZE
	LD	A9,SCTPSZ	GET MAX SEGMENT SIZE
	CALL	CMPADR	CURRENT SEGMENT GREATER? 
	RB(L)	BMSG20	NO
	ST	A3,SCTPSZ	UPDATE MAX SEGMENT SIZE 
	RB	BMSG20
BMSG99	RTN	A14	RETURN 
	EJECT
**********************************************************
*                                                        *
*          BMSTAB - BUILD MONITOR SEGMENT TABLE          *
*          ====================================          *
*                                                        *
*  REFERENCED IN:  B:MSEG                                *
*                                                        *
*  ENTRY:  A4 - POINTER TO NUMBER OF SEGMENTS            *
*          A8 - POINTER TO SEGMENT CLUSTER IN MXSTAB     *
*                                                        *
*  EXIT:  A5 - SEGMENT TABLE ADDRESS                     *
*                                                        *
*  WORK REGISTERS:  A2,A3,A9,A11                         *
*                                                        *
*  SUBROUTINES:  CMPADR,ERROR                            *
*                                                        *
**********************************************************
	EJECT
BMSTAB	EQU	*
	STR	A1,A15	SAVE REGISTER A1 ON STACK 
	LD	A5,SCTSFA	GET START OF FREE AREA
	LD	A2,SCTIPL	GET PROGRAM LOAD DEVICE 
	STR	A2,A5	STORE IN SEGMENT TABLE 
	ADK	A5,2	NEXT ENTRY IN SEGMENT TABLE 
	LDR*	A9,A4	GET NUMBER OF SEGMENTS
	LDR	A1,A9	SAVE 
	STR	A9,A5	STORE IN SEGMENT TABLE 
	ADS	A9,STKCOM+TOTSGM	INCREMENT TOTAL NUMBER OF SEGMENTS
	ADK	A5,2	SEGMENT TABLE ENTRY 
	LDR	A3,A5	SAVE 
* 
*  BUILD SEGMENT BLOCK 0
* 
	LDKL	A2,/8400	STATUS FOR SEGMENT 0 
	STR	A2,A3	STORE IN SEGMENT BLOCK 0 
BMST20	ST	A1,STKEND+SGMCNT	SAVE NUMBER OF SEGMENTS
	ADK	A3,8	NEXT SEGMENT BLOCK
	LD	A9,STKEND+LIMIT	GET END OF SYSTEM AREA
	LDR	A11,A3	GET END OF SEGMENT BLOCKS 
	CALL	CMPADR	COMPARE ADDRESSES
	RF(NG)	BMST25	OK 
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
BMST25	LDR*	A2,A8	GET SEGMENT TYPE
	SRL	A2,8	ISOLATE 
	CCK	A2,'RR'	CORE RESIDENT SEGMENT? 
	RF(E)	BMST40	YES!
	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,2	DISC PAGING?
	RF(Z)	BMST40	NO! 
* 
*  DISC PAGING & DISC RESIDENT SEGMENT
* 
	LD	A1,SCTMXS	GET ADDRESS TO MXSTAB 
	LD	A2,MX:DA2,A1	GET DISC ADDRESS BITS 16-31
	LD	A1,MX:DA1,A1	GET DISC ADDRESS BITS 0-15 
	LD	A10,2,A8	GET RELOCATION BASE
	ADR	A2,A10	RELOCATE DISC ADDRESS 
	RF(P)	BMST30	NO CARRY! 
	ANKL	A2,/7FFF	CLEAR BIT 0
	ADK	A1,1	ADD CARRY 
	RF(P)	BMST30	NOT OVERFLOW
	LDKL	A1,LMP10	DISC ADDRESS OVERFLOW
	CALL	ERROR 
BMST30	ORKL	A1,/4000	INDICATE ASSEMBLER SEGMENT 
	STR	A1,A3	STORE SEGMENT DISC ADDRESS BITS 0-15 
	ST	A2,2,A3	STORE SEGMENT DISC ADDRESS BITS 16-31 
	RF	BMST50
* 
*  DISC RESIDENT SEGMENT OR NO DISC PAGING
* 
BMST40	LDKL	A2,/8800	STATUS FOR DISC RESIDENT SEGMENT 
	STR	A2,A3	STORE IN SEGMENT BLOCK 
BMST50	LD	A9,4,A8	GET SEGMENT LENGTH
	LD	A11,STKEND+MAXSGM	GET MAXIMUM SEGMENT LENGTH
	CALL	CMPADR
	RF(NL)	BMST55	CURRENT SEGMENT NOT GREATER
	ST	A9,STKEND+MAXSGM	UPDATE MAXIMUM SEGMENT LENGTH
BMST55	ST	A9,4,A3	STORE SEGMENT LENGTH IN SEGMENT BLOCK 
	ADKL	A8,6	INCREMENT POINTER IN MXSTAB
	LD	A1,STKEND+SGMCNT	GET NUMBER OF SEGMENTS 
	SUK	A1,1 
	RB(NZ)	BMST20	MORE SEGMENTS
	ADK	A3,8	END OF SEGMENT TABLE
BMST60	ST	A3,SCTSFA	UPDATE START OF FREE AREA 
	LDR*	A1,A15	RESTORE REGISTER A1
	RTN	A14
	EJECT
************************************************************
*                                                          *
*          CHKTAD - CHECK IF TASK ALREADY DEFINED          *
*          ======================================          *
*                                                          *
*  REFERENCED IN:  B:MSEG                                  *
*                                                          *
*  ENTRY:  A1 - POINTER TO TASK ID                         *
*               FOR MONITOR SEGMENT TASK                   *
*                                                          *
*  EXIT:  A12 - TTAB ADDRESS IF TASK ALREADY DEFINED       *
*         A12 = 0 IF TASK NOT DEFINED                      *
*                                                          *
*  WORK REGISTERS:  A2,A3                                  *
*                                                          *
*  SUBROUTINES:  PSW                                       *
*                                                          *
************************************************************
	EJECT
CHKTAD	EQU	*
	LD*	A2,SCTTCT	GET LENGTH OF TCTAB
	AD	A2,SCTTCT	END OF TCTAB
CHKT20	SUK	A2,2	DECREMENT POINTER IN TCTAB
	CW	A2,SCTTCT	START OF TCTAB? 
	RF(E)	CHKT30	YES: ALL TASKS CHECKED! 
	LDR*	A3,A2	GET POINTER TO TTAB 
	LD	A3,TTB:ID,A3	GET TASK ID
	CWR*	A3,A1	EQUAL TO CURRENT TASKS? 
	RB(NE)	CHKT20	NO 
	LDR*	A12,A2	GET TTAB POINTER 
	RF	CHKT50
CHKT30	LDKL	A12,0	INDICATE TASK NOT FOUND 
CHKT50	CFI	A14,PSW,A13	STORE PSW ON STACK 
	RTN	A14
	EJECT
******************************************************************* 
*                                                                 * 
*          BMXSTT - BUILD MONITOR EXTENT & SEGMENT TTABS          * 
*          =============================================          * 
*                                                                 * 
*  REFERENCED IN: MXTTAB,B:MSEG                                   * 
*                                                                 * 
*  ENTRY:                                                         * 
*                                                                 * 
*  EXIT:  A12 - TTAB ADDRESS                                      * 
*                                                                 * 
*  WORK REGISTERS:  A2,A9,A10,A11                                 * 
*                                                                 * 
*  SUBROUTINES:  CMPADR,ERROR                                     * 
*                                                                 * 
******************************************************************* 
BMXSTT	EQU	*
	LD	A12,SCTSFA	GET START OF FREE AREA 
	LDKL	A10,TTB:TD+2	STANDARD TTAB LENGTH 
	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,/21	EMM?
	XRK	A2,/21 
	RF(NZ)	BMXS20
	SUKL	A12,TTB:AM	INCLUDE MMU ALLOCATION BIT MAP 
	SUKL	A10,TTB:AM	INCLUDE LENGTH 
	RF	BMXS40
BMXS20	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,1	MMU OPTION? 
	RF(Z)	BMXS30	NO! 
	SUKL	A12,TTB:MT	INCLUDE MMU TABLE IN TTAB
	SUKL	A10,TTB:MT	INCLUDE LENGTH 
	RF	BMXS40
BMXS30	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,2	DISC PAGING?
	RF(Z)	BMXS40 
	SUKL	A12,TTB:CB	INCLUDE 3 WORDS FOR DISC PAGING
	SUKL	A10,TTB:CB	INCLUDE IN LENGTH
BMXS40	AD	A10,SCTSFA	COMPUTE START OF FREE AREA 
	LDR	A9,A10	SAVE
	LD	A11,STKEND+LIMIT	GET END OF SYSTEM AREA 
	CALL	CMPADR	MEMORY OVERFLOW? 
	RF(NL)	BMXS50	NO!
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
BMXS50	ST	A10,SCTSFA	UPDATE START OF FREE AREA
	LD*	A2,SCTTCT	GET CURRENT LENGTH 
	AD	A2,SCTTCT	COMPUTE NEXT FREE ENTRY 
	STR	A12,A2	STORE TTAB ADDRESS
	IM*	SCTTCT	INCREMENT CURRENT LENGTH
	IM*	SCTTCT	TWICE 
	LDR*	A2,A1	GET TASK ID 
	ST	A2,TTB:ID,A12	STORE IN TTAB 
	LDKL	A2,MX:LEV	GET MONITOR TASK LEVEL
	ST	A2,TTB:ST,A12	STORE IN TTAB 
	SLL	A2,10
	ORKL	A2,/00C1	PROGRAM STATUS 
	ST	A2,TTB:PW,A12	STORE PROGRAM STATUS WORD 
	LD	A2,STKEND+EXCTAB	GET EXTENT CONTROL BLOCK ADDRESS 
	ST	A2,TTB:AP,A12	STORE IN TTAB 
	LDK	A2,2 
	ST	A2,TTB:TD,A12	STORE DEVICE TABLE LENGTH 
	RTN	A14	RETURN 
	EJECT
**************************************************************
*          MX:MEB - FIND FIRST MONITOR EXTENT BLOCK          *
*          ========================================          *
*                                                            *
*  REFERENCED IN:  MX:MST                                    *
*                                                            *
*  ENTRY:  SCTMXS - ADDRESS TO MONITOR EXTENT TABLE          *
*                                                            *
*  EXIT:  A1 - POINTER TO FIRST MONITOR EXTENT BLOCK         *
*         A5 - POINTER TO NUMBER OF SEGTABS                  *
*         A6 - NUMBER OF MONITOR SEGMENT TABLES              *
*         A7 - NUMBER OF MONITOR EXTENTS                     *
*                                                            *
*  WORK REGISTERS:  A2                                       *
*                                                            *
*  SUBROUTINES:                                              *
*                                                            *
**************************************************************
	EJECT
MX:MEB	EQU	*
	LD	A7,SCTMXS	GET ADDRESS TO MXSTAB 
	LDR	A6,A7	SAVE 
	RF(Z)	MEB99	NOT PRESENT
	LD	A2,MX:NOS,A7	GET NUMBER OF SEGTABS
	LDR	A6,A2	SAVE 
	LDR	A1,A7	SAVE ADDRESS TO MXSTAB 
	LD	A7,MX:NOX,A7	GET NUMBER OF EXTENTS
	ADK	A1,MX:NOS	ADDRESS NUMBER OF SEGTABS
	LDR	A5,A1	SAVE 
MEB10	ADK	A1,2	ADDRESS NUMBER OF SEGMENTS 
	SUK	A2,1	MORE SEGTABS? 
	RB(NN)	MEB10	YES 
MEB99	RTN	A14	RETURN
	EJECT
**************************************************************
*                                                            *
*          MX:MST - GET FIRST MONITOR SEGMENT TABLE          *
*          ========================================          *
*                                                            *
*  REFERENCED IN:  B:MSEG                                    *
*                                                            *
*  ENTRY:  SCTMXS - ADDRESS TO MXSTAB                        *
*                                                            *
*  EXIT:  A1 - POINTER TO FIRST MONITOR SEGMENT TABLE        *
*         A5 - POINTER TO NUMBER OF SEGTABS                  *
*         A6 - NUMBER OF MONITOR SEGMENT TABLES              *
*         A7 - NUMBER OF MONITOR EXTENTS                     *
*                                                            *
*   WORK REGISTERS:  A2                                      *
*                                                            *
*  SUBROUTINES:  MX:MEB                                      *
*                                                            *
**************************************************************
	EJECT
MX:MST	EQU	*
	CALL	MX:MEB	GET POINTER TO FIRST MONITOR EXTENT BLOCK
	LDR	A2,A7	GET NUMBER OF MONITOR EXTENT BLOCKS
MST10	SUK	A2,1	DECREMENT NUMBER OF MONITOR EXTENT BLOCKS
	RF(N)	MST99	NO MORE MONITOR EXTENTS
	ADK	A1,MX:EBL	ADDRESS NEXT MONITOR EXTENT BLOCK
	RB	MST10 
MST99	RTN	A14	RETURN
	EJECT
************************************************************* 
*                                                           * 
*  MX:TDB - GET FIRST MONITOR EXTENT TASK DEFINITION BLOCK  * 
*  =======================================================  * 
*                                                           * 
*  REFERENCED IN:  MX:STD                                   * 
*                                                           * 
*  ENTRY:  SCTMXS - ADDRESS TO MXSTAB                       * 
*                                                           * 
*  EXIT: A1 - POINTER TO FIRST MONITOR EXTENT TASK          * 
*             DEFINITION BLOCK                              * 
*        A5 - POINTER TO FIRST MONITOR EXTENT BLOCK         * 
*        A6 - NUMBER OF MONITOR SEGMENT TABLES              * 
*        A7 - NUMBER OF MONITOR EXTENTS                     * 
*                                                           * 
*  WORK REGISTERS:  A2,A3                                   * 
*                                                           * 
*  SUBROUTINES:  MX:MST                                     * 
*                                                           * 
************************************************************* 
	EJECT
MX:TDB	EQU	*
	CALL	MX:MST	GET FIRST MONITOR SEGMENT TABLE
	LDR	A2,A6	GET NUMBER OF SEGMENT TABLES 
TDB10	ADK	A5,2	ADDRESS NUMBER OF SEGMENTS 
	SUK	A2,1	DECREMENT NUMBER OF SEGTABS 
	RF(N)	TDB99	NO MORE SEGTABS
	LDR*	A3,A5	GET NUMBER OF SEGMENTS
TDB20	SUK	A3,1	DECREMENT NUMBER OF SEGMENTS 
	RB(N)	TDB10	NO MORE SEGMENTS 
	ADK	A1,MX:SBL	INCREMENT SEGMENT BLOCK POINTER
	RB	TDB20 
TDB99	RTN	A14	RETURN
	EJECT
**************************************************************
*                                                            *
*  MS:STD - GET FIRST MONITOR SEGMENT TASK DEFINITION BLOCK  *
*  ========================================================  *
*                                                            *
*  REFERENCED IN:  B:MXST                                    *
*                                                            *
*  ENTRY:                                                    *
*                                                            *
*  EXIT:  A1 - POINTER TO FIRST MONITOR SEGMENT TASK         *
*              DEFINITION BLOCK                              *
*         A5 - POINTER TO FIRST MONITOR EXTENT BLOCK         *
*         A6 - NUMBER OF MONITOR SEGMENT TABLES              *
*         A7 - NUMBER OF MONITOR EXTENTS                     *
*                                                            *
*  WORK REGISTERS:  A2,A3                                    *
*                                                            *
*  SUBROUTINES:  MX:TDB                                      *
*                                                            *
**************************************************************
	EJECT
MX:STD	EQU	*
	CALL	MX:TDB	GET FIRST MONITOR TASK DEF. BLOCK
	LDR	A2,A7	GET NUMBER OF MONITOR EXTENTS
STD10	SUK	A2,1	DECREMENT NUMBER OF MONITOR EXTENTS
	RF(N)	STD99	NO MORE EXTENTS
	LDR*	A3,A1	GET NUMBER OF TASKS IN EXTENT 
STD20	ADK	A1,2	ADDRESS TASK ID
	SUK	A3,1	DECREMENT NUMBER OF TASKS 
	RB(NN)	STD20	MORE TASKS
	RB	STD10	NEXT EXTENT 
STD99	RTN	A14	RETURN
	XIF
	EJECT
******************************
*  B:TT - BUILD TASK TABLES  *
******************************
* 
*  REFERENCED IN: SYSLDM
* 
*  ENTRY: 
* 
*  EXIT:  TC:TAB CONTAIN POINTERS TO ALL TASK TABLES
* 
*  WORK REGISERS:  A1-A12 
* 
*  SUBROUTINES:  CONVRT,GETTSK,TETTDC,GETCLN,GETSDC 
* 
*                 TASK TABLE LAYOUT 
* 
*             ------------------------
*    TTB:AM   I   MMU ALLOCATION     I
*             I   BIT MAP (4 WORDS)  I
*             I______________________I
*    TTB:MT   I        MMU           I
*             I       TABLE          I
*             I         16           I
*             I        WORDS         I
*             I______________________I
*    TTB:CB   I     CSB POINTER      I
*             I______________________I
*    TTB:SP   I    SEGTAB POINTER    I
*             I______________________I
*    TTB:SB   I  SEGM. BLOCK POINTER I
*             I----------------------I
*    TTB:AP   I      ACB 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
*             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	*
	CALL	FSTAPL	GET FIRST APPLICATION
	LD	A12,SCTSFA	GET START OF FREE AREA 
	ST	A12,STKEND+SFASAV	SAVE
	ST	P,STKEND+LIMIT	UPDATE END OF SYSTEM AREA
	ST	P,STKEND+WRK1	SAVE PROGRAM COUNTER
	ST	A11,STKEND+LCDSTA	SAVE CONFIGURATION DATA POINTER 
	ST	P,STKEND+WRK2	SAVE PROGRAM COUNTER
* 
*  GET NUMBER OF TASKS IN THIS CLASS
* 
	CALL	GETTSK
	ST	A1,STKEND+NBRTSK	SAVE NUMBER OF TASKS 
* 
*  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,STKEND+TASKID	SAVE TASK ID START VALUE 
* 
*  CHECK IF CREDIT APPLICATION
* 
	LD	A5,STKEND+APCSTA	GET APPLICATION CONTROL BLOCK
	LD	A5,APLTYP,A5	GET APPLICATION TYPE 
	CWK	A5,'CR'	CREDIT APPLICATION?
	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,STKEND+TCLSAV	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,STKEND+TSKLEV	SAVE 
	EJECT
* 
*  COMPUTE SIZE OF CONFIGURATION DEPENDENT PART OF TASK TABLE 
* 
	LDKL	A10,TTB:TD+4	STANDARD LENGTH
	LD	A5,SCTOPT	GET OPTION WORD 
	ANK	A5,/21	CHECK IF EMM AND MMU PAGING INCLUDED
	XRK	A5,/21	BOTH INCLUDED?
	RF(NZ)	BTT22	NO! 
	SUKL	A10,TTB:AM+2	INCLUDE BIT MAP IN LENGTH
	SUKL	A12,TTB:AM	RESERV SPACE FOR BIT MAP 
	RF	BTT30 
BTT22	LD	A5,SCTOPT
	SRC	A5,1	MMU PAGING? 
	RF(NN)	BTT25	NO
	SUKL	A10,TTB:MT+2	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+2	FOUR WORD EXTRA IF DISC PAGING 
	SUKL	A12,TTB:CB	RESERV SPACE FOR EXTRA WORD
BTT30	EQU	* 
	EJECT
* 
*  COMPUTE SIZE OF TERMINAL DEVICE CLASS DEPENDENT PART 
*  OF TASK CONFIGURATION 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,STKEND+TCLA	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 CONFIGURATION 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,STKEND+SCLA	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	* 
	IFF	EDM=0
	ADKL	A10,14	7 EXTRA WORDS FOR EDM
	XIF
	ADK	A6,2	INCLUDE LENGTH WORD 
	LD	A7,STKEND+CUTENT	GET CURRENT ENTRY IN TC:TAB
	LD	A8,STKEND+NBRTSK	GET NUMBER OF TASKS IN THIS CLASS
BTT60	EQU	* 
	RF(Z)	BTT70
	ST	A9,STKEND+WRK3	SAVE A9
	ST	A11,STKEND+WRK4	SAVE A11
	LDR	A9,A10	GET TTAB LENGTH 
	AD	A9,STKEND+SFASAV	COMPUTE END OF FREE AREA	=2
	ST	A9,STKEND+SFASAV		=2
	LD	A11,STKEND+LIMIT	GET END OF SYSTEM AREA 
	CALL	CMPADR	CHECK IF MEMORY OVERFLOW 
	RF(NL)	BTT61	NOT YET 
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
BTT61	LD	A9,STKEND+WRK3	RESTORE A9
	LD	A11,STKEND+WRK4	RESTORE A11 
* 
*  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,STKEND+TSKLEV	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 
	IFF	MMUPAG=0 
	CALL	MMUINI	INITIALIZE MMU TABLE 
	XIF
* 
*  STORE TASK IDENTIFICATION IN TTAB
* 
BTT62	LD	A5,STKEND+TASKID	GET TASK ID 
	ST	A5,TTB:ID,A12	STORE IN TTAB 
	ADK	A5,1	INCREMENT TASK ID 
	ST	A5,STKEND+TASKID	SAVE TO NEXT TASK IN SAME CLASS
	LD	A5,STKEND+APCSTA	GET APPL. CONTROL BLOCK
	ST	A5,TTB:AP,A12	STORE ADDRESS IN TTAB 
	LD	A5,APLTYP,A5	GET APPL. TYPE 
	CWK	A5,'CR'	CREDIT?
	RF(NE)	BTT65	NO
* 
*  STORE TASK CLASS TO MATCH IN TTAB
* 
	LD	A5,STKEND+TCLSAV	GET TCL START VALUE
	ST	A5,TTB:PP,A12	SAVE IN TTAB
	ADK	A5,1	INCREMENT  TCL
	ST	A5,STKEND+TCLSAV	SAVE 
BTT65	EQU	* 
	STR	A12,A7	SAVE TTAB ADDRESS IN TC:TAB 
	ADK	A7,2	NEXT ENTRY IN TC:TAB
	ST	A7,STKEND+CUTENT	SAVE CURRENT USER TASK ENTRY 
	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,STKEND+SFASAV 
BTT90	EQU	* 
	CALL	NXTBLK	GET NEXT BLOCK 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RF(NE)	BTT95 
	LD	P,STKEND+WRK2 
BTT95	EQU	* 
	CALL	NXTAPL	NEXT APPLICATION 
	RF(Z)	BTT98
	LD	P,STKEND+WRK1 
BTT98	ST	A12,SCTSFA	SAVE START OF FREE AREA 
	SU	A7,SCTTCT	COMPUTE LENGTH
	ST*	A7,SCTTCT	STORE
	RTN	A14	RETURN 
	IFF	SWPBLK=0 
	EJECT
B:SWBT	EQU	*
	CALL	PUSH	SAVE REGISTER A1-A14 
	LD	A1,SCTOPT	GET OPTION WORD 
	ANK	A1,8	SWB OPTION INCLUDED 
	RF(Z)	BSWT42	NO
	CM	STKCOM+APPLNO	RESET APPLICATION COUNTER 
	ST	P,STKEND+LIMIT	SAVE LOCATION COUNTER
BSWT05	LDKL	A1,'CR'	APPLICATION TYPE=CREDIT 
	CALL	GETAPP	GET NEXT CREDIT APPLICATION
	RF(Z)	BSWT42	NO MORE APPLICATIONS
	LDR	A10,A1	GET ACB ADDRESS 
	ST	A10,STKEND+APCSTA	SAVE
	LD	A12,SCTSFA	START OF FREE AREA 
* 
*  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,APLSWB,A10	CLEAR SWB POINTER 
	LD	P,STKEND+LIMIT	PROCESS NEXT CREDIT APPLICATION	=2 
BSWT42	CALL	POB	RESTORE REGISTERS 
	RTN	A14
BSWT44	ADKL	A11,1	NUMBER OF TYPES 
	ST	A11,STKEND+SWBBLK	START OF CONF. DATA 
	LDR	A6,A11 
	CALL	GETNUM	GET 3 DIGITS 
	LDR	A5,A5	ZERO?
	RF(Z)	SWBERR	ILLEGAL NUMBER!!! 
	ST	A5,STKEND+NBRSWB	SAVE NUMBER OF RECORDS 
	ST	A5,STKEND+WRK1	SAVE 
	LD	A8,STKCOM+SWBFLG	GET ADDRESS TO $SWAPP
	RF(NZ)	BSWT48	FILE CREATED 
SWBERR	LDKL	A1,LMP6	SWB ERROR!
	CALL	ERROR 
BSWT48	ST	A12,APLSWB,A10	SAVE ADDRESS TO ADDRESS TABLE
	CM	STKCOM+SWBCNT	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,STKEND+APCSTA	GET ADDRESS TO ACB 
	LD*	A1,APLMMC,A2	GET TTAB ADDRESS
	TL	TTB:MT,A1	LOAD MMU REGISTERS
	LD	A2,APLLAC,A2	GET P:MTAB 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,STKEND+SWBNAM	SAVE 
	SUK	A2,2	ADDRESS TO LENGTH OF PROT. S:BTAB 
	CALL	GETCON	GET LENGTH OF PROT. S:BTAB 
	LDR	A4,A1	SAVE 
* 
*  CHECK IF ENOUGTH MEMORY IN FIRST PARTITION 
* 
	XRR	A2,A2	RESET COUNTER
BSWT52	SUK	A1,6	DECREMENT LENGTH
	RF(N)	BSWT55	NO MORE SWB-BLOCKS
	ADK	A2,1	INCR. BLOCK COUNTER 
	RB	BSWT52
BSWT55	SLL	A2,3	MULTIPLY BY 8 
	LDR	A9,A10	GET START OF BLOCKS 
	ADR	A9,A2	ADD LENGTH 
	LD	A11,STKEND+LIMIT	GET CURRENT LIMIT
	CALL	CMPADR	MEMORY OVERFLOW? 
	RF(NL)	BSWT57	NO!
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
BSWT57	SUK	A4,2	SKIP LENGTH WORD
	LDKL	A9,0	RESET BLOCK COUNTER
BSWT60	STR	A10,A12	SAVE POINTER TO BLOCK
	ST	A4,STKEND+SWBTBL	SAVE 
	LD	A11,STKEND+SWBBLK	START OF CONF. DATA 
	LD	A7,STKEND+NBRSWB	NUMBER OF SWB RECORDS
BSWT65	LD	A2,STKEND+SWBNAM	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
* 
	LD	A3,STKEND+WRK1	GET NUMBER OF SWB TYPES
	SUK	A3,1	DECREMENT 
	ST	A3,STKEND+WRK1	SAVE 
	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,STKCOM+SWBFSA+2	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,STKCOM+SWBFSA	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	STKCOM+SWBFSA	INCREMENT SECTOR ADDRESS
	RF(O)	BSWT88 
	RF	BSWT90
BSWT88	IM	STKCOM+SWBFSA+2 
	CM	STKCOM+SWBFSA 
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	STKCOM+SWBCNT	INCREMENT SWP-BLOCK COUNTER 
	LD	A8,STKCOM+SWBFSA+2
	CW	A8,STKCOM+SWBFSE+2
	RF(G)	BSWT98	$SWAP-FILE TOO SMALL! 
	RF(L)	BSWT95 
	LD	A8,STKCOM+SWBFSA
	CW	A8,STKCOM+SWBFSE
	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,STKEND+SWBNAM	CURRENT RECORD IN PROT. S:BTAB 
	ADK	A2,UP:REC	NEXT RECORD IN PROT. S:BTAB
	ST	A2,STKEND+SWBNAM	SAVE 
	LD	A4,STKEND+SWBTBL	GET LENGTH OF PROT. S:BTAB 
	SUK	A4,UP:REC	DECREMENT
	RB(P)	BSWT60	MOORE TYPES 
	LD	A8,STKCOM+SWBCNT	ANY BLOCKS GENERATED?
	RF(Z)	BSWT98	NO! 
	LD	A8,STKEND+WRK1	ALL SWB TYPES MATCHED? 
	RF(NP)	BSWT99	YES! 
BSWT98	LDKL	A1,LMP6 
	CALL	ERROR	SWB ERROR!
BSWT99	ST	A10,SCTSFA	UPDATE START OF FREE AREA
	LD	A10,STKEND+APCSTA	GET CURRENT ACB ADDRESS 
	ST*	A9,APLSWB,A10	NUMBER OF SWB TYPES
	LD	P,STKEND+LIMIT	PROCESS NEXT CREDIT APPLICATION
	XIF
	IFF	MMUPAG+DSKPAG=0
	EJECT
*************************************************** 
*                                                 * 
*          B:STAB - BUILD SEGMENT TABLES          * 
*          =============================          * 
*                                                 * 
*  REFERENCED IN:  SYSLDM                         * 
*                                                 * 
*  ENTRY:                                         * 
*                                                 * 
*  EXIT:                                          * 
*                                                 * 
*  WORK REGISTERS:  A1-A14 (THEIR ORIGINAL        * 
*                   CONTENTS ARE SAVED ON STACK   * 
*                   AND RESTORED BEFORE EXIT)     * 
*                                                 * 
*  FUNCTIONAL DESCRIPTION:                        * 
*  FOR BASIC ONE SEGMENT TABLE AREA/TASK IS       * 
*  RESERVED. THE FIFTH WORD IN EACH SEGMENT TABLE * 
*  CONTAINS A POINTER TO THE FIFTH WORD IN NEXT   * 
*  EXCEPT THE LAST CONTAINS A PONTER TO THE FIFTH * 
*  WORD IN THE NEXT SEGMENT TABLE. ALL OTHER LO-  * 
*  CATIONS CONTAIN ZERO.                          * 
*  FOR COBOL AND CREDIT APPLICATIONS ONE SEGMENT  * 
*  TABLE PER APPLICATION IS GENERATED. STATUS,    * 
*  DISK ADDRESS AND LENGTH FOR EACH SEGMENT IS    * 
*  WRITTEN IN CORRESPONDING SEGBLK.  THE SEGMENT  * 
*  TABLE ADDRESS IS STORED IN THE TTAB FOR EACH   * 
*  TASK IN THE APPLICATION.                       * 
*                                                 * 
*************************************************** 
	EJECT
B:STAB	EQU	*
	CALL	PUSH	SAVE A1-A14 ON STACK 
	CALL	FSTAPL	GET FIRST APPLICATION
	LDR	A9,P	GET LIMIT FOR WRITE 
BST010	LD	A10,STKEND+APCSTA	SAVE POINTER TO CURRENT ACB 
	CALL	NXTAPL	GET NEXT APPL. CONTROL BLOCK 
	RF(NZ)	BST020	NOT LAST YET 
	LD*	A2,SCTTCT	GET LENGTH OF TCTAB
	AD	A2,SCTTCT	END OF TCTAB
	RF	BST040
BST020	LD	A2,APLMMC,A2	GET END OF TCTAB ENTRIES 
BST040	ST	A2,STKEND+TCTEND	SAVE 
	LDR	A8,P 
BST045	ADKL	A8,BST400-BST045	RELOCATE BRANCH ADDRESS
	LD	A5,APLMMP,A10	GET CURRENT APPLICATION TYPE
	CWK	A5,'AS'	ASSEMBLER APPLICATION? 
	ABR(E)	A8	YES; DON'T GENERATE SEGMENT TABLE! 
	LD	A8,APLMMC,A10	GET FIRST TCTAB ENTRY 
	CWK	A5,'BA'	BASIC? 
	RF(NE)	BST050	NO 
	SUR	A2,A8	2*NUMBER OF TASKS
	SRL	A2,1	NUMBER OF TASKS 
	ST	A2,STKEND+WRK1	SAVE 
	ST	A2,APLNPE,A10	SAVE
	LD	A3,SCTNOS	GET NUMBER OF SEGMENTS/TASK 
	SLL	A3,3	MULTIPLY BY 8 
	ADK	A3,12	INCLUDE 6 FIRST WORDS
	LDR	A4,A3	SAVE LENGTH
	CALL	MULT	COMPUTE LENGTH OF SEGMENT TABLE AREA 
	RF	BST090
	EJECT
BST050	LD	A2,SCTOPT	GET OPTION WORD 
	ANK	A2,1	MMU?
	RF(Z)	BST070	NO
	LDR*	A7,A8	GET TTAB ADDRESS
	TL	TTB:MT,A7	LOAD MMU TABLE
BST070	LD	A2,APLLAC,A10	ADDRESS S:GTAB
	ADK	A2,10	ADDRESS NUMBER OF SEGMENTS 
	CALL	GETCON	GET NUMBER OF SEGMENTS 
	LDR	A6,A1	SAVE 
	LDR	A3,A1	SAVE 
	SLL	A3,3	MULTIPLY BY 8 
	ADK	A3,12	INCLUDE 6 FIRST WORDS
BST090	LD	A12,SCTSFA	GET START OF FREE AREA 
	LDR	A2,A11	SAVE CONF. DATA POINTER 
	LDR	A11,A12	SAVE 
	ADR	A11,A3	END OF SEGMENT TABLE AREA 
	CALL	CMPADR	MEMORY OVERFLOW? 
	RF(NG)	BST100	NO 
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
BST100	ST	A11,SCTSFA	INDICATE START OF FREE AREA
	LDR	A11,A2	RESTORE CONF. DATA POINTER
	CWK	A5,'BA'	BASIC? 
	RF(NE)	BST200	NO 
	LD	A2,STKEND+WRK1	GET NUMBER OF TASKS
	LD	A3,SCTNOS	GET NUMBER OF SEGMENTS/TASK 
	ADK	A3,NBRDPS	ADD NUMBER OF DATA PAGES/TASK
	CALL	MULT	MULTIPLY 
	LDR	A2,A3	GET MAX NUMBER OF SEGMENTS 
	ADS	A2,STKCOM+TOTSGM	UPDATE TOTAL NUMBER OF SEGMENTS 
	ST	A12,APLSEG,A10	STORE ADDRESS TO SEGMENT TABLE POOL
	EJECT
* 
*  CLEAR SEGMENT TABLE AREA 
* 
	LD	A2,SCTSFA	GET END OF SEGMENT TABLE AREA 
BST110	SUK	A2,2	DECREMENT POINTER 
	CMR	A2	CLEAR 
	CWR	A2,A12	START OF SEGMENT TABLE AREA?
	RB(NE)	BST110	NOT YET
BST120	ADR	A2,A4	ADD SEGMENT TABLE LENGTH 
	CW	A2,SCTSFA	END OF SEGMENT TABLE AREA?
	RF(E)	BST400	YES 
	ADK	A2,8	ADDRESS FIFTH WORD IN SEGMENT TABLE 
	ST	A2,8,A12	STORE IN PRECEDING SEGMENT TABLE 
	ADR	A12,A4	START OF NEXT SEGMENT TABLE 
	LDR	A2,A12	SAVE
	RB	BST120
BST200	ST	A6,2,A12	STORE NUMBER OF SEGMENTS 
	LDR	A3,A6	GET NUMBER OF SEGMENTS 
	ADS	A3,STKCOM+TOTSGM	UPDATE TOTAL NUMBER OF SEGMENTS 
	LD	A3,SCTIPL	GET FILE-CODE FOR LOAD DEVICE 
	STR	A3,A12	STORE 
	ADKL	A12,4	ADDRESS SEGMENT BLOCK 0 
	LDR	A4,A12	SAVE
BST210	LDKL	A2,/8400	STATUS FOR SEGMENT 0 
	STR	A2,A12	STORE IN SEGBLK 0 
	LD	A2,APLLAC,A10	GET START OF S:GTAB 
	CALL	GETCON	GET ADDRESS TO P:MTAB
	LDR	A2,A1	SAVE 
	ADK	A2,6	ADDRESS TO P:BAS
	CALL	GETCON	GET P:BAS
	ST	A1,2,A12	STORE IN SEGBLK 0
	LD	A2,APLLAC,A10	GET START OF S:GTAB 
	ADK	A2,10	ADDRESS NUMBER OF SEGMENTS 
BST220	ADKL	A12,8	NEXT SEGMENT BLOCK
	SUK	A6,1	ANY MORE SEGMENTS?
	RF(N)	BST300	NO
	LDK	A7,0	INIT STATUS BYTE
	ADK	A2,2	ADDRESS FIRST ENTRY IN SEGMENT BLOCK
	CALL	GETCON	GET SEGMENT TYPE/DISC ADDRESS
	LDR	A3,A1	SAVE 
	ANK	A3,/FF	ISOLATE DISC ADDRESS
	SRL	A1,8	ISOLATE SEGMENT TYPE
	CCK	A1,'RR'	CORE RESIDENT SEGMENT? 
	RF(E)	BST230	YES 
	LD	A1,SCTOPT	GET OPTION WORD 
	ANK	A1,2	DISC PAGING?
	RF(NZ)	BST240	YES
	XRR	A3,A3	CLEAR DISC ADDRESS 
	LDKL	A7,/8800	INDICATE CORE RESIDENT AND LOADED
	ADK	A2,2	ADDRESS SEGMENT DISC ADDRESS BIT 8-23 
	RF	BST270
BST230	LDKL	A7,/8800	INDICATE CORE RESIDENT AND LOADED
BST240	ADK	A2,2	DISC ADDRESS BIT 8-23 
	CALL	GETCON	GET SEGMENT DISC ADDRESS 
	AD	A1,APLADA+2,A10	RELOCATE PART 2 OF D. A.
	RF(O)	BST250	CARRY 
	RF	BST260
BST250	ADK	A3,1	INCR. PART 1 OF D. A. 
	ANKL	A1,/7FFF	RESET OVERFLOW BIT (BIT 0) 
BST260	AD	A3,APLADA,A10	RELOCATE PART 1 OF D. A.
	CWK	A3,255	OVERFLOW IN PART 1 OF D. A. ? 
	RF(NG)	BST270	NO!
	LDKL	A1,LMP10	INDICATE DEVICE ERROR
	CALL	ERROR 
BST270	ORR	A7,A3	MERGE STATUS AND DISC ADDRESS
	STR	A7,A12	STORE 
	ST	A1,2,A12	STORE DISC ADDRESS BIT 8-23
	ADK	A2,2	ADDRESS SEGMENT LENGTH
	CALL	GETCON	GET  SEGMENT LENGTH
	ST	A1,4,A12	STORE IN SEGTAB
	CM	6,A12	CLEAR PAGEBLOCK POINTER 
	RB	BST220
BST300	CW	A8,STKEND+TCTEND	LAST TCTAB ENTRY?
	RF(E)	BST400	YES 
	LDR*	A2,A8	GET TTAB ADDRESS
	ST	A4,TTB:SP,A2	STORE SEGMENT TABLE POINTER
	ADKL	A8,2	INCREMENT POINTER IN TCTAB 
	RB	BST300
BST400	LD	A1,STKEND+APLNO	GET NUMBER OF APPLICATIONS
	RF(Z)	BST410	NO MORE APPLICATIONS
	ABR	A9	NEXT APPLICATION
BST410	EQU	*
	CALL	POB	RESTORE REGISTERS 
	RTN	A14	RETURN 
	XIF
	IFF	SPDVCL+TEDVCL=0
	EJECT
************************************************************************
*  B:DWTS - BUILD DWT:S FOR SPECIAL DEVICES AND CONNECT TO TASK TABLES
************************************************************************
* 
*  REFERENCED IN: MONCON
* 
*  ENTRY: SCTSFA - START OF FREE ARE (X)
*         CONSTA - START OF CONFIGURATION DATA
*         SCTEFA - END OF FREE AREA 
* 
*  EXIT:
* 
*  WORK REGISTERS:  A1-A12
* 
*  SUBROUTINES: GETTSK,GETTDC,GETSDC,GETCLN,NXTBLK,ERROR
* 
	EJECT
B:DWTS	EQU	*
* 
*  GET START OF CONFIGURATION FILE
* 
	LD	A12,SCTSFA	START OF FREE AREA 
* 
*  CHECK IF FIRST BLOCK IS A TASK DEFINITION BLOCK
* 
	CALL	FSTAPL	GET FIRST APPLICATION
	ST	P,STKEND+LIMIT	UPDATE END OF SYSTEM AREA
	ST	P,STKEND+ECHTAB	START OF ECHO TABLE 
* 
*  GET ADDRESS TO TC:TAB
* 
DWTS05	LD	A7,APLMMC,A2	GET FIRST TCTAB ENTRY
	SUK	A7,2 
	EJECT
DWTS10	EQU	*
* 
*  GET NUMBER OF TASKS IN THIS TASK CLASS 
* 
	CALL	GETTSK
DWTS20	EQU	*
	ST	A1,STKEND+NBRTSK	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 DEVICE 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,STKEND+TCLA	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,STKEND+NBRSDC	SAVE 
* 
*  GET SPECIAL DEVICE CLASS NUMBER
* 
	CALL	GETCLN
* 
*  GET CORRESPONDING SPECIAL DEVICE CLASS IN SCLASS 
* 
	ADR	A1,A1
	LD	A6,STKEND+SCLA	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	CHKMOV	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 CONFIGURATION 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,STKEND+NBRSDC
	SUK	A1,1 
	RB	DWTS50
DWTS90	EQU	*
* 
*  CHECK IF MOORE TASKS WITH THE SAME CONFIGURATION 
* 
	LD	A1,STKEND+NBRTSK
	SUK	A1,1 
	RB(P)	DWTS20 
* 
*  CHECK IF MOORE TASK DEFINITION BLOCKS
* 
	CALL	NXTBLK
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	DWTS10	YES 
	CALL	NXTAPL	GET NEXT APPLICATION 
	RB(P)	DWTS05	PROCESS NEXT APPLICATION
	ST	A12,SCTSFA
* 
*  CLEAR WORK AREA TO BE USED FOR ECHO DEVICE 
*  AND TEMPORARY INTERRUPT TABLES 
* 
	LDR	A1,P	GET LOCATION COUNTER	=4 
DWTS95	SUK	A1,2	DECREMENT MEMORY ADDRESS	=4 
	CMR	A1	CLEAR MEMORY AREA	=4
	CW	A1,SCTSFA	ALL WORDS CLEARED?	=4 
	RB(NE)	DWTS95	NO!	=4 
	RTN	A14	RETURN 
	XIF
	IFF	TEDVCL=0 
	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	*
	CM	STKEND+FWTFLG	CLEAR FWT FLAG
	LD	A1,SCTFWT	START OF FWT AREA 
	RF(NZ)	BDWT15	FWT AREA RESERVED
	LD	A1,STKEND+LIMIT 
	ST	A1,STKEND+INTTAB	START OF T.I.T. IF NO FWT AREA 
	IM	STKEND+FWTFLG	INCREMENT 
BDWT15	EQU	*
	EJECT
* 
*  INIT CONFIGURATION DATA POINTER
* 
	CALL	FSTAPL	GET FIRST APPLICATION
	LD	A12,SCTSFA	GET START OF FREE AREA 
* 
*  INIT TC:TAB ENTRY POINTER TO POINT AT FIRST USER TASK ENTRY
* 
	LD	A5,APLMMC,A2	GET FIRST USER TASK ENTRY
	ST	A5,STKEND+CUTENT	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,STKEND+NBRTSK	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,STKEND+NBRTDC	SAVE NUMBER OF TERMINAL DEVICESS 
	LD*	A10,STKEND+CUTENT	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,STKEND+CLANBR	SAVE BINARY VALUE
* 
*  FIND CORRESPONDING TERMINAL DEVICE CLASS IN TCLASS 
* 
	LD	A2,STKEND+CLANBR	GET BINARY VALUE OF CLASS ID 
	ADR	A2,A2	2*ID 
	LD	A7,STKEND+TCLA	POINTER TO TCLASS
	ADR	A7,A2	GET ENTRY
	LDR*	A7,A7	GET POINTER TO CLASS
* 
*  GET LINE CONNECTION NUMBER FOR THIS TERMINAL DEVICE CLASS
*  IN THIS TASK 
* 
	CALL	GETLCN	GET LINE CONNECTION NUMBER 
	LDR	A6,A1	SAVE BINARY VALUE
	LC	A4,TDC+6,A9	GET LINE CONNECTION TYPE
	CCK	A4,'AA'	ASCU4Z CONNECTION? 
	RF(NE)	BDWT58	NO!
	LDR*	A8,A7	YES! GET LENGTH OF THIS CLASS 
	SUKL	A8,2	EXCLUSIVE LENGTH WORD
	CWK	A8,4	ONE DEVICE? 
	RF(NE)	BDWT57	NO!
	LD	A8,4,A7	GET ADDRESS TO PROT.DWT 
	LD	A4,DWTTAB,A8	GET DEVICE 
	CWK	A4,/C459	/C459 ? 
	RF(E)	BDWT58	YES!
BDWT57	EQU	*
	ADK	A1,1	INCREMENT LINE CONNECTION NUMBER
BDWT58	EQU	*
	ADK	A1,1	INCREMENT LINE CONNECTION NUMBER
	CALL	BINASC	CONVERT INCREMENTED VALUE TO ASCII 
	SC	A1,TDC+5,A9	STORE ASCII DIGIT	=2
	SRL	A1,8	MOVE LEFT ASCII DIGIT	=2
	SC	A1,TDC+4,A9	STORE ASCII DIGIT	=2
	SC	A5,TDC+3,A9	STORE ASCII DIGIT DIGIT	=2
	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,STKEND+NBRTDC	GET NUMBER OF TERMINAL DEVICE CLASSES
	SUK	A1,1	ANY MOORE IN THIS TASK CLASS? 
	RF(Z)	BDW100	NO
	ST	A1,STKEND+NBRTDC	SAVE REMAINING NUMBER
	ADKL	A9,TDC+TLC	NEXT TDC RECORD
	RB	BDWT55
BDW100	EQU	*
	CALL	ECHO	INIT ECHO POINTERS 
	LD	A1,STKEND+CUTENT	GET CURRENT ENTRY IN TC:TAB
	ADK	A1,2	INCREMENT ENTRY POINTER 
	ST	A1,STKEND+CUTENT	SAVE 
	LD	A1,STKEND+NBRTSK	GET NUMBER OF TASKS IN THIS CLASS
	SUK	A1,1	ANY MOORE TASKS LEFT
	RB(P)	BDWT50	YES 
*  CHECK IF MOORE TASK DEFINITION BLOCKS
* 
	CALL	NXTBLK	SKIP TO NEXT BLOCK 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	BDWT40	YES 
	EJECT
	CALL	NXTAPL	GET NEXT APPLICATION 
	RB(P)	BDWT40 
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14	RETURN 
	XIF
	EJECT	 
****************************************
*  B:CDT - BUILD COMMON DEVICE TABLE   *
****************************************
* 
*  REFERENCED IN:  SYSLDM 
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
*          CONSTA - START OF CONFIGURATION 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	A12,SCTSFA	START OF FREE AREA 
	LDK	A7,0	RESET LENGTH
	CALL	FSTAPL	GET FIRST APPLICATION
* 
*  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,STKEND+TCLA	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,STKEND+SCLA	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	*
	CALL	NXTAPL	GET NEXT APPLICATION 
	RB(P)	CDG:10	MORE APPLICATIONS?
	CALL	FSTAPL	GET FIRST APPLICATION
B:CT35	CALL	NXTBLK	GET NEXT BLOCK 
	CCK	A2,'TT'	TASK DEFINITION BLOCK? 
	RB(E)	B:CT35	YES 
	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:12	NO! 
	LD	A6,STKEND+SCLA	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:12	EQU	*
	ADK	A7,2 
	STR	A7,A12 
	ST	A12,SCTCDT
	ADR	A12,A7 
	ST	A11,STKEND+WRK1	SAVE A11
	LDR	A11,A12	GET END OF CDTAB 
	LD	A9,STKEND+LIMIT	GET END OF SYSTEM AREA
	CALL	CMPADR	CHECK IF MEMORY OVERFLOW 
	RF(NG)	CDG:13	OK 
	LDKL	A1,LMP3	INDICATE MEMORY OVERFLOW
	CALL	ERROR 
CDG:13	LD	A11,STKEND+WRK1	RESTORE A11 
	EJECT
* 
* INIT POINTER TO START OF FREE AREA AND TO CDTAB 
* 
	LD	A10,SCTCDT	FIRST ENTRY IN SCTCDT
CDG:15	LCR	A2,A11	GET FIRST CHARACTER 
CDG:16	CCK	A2,'TT'	TASK DEFINITION BLOCK/ 
	RF(NE)	CDG:17	NO!
	CALL	NXTBLK	GET NEXT BLCK
	RB	CDG:16
CDG:17	CCK	A2,'CC'	COMMON DEF. BLOCK? 
	RF(E)	CDG:19	YES!
	SUR	A8,A8	INDICATE NO COMMON WORK BLOCKS 
CDG:18	RF(N)	CDG:EX	CDTAB COMPLETE! 
	CALL	NXTAPL	GET NEXT APPLICATION 
	RB(P)	CDG:15	MORE APPLICATIONS 
	RF	CDGEX	NO MORE APPLICATIONS
CDG:19	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,STKEND+NBRCOM	SAVE 
	CALL	GETCLN	GET CLASS IDENT NUMBER 
	ST	A1,STKEND+CLASID	SAVE 
	CALL	GETLCN	GET LINE CONNECTION NUMBER 
	LDR	A6,A1	SAVE 
	LD	A2,STKEND+CLASID	GET CLASS IDENT NUMBER 
	ADR	A2,A2	CONVERT TO DISPLACEMENT
	LD	A7,STKEND+TCLA	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,STKEND+NBRCOM	GET NUMBER OF C.T.C. 
	SUK	A1,1	DECREMENT COUNTER 
	RB	B:CT40
B:CT50	CALL	ECHO
	EJECT
* 
*  GET NUMBER OF SPECIAL DEVICE CLASSES 
* 
	CALL	GETSDC
	ADKL	A9,SDCFST-CDBNC 
	LDR	A8,A1
CDG:20	EQU	*
	RB(NP)	CDG:18
* 
*  GET SPECIAL DEVICE CLASS NUMBER
* 
	CALL	GETCLN
* 
*  GET CORRESPONDING DEVICE CLASS IN SCLASS 
* 
	ADR	A1,A1		T 
	LD	A6,STKEND+SCLA	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	CHKMOV	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,4,A10	STORE DWT-ADDRESS
	LD	A1,-2,A5	GET FILE CODE
	ST	A1,2,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	* 
	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,STKEND+SCLA	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	*
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14	RETURN 
				=6
	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,STKEND+LCNBR	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,STKEND+LCNBR	GET LINE CONNECTION NUMBER
* 
*  CHECK CONNECTION TYPE
* 
	LC	A4,TDC+6,A9	GET LINE CONNECTION TYPE
	CCK	A4,'SS'	SALCUZ CONNECTION? 
	RF(NE)	DWT10	NO! 
	CALL	I:CHSZ	INIT CHANNEL PARAMETERS SALCUZ 
	RF	DWT31 
DWT10	CCK	A4,'AA'	ASCU4Z CONNECTION?
	RF(NE)	DWT07	NO! 
	CALL	I:CHAZ	INIT CHANEL PARAMETERS ASCU4Z
	RF	DWT31 
DWT07	CCK	A4,'VV'	VCCU1/4 CONNECTION? 
	RF(NE)	DWT11 
	CALL	I:CHVC	INIT CHANNEL PARAMETERS VCCU1/4
	RF	DWT31 
DWT11	CCK	A4,'PP'	PLC CONNECTION? 
	RF(NE)	DWT12	NO! 
	CALL	I:CHPC	INIT CHANNEL PARAMETERS PLC
	RF	DWT31 
DWT12	CCK	A4,'LL'	LT CONNECTION?
	RF(NE)	DWT08	NO! 
	CALL	I:CHLT	INIT CHANNEL PARAMETERS LT 
	RF	DWT31 
DWT08	CCK	A4,'RR'	RT CONNECTION?
	RF(E)	DWT09	YES! 
	LDKL	A1,LMP4	INDICATE FORMAT ERROR 
	CALL	ERROR 
DWT09	CALL	I:CHRT	INIT CHANNEL PARAMETERS RT
DWT31	EQU	* 
	ST	A3,STKEND+CONTYP	SAVE 
	ST	A5,STKEND+WRK3	SAVE 
	ST	A6,STKEND+WRK4	SAVE 
* 
*  CHECK IF DWT ALREADY GENERATED ON THIS LINE
* 
	LD	A4,STKEND+INTTAB	GET START OF T.I.T.
	LDR*	A5,A4	GET NUMBER OF BLOCKS
	SUK	A4,2 
	LDR	A5,A5
DWT13	EQU	* 
	RF(Z)	DWT32
	LD	A3,STKEND+CONTYP	GET LINE AND CONNECTION TYPE 
	CW	A3,-4,A4	EQUAL? 
	RF(Z)	DWT15	YES! 
DWT14	EQU	* 
	SUK	A4,6	GET NEXT BLOCK
	SUK	A5,1	DECREMENT NUMBER OF BLOCKS
	RB	DWT13 
DWT15	EQU	* 
	LD	A2,-2,A4	GET RUN-TIME DWT-ADDRESS 
	LD	A6,DWTCP2,A2	GET CHANNEL PARAMETER-2
	ANK	A6,/003F	GET DEVICE ADDRESS
	LD	A3,STKEND+WRK3	GET CHANNEL PARAMETER-2
	ANK	A3,/003F	GET DEVICE ADDRESS
	SUR	A3,A6	EQUAL? 
	RB(NE)	DWT14	NO! 
	LD	A6,DWTST,A2	GET DEVICE STATUS 
	ANK	A6,/00C0	GET BITS 8 AND 9
	LD	A3,DWTST,A1	GET DEVICE STATUS 
	ANK	A3,/00C0	GET BITS 8 AND 9
	SUR	A3,A6	EQUAL? 
	RB(NE)	DWT14 
	LD	A6,DWTTAB,A2	GET DEVICE TYPE
	ANKL	A6,/8000	ISOLATE ECHO BIT 
	LD	A3,DWTTAB,A1	GET DEVICE TYPE
	ANKL	A3,/8000	ISOLATE ECHO BIT 
	SUR	A3,A6	EQUAL? 
	RB(NE)	DWT14	NO! 
	CALL	DWT50 
	LDKL	A1,DWT70
	AD	A1,STKCOM+M:REL 
	ABR	A1 
DWT32	EQU	* 
	LDR	A5,A12	GET RUN TIME DWT-ADDRESS
	CALL	B:TTAB	BUILD ONE BLOCK IN T.I.T.
* 
*  COPY DEVICE TYPE DWT 
* 
	LDR	A2,A12	TO-ADDRESS
	LD	A3,DWTOR,A1	LENGTH
	ADR	A12,A3	NEXT FREE ENTRY 
	CALL	CHKMOV
	EJECT
* 
*  A1 - ADDRESS TO PROTOTYPE DWT
*  A2 - ADDRESS TO REAL DWT 
* 
	LD	A6,STKEND+WRK4
	LD	A5,STKEND+WRK3
	STR	A6,A2	STORE CHANNEL PARAMETERS -1
	ST	A5,DWTCP2,A2	STORE CHANNEL PARAMETERS -2
* 
*  CHECK IF INPUT DEVICE
* 
	LD	A3,2,A1	GET DWT STATUS
	ANK	A3,/0040	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,STKCOM+M:REL 
	LD*	A3,STKEND+ECHTAB	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,STKEND+ECHTAB	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,STKEND+ECHTAB	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
* 
	LD	A3,DWTDEV,A1	GET DEVICE STATUS OF TYPE DWT
	ANK	A3,/FF	GET EIGTH RIGHTMOST BITS
	RF(Z)	DWT60	NOT DOUBLE KEYBOARD
	LDR	A5,A2	GET REAL DWT-ADDRESS 
	ADK	A5,1	ADD ONE 
	CALL	B:TTAB	BUILD ONE BLOCK IN T.I.T.
	SUK	A5,1 
	LDR	A2,A5	GET REAL DWT-ADDRESS 
	RF	DWT60 
	EJECT
DWT45	CALL	DWT50
	RF	DWT60 
DWT50	EQU	* 
* 
*  OUTPUT DEVICE* 
*  IF BIT 0 IN SIXTH WORD IN DWT IS SET 
*  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,STKEND+ECHTAB	GET LENGTH OF ECHO DEVICE TABLE 
	RF(NZ)	DWT55	ALREADY INITIALIZED!
	ADK	A3,2	INCLUDE LENGTH
DWT55	LDR	A4,A3	SAVE LENGTH 
	AD	A4,STKEND+ECHTAB	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,STKEND+ECHTAB	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 
	ANKL	A3,/FFFE	MAKE SURE OF EVEN LENGTH 
	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,STKCOM+BUFSIZ		
	RF(NG)	DWT65 
	ST	A3,STKCOM+BUFSIZ
	ST	A12,STKCOM+SYSBUF 
DWT65	EQU	* 
	ADR	A12,A3	NEXT FREE ENTRY 
	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,STKCOM+M:REL 
	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,STKEND+ECHTAB	GET LENGTH OF ECHO DEVICE TABLE 
	RF(Z)	DWT160	NO ECHO DEVICES!
	AD	A3,STKEND+ECHTAB	COMPUTE END OF ECHO DEVICE TABLE 
	LD	A1,STKEND+ECHTAB	GET START OF ECHO DEVICE TABLE 
	ADK	A1,2	BYPASS LENGTH 
DWT90	LD	A2,STKEND+ECHTAB	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*	STKEND+ECHTAB	CLEAR LENGTH 
DWT160	RTN	A14	RETURN 
				=6
	IFT	DC=1 
	EJECT
******************************************************* 
*                                                     * 
*   B:CNA  BUILD COMPUTER NETWORK ARCHITECTURE        * 
*   ==========================================        * 
*                                                     * 
*   SCANS POSSIBLE D-BLOCK IN CONFIGURATION DATA      * 
*   AND BUILDS DATA COMMUNICATION TABLE IN MEMORY.    * 
*   TABLE START IS DEFINED BY THE POINTER SCTDCT      * 
*   IN SYSTAB.                                        * 
*   ON ENTRY: SCTDCT = RELATIVE POSITION OF THE       * 
*             D-BLOCK IN CONF. DATA (SET BY SYSLOD)   * 
*                                                     * 
*   REFERENCED IN: CONMON                             * 
*   SUBROUTINES CALLED: GETDTE, P:DTE                 * 
*   WORK REGISTERS: A1-A12                            * 
*                                                     * 
******************************************************* 
			 
			 
B:CNA	EQU	* 
	LD	A11,DCBLK+STKCOM
	RF(Z)	B:CN20	NO DATA COMMUNICATION	=1
* 
	AD	A11,CONSTA+STKCOM	GET D BLOCK ADDRESS IN CONF. DATA 
	LD	A12,SCTSFA	GET START OF FREE AREA 
	ST	A12,SCTDCT	UPDATE SYSTAB POINTER
	ST	P,STKEND+LIMIT	UPDATE END OF SYSTEM AREA
	CALL	GETDTE	GET NO OF DTE:S DEFINED
	ADKL	A11,2	ADVANCE TO START OF SDTE RECORD 
B:CN00	EQU	*
	SUK	A1,1 
	RF(N)	B:CN10	NO DTE BLOCKS LEFT IN CONF. DATA
* 
	ST	A1,NUMDTE+STKEND	SAVE NO OF DTE:S LEFT
	ADKL	A11,5	ADVANCE TO 1ST CHAR. IN NAME
	CALL	P:DTE	PROCESS THIS DTE BLOCK
	LD	A1,NUMDTE+STKEND	GET REMAINING DTE BLOCKS 
	LDR*	A12,A12	GET ADDRESS TO NEXT DTE 
	RB	B:CN00
* 
B:CN10	EQU	*
	CM	0,A12	AND RESET IT
	ADKL	A12,2 
	ST	A12,SCTSFA	UPDATE START OF FREE AREA
B:CN20	EQU	*	 	=1 
	RTN	A14
	EJECT
******************************************************* 
*                                                     * 
*   P:DTE  PROCESS DTE BLOCK IN CONFIGURATION DATA    * 
*   ==============================================    * 
*                                                     * 
*   SCANS DTE BLOCK IN CONF. DATA AND BUILDS CORRE-   * 
*   SPONDING DTE-BLOCK IN SCTDCT. IF MULTIPLE COPIES  * 
*   ARE DEFINED CURRENT DTE IS DUPLICATED THE NO OF   * 
*   TIMES SPECIFIED.                                  * 
*                                                     * 
*   ON ENTRY: A11 ADDRESS TO 1ST CHARACTER IN         * 
*                 SDTE NAME IN CONF. DATA             * 
*             A12 POINTER TO START OF CURRENT         * 
*                 DTE BLOCK IN SCTDCT TABLE           * 
*                                                     * 
*   ON EXIT:  A11 ADDRESS TO LAST CHARACTER IN        * 
*                 PROCESSED DTE-BLOCK IN CONF. DATA   * 
*             A12 POINTER TO LAST DEFINED DTE-BLOCK   * 
*                 DEFINED IN SCTDCT TABLE             * 
*                                                     * 
*   REFERENCED IN: B:CNA                              * 
*   SUBROUTINES REFERENCED: GETCOP,GETNSA,P:NA,HEXCPY * 
*                           AND MOVE                  * 
*                                                     * 
******************************************************* 
			 
			 
P:DTE	EQU	* 
	LDKL	A1,/3000	INITIALIZE NAME FILLER 
	LC	A1,1,A11	GET 1ST CHAR. IN SDTE NAME 
	LC	A2,IDLIM,A11	GET NA-NSA QUALIFIER (=T)
	ADKL	A11,1 
	CCK	A2,'TT'	START OF TYPE RECORD?
	RF(E)	PDTE00	YES!
* 
	SLL	A1,8	NO LEFT ADJUST CHAR. AND
	LC	A1,1,A11	GET NEXT CHARACTER 
	ADKL	A11,1 
PDTE00	EQU	*
	ST	A1,DTENAM+STKEND	SAVE NAME IN STACK 
	CALL	GETCOP	GET NO OF COPIES 
	ST	A1,DTECOP+STKEND	AND SAVE 
	ADKL	A11,TYPOFS	ADVANCE TO TYPE IDENTIFIER 
	LC	A1,1,A11
	SLL	A1,8	FORM TYPE IDENTIFIER
	LC	A1,2,A11
	ST	A1,DTETYP+STKEND	SAVE IN STACK
	ADKL	A11,2 
	LDK	A2,0	RESET NETWORK ADDR. LENGTH
	CALL	ENDBLK	END OF D-BLOCK?
	LDR	A8,A8
	RF(Z)	PDTE05	YES!
* 
	LC	A7,NANSA,A11	GET NA-NSA-SDTE QUALIFIER
	CCK	A7,'AA'
	RF(NE)	PDTE05	NSA OR SDTE RECORD 
* 
	ADKL	A11,NAOFS	ADVANCE TO 1ST DIGIT IN NA
	ST	A11,NASTRT+STKEND	SAVE ADDRESS
	CALL	P:NA	PROCESS NETWORK ADDRESS
	LC	A7,2,A11
PDTE05	EQU	*
	ST	A2,NALNG+STKEND	SAVE LENGTH OF NA 
	LDK	A1,0 
	CALL	ENDBLK	END OF D-BLOCK?
	LDR	A8,A8
	RF(Z)	PDTE07	YES!
* 
	CCK	A7,'SS'
	RF(NE)	PDTE07	NO NSA RECORD
* 
	ADKL	A11,NSAOFS	ADVANCE TO NO OF SUBADDR.
	CALL	GETNSA
	ADKL	A11,2	SKIP NSA NR IN CONF. DATA 
PDTE07	EQU	*
	ST	A1,DTENSA+STKEND	SAVE NO OF SUBADDR. DEF. 
	CWK	A1,/FF	LOOK IF LEGAL NUMBER
	RF(NG)	PDTE10	YES! 
* 
NSAERR	EQU	*
	LDKL	A1,LMP4	NO, ERROR IN CONF. FILE 
	CALL	ERROR 
PDTE10	EQU	*
	LDR	A1,A1
	RF(Z)	PDTE15	NO SUBADDRESSES 
* 
	ST	A11,NSAADR+STKEND	SAVE ADDR. OF 1ST SUBADDR.
	SLL	A1,1 
	ADR	A11,A1	CALCULATE STAT OF NEXT RECORD 
PDTE15	EQU	*
	CALL	DTESIZ	CALCULATE SIZE OF THIS DTE BLOCK 
	CALL	UPDDTE	UPDATE DTE BLOCK IN DCT
	LD	A7,DTECOP+STKEND	GET NO OF COPIES 
PDTE20	EQU	*
	SUK	A7,1 
	RF(Z)	PDTE40	NO COPIES LEFT TO PROCESS 
	LDK	A5,1	INITIALIZE INCREMENT CONSTANT 
	LD	A4,DTENAM+STKEND	GET PREVIOUS NAME
	LDR	A3,A4
	ANK	A3,/FF	ISOLATE RIGHT BYTE OF NAME
	CWK	A3,/5F	UPPER BOUNDARY? 
	RF(L)	PDTE25	NO! 
* 
	LC	A4,/30	RESET RIGHT BYTE TO ASCII '0'
	SLL	A5,8	LEFT BYTE INCREMENTATION
PDTE25	EQU	*
	ADR	A4,A5	INCREMENT SYMBOLIC NAME
	ST	A4,DTENAM+STKEND
* 
	CALL	ENDBLK	END OF D-BLOCK?
	LDR	A8,A8
	RF(Z)	PDTE35	YES!
* 
	LC	A1,2,A11	GET 2ND CHAR. IN NEXT RECORD 
	CCK	A1,'DD'	IF A SDTE-RECORD USE OLD ADDR. 
	RF(E)	PDTE35 
* 
	CCK	A1,'SS'	IF NSA RECORD
	RF(E)	PDTE30	USE OLD NETWORK ADDRESS 
* 
	ADKL	A11,NAOFS	ADVANCE TO 1ST DIGIT IN NA
	ST	A11,NASTRT+STKEND 
	CALL	P:NA	PROCESS NETWORK ADDRESS
	ST	A2,NALNG+STKEND	SAVE LENGTH OF NA 
* 
	CALL	ENDBLK	END OF D-BLOCK?
	LDR	A8,A8
	RF(Z)	PDTE35	YES!
* 
	LC	A1,2,A11
	CCK	A1,'SS'
	RF(NE)	PDTE35	NO NSA RECORD PRESENT
* 
PDTE30	EQU	*
	ADKL	A11,NSAOFS	ADVANCE TO NO OF SUBADDR.
	CALL	GETNSA
	ST	A1,DTENSA+STKEND	SAVE NO OF SUBADDR.
	ADKL	A11,2 
	LDR	A1,A1
	RF(Z)	PDTE35	NO SUBADDRESSE
* 
	CWK	A1,/FF 
	RB(G)	NSAERR	TOO MANY SUBADDR. DEFINED 
* 
	ST	A11,NSAADR+STKEND	SAVE START OF 1ST SUBADDR.
	SLL	A1,1 
	ADR	A11,A1	CALCULATE START OF NEXT RECORD
PDTE35	EQU	*
	LDR*	A12,A12	GET START OF NEXT DTE BLOCK 
	CALL	DTESIZ	CALCULATE LENGTH OF THIS DTE BLOCK 
	CALL	UPDDTE
	RB	PDTE20
* 
PDTE40	EQU	*
	RTN	A14
	EJECT
********************************************************
*                                                      *
*   DTESIZ  CALCULATES THE LENGTH OF A DTE BLOCK       *
*   ============================================       *
*                                                      *
*   ON ENTRY: A12 START OF CURRENT DTE BLOCK           *
*                                                      *
*   WORK REGISTER: A1,A9                               *
*                                                      *
********************************************************


DTESIZ	EQU	*
	ST	A11,WRK1+STKEND 
	LD	A1,NALNG+STKEND	GET LENGTH OF NETWORK ADDRESS 
	ADK	A1,1 
	SRL	A1,1	2 DIGITS IN EACH BYTE 
	AD	A1,DTENSA+STKEND	ADD NO OF SUBADDR. 
	ADK	A1,DTEFIX+1	AND LENGTH OF FIX PART+1 
	ANKL	A1,/FFFE	MAKE EVEN
	ADR	A1,A12	START OF NEXT DTE BLOCK 
	STR	A1,A12	UPDATE DTE BLOCK LINK 
	LDR	A9,A1
	ST	A11,WRK1+STKEND	SAVE A11
	LD	A11,LIMIT+STKEND	GET END OF SYSTEM AREA 
	CALL	CMPADR	MEMORY OVERFLOW? 
	RF(NL)	DTSIZ0	NO!
* 
	LDKL	A1,LMP3	YES!
	CALL	ERROR 
* 
DTSIZ0	EQU	*
	LD	A11,WRK1+STKEND	RESTORE POSITION IN CONF. DATA
	RTN	A14
	EJECT
********************************************************
*                                                      *
*   UPDDTE  UPDATES CURRENT DTE BLOCK WITH ITS:        *
*   ======                                             *
*           NAME                                       *
*           TYPE                                       *
*           NETWORK ADDRES                             *
*           SUBADDRESSES                               *
*                                                      *
********************************************************


UPDDTE	EQU	*
	LDR	A6,A12	GET START OF CURRENT DTE BLOCK ENTRY
	ADK	A6,2	SKIP LINK ENTRY 
	LD	A1,DTENAM+STKEND	GET NAME FROM STACK
	STR	A1,A6	SAVE IN DCT
	ADK	A6,2	NEXT ENTRY
	LD	A1,DTETYP+STKEND	GET TYPE FROM STACK
	STR	A1,A6	AND SAVE IN DCT
	ADK	A6,2 
	LDK	A5,4	GET NO OF SHIFTS
	ORKL	A5,SLL0	AND CONFIG. SLL A1,8 INSTR. 
	LD	A2,NALNG+STKEND	GET LENGTH OF NETWORK ADDR. 
	LDR	A3,A2	SAVE NO OF CHARACTERS
	SLL	A2,8	LEFT ADJUST 
	RF(Z)	UPDTE0	NO NETWORK ADDRESS DEFINED
* 
	LD	A4,NASTRT+STKEND	GET START OF NETWORK ADDR. 
	CALL	HEXCPY	COPY AND PACK NA TO DCT
	ANKL	A5,/1F	ISOLATE SHIFT COUNT
	CWK	A5,4	LESS THAN ONE BYTE LEFT?
	RF(NG)	UPDTE2	YES! 
UPDTE0	EQU	*
	LDK	A5,0	SET NO OF SHIFTS
	RF	UPDTE4
* 
UPDTE2	EQU	*
	STR	A2,A6	STORE WORD IN DCT
	LDK	A2,0	CLEAR TABLE WORD
	ADK	A6,2	ADVANCE TO NEXT ENTRY 
	LDK	A5,8	GET NO OF SHIFTS
UPDTE4	EQU	*
	ORKL	A5,SLL0	CONFIGURE SSL A1,N INSTR. 
	LD	A1,DTENSA+STKEND	GET NO OF SUBADDR. DEFINED 
	RF(Z)	UPDTE8	NO SUBADDR. DEFINED 
* 
	LD	A4,NSAADR+STKEND	GET ADDRESS TO 1ST SUBADDR.
	LDR	A3,A1
	SLL	A3,1	2 DIGITS FOR EACH SUDADDRESS
	EXR	A5	SHIFT 
	ORR	A2,A1	AND CONFIGURE DCT WORD 
	CWK	A5,SLL0	FULL WORD? 
	RF(NE)	UPDTE6	NO!
* 
	STR	A2,A6	YES! SAVE IN DCT 
	LDK	A2,0	CLEAR TABLE WORD
	ADK	A6,2	ADVANCE DCT POINTER 
	LDK	A5,16	NO OF SHIFTS 
	ORKL	A5,SLL0	CONFIGURE SLL A1,12 INSTR.
UPDTE6	EQU	*
	SUK	A5,4	NEXT NIBBLE 
	CALL	HEXCPY	COPY AND PACK INTO DCT 
UPDTE8	EQU	*
	STR	A2,A6
	RTN	A14
	EJECT
********************************************************
*                                                      *
*   HEXCPY  COPIES AND PACKS 4 HEXADECIMAL DIGITS      *
*           IN ONE WORD.                               *
*                                                      *
*   ON ENTRY: A2 WORD TO PACK                          *
*             A3 NO OF CHARACTERS TO PROCESS           *
*             A4 ADDRESS TO FIRST ASCII DIGIT          *
*             A5 PACKING INSTR. (SLL A1,N TIMES)       *
*             A6 POINTER WHERE TO STORE PACKED WORD    *
*                                                      *
*   ON EXIT:  A2 LAST PACKED, BUT NOT STORED WORD      *
*             A4 ADDRESS TO CHAR. FOLLOWING LAST       *
*                PROCESSED DIGIT                       *
*             A5 PACKING INSTR. (SLL A1,N TIMES)       *
*             A6 POINTER WHERE TO STORE NEXT WORD      *
*                                                      *
********************************************************
			 
			 
HEXCPY	EQU	*
	LDK	A1,0 
	LC	A1,1,A4	GET CHARACTER 
	CALL	HEXCNV	CONVERT TO HEX 
	EXR	A5	SHIFT 
	ORR	A2,A1	CONFIGURE DCT WORD 
	SUK	A3,1	DECREMENT NO OF CHARACTERS
	RF(Z)	HXCPY8	WHOLE NA PROCESSED
* 
	CWK	A5,SLL0	FULL WORD? 
	RF(NE)	HXCPY6	NO!
* 
	STR	A2,A6	YES! SAVE IN DCT 
	LDK	A2,0	CLEAR TABLE WORD
	ADK	A6,2	ADVANCE TO NEXT ENTRY 
	LDK	A5,16	NO OF SHIFTS 
	ORKL	A5,SLL0	CONFIGURE SSL A1,16 INSTR.
HXCPY6	EQU	*
	SUK	A5,4	NEXT NIBBLE 
	ADK	A4,1	NEXT CHARACTER IN CONF. DATA
	RB	HEXCPY
* 
HXCPY8	EQU	*
	RTN	A14
	EJECT
********************************************************
*                                                      *
*   HEXCNV  CONVERTS A HEXADECIMAL DIGIT IN ASCII CODE *
*           TO CORRESPONDING HEXADECIMAL VALUE         *
*           (4 BITS BINARY CODE)                       *
*                                                      *
*   ON ENTRY: A1 CHARACTER TO CONVERT                  *
*                                                      *
*   ON EXIT:  A1 CONVERTED CARACTER                    *
*                                                      *
********************************************************
			 
			 
HEXCNV	EQU	*
	ANK	A1,/FF	ISOLATE CHARACTER 
	CWK	A1,/29 
	RF(L)	TYPERR	ERRANEOUS TYPE
* 
	CWK	A1,/40	DIGIT BETWEEN 0-9?
	RF(L)	HXCN00	YES!
	RF(E)	TYPERR	NO NEXADECIMAL DIGIT
* 
	CWK	A1,/46	DIGIT BETWEEN A-F?
	RF(G)	TYPERR	NO
* 
	ADK	A1,9	YES!
HXCN00	EQU	*
	ANK	A1,/F	ISOLATE HEX NUMBER 
	RTN	A14
* 
TYPERR	EQU	*
	LDKL	A1,LMP4	CONF. DATA ERROR
	CALL	ERROR 
	EJECT
********************************************************
*                                                      *
*   P:NA  PROCESS NETWORK ADDRESS                      *
*                                                      *
*   SCANS THE NETWORK ADDRESS RECORD (NA=..) IN CONF.  *
*   DATA AND REPACKS THE RECORD, OVERWRITING POSSIBLE  *
*   CONTINUATION DEFINITIONS (C=..), SO THAT THE       *
*   WHOLE NETWORK ADDRESS WILL BE IN CONTIGOUSE LOCA-  *
*   TIONS.                                             *
*                                                      *
*   ON ENTRY: A11 ADDRESS TO 1ST CHARACTER IN NETWORK  *
*             ADDRESS.                                 *
*                                                      *
*   ON EXIT:  A2 LENGTH OF NETWORK ADDRESS             *
*             A11 START OF NSA RECORD IN CONF. DATA    *
*                                                      *
********************************************************
			 
			 
P:NA	EQU	*
	LDK	A4,1	RESET PACKING CONSTANT
	LDK	A2,0	RESET ADDRESS LENGTH
P:NA00	EQU	*
	LDK	A1,0 
	LC	A1,1,A11	GET CHARACTER
	LDR	A1,A1	SET CONDITION REGISTER 
	RF(Z)	P:NA06	END OF CONF. DATA 
* 
	CCK	A1,/FF	END OF D-BLOCK? 
	RF(E)	P:NA05	YES!
* 
	CCK	A1,'=='	CONTINUATION RECORD? 
	RF(E)	P:NA04	YES!
* 
	CCK	A1,'NN'	NO! START OF NA OR NSA RECORD
	RF(E)	P:NA06	YES! RETURN 
* 
	CCK	A1,'SS'	START OF SDTE RECORD?
	RF(E)	P:NA06	YES!
* 
	ADK	A2,1	INCREMENT NA ADDRESS LENGTH 
	CWK	A2,/FF	TOO MANY DIGITS?
	RF(NG)	P:NA02	NO!
* 
	LDKL	A1,LMP4	YES! ERROR IN CONF. DATA
	CALL	ERROR 
P:NA02	EQU	*
	LDR	A3,A4
	ADR	A3,A11	REPACKING ADDRESS 
	SCR	A1,A3	PUT CHARACTER BACK IN FILE 
	ADKL	A11,1	GET NEXT CHARACTER
	RB	P:NA00
* 
P:NA04	EQU	*
	SUK	A2,1	DON'T COUNT CONT. RECORD IDENTIFIER 
	SUK	A4,2	SET REPACKING CONSTANT
	ADKL	A11,1	ADVANCE TO NEXT CHARACTER 
	RB	P:NA00
* 
P:NA05	EQU	*
	SUK	A2,1	DECREMENT NA LENGTH 
	SUKL	A11,1	AND POSITION IN CONF. DATA
* 
P:NA06	EQU	*
	RTN	A14
	EJECT

********************************************************
*                                                      *
*   ENDBLK  LOOKS FOR END OF DATA COMMUNICATION BLOCK  *
*   =================================================  *
*                                                      *
*   END OF BLOCK IS DEFINED BY A RECORD BEGINNING      *
*   WITH 'A' AS IN APPLICATION DEFINITION BLOCK OR     *
*   BY A CHARACTER = 0 (BINARY) MEANING END OF         *
*   CONFIGURATION DATA.                                *
*                                                      *
*   ON ENTRY:  A11 CURRENT POSITION IN CONF. DATA      *
*                                                      *
*   ON EXIT:   A8 = 0 IF END OF BLOCK                  *
*              A8 NOT ZERO OTHERVISE                   *
*                                                      *
********************************************************


ENDBLK	EQU	*
	LC	A8,1,A11	GET NEXT CHARACTER 
	CCK	A8,/00	END OF CONF. DATA?
	RF(E)	ENDBL0	YES!
* 
	CCK	A8,'AA'	START OF APPL. DEF. BLOCK? 
	RF(NE)	ENDBL2	NO! NOT END OF D-BLOCK 
* 
ENDBL0	EQU	*
	SUR	A8,A8	SET END OF D-BLOCK COND. 
ENDBL2	EQU	*
	RTN	A14
	XIF
	EJECT
********************************************* 
*  I:CHSZ - INIT CHANNEL PARAMETERS SALCUZ  * 
********************************************* 
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A6 - LINE CONNECTION NUMBER
* 
*  EXIT:   A6 - CHANNEL PARAMETER - 1 
*          A5 - CHANNEL PARAMETER - 2 
*          A3 - BITS 12-15 CONNECTION TYPE
*               BITS 4 -11 LINE NUMBER
*  WORK REGISTERS:
* 
*  SUBROUTINES: 
* 
I:CHSZ	EQU	*
	IFF	SALCUZ=0 
	CWK	A6,8	CONNECTION NUMBER <=8?
	RF(G)	NUMERR	NO! 
	CWK	A6,1	CONNECTION NUMBER >=1?
	RF(L)	NUMERR	NO! 
	SUK	A6,1	MODIFY LINE CONNECTION NUMBER 
	LD	A5,DWTCP2,A1	GET DWTCP2 OF PROTOTYPE DWT
	ANK	A5,/3F	CLEAR BITS TO MODIFY
	LDR	A3,A6	GET MODIFY LINE CONNECTION NUMBER
	SLL	A3,4	MOVE TO BITS 4 - 11 
	ADK	A3,2	ADD CONNECTION TYPE SALCUZ
	ADKL	A6,/0200	ADD CONNECTION TYPE SALCUZ 
	RTN	A14	RETURN 
	XIF
	IFT	SALCUZ=0 
	LDKL	A1,LMP4 
	CALL	ERROR 
	XIF
	EJECT
***************************************************** 
*  I:CHAZ - INIT CHANNEL PARAMETERS ASCU4Z  * 
***************************************************** 
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A4 - LINE CONNECTION TYPE
*          A6 - LINE CONNECTION NUMBER
* 
*  EXIT:   A6 - CHANNEL PARAMETER - 1 
*          A5 - CHANNEL PARAMETER - 2 
*          A3 - BITS 12-15 CONNECTION TYPE
*               BITS  4-11 LINE NUMBER
* 
*  WORK REGISTERS:
* 
*  SUBROUTINES: 
* 
I:CHAZ	EQU	*
	IFF	ASCU4Z=0 
	CWK	A6,32	CONNECTION NUMBER <=32?
	RF(G)	NUMERR	NO! 
	CWK	A6,1	CONNECTION NUMBER >=1?
	RF(L)	NUMERR	NO! 
	SUK	A6,1	MODIFY LINE CONNECTION NUMBER 
	LD	A5,DWTCP2,A1	GET DWTCP2 OF PROTOTYPE DWT
	ANK	A5,/3F	CLEAR BITS TO MODIFY
	LDR	A3,A6	GET MODIFY LINE CONNECTION NUMBER
	ANK	A3,3	GET BITS 14-15
	SLL	A3,8	MOVE TO BITS TO BITS 6-7
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	SLL	A3,4 
	ANK	A6,/1C	GET BITS 11-13 BOARD NUMBER 
	SRL	A6,2	MOVE TO BITS 12-15
	ADK	A3,3	ADD CONNECTION TYPE ASCU4Z
	ADKL	A6,/0300	ADD CONNECTION TYPE ASCU4Z 
	RTN	A14
	XIF
	IFT	ASCU4Z=0 
	LDKL	A1,LMP4 
	CALL	ERROR 
	XIF
	EJECT
***************************************************** 
*  I:CHAZ - INIT CHANNEL PARAMETERS VCCU1/4  *
***************************************************** 
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A4 - LINE CONNECTION TYPE
*          A6 - LINE CONNECTION NUMBER
* 
*  EXIT:   A6 - CHANNEL PARAMETER - 1 
*          A5 - CHANNEL PARAMETER - 2 
*          A3 - BITS 12-15 CONNECTION TYPE
*               BITS  4-11 LINE NUMBER
* 
*  WORK REGISTERS:
* 
*  SUBROUTINES: 
* 
I:CHVC	EQU	*
	IFF	VIDEO=0
	CWK	A6,32	CONNECTION NUMBER <=32?
	RF(G)	NUMERR	NO! 
	CWK	A6,1	CONNECTION NUMBER >=1?
	RF(L)	NUMERR	NO! 
	SUK	A6,1	MODIFY LINE CONNECTION NUMBER 
	LD	A5,DWTCP2,A1	GET DWTCP2 OF PROTOTYPE DWT
	ANK	A5,/3F	CLEAR BITS TO MODIFY
	LDR	A3,A6	GET MODIFY LINE CONNECTION NUMBER
	ANK	A3,3	GET BITS 14-15
	SLL	A3,8	MOVE TO BITS TO BITS 6-7
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	SLL	A3,4 
	ANK	A6,/1C	GET BITS 11-13 BOARD NUMBER 
	SRL	A6,2	MOVE TO BITS 12-15
	ADK	A3,7	ADD CONNECTION TYPE VCCU1/4 
	ADKL	A6,/0700	ADD CONNECTION TYPE VCCU1/4
	RTN	A14
	XIF
	IFT	VIDEO=0
	LDKL	A1,LMP4 
	CALL	ERROR 
	XIF
	EJECT
******************************************
*  I:CHPC - INIT CHANNEL PARAMETERS PLC  *
******************************************
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A6 - LINE CONNECTION NUMBER
* 
*  EXIT:   A6 - CHANNEL PARAMETER - 1 
*          A5 - CHANNEL PARAMETER - 2 
*          A3 - BITS 12-15 CONNECTION TYPE
*               BITS 4 -11 LINE NUMBER
* 
*  WORK REGISTERS:
*  SUBROUTINES: 
* 
I:CHPC	EQU	*
	IFF	PLCL=0 
	CWK	A6,128	CONNECTION NUMBER <=128?
	RF(G)	NUMERR	NO! 
	CWK	A6,1	CONNECTION NUMBER >=1?
	RF(L)	NUMERR	NO! 
	SUK	A6,1 
	LD	A5,DWTCP2,A1	GET DWTCP2 OF PROTOTYPE DWT
	ANK	A5,/3F	CLEAR BITS TO MODIFY
	LDR	A3,A6	GET LINE CONNECTION NUMBER 
	ANK	A3,/1F	GET BITS 11 - 15
	ADK	A3,1 
	SLL	A3,8	MOVE TO BITS 2 - 7
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	LDR	A3,A6	GET LINE CONNECTION NUMBER 
	ADK	A3,1 
	SLL	A3,4	MOVE TO BITS 4 - 11 
	ADK	A3,5	ADD CONNECTION TYPE PLC 
	ANK	A6,/60	GET BITS 9 - 10 BOARD NUMBER
	SRL	A6,5	MOVE TO BITS 12 - 15
	ADKL	A6,/0500	ADD CONNECTION TYPE PLC
	RTN	A14
	XIF
	IFT	PLCL=0 
	LDKL	A1,LMP4 
	CALL	ERROR 
	XIF
	EJECT
************************************* 
*  I:CHLT - INIT CHANNEL PARAMETERS LT  * 
************************************* 
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A6 - LINE CONNECTION NUMBER
* 
*  EXIT:   A6 - CHANNEL PARAMETERS -1 
*          A5 - CHANNEL PARAMETERS -2 
*          A3 - BITS 12-15 CONNECTION TYPE
*               BITS  4-11 LINE NUMBER
* 
*  WORK REGISTERS:
* 
*  SUBROUTINES: 
* 
	EJECT
I:CHLT	EQU	*
	IFF	SUML=0 
	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 
	LD	A5,DWTCP2,A1	GET DWTCP2 OF PROTOTYPE DWT
	ANKL	A5,/003F	CLEAR BITS TO MODIFY 
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	ANK	A3,7	GET BITS 13-15
	SLL	A3,8	MOVE TO BITS 5-7
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	SLL	A3,4 
	ANK	A6,/18	GET BITS 11-12
	SRL	A6,3	MOVE TO BITS 14-15
	RTN	A14
	XIF
	IFT	SUML=0 
	LDKL	A1,LMP4 
	CALL	ERROR 
	XIF
	EJECT
***************************************** 
*  I:CHRT - INIT CHANNEL PARAMETERS RT  * 
***************************************** 
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A6 - LINE CONNECTION NUMBER
* 
*  EXIT:   A6 - CHANNEL PARAMETERS - 1
*          A5 - CHANNEL PARAMETERS - 2
*          A3 - BITS 12-15 CONNECTION TYPE
*               BITS  4-11 LINE NUMBER
* 
*  WORK REGISTERS:
* 
*  SUBROUTINES: 
* 
	EJECT
I:CHRT	EQU	*
	IFF	SUMR=0 
	CWK	A6,0016	CONNECTION NUMBER <= 16? 
	RF(G)	NUMERR	NO! 
	CWK	A6,0001	CONNECTION NUMBER >=1? 
	RF(L)	NUMERR	NO! 
	SUK	A6,1	MODIFY LINE CONNECTION NUMBER 
	LD	A5,DWTCP2,A1	GET DWTCP2 OF PROTOTYPE DWT
	ANKL	A5,/003F	CLEAR BITS TO MODIFY 
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	ANK	A3,3	GET BITS 14-15
	SLL	A3,8	MOVE TO BITS 6-7
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	SLL	A3,4 
	ADK	A3,1	ADD CONNECTION TYPE RT
	ANK	A6,/C	GET BITS 12-13 
	SRL	A6,2	MOVE TO BITS 14-15
	ADKL	A6,/0100	ADD CONNECTION TYPE RT 
	RTN	A14
	XIF
NUMERR	EQU	*
	LDKL	A1,LMP4	INDICATE FORMAT ERROR 
	CALL	ERROR 
	IFF	TEDVCL=0 
	EJECT
**********************************************
*  B:ITAB - BUILD REAL-TIME INTERRUPT TABLE  *
**********************************************
* 
*  REFERENCED IN:  DWTGEN 
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
* 
*  EXIT:  REAL TIME INTERRUPT TABLES FOR
*         LT,RT,PLC,VCCU1/4,SALCUZ AND ASCU4Z 
* 
*  SUBROUTINES
* 
	EJECT
B:ITAB	EQU	*	BUILD REAL-TIME INTERRUPT TABLES 
* 
*	BUILD REAL-TIME INTERRUPT TABLES FOR LT 
* 
	XIF
B:ITLT	EQU	*
	IFF	SUML=0 
	LDKL	A8,0	CONNECTION TYPE = LT 
	LDKL	A9,7	1:ST BOARD 
	LDK	A1,16	MAX.LENGTH OF BOARD CONF. TABLE
	ST	A1,STKEND+WRK4	SAVE 
	CM	STKEND+WRK1	CLEAR 
	CM	STKEND+WRK2	CLEAR 
	CM	STKEND+WRK3	CLEAR 
BIT10	EQU	* 
	CALL	B:BTAB
	CALL	B:LTAB
	LD	A1,STKEND+WRK2	GET INDEX IN MONTAB
	LD	A2,STKEND+WRK3	ANY LINES? 
	RF(Z)	BIT15	NO!
	CM	STKEND+WRK3	CLEAR 
	LD	A2,STKEND+BRDTAB	GET ADDRESS TO BOARD CONF. TABLE 
	ST	A2,INTLT1,A1	SAVE 
BIT15	EQU	* 
	ADK	A1,2 
	ST	A1,STKEND+WRK2	STORE NEW INDEX
	ADKL	A9,1
	ST	A9,STKEND+WRK1	STORE
	ADKL	A9,7	NEXT BOARD 
	CWK	A9,31	LAST BOARD?
	RF(G)	B:ITRT	YES!
	RB	BIT10 
	XIF
	EJECT
* 
*	BUILD REAL-TIME INTERRUPT TABLES FOR RT 
* 
B:ITRT	EQU	*
	IFF	SUMR=0 
	LDKL	A8,1	CONNECTION TYPE = RT 
	LDKL	A9,3	1:ST BOARD 
	LDK	A1,8	MAX.LENGTH OF BOARD CONF. TABLE 
	ST	A1,STKEND+WRK4	SAVE 
	CM	STKEND+WRK1	CLEAR 
	CM	STKEND+WRK2	CLEAR 
	CM	STKEND+WRK3	CLEAR 
BRT10	EQU	* 
	CALL	B:BTAB
	CALL	B:LTAB
	LD	A1,STKEND+WRK2	GET INDEX IN MONTAB
	LD	A2,STKEND+WRK3	ANY LINES? 
	RF(Z)	BRT15	NO!
	CM	STKEND+WRK3	CLEAR 
	LD	A2,STKEND+BRDTAB	GET ADDRESS TO BOARD CONF. TABLE 
	ST	A2,INTRT1,A1	SAVE 
BRT15	EQU	* 
	ADK	A1,2 
	ST	A1,STKEND+WRK2	STORE NEW INDEX
	ADKL	A9,1
	ST	A9,STKEND+WRK1	STORE
	ADKL	A9,3	NEXT BOARD 
	CWK	A9,15	LAST BOARD?
	RF(G)	B:ITPC	YES!
	RB	BRT10 
	XIF
	EJECT
* 
*	BUILD REAL-TIME INTERRUPT TABLES FOR PLC
* 
B:ITPC	EQU	*
	IFF	PLCL=0 
	LDKL	A8,5	CONNECTION TYPE = PLC
	LDKL	A9,32	1:ST BOARD
	LDK	A1,66	MAX LENGHT OF BOARD CONF.TABLE	=2
	ST	A1,STKEND+WRK4
	LDK	A1,1		=2 
	ST	A1,STKEND+WRK1		=2
	CM	STKEND+WRK2	CLEAR 
	CM	STKEND+WRK3	CLEAR 
BPC10	EQU	* 
	CALL	B:BTAB
	CALL	B:LTAB
	LD	A1,STKEND+WRK2	GET INDEX IN MONTAB
	LD	A2,STKEND+WRK3	ANY LINES? 
	RF(Z)	BPC15	NO!
	CM	STKEND+WRK3 
	LD	A2,STKEND+BRDTAB	GET ADDRESS TO BOARD CONFIGURATION TABLE 
	ST	A2,INTPL1,A1	SAVE 
BPC15	EQU	* 
	ADK	A1,2 
	ST	A1,STKEND+WRK2	STORE NEW INDEX
	ADKL	A9,1
	ST	A9,STKEND+WRK1
	ADKL	A9,31	NEXT BOARD
	CWK	A9,128	LAST BOARD? 
	RF(G)	B:ITVU	YES!
	RB	BPC10 
	XIF
	EJECT

* 
*	BUILD REAL-TIME INTERRUPT TABLES FOR VCCU1/4
* 
B:ITVU	EQU	*
	IFF	VIDEO=0
	LDKL	A8,7	CONNECTION TYPE = VCCU1/4
	LDKL	A9,3	1:ST BOARD 
	LDK	A1,8	MAX.LENGTH OF BOARD CONF. TABLE 
	ST	A1,STKEND+WRK4	SAVE 
	CM	STKEND+WRK1	CLEAR 
	CM	STKEND+WRK2	CLEAR 
	CM	STKEND+WRK3	CLEAR 
BVU10	EQU	* 
	CALL	B:BTAB
	CALL	B:LTAB
	LD	A1,STKEND+WRK2	GET INDEX IN MONTAB
	LD	A2,STKEND+WRK3	ANY LINES? 
	RF(Z)	BVU15	NO!
	CM	STKEND+WRK3	CLEAR 
	LD	A2,STKEND+BRDTAB	GET ADDRESS TO BOARD CONF. TABLE 
	ST	A2,INTVU1,A1	SAVE 
BVU15	EQU	* 
	ADK	A1,2 
	ST	A1,STKEND+WRK2	STORE NEW INDEX
	ADKL	A9,1
	ST	A9,STKEND+WRK1	STORE
	ADKL	A9,3	NEXT BOARD 
	CWK	A9,31	LAST BOARD?
	RF(G)	B:ITSZ	YES!
	RB	BVU10 
	XIF

	EJECT
* 
*	BUILD REAL-TIME INTERRUPT TABLES FOR SALCUZ 
* 
B:ITSZ	EQU	*
	IFF	SALCUZ=0 
	LDKL	A8,2	CONNECTION TYPE = SALCUZ 
	LDKL	A9,0	1:ST BOARD 
	LDK	A1,2	MAX. LENGTH OF BOARD CONF.TABLE 
	ST	A1,STKEND+WRK4
	CM	STKEND+WRK1	CLEAR 
	CM	STKEND+WRK2	CLEAR 
	CM	STKEND+WRK3	CLEAR 
BSZ10	EQU	* 
	CALL	B:BTAB
	CALL	B:LTAB
	LD	A1,STKEND+WRK2	GET INDEX IN MONTAB
	LD	A2,STKEND+WRK3	ANY LINES? 
	RF(Z)	BSZ15
	CM	STKEND+WRK3 
	LD	A2,STKEND+BRDTAB	GET ADDRESS TO BOARD CONF. TABLE 
	ST	A2,INTSL1,A1	SAVE 
BSZ15	EQU	* 
	ADK	A1,2 
	ST	A1,STKEND+WRK2	STORE NEW INDEX
	ADKL	A9,1
	ST	A9,STKEND+WRK1
	CWK	A9,7	LAST BOARD? 
	RF(G)	B:ITAZ	YES!
	RB	BSZ10 
	XIF
	EJECT
* 
*	BUILD REAL-TIME INTERRUPT TABLES FOR ASCU4Z 
* 
B:ITAZ	EQU	*
	IFF	ASCU4Z=0 
	LDKL	A8,3	CONNECTION TYPE = ASCU4Z 
	LDKL	A9,3	1:ST BOARD 
	LDK	A1,8	MAX. LENGTH OF BOARD CONF.TABLE 
	ST	A1,STKEND+WRK4
	CM	STKEND+WRK1	CLEAR 
	CM	STKEND+WRK2	CLEAR 
	CM	STKEND+WRK3	CLEAR 
BAZ10	EQU	* 
	CALL	B:BTAB
	CALL	B:LTAB
	LD	A1,STKEND+WRK2	GET INDEX IN MONTAB
	LD	A2,STKEND+WRK3	ANY LINES
	RF(Z)	BAZ15
	CM	STKEND+WRK3 
	LD	A2,STKEND+BRDTAB	GET ADDRESS TO BOARD CONFIGURATION TABLE 
	ST	A2,INTAS1,A1	SAVE 
BAZ15	EQU	* 
	ADK	A1,2 
	ST	A1,STKEND+WRK2	STORE NEW INDEX
	ADKL	A9,1
	ST	A9,STKEND+WRK1
	ADKL	A9,3	NEXT BOARD 
	CWK	A9,31	LAST BOARD?
	RF(G)	BAZ20	YES! 
	RB	BAZ10 
BAZ20	EQU	* 
	XIF
	RTN	A14
	EJECT

Full view