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

⟦b7ae84c73⟧

    Length: 83808 (0x14760)
    Notes: pts_type(SC)
    Names: »SYSLDM.SC«

Derivation

└─⟦726a6c4ca⟧ Bits:30009685 Philips computer tape "600309"
    └─⟦this⟧ »M:PTB/SYSLDM.SC« 

PTS(SC)

	IDENT SYSLDM 	REL 9.2 79-12-20  870105040920 

			=1,FAULTY LENGTH OF TEMPORARY BUFFER,USED BY XMOVE 
			REL 9.2 79-12-20 ST
	ENTRY	SYSLDM 
*************************** 
*                         * 
*  ENTRIES AND EXTERNALS  * 
*                         * 
*************************** 
	EXTRN	FREQUE 
	EXTRN	INTLT1 
	EXTRN	REL
	EXTRN	SCLASS 
	EXTRN	SCTADA 
	EXTRN	SCTANO 
	EXTRN	SCTBLK 
	EXTRN	SCTBUG 
	EXTRN	SCTCDT 
	EXTRN	SCTDCT 
	EXTRN	SCTDMC 
	EXTRN	SCTDMI 
	EXTRN	SCTDML 
	EXTRN	SCTDMT 
	EXTRN	SCTEFA 
	EXTRN	SCTLAC 
	EXTRN	SCTLAP 
	EXTRN	SCTNOP 
	EXTRN	SCTNOS 
	EXTRN	SCTOPT 
	EXTRN	SCTPAG 
	EXTRN	SCTPLD 
	EXTRN	STTPSZ 
	EXTRN	SCTPSZ 
	EXTRN	SCTSEG 
	EXTRN	SCTSFA 
	EXTRN	SCTSWB 
	EXTRN	SCTTCT 
	EXTRN	SYSBAS 
	EXTRN	SYSLOD 
	EXTRN	TCLASS 
	EXTRN	TTMJOB 
	EXTRN	DWTECH 
	EXTRN	DWTSQ
	EJECT
	EXTRN	M:REL
	EXTRN	ERROR
	EXTRN	MOVE 
	EXTRN	CMPADR 
	EXTRN	CONVRT 
	EXTRN	NXTBLK 
	EXTRN	SYSLDA 
	EXTRN	SAVE01 
	EXTRN	SAVE02 
	EXTRN	SAVE03 
	EXTRN	SAVE04 
	EXTRN	SAVE05 
	EXTRN	SAVE06 
	EXTRN	SAVE07 
	EXTRN	SAVE08 
	EXTRN	SAVE09 
	EXTRN	SAVE10 
	EXTRN	SAVE11 
	EXTRN	SAVE12 
	EXTRN	SAVE13 
	EXTRN	SAVE14 
	EXTRN	SAVE15 
	EXTRN	SAVE16 
	EXTRN	SAVE17 
	EXTRN	SAVE18 
	EXTRN	SAVE19 
	EXTRN	SAVE20 
	EXTRN	SAVE21 
	EXTRN	NUMSEG 
	EXTRN	SAVE23 
	EXTRN	SAVE24 
	EXTRN	SAVE25 
	EXTRN	BUFSIZ 
	EXTRN	SYSBUF 
	EXTRN	PRGLG1 
	EJECT
* 
*  EXTERNAL SUBROUTINES 
* 
	EXTRN	NXTCOM 
	EXTRN	GETNUM 
	EJECT


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

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

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

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

DWT15	EQU	* 
	RF(Z)	DWT17	LINE ENTRY FOUND 
	ADK	A4,28	NEXT LINE
	SUK	A3,1	DECREMENT LINE PARAMETER
	RB	DWT15 
	EJECT
DWT17	EQU	* 
	ST	A4,SAVE07,A13	SAVE INTERRUPT TABLE LINE ENTRY 
* 
*  GET DEVICE ADDRESS:
*  USE DEVICE ADDRESSES 1-7 FOR INPUT DEVICE
*  OR DEVICE WITHOUT DATA REQUEST 
*  USE DEVICE ADDRESSES 8-14 FOR OUTPUT DEVICES 
* 
	LDR*	A6,A1	GET FIRST WORD OF PROTOTYPE DWT 
	LDR	A2,A6	SAVE 
	ANKL	A6,/7100	GET DEVICE ADDRESS AND DEVICE TYPE BIT 
	SLC	A6,7	CHECK IF INPUT DEVICE 
	RF(N)	DWT20	YES! 
* 
*  NOT INPUT DEVICE - CHECK IF DEVICE WITH DATA REQUEST 
* 
	ANKL	A2,/8000	DATA REQUEST BIT SET?
	RF(Z)	DWT20	NO!
	SRL	A6,2 
	ADK	A6,12
	RF	DWT30 
DWT20	EQU	* 
	SRL	A6,2 
	SUK	A6,2 
DWT30	EQU	* 
	ANK	A6,/1E 
* 
*  CHECK IF DWT ALREADY GENERATED ON THIS LINE
* 
	ADR	A6,A4	TABLE ENTRY
	LDR*	A2,A6	DWT ALREADY GENERATED?
	RF(Z)	DWT32	NO!
	LD	A5,DWTECB,A1	CHECK IF ECHO
	RF(Z)	DWT70	NO!
	ST	A2,DWTECH,A5	STORE REAL ECHODEVICE-DWTADDRESS 
	CM	DWTECB,A1	RESET POINTER TO INPUT-DWT
	RF	DWT70 
	EJECT
* 
*  CHECK IF DWT IN DRIVER 
* 
DWT32	LDKL	A2,SYSLOD
	TNM	A1,A2
	RF(NN)	DWT34 
	CWR	A1,A2
	RF	DWT36 
DWT34	CWR	A2,A1 
DWT36	RF(L)	DWT38 
	STR	A1,A6
	LDR	A2,A1	DWT IN DRIVER
	RF	DWT70 
DWT38	EQU	* 
	STR	A12,A6	SAVE DWT-ADDRESS
* 
*  COPY DEVICE TYPE DWT 
* 
	LDR	A2,A12	TO-ADDRESS
	LD	A3,DWTOR,A1	LENGTH
	ADR	A12,A3	NEXT FREE ENTRY 
	CALL	MOVE
	EJECT
* 
*  A1 - ADDRESS TO PROTOTYPE DWT
*  A2 - ADDRESS TO REAL DWT 
* 
	STR	A5,A2	STORE CHANNEL PARAMETER
* 
*  CHECK IF INPUT DEVICE
* 
	LDR*	A3,A1	GET FIRST WORD OF TYPE DWT
	ANKL	A3,/0100	INPUT DEVICE?
	RF(Z)	DWT50	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 DWT IN THIRD WORD
*  OF PROTOTYPE DWT OF OUTPUT ECHO DEVICE 
* 
	LD	A5,DWTECH,A1	ECHO?
	RF(Z)	DWT40	NO 
	AD	A5,M:REL,A13	RELOCATE ECHO DEVICE DWT-ADDRESS 
	ST	A2,4,A5	SAVE INPUT DWT-ADDRESS
	EJECT
DWT40	EQU	* 
* 
*  RELOCATE POINTERS TO CIRCULAR INPUT BUFFER 
* 
	LDR	A5,A2	GET DWT-ADDRESS
	ADKL	A5,DWTSQ	DISPLACEMENT TO START OF BUFFER
	ST	A5,DWTSQ-4,A2	STORE POINTER 
	ST	A5,DWTSQ-2,A2	STORE POINTER 
* 
*  IF DOUBLE KEYBOARD:
*  ADD 1 TO DWT-ADDRESS AND SAVE IT IN TEMPORARY INTERRUPT TABLE
*  IN ENTRY CORRESPONDING TO SECOND DEVICE ADDRESS
* 
	LDR*	A3,A1	GET FIRST WORD OF TYPE DWT
	ANK	A3,/F	GET FOUR RIGHTMOST BITS
	RF(Z)	DWT60	NOT DOUBLE KEYBOARD
	LDR	A5,A2	GET REAL DWT-ADDRESS 
	ADK	A5,1	ADD ONE 
	SUK	A3,1	DISPLACEMENT=0 IF DEVICE ADDRESS=1
	ADR	A3,A3	BYTE DISPLACEMENT
	AD	A3,SAVE07,A13	ENTRY IN INTERRUPT TABLE
	STR	A5,A3	STORE DEVICE-ADDRESS 
	RF	DWT60 
	EJECT
DWT50	EQU	* 
* 
*  OUTPUT DEVICE
*  IF ECHO OUTPUT DEVICE: 
*  GET CORRESPONDING INPUT DWT-ADDRESS FROM THIRD WORD
*  IN THE DWT.
*  SAVE ADDRESS OF THIS DWT IN WORD 18 OF INPUT DWT 
*  AND CLEAR WORD 3 OF THIS DWT.
* 
	LD	A5,DWTECB,A2	GET THIRD WORD IN REAL DWT 
	RF(Z)	DWT60	NOT ECHO OUTPUT DEVICE 
	ST	A2,DWTECH,A5	STORE DWT-ADDRESS OF REAL OUTPUT DWT 
	CM	DWTECB,A2	CLEAR THIRD WORD OF THIS DWT
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 LENGTH EVEN 
	EJECT
* 
*  CHECK IF INTERNAL BUFFER SIZE IS GREATER THAN
*  THE SIZE OF BUFFER RESERVED FOR SYSLOD PART A. 
*  IF YES,THAN STORE THE ADDRESS AND SIZE OF THE
*  INTERNAL BUFFER IN SYSBUF AND BUFSIZ.
* 
	CW	A3,BUFSIZ,A13		 
	RF(NG)	DWT65 
	ST	A3,BUFSIZ,A13 
	ST	A12,SYSBUF,A13
DWT65	EQU	* 
	ADR	A12,A3	NEXT FREE ENTRY 
	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,DWT10	START OF LOOP
	AD	A1,M:REL,A13	RELOCATE START OF LOOP 
	ABR	A1 
DWTEX	EQU	* 
	RTN	A14	RETURN 
	EJECT
************************************* 
*  I:CHP - INIT CHANNEL PARAMETER   * 
************************************* 
* 
*  REFERENCED IN: DWTGEN
* 
*  ENTRY:  A1 - POINTER TO PROTOTYPE DWT
*          A2 - POINTER TO REAL DWT 
*          A6 - LINE CONNECTION NUMBER
*          A9 - POINTER TO TDC RECORD 
* 
*  EXIT:   A5 - CHANNEL PARAMETER 
*          SAVE05 - SELECTS INTERRUPT TABLE (INTLT1-INTRT4) 
*          SAVE06 - SELECTS LINE ENTRY (1-8)
* 
*  WORK REGISTERS:  A3,A4,A5
* 
*  SUBROUTINES: 
* 
	EJECT
I:CHP	EQU	* 
	LD	A6,SAVE08,A13	GET LINE CONNECTION NUMBER
	SUK	A6,1	MODIFY LINE CONNECTION NUMBER 
	LDR*	A5,A1	GET FIRST WOED OF PROTOTYPE DWT 
	ANKL	A5,/F1F0	CLEAR BITS TO MODIFY 
	LDR	A3,A6	GET MODIFIED LINE CONNECTION NUMBER
	LC	A4,TDC+5,A9	CHECK TYPE OF LINE
	CCK	A4,'LL'	LOCAL LINE?
	RF(NE)	I:CHPR	NO: REMOTE 
I:CHPL	EQU	*
	ANK	A3,7	GET BITS 13-15
	ST	A3,SAVE06,A13	SAVE
	SLL	A3,9	MOVE TO BITS 4-6
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	LDR	A3,A6	GET LINE CONNECTION NUMBER 
	ANK	A3,/18	GET BITS 11-12
	SRL	A3,2	MOVE TO BITS 13-14
	ST	A3,SAVE05,A13	SAVE
	SRL	A3,1	MOVE TO BITS 14-15
	ORR	A5,A3	MERGE WITH OLD CONTENTS
	RF	I:CHPE
	EJECT
I:CHPR	EQU	*
* 
*  REMOTE LINE
* 
	ANK	A3,3	GET BITS 14-15
	RF(NZ)	I:CH10
	ANKL	A5,/F1FF	CLEAR BITS 4-6 (= STORE ZERO)
	ST	A3,SAVE06,A13	SAVE ENTRY SELECTOR 
	RF	I:CH50
I:CH10	EQU	*
	ANK	A3,2	GET BIT 14
	RF(NZ)	I:CH20
	ORKL	A5,/0800	STORE 4 IN BITS 4-6
	LDK	A3,4	ENTRY SELECTOR
	ST	A3,SAVE06,A13	SAVE
	RF	I:CH50
I:CH20	EQU	*
	LDR	A3,A6	GET LINE CONNECTION
	ANK	A3,1	GET BIT 15
	RF(NZ)	I:CH30
	ORKL	A5,/0200	STORE 1 IN BITS 4-6
	LDK	A3,1	ENTRY SELECTOR
	ST	A3,SAVE06,A13	SAVE
	RF	I:CH50
I:CH30	EQU	*
	ORKL	A5,/0A00	STORE 5 IN BITS 4-6
	LDK	A3,5	ENTRY SELECTOR
	ST	A3,SAVE06,A13	SAVE
	EJECT
I:CH50	EQU	*
	LDR	A3,A6	GET LINE CONNECTION
	LDK	A4,4	INIT COUNTER
I:CH60	EQU	*
	SUK	A3,2	DECREMENT LINE CONNECTION NUMBER
	RF(N)	I:CH70 
	ADK	A4,1	INCREMENT TABLE SELECTOR
	RB	I:CH60
I:CH70	EQU	*
	ORR	A5,A4	STORE COMPUTED BITS 12-15
	SUK	A4,4 
	ANK	A4,6 
	ADK	A4,8 
	ST	A4,SAVE05,A13	SAVE
I:CHPE	EQU	*
	RTN	A14	RETURN 
	EJECT
**********************************************
*  B:ITAB - BUILD REAL-TIME INTERRUPT TABLE  *
**********************************************
* 
*  REFERENCED IN:  DWTGEN 
* 
*  ENTRY:  SCTSFA - START OF FREE AREA
* 
*  EXIT:  INTLT1-INTRT4 - REAL TIME INTERRUPT TABLES
* 
*  REGISTER USE:  A1 - WORK REGISTER
*                 A2 -      " 
*                 A3 -      " 
*                 A4 - LENGTH OF LINE SAVE01URATION TABLE 
*                 A5 - DEVICE COUNTER 
*                 A6 - LINE COUNTER 
*                 A7 - DISPLACEMENT IN SAVE21 
*                 A10- ADDRESS TO TEMPORARY INTERRUPT TABLE 
*                 A11- POINTER IN LINE CONF. PART OF REAL INT. TABLE
*                 A12- LINE ENTRY IN REAL INTERRUPT TABLE 
* 
*  SUBROUTINES
* 
	EJECT
B:ITAB	EQU	*
	LD	A12,SCTSFA	INIT POINTER TO FIRST R. I. T. 
	LDR	A11,A12
	LDK	A7,0	RESET POINTER IN IABAT
BIT10	EQU	* 
	LDK	A1,0 
	ST	A1,SAVE24,A13 
	ST	A12,SAVE21,A13	SAVE 
	ADKL	A11,16	INIT POINTER TO LINE CONF. TABLE 
* 
*  GET ADDRESS TO TEMPORARY INTERRUPT TABLE 
* 
	LD	A10,SCTSFA+2
	ADR	A10,A7 
	LDR*	A10,A10 
	LDK	A6,0	RESET LINE ENTRY POINTER
BIT20	EQU	* 
* 
*  SAVE POINTER TO START OF LINE SAVE01URATION TABLE
*  IN TEMPORARY AREA AND RESET LENGTH OF LINE SAVE01URATION TABLE 
* 
	ST	A11,SAVE23,A13	SAVE START OF LINE SAVE01URATION TABLE 
	LDK	A4,0	RESET LENGTH OF LINE CONF.TABLE 
* 
*  INIT POINTER IN TEMPORARY INTERRUPT TABLE
*  TO POINT AT LAST INPUT DEVICE ENTRY
* 
	ADKL	A10,12
	LDK	A5,7 
	ADKL	A11,14
	EJECT
* 
*  CHECK INPUT PART OF TEMPORARY INTERUPT TABLE STARTING
*  WITH THE LAST DEVICE ENTRY 
* 
BIT30	EQU	* 
	LDR*	A1,A10	OCCUPIED ENTRY?
	RF(NZ)	BIT40	YES 
BIT35	EQU	* 
	SUK	A5,1	NO; CHECK IF LAST DEVICE ENTRY
	RF(Z)	BIT50	YES
* 
*  NO ENTRIES IN THE INPUT DEVICE PART OF THE TEMPORARY 
*  INTERRUPT TABLE HAS BEEN OCCUPIED SO FAR 
* 
	SUKL	A10,2	NEXT ENTRY IN TEMP. INT. TABLE
	SUKL	A11,2	NEXT ENTRY IN REAL INT. TABLE 
	RB	BIT30 
* 
*  AN OCCUPIED ENTRY IN THE TEMPORARY INTERRUPT TABLE HAS OCURRED.
*  COPY THE CONTENTS OF THE INPUT DEVICE PART (INCLUDING ZEROES)
*  OF THE TEMPORARY INTERRUPT TABLE UP TO AND INCLUDING THIS ENTRY. 
* 
BIT40	EQU	* 
	STR	A1,A11	STORE CONTENT IN R. I. T. 
	ADK	A4,2	INCREMENT LENGTH
	SUK	A5,1	LAS DEVICE ENTRY? 
	RF(Z)	BIT50	YES
	SUKL	A10,2	NEXT ENTRY IN T.I.T.
	SUKL	A11,2	NEXT ENTRY IN R.I.T.
	LDR*	A1,A10	GET CONTENT OF NEXT ENTRY
	RB	BIT40 
	EJECT
BIT50	EQU	* 
* 
*  ALL ENTRIES OF THE INPUT DEVICE PART IN TEMPORARY INTERRUPT
*  TABLE HAS BEEN SCANNED.
*  -INIT POINTER TO FIRST ENTRY IN OUTPUT DEVICE PART 
*   OF THE TEMPORARY INTERRUPT TABLE. 
*  -INIT DEVICE COUNTER.
* 
	ADKL	A10,14
	LDK	A5,7 
* 
*  SCAN ENTRIES IN OUTPUT DEVICE PART OF THE TEMPORARY INTERRUPT TABLE. 
*  -IF AN OCCUPIED ENTRY OCCUR: 
*  FIND FIRST UNOCCUPIED ENTRY (CONTENT=ZERO) IN THE LINE SAVE01URATION 
*  TABLE OF THE REAL INTERRUPT TABLE AND STORE CONTENT IN THIS ENTRY. 
*  -IF THIS EXTENDS THE LINE SAVE01URATION TABLE: 
*  INCREMENT LENGTH 
* 
BIT70	EQU	* 
	LDR*	A1,A10	OCCUPIED ENTRY?
	RF(NZ)	BIT90	YES 
	SUK	A5,1	LAST ENTRY
	RF(Z)	BIT120	YES 
BIT80	EQU	* 
	ADKL	A10,2	NEXT ENTRY
	RB	BIT70 
BIT90	EQU	* 
* 
*  AN OCCUPIED ENTRY IN OUPUT DEVICE PART OF THE TEMPORARU INTERRUPT TAB
*  HAS OCURRED. FIND FIRST UNOCCUPIED ENTRY IN LINE SAVE01URATION TABLE 
*  OF REAL INTERRUPT TABLE. 
* 
	LDR*	A2,A11
	RF(Z)	BIT100 
	ADKL	A11,2 
	RB	BIT90 
	EJECT
BIT100	EQU	*
* 
*  AN UNOCCUPIED ENTRY HAS BEEN FOUND IN LINE SAVE01URATION TABLE.
*  -STORE THE CONTENT IN THIS ENTRY.
*  -UPDATE LENGTH IF TABLE WAS EXTENDED.
* 
	STR	A1,A11	STORE CONTENT 
	LD	A1,SAVE23,A13	GET START OF L.C.T. 
	LDR	A3,A11	GET CURRENT ENTRY 
	SUR	A3,A1	COMPUTE LENGTH 
	CWR	A3,A4	L.C.T. EXTENDED? 
	RF(NG)	BIT110
	LDR	A4,A3	SAVE NEW LENGTH
BIT110	EQU	*
	SUK	A5,1	LAST ENTRY? 
	RB(P)	BIT80	NO 
BIT120	EQU	*
* 
*  ALL ENTRIES OF THIS LINE IN TEMPORARY INTERRUPT TABLE HAS BEEN SCANNE
*  -IF ANY ENTRY WAS OCCUPIED (LENGTH>0): STORE POINTER TO LINE 
*   SAVE01URATION TABLE IN THIS LINE ENTRY AND STORE LENGTH IN FIRST WOR
* 
	LDR	A4,A4	ANY ENTRY OCCUPIED?
	RF(Z)	BIT130	NO
	IM	SAVE24,A13	INDICATE DEVICE PRESENT! 
	LD	A1,SAVE23,A13	GET POINTER TO L.C.T. 
	STR	A1,A12	STORE IN LINE ENTRY 
	STR	A4,A1	STORE LENGTH IN FIRST WORD OF L.C.T. 
	LDR	A11,A1	START OF L.C.T. 
	ADR	A11,A4	LAST OCCUPIED ENTRY IN L.C.T. 
	ADKL	A11,2	NEXT FREE ENTRY 
	RF	BIT140
	EJECT
BIT130	EQU	*
* 
*  NO DEVICES ON THIS LINE. 
*  -NO LINE SAVE01URATION TABLE GENERATED 
*  -SKIP LENGTH WORD
*  -LINE ENTRY CONTAIN ZERO 
* 
	SUKL	A11,2	SKIP LENGTH WORD
BIT140	EQU	*
	ADKL	A10,2	NEXT ENTRY IN T.I.T.
	ADK	A6,1	INCREMENT LINE COUNTER
	CWK	A6,8	ALL LINES SCANNED?
	RF(E)	BIT150	YES 
	ADKL	A12,2	NEXT LINE ENTRY 
	RB	BIT20 
BIT150	EQU	*
* 
*  STORE ADDRESS TO THIS INTERRUPT TABLE IN MONTAB
*  IF ANY DEVICE PRESENT ON ANY LINE
* 
	LD	A1,SAVE24,A13	ANY DEVICE PRESENT? 
	RF(Z)	BIT155	NO! 
	LD	A1,SAVE21,A13	GET INTERRUPT TABLE ADDRESS 
	ST	A1,INTLT1,A7	SAVE 
	RF	BIT158
BIT155	EQU	*
	LD	A11,SAVE21,A13	GET START OF FREE AREA 
BIT158	EQU	*
* 
*  ALL LINES OF THIS INTERRUPT TABLE HAS BEEN SCANNED.
*  -CHECK IF ALL INTERRUPT TABLES (INTLT1-INTRT4) HAS BEEN GENERATED
* 
	ADK	A7,2	NEXT ENTRY IN ITAB
	CWK	A7,16	LAST ENTRY?
	RF(E)	BIT160	YES 
	LDR	A12,A11	GET NEXT FREE ENTRY
	RB	BIT10 
BIT160	EQU	*
* 
*  ALL ENTRIES IN THE TEMPORARY INTERRUPT TABLE HAS BEEN SCANNED
*  AND ALL THE REAL INTERRUPT TABLES HAS BEEN GENERATED.
*  POINTERS TO THE REAL INTERRUPT TABLES HAS BEEN INSERTED IN MOXTAB. 
* 
	LD	A2,SCTSFA 
	SUK	A2,2 
BIT165	ADK	A2,2 
	CW	A2,SCTEFA	CHECK IF MEMORY OVERFLOW
	RF(NE)	BIT170
	LDKL	A1,LMP3 
	CALL	ERROR	INDICATE MEMORY OVERFLOW
BIT170	CWR	A2,A11 
	RB(NE)	BIT165
	ST	A13,SCTEFA	SKIP TEMP. INT. TABLE
	ST	A11,SCTSFA	UPDATE START OF FREE AREA
	RTN	A14	RETURN 
	EJECT

Full view