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

⟦7c6c56ade⟧

    Length: 61982 (0xf21e)
    Notes: pts_type(SC)
    Names: »SYSINI.SC«

Derivation

└─⟦7a1dcd5a9⟧ Bits:30009673 Philips computer tape "600134"
    └─⟦this⟧ »PTMON/SYSINI.SC« 
└─⟦928b1fd3e⟧ Bits:30009671 Philips computer tape "600131"
    └─⟦this⟧ »PTMON/SYSINI.SC« 

PTS(SC)

	IDENT SYSINI 	REL 11.0 81-01-26 870105041100 

			=2,WHEN MMUPAG=0 INITIATE PAGE ADDRESS 
			   IN PAGTAB WITH RIGHT VALUE
			   PRR 11.0 80-12-03 
			=1,CREATE PAGES FOR APPLICATIONS WITH
			   DIFFERENT SEGMENT SIZES 
			   PRR 11.0 80-11-20 
				
				
	EJECT
				
*************************** 
*                         * 
*  ENTRIES AND EXTERNALS  * 
*                         * 
*************************** 
			 
* LABEL ENTRIES 
	ENTRY	SYSINI 
	ENTRY	INILEN	PROGRAM LENGTH
	ENTRY	INIEND	END OF SYSINI 
	ENTRY	REL

* SUBROUTINE ENTRIES
	ENTRY	MOVE 
	ENTRY	ERROR
	ENTRY	CMPADR	COMPARE ADDRESSES 
	ENTRY	NXTBLK	SKIP TO NEXT CONFIGURATION BLOCK
	ENTRY	NXTCOM	SKIP COMMONDEVICE DEFINITION BLOCK
	ENTRY	CONVRT	CONVERSION ASCII-BINARY 
	ENTRY	GETNUM	CONVERT 3 ASCII-DIGITS TO BINARY
	ENTRY	MULT	MULTIPLICATION ROUTINE
	ENTRY	XMOVE	MOVE BLOCKS INSIDE MEMORY VIA MMU
	ENTRY	MOVING 
	ENTRY	MOVMMT	MOVE MM-TABLE 
	ENTRY	MMRST	RESET MM-TAB ENTRIES 
	ENTRY	GETTAB	FIND TTAB-ADDRESS 
	ENTRY	GETTTB	FIND TTAB-ADDRESS 
	ENTRY	MMENT	FIND LAST USED ENTRY IN MM-TAB 
	ENTRY	PUSH	STORE REGISTERS ON A15-STACK
	ENTRY	POB	RESTORE REGISTERS FROM A15-STACK 
	ENTRY	GETAPP	
	ENTRY	SETTAB 
	ENTRY	INBIMA 
	ENTRY	QUEJOB	QUEUE TASK
	EJECT

* SAVE AND WORK AREA ENTRIES
	ENTRY	MMTAB	WORK-TABLE 1 (MMU
	ENTRY	TABBE	ABSOLUTE START ADDRESS OF WORK-TAB 1 
	ENTRY	MMEND	ABSOLUTE END ADDRESS OF WORK-TAB 1 
	ENTRY	MMDDIV	WORK-TABLE 2 (MM) RELATIVE 'REL'
	ENTRY	MMBEG	 
	ENTRY	LSTPAG	DISPL. TO 'ENTRY POINTER' 
	ENTRY	PSW
	EJECT

* SYSTEM CONTROL TABLE EXTERNALS
	EXTRN	SCTSFA	START OF FREE AREA
	EXTRN	SCTLAC	LOGICALL ADDRESS TO COMMON PART 
	EXTRN	SCTTCT	TC:TAB ADDRESS
	EXTRN	SCTSTB	A15 STACK-BASE
	EXTRN	SCTEFA	END OF FREE AREA
	EXTRN	SCTNOP	NUMBER OF PAGES 
	EXTRN	SCTPSZ	PAGE SIZE 
	EXTRN	SCTMMC		=00002 
	EXTRN	SCTOPT	SYSTEM OPTION 
	EXTRN	SCTPAG	PAGE TABLE ADDRESS
	EXTRN	SCTSWB	ADDRESS TO SWB CONTROL BLOCK TABLE
	EXTRN	SCTBUG	BUGGER ADDRESS
	EXTRN	STKEND	START OF SCRATCH-PAD AREA 
	EXTRN	STKCOM	START OF COMMON-PAD AREA

* EXTERNAL LABELS 
	EXTRN	PAGQUE	PAGE QUEUE POINTER

* EXTERNAL SUBROUTINES
	EXTRN	ACTOT	QUEUE TASK 
	EXTRN	PFINIT 
	EXTRN	SAVE8	SAVE 8 REGS
	EXTRN	RETUR8	RELOAD 8 REGS 
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	SWL48	SWITCH TO LEVEL 48 

* 
	EXTRN	TTB:SA	START OF SAVE AREA IN TTAB
	EXTRN	TTB:CB	DISPL. TO CURRENT SEGMENT BASE ADDRESS
	EXTRN	TTB:MT	DISPL. TO 1:ST MMU-TABLE ENTRY IN TTAB
	EXTRN	TTB:SP	DISPL TO SEGMENT TABLE ADDRESS
	EXTRN	SEG:NS	NUMBER OF SEGMENTS IN SEGTAB
	EXTRN	TTB:AM	DISPL. TO ALLOCATION BIT MAP
	EJECT


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

DSKPAG	EQU	0	0 = NO DISC PAGING 
MMUPAG	EQU	1	0 = NO MMU 
CPU852	EQU	0	0 = NOT 852 CPU
********************************************* 
*                                           * 
*    APCTAB DISPLACEMENTS                   * 
*    ====================                   * 
*                                           * 
********************************************* 


APLADA	EQU	22	APPL. REL. BASE (2 WORDS)	=1
APLREL	EQU	18	NUMBER OF RESIDENT SEGMENTS 
APLIOE	EQU	0	APPLICATION RESTART ADDRESS
APLDAD	EQU	0	APPLICATION FILE DISC ADDR. (BIT 0-15) 
APLLAC	EQU	14	APPLICATION LOAD ADDR. (LOGICAL ADDR.)
APLLAP	EQU	12	LOGICAL PAGE ADDRESS
APLLDA	EQU	0	APPLICATION LOAD ADDR. (PHYSICAL ADDR.)
APLMMC	EQU	10	APPLICATION 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	APPLICATION SWB
APLSTA	EQU	16	APPL. PGM START ADDRESS 
APLTYP	EQU	8	APPLICATION TYPE 
APLPSZ	EQU	20	APPLICATION SEGMENT SIZE	=1 
	EJECT
***************************************** 
*                                       * 
*  COMMON DISPLACEMENTS AND CONSTANTS   * 
*                                       * 
***************************************** 

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 
DYNSTA	EQU	52	START OF DYNTAB:S 
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 
SWBFSE	EQU	8	SWB-FILE END ADDRESS 
TTAB	EQU	32	WORK AREA FOR MMU TABLE 
TOTSGM	EQU	46	TOTAL NUMBER OF SEGMENTS
SWBFLG	EQU	48	SWAPPABLE WORK BLOCK FLAG 
COM01	EQU	40	COMMON WORK AREA 1 
COM02	EQU	42	COMMON WORK AREA 2 
COM03	EQU	44	COMMON WORK AREA 3 
COM04	EQU	50	COMMON WORK AREA 4 
DCBLK	EQU	54	START OF DC CONF DATA
	EJECT
******************************* 
*  SCRATCH-PAD DISPLACEMENTS  * 
******************************* 
* 
APCBLK	EQU	0	START OF APPL. CONTROL BLOCK 
	EJECT
				
		***************** 
		***************** 
		**             ** 
		**  CONSTANTS  ** 
		***************** 
		**             ** 
		***************** 
				
**********
* P:MTAB *
**********
T:ATAB	EQU	0
U:BTAB	EQU	2
P:BAS	EQU	6	SEGMENT BASE
T:AID	EQU	32	ADDRESS TO 'TABLE OF T:A TID'
S:BTAB	EQU	40	DISP TO S:BTAB ADDRESS
	EJECT
				
				
				
******************************* 
* CONFIGURATION FILE (CONFIG) * 
******************************* 
			 
* 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
	EJECT
				
				
********* 
*  T:A  * 
********* 
T:ASTA	EQU	-14	T:A START
CSE	EQU	-14	CURRENT SEGMENT END (HERE: STACKSIZE) 
CSB	EQU	-12	CURRENT SEGMENT BASE
CSN	EQU	-10	CURRENT SEGMENT NUMBER (HERE LENGTH 
			                        OF ALL DSCB-RECORDS
T:DAD	EQU	-8	ADDRESS TO T:D 
CIA	EQU	-6	CURRENT INSTUCTION ADDRESS 
			(HERE: DISPLACEMENT TO T:A-START)
			 
T:ATID	EQU	-4	TASK ID 
STKE	EQU	-2	STACK END 
PA	EQU	0	STACK POINTER
STKB	EQU	2	STACK BASE 
WATFST	EQU	4	FIRST WAT-ELEMENT
* 
* DSCB-RECORD:
DSCBL	EQU	20	RECORD LENGTH
BL	EQU	2	LENGTH OF FIX BUFFER 
SB	EQU	4	INDEX TO DSCB WHICH SHARE THE BUFFER 
BP	EQU	18	BUFFER POINTER
	EJECT
				
				
********* 
*  T:D  * 
********* 
FCD	EQU	0	DISPLACEMENT TO FCB IN T:A
T:DTID	EQU	2	TASK IDENTIFIER (PROTOTYPE)
DATLEN	EQU	4	NUMBER OF DATASETS (DSCB'S)
DATTAB	EQU	6	DISPLACEMENT TO BEGINNING OF DAT-TABLE 
WATLEN	EQU	8	NUMBER OF WATELEMENTS
TWBMSK	EQU	10	MASK FOR TWB'S (ONE BIT/ENTRY)
SWBMSK	EQU	12	MASK FOR SWB'S      -"- 
CWBMSK	EQU	14	MASK FOR CWB'S      -"- 
UWBMSK	EQU	16	MASK FOR UWB'S      -"- 
DWBFST	EQU	18	FIRST WORD IN DBLK-TAB

STPREC	EQU	4	RECORD LENGTH OF START-POINTS
				

****************
* SOP-HANDLING *
****************
SOP	EQU	/2E	DEVICE ADDRESS

		  LAMP CODE	MEANING 
		  ---------	------- 
LMP1	EQU	/400	SYSLOAD RUNS
LMP2	EQU	/200	READ ERROR
LMP3	EQU	/100	MEMORY OVERFLOW 
LMP4	EQU	/80	FORMAT ERROR (CONFIG)
LMP5	EQU	/40	TID ERROR
LMP6	EQU	/20	UWB OR SWB ERROR 
LMP7	EQU	/10	MM-TABLE OVERFLOW
LMP8	EQU	8
LMP9	EQU	4
LMP10	EQU	2 
LMP11	EQU	1 
	EJECT
******************************
*  CONSTANTS USED ONLY       *
*  WHEN COBOL APPLICATION    *
******************************

STKMAX	EQU	500	DEFAULT SPL STACK-SIZE 
ENTFIN	EQU	/FFFF	PROGRAMMER DEFINED ENTRY POINT 
SPLSTS	EQU	4	DIAGNOSTIC,STACK-SIZE
SPLSTB	EQU	52	STACK-BASE
SPLENT	EQU	54	ENTRY-FINI
SPLSTA	EQU	88	STACK-AREA


********************* 
*  OTHER CONSTANTS  * 
********************* 
			 
			 
WBLEN	EQU	-4	LENGTH OF WORK-BLOCK 
DTLEN	EQU	-2	LENGTH OF DESCRIPTOR-TABLE 
SWBLEN	EQU	4	DISP TO LENGTH OF SWB
			 
FCBDD1	EQU	8	DISP TO FIRST DSET 
FCBDD2	EQU	10	DISP TO 2:ND DSET 
			 
STKSZ	EQU	128	DEFAULT STACK-SIZE
			 
SEGREC	EQU	6	RECORD LENGTH IN S:GTAB
NUMSEG	EQU	10	DISPL. TO NUMBER OF SEGMENTS IN S:GTAB

TTBTID	EQU	2	TID IN TTAB
T:DSAV	EQU	0	SAVE FOR T:D-ADDRESS IN TTAB 
TTB:PP	EQU	6	SAVE AREA FOR TCL IN TTAB

NTPA	EQU	4	INTERPRETER START ADDRESS
IHRTC	EQU	4	RTC INTERRUPT ADDRESS 
RTCDA	EQU	/1B	RTC DEVICE ADDRESS
			 
TABLEN	EQU	20	LENGTH OF EACH APL.TABLE IN SCRATCH-PAD AREA
ACBLEN	EQU	26	APPL.CONTROL BLOCK LENGTH	=1
			 
***************************************************************** 
*  CALL-FORMAT, PERFORMS:  CFR      A14,A13                     * 
*                          DATA     [REL-ADDRESS]               * 
*                                                               * 
***************************************************************** 
			 
			 
			 
CALL	FORM	16=/F697,16 
	EJECT
	LDKL	A1,SYSINI 
	AD	A1,M:REL+STKCOM 
	ABR	A1	GO TO START OF SYSINI 
	EJECT
				
**************************************************
**************************************************
**                                              **
**  RELOCATION ROUTINE & STACK INITIALLISATION  **
**                                              **
**************************************************
**************************************************
			 
REL	RF	SUBBA	JUMP TO SUBROUTINE HANDLER 
	LDR	A13,P	GET BASE ADDRESS TO A13
	SUKL	A13,4 
* ADJUST FOR PSW-ROUTINE *
**************************
	LDK	A3,GETPSW	RELATIVE ADDRESS TO 'PSW-ADDRESS'
	ADR	A3,A13	ABSOLUT DITO
	ST	A3,PSW,A13	STORE ADDRESS TO 'GETPSW'-ROUTINE
* LOAD STACKBASE *
******************

	LDKL	A14,STACKB
	ADR	A14,A13	RELOCATE 
	RTN	A8 
				
				
* STACK * 
********* 
* 
	RES	20 
STACKB	EQU	*-REL-2
	EJECT
			 
				
* ADDRESS TO PSW-ROUTINE *
**************************
* 
PSW	EQU	*-REL 
	DATA	GETPSW
			 
****************************************************************
*                        G E T P S W                           *
* LITTLE SUBROUTINE TO PUT PSW IN STACK FOR CALLING SUBROUTINE *
****************************************************************
			 
GETPSW	EQU	*-REL
	STR	A2,A14	SAVE A2 ON A14-STACK
	LD	A2,2,A14	GET PSW FROM CALLING SUBROUTINE
	ST	A2,6,A14	REPLACE PSW FROM MAIN PROGRAM
	LDR*	A2,A14	RESTORE A2 
	RTN	A14
	EJECT

********************************* 
*                               * 
*  SUBROUTINE-HANDLER           * 
*                               * 
********************************* 

SUBSUB	EQU	*-REL
SUBBA	ST	A10,COM04+STKCOM	SAVE A10
	LD*	A10,4,A14	GET SUBROUTINE REL ADDRESS 
	IM	4,A14	ADJUST RETURN ADDRESS 
	IM	4,A14 
	AD	A10,M:REL+STKCOM	ADD FOR SYSLDM RELOCATION
	STR	A10,A14	PUT ON STACK 
	LD	A10,COM04+STKCOM	RESTORE A10
	ABR*	A14 



	EJECT

* MMU TABLES *


MMDDIV	EQU	*-REL	DDIV (& SYSLDA) MM-TABLE 
	IFT MMUPAG=1 
	RES	16 
	XIF

MMTAB	EQU	*-REL	WORK AREA MM-TAB
TABBE	EQU	* 
	IFT MMUPAG=1 
	DATA	0,0,0,0,0,0,0,0 
	DATA	0,0,0,0,0,0,0,0 
	XIF
MMEND	EQU	* 
	DATA	0	CURRENT SEGMENT BASE IN T:A 
TTPAG	DATA	0	LAST ENTRY (FROM BOTTOM) IN MM-TAB 
	DATA	0 
LSTPAG	EQU	TTPAG-*	DISPL. TO 'ENTRY-POINTER'
	DATA	0	APPL. CONTROL BLOCK ADDRESS 

MMBEG	EQU	TABBE-* 
	EJECT
				
***                                           *** 
***      S  U  B  R  O  U  T  I  N  E  S      *** 
***                                           *** 
************************************************* 
************************************************* 
				
				
**              E R R O R             **
**                                    **
**                                    **
**  ERROR HANDLING ROUTINE.           **
**                                    **
**  INPUT :A1=SOP-MESSAGE             **
**  OUTPUT:A2=RELATIVE CALLING ADDRESS**
**            (REG-CONTENTS IS SAVED) **
****************************************

ERROR	EQU	* 
	ST	A2,COM01+STKCOM	SAVE A2 
	LD	A2,4,A14	GET CALLING ABSOLUTE ADDRESS 
	SUR	A2,A13	RELATIVE DITO 
	OTR	A1,0,SOP 
	HLT
	DATA	/6300	(DEBUGGING PURPOS)
	EJECT

**          P U S H               **
**                                **
**                                **
**  STORE REGISTERS ON A15-STACK  **
**                                **
************************************
PUSH	EQU	*
	IFT	CPU852=1 
	STR	A1,A15	SAVE A1 
	STR	A2,A15	SAVE A2 
	STR	A3,A15	SAVE A3 
	STR	A4,A15	SAVE A4 
	STR	A5,A15	SAVE A5 
	STR	A6,A15	SAVE A6 
	STR	A7,A15	SAVE A7 
	STR	A8,A15	SAVE A8 
	STR	A9,A15	SAVE A9 
	STR	A10,A15	SAVE A10 
	STR	A11,A15	SAVE A11 
	STR	A12,A15	SAVE A12 
	STR	A13,A15	SAVE A13 
	STR	A14,A15	SAVE A14 
	XIF
	IFT	CPU852=0 
	MSR	14,A15	SAVE A1-A14 ON A15-STACK
	XIF
	RTN	A14
	EJECT

**            P O B 
**
**
**  RESTORE REGISTERS FROM A15-STACK  **
**                                    **
****************************************

POB	EQU	* 
	IFT	CPU852=1 
	LDR*	A14,A15	RESTORE A1
	LDR*	A13,A15	RESTORE A2
	LDR*	A12,A15	RESTORE A3
	LDR*	A11,A15	RESTORE A4
	LDR*	A10,A15	RESTORE A5
	LDR*	A9,A15	RESTORE A6 
	LDR*	A8,A15	RESTORE A7 
	LDR*	A7,A15	RESTORE A8 
	LDR*	A6,A15	RESTORE A9 
	LDR*	A5,A15	RESTORE A10
	LDR*	A4,A15	RESTORE A11
	LDR*	A3,A15	RESTORE A12
	LDR*	A2,A15	RESTORE A13
	LDR*	A1,A15	RESTORE A14
	XIF
	IFT	CPU852=0 
	MLR	14,A15	RESTORE A1-A14 FROM A15-STACK 
	XIF
	RTN	A14
	EJECT

**         M O V E             ** 
**                             ** 
**                             ** 
**  MOVE  BLOCKS INSIDE MEMORY ** 
**                             ** 
**  INPUT:A1=FROM-ADDRESS      ** 
**        A2=TO-ADDRESS        ** 
**        A3=LENGTH            ** 
** OUTPUT:A3=-1                ** 
**  WORK-REG: A4               ** 
********************************* 
			 
MOVE	EQU	*
MOVES	ADR	A1,A3	END OF FROM AREA
	ADR	A2,A3	END OF TO-AREA 
MOVE10	SUK	A3,1	DEC LENGTH
	RF(N)	MOVE20	ALL DONE
	SUK	A1,1 
	SUK	A2,1 
	LCR	A4,A1	GET CHARACTER
	SCR	A4,A2	STORE CHARACTER
	RB	MOVE10
MOVE20	RTN	A14
	IFT	MMUPAG=0 
	EJECT
				
				
**                M O V I N G                ** 
**                                           ** 
**                                           ** 
**  USES ROUTINE 'MOVE' ABOVE. TO-ADDRESS IS ** 
**  ASSUMED TO BE DATA-PART OF MEMORY        ** 
**  LSTADR POINTS AT LAST (HIGHEST) FREE     ** 
**  ADDRESS. LSTADR IS UPDATED AND CHECKED   ** 
**                                           ** 
**  INPUT:A3 & A1 AS IN 'MOVE'               ** 
**  OUTPUT: A2=TO-ADDRESS (LSTADR UPDATED)   ** 
**  WORK-REG: A4                             ** 
*********************************************** 
			 
MOVING	EQU	*
	CALL	PUSH	STORE REGISTERS ON A15-STACK 
	LD	A2,LSTADR+STKCOM	GET LAST ADDRESS 
	LDR	A9,A2
	LDR	A11,A3 
	CALL	CMPADR	ENOUGTH MEMORY LEFT? 
	RF(NL)	MOV010	NO!
	SUR	A2,A3	SUB LENGTH 
	ANKL	A2,/FFFE	MAKE EVEN ADDRESS
	LDR	A11,A2 
	LD	A9,DATEND+STKCOM	END OF PROTOTYP AREA 
	CALL	CMPADR	COMPARE ADDRESSES
	RF(NL)	MOV020
MOV010	LDKL	A1,LMP3	MEMORY OVERFLOW 
	CALL	ERROR 
MOV020	LD	A9,FSTADR+STKCOM	CHECK FIRST FREE ADDRESS 
	CALL	CMPADR
	RB(L)	MOV010 
	ST	A2,LSTADR+STKCOM	NEW ADDRESS
	CALL	POB	RESTORE REGISTERS FROM A15-STACK
	LD	A2,LSTADR+STKCOM
	RB	MOVES 
	XIF
	EJECT

**               X M O V E                    **
**                                            **
**                                            **
**  MOVE BLOCK INSIDE MEMORY VIA MMU          **
**  TWO PHASES:-MOVE TO SYSTEM AREA (BUFBEG)  **
**             -MOVE TO USER AREA             **
**  IF 'BUFSIZ' (TEMPORARY MOVE-BUFFER) IS NOT**
**  BIG ENOUGH THE MOVE IS REPEATED           **
**                                            **
**  INPUT :A1=FROM-ADDR(MMFROM=MM-TABLE ADDR.)**
**         A2=TO-ADDRESS (MMTO=MM-TABLE ADDR.)**
**         A3=LENGTH (IN BYTES)               **
**  WORK.REGS:A4,A10                          **
************************************************

XMOVE	EQU	* 
	IFT	MMUPAG=1 
	CALL	PUSH	STORE REGISTERS ON A15-STACK 
	ST	A1,COM01+STKCOM 
	ST	A2,COM02+STKCOM 
	ST	A3,COM03+STKCOM 
XMOV05	EQU	*
	LDR	A10,A3	SAVE LENGTH 
	LDK	A4,0	RESET 'NUMBER-OF-MOVE' COUNTER
	LDR	A11,A3	GET LENGTH OF AREA TO MOVE
	LD	A9,BUFSIZ+STKCOM	GET TEMPORARY BUFFER SIZE
	CALL	CMPADR	TEMPORARY BUFFER BIG ENOUGTH 
	RF(G)	SPLIT	NO! SEVERAL MOVE 
XMOV10	LDR	A3,A10	GET LENGTH
	LD	A1,COM01+STKCOM	GET FROM ADDRESS
	LD	A2,SYSBUF+STKCOM	GET TEMP. BUFFER START-ADDRESS 
	TL*	MMFROM+STKCOM	LOAD FROM-TABLE
	MVUS	A3	MOVE DATA-BLOCK TO TEMP. BUFFER
	ST	A1,COM01+STKCOM	SAVE END OF 'FROM' ADDRESS
	LD	A1,SYSBUF+STKCOM
	LD	A2,COM02+STKCOM	GET START OF 'TO' ADDRESS 
	LDR	A3,A10	GET LENGTH
	TL*	MMTO+STKCOM	LOAD TO-TABLE
	MVSU	A3	MOVE DATA-BLOCK FROM BUFFER
	SUK	A4,1	MORE PARTS TO MOVE? 
	RF(N)	XMOV30	NO! 
	ADR	A2,A10 
	ST	A2,COM02+STKCOM	SAVE START OF 'TO' ADDRESS
	LD	A3,COM03+STKCOM	GET REQUESTED LENGTH
	SUR	A3,A10	SUBTRACT MOVED PART 
	ST	A3,COM03+STKCOM	SAVE
	LDR	A11,A3	GET REMAINING LENGTH
	LDR	A9,A10	GET CURRENT BUFFER LENGTH 
	CALL	CMPADR	REMAINING LENGTH<CURRENT BUFFER LENGTH?
	RB(NL)	XMOV10
	LDR	A10,A3	LAST LENGTH 
	RB	XMOV10
	EJECT

SPLIT	EQU	* 
	LDR	A1,A3	GET DIVISOR
	SRL	A1,15	MOST SIGN. PART OF DIVISOR 
	LDR	A2,A3	GET DIVISOR
	DV	BUFSIZ+STKCOM	AND DIVIDE
	LDR	A4,A2	GET QUOTIENT (=NUMBER OF MOVES - 1)
	LD	A10,BUFSIZ+STKCOM	MOVE MAX LENGTH 
	RB	XMOV10

XMOV30	CALL	POB	RESTORE REGISTERS FROM A15-STACK
	RTN	A14
	EJECT

**                M O V I N G                ** 
**                                           ** 
**                                           ** 
**  USES SUBROUTINE 'XMOVE' TO MOVE A BLOCK  ** 
**  VIA TWO MM-TABLES.PHYSICALL TO-ADDRESS   ** 
**  IS ALWAYS ASSUMED TO BE DATA PART OF     ** 
**  MEMORY. LSTADR & FYSPAG POINTS AT LAST   ** 
**  (HIGHEST) FREE ADDRESS. LSTADR &FYSPAG   ** 
**  IS UPDATED AND CHECKED.                  ** 
**                                           ** 
**  INPUT :A1 & A3 AS IN 'XMOVE'             ** 
**         TTAB=POINTER TO TTAB (OR LIKELY)  ** 
**  OUTPUT:A2=LOGICALL TO-ADDRESS            ** 
**  WORK-REGS: A4,A10                        ** 
*********************************************** 

MOVING	EQU	*
	CALL	PUSH	STORE REGISTERS ON A15-STACK 
	LD	A4,FYSPAG+STKCOM	GET ACT. PHYSICALL PAGE
	LD	A10,TTAB+STKCOM	LOAD TTAB-ADDRESS 
	LD	A2,LSTPAG,A10	GET LAST TABLE-ENTRY IN TTAB
	LDR*	A9,A2	GET PAGE IN TABLE 
	ANKL	A9,/FC00
	CWR	A9,A4	CORRECT PAGE IN MMU-TABLE? 
	RF(E)	MOV010	YES!
	ADKL	A4,/400	ADJUST FOR 'SETTAB' 
	CALL	SETTAB	NEW PAGE IN TABLE! 
MOV010	LD	A11,LSTADR+STKCOM	GET LAST LOGICALL ADDRESS 
	ANKL	A11,/FFF
	LDR	A9,A3	GET LENGTH OF AREA TO MOVE 
	CALL	CMPADR	ENOUGTH SPACE IN CURRENT PAGE? 
	RF(NL)	MOV020	YES! 
	SUR	A11,A3	COMPUTE DISPLACEMENT IN PAGE
MOV015	RF(NP)	MOV025
	CALL	SETTAB	INITIALIZE NEW PAGE ENTRY
	ADKL	A11,4096	PHYSICAL PAGE INCREMENT
	RB	MOV015
MOV020	SUR	A11,A3	COMPUTE DISPLACEMENT IN PAGE
MOV025	RF(NN)	MOV050
MOV030	CALL	SETTAB	NEW PAGE IN TABLE! 
	ADKL	A11,4096	NEW PAGE INCREMENT 
	RB(N)	MOV030	NOT ENOUGH. NEW PAGE! 

* MM-TABLE CORRECT. SAVE ADDRESSES *

* A4=PHYSICALL PAGE NUMBER
* A11=DISPLACEM. WITHIN PAGE
* A2=CURRENT ENTRY IN MM-TABLE

MOV050	EQU	*
	ST	A2,LSTPAG,A10	SAVE MMU-ENTRY IN TTAB
	ST	A4,FYSPAG+STKCOM	SAVE PHYSICALL PAGE NUMBER 
	LDKL	A4,MMBEG	CALCULATE TABLE ENTRY DISPLACEM. 
	ADR	A4,A10	ABSOLUTE ENTRY ADDRESS
	ST	A4,MMTO+STKCOM	SAVE TABLE ADDRESS 
	SUR	A2,A4	RELATIVE ADDRESS 
	SLL	A2,11	SHIFT TO FOUR FIRST BITS & DIV BY 2
	ORR	A2,A11	GET DISPLACEM. WITHIN PAGE
	ANKL	A2,/FFFE	EVEN ADDRESS 
	ST	A2,LSTADR+STKCOM	SAVE LOGICALL ADDRESS
* CHECK ADDRESSES * 

	LD	A9,FSTPAG+STKCOM	GET FIRST FREE PAGE
	ST	A11,COM01+STKCOM	SAVE A11 
	LD	A11,FYSPAG+STKCOM 
	CALL	CMPADR	AND COMPARE
	RF(G)	MOV090	OK! 
	RF(L)	MOV070	NOK!
	LD	A11,COM01+STKCOM	RESTORE DISPL. 
	LD	A9,FSTADR+STKCOM
	CALL	CMPADR
	RF(NL)	MOV090	OK!
MOV070	LDKL	A1,LMP3 
	CALL	ERROR 
MOV090	EQU	*
	CALL	XMOVE	MOVE
	LD	A1,STKCOM+MAPLEN	MAPPING? 
	RF(Z)	MOV100	NO
	CALL	INBIMA	INIT ALLOCATION BIT MAP
MOV100	CALL	POB	RESTORE REGISTERS FROM A15-STACK
	LD	A2,LSTADR+STKCOM	GET LOGICAL TO-ADDRESS 
	TL*	MMFROM+STKCOM	RESTORE MM-TABLE 
	RTN	A14
	XIF
	EJECT

**               S E T T A B                   ** 
**                                             ** 
**                                             ** 
**  SET NEW PAGE IN MM-TABLE & CHECK IF TABLE  ** 
**  OVERFLOW.                                  ** 
**                                             ** 
**  INPUT :A2-ADDRESS TO CURRENT ENTRY         ** 
**         A4=PHYSICALL PAGE                   ** 
**  OUTPUT:A2 & A4 IS UPDATED                  ** 
**   WORK.REG: A9                              ** 
************************************************* 

SETTAB	EQU	*
	IFT	MMUPAG=1 
	SUKL	A4,/400	GET NEXT PAGE 
	SUK	A2,2	GET NEXT ENTRY

* CHECK IF MM-TABLE OVERFLOW *

	LDR	A9,A10	GET END-ADDRESS A10=TTAB
	ADKL	A9,MMBEG
	TNM	A2,A9	32-KB BOARDER CHECK
	RF(NN)	SETT00
	CWR	A9,A2
	RF	SETT05
SETT00	CWR	A2,A9	OVERFLOW?
SETT05	RF(NL)	SETT10	NO 
	LDK	A1,LMP7
	CALL	ERROR 
SETT10	EQU	*
	STR	A4,A2	STORE IN TABLE 
	RTN	A14
	XIF
	EJECT



**                 C M P A D R                  **
**                                              **
**                                              **
**  COMPARE ADDRESSES. RESULT IN PSW ON RETURN  **
**                                              **
**  INPUT : A11 COMPARED TO..                   **
**          A9                                  **
**  OUTPUT: RESULT IN A14-STACK                 **
**************************************************
			 
CMPADR	EQU	*
	TNM	A11,A9 
	RF(NN)	CMPA10
	CWR	A9,A11 
	RF	CMPA20
CMPA10	CWR	A11,A9 
CMPA20	CFI	A14,PSW,A13	PUT RESULT ON STACK
	RTN	A14
	EJECT
				
				
**                M U L T                     **
**                                            **
**                                            **
**  MULTIPLICATION  (A2) X A3(), A2#0         **
**                                            **
**  INPUT : A3,A2                             **
**  OUTPUT:A3=RESULT                          **
************************************************
MULT	EQU	*
	ST	A3,COM01+STKCOM 
	STR	A2,A14	SAVE A2 TEMPORARY 
	LDK	A3,0 
ADD	AD	A3,COM01+STKCOM
	SUK	A2,1 
	RB(NZ)	ADD 
	LDR*	A2,A14
	RTN	A14
	EJECT

**               M M E N T                   ** 
**                                           ** 
**                                           ** 
**  FIND LAST USED ENTRY IN MM-TAB. SCAN     ** 
**  FROM LOW ADDRESS. NOT USED ENTRY=0.      ** 
**                                           ** 
**  INPUT :A3=MM-TABLE ADDRESS               ** 
**  OUTPUT:A3=ENTRY ADDRESS                  ** 
**         A9=TTAB-ADDRESS                   ** 
**         LSTPAG IN TTAB=A3                 ** 
**         A1=CONTENTS OF 1:ST USED ENTRY    ** 
*********************************************** 

MMENT	EQU	* 
	IFT	MMUPAG=1 
	LDR	A9,A3	GET TABLE ADDRESS
	SUKL	A9,MMBEG	ADJUST A9 (LOOKS LIKE TTAB POINTER)
	SUK	A3,2 
MMEN10	ADK	A3,2	INCREMENT ADDRESS 
	LDR*	A1,A3	GET CONTENTS OF MM-TABLE
	ANKL	A1,/FC00
	CWK	A1,/FC00 
	RB(Z)	MMEN10 
	ST	A3,LSTPAG,A9	SAVE FIRST FREE PAGE-ADDRESS 
	RTN	A14
	XIF
	EJECT

**              G E T T A B                 **
**                                          **
**                                          **
**  FIND TTAB ADDRESS                       **
**                                          **
**  INPUT :A8=POINTER TO T:A IN T:ATAB      **
**  OUTPUT:A2=TTAB-ADDRESS                  **
**         A1=TID                           **
**  WORKREGS:A3,A4,A10                      **
**********************************************

GETTAB	EQU	*
	IFT MMUPAG=0 
	LDR*	A3,A8	T:A ADDRESS 
	LD	A1,T:ATID,A3	GET TID TO MATCH 
	LD	A12,T:DAD,A3	T:D-ADDRESS
	XIF
	IFT MMUPAG=1 
	ELR	A3,A8	T:A-ADDRESS
	EL	A1,T:ATID,A3	GET TID
	EL	A12,T:DAD,A3
	XIF
GETTTB	EQU	*	ENTRY. INPUT: A1=TID 
	ST	A10,COM04+STKCOM	SAVE A10 
	LD	A4,SCTTCT	GET TC:TAB ADDRESS
	LDR*	A10,A4	TCTAB LENGTH 
GETT10	ADK	A4,2 
	SUKL	A10,2	ALL?
	RF(NN)	GETT20	NO!
	LDR	A3,A1	SAVE A1 (DEBUGGING PURPOS) 
	LDK	A1,LMP5	TID ERROR
	CALL	ERROR 
GETT20	LDR*	A2,A4	TTAB-ADDRESS
	CW	A1,TTB:PP,A2	TCL EQUAL? 
	RB(NE)	GETT10	NO!
	ST	A2,TTAB+STKCOM	SAVE 
	LD	A10,COM04+STKCOM
	RTN	A14
	EJECT
**********************************************************
*                                                        *
*               INBIMA - INIT BIT MAP                    *
*               =====================                    *
*                                                        *
*  REFERENCED IN:  MOVING,SYSLDB PART 2                  *
*                                                        *
*  ENTRY:  MAPLEN - LENGTH OF AREA TO BE MAPPED          *
*          LSTADR - LAST LOGICAL ADDRESS                 *
*            TTAB - TTAB ADDRESS                         *
*                                                        *
*  EXIT:                                                 *
*                                                        *
*  WORK REGISTERS:  A1,A2,A3,A4                          *
*                                                        *
*  SUBROUTINES:                                          *
*                                                        *
**********************************************************
INBIMA	EQU	*
	IFT	MMUPAG=1 
	LDKL	A1,/8000	INIT BIT MASK
	LD	A2,STKCOM+LSTADR	GET LAST ADDRESS 
	LDR	A4,A2	SAVE 
	ANKL	A4,/C000	SELECT MMU TABLE PARTITION 
	SRL	A4,13	DISPLACEMENT TO START OF PARTITION 
	ADKL	A4,TTB:AM	BIT MAP DISPLACEMENT
	AD	A4,STKCOM+TTAB	ADD TTAB ADDRESS 
	LDR	A3,A2	GET LOGICAL ADDRESS
	ANKL	A3,/3000	SELECT ENTRY IN PARTITION
	SRL	A3,12	DISPL. REL. START OF PARTITION 
MAP:40	SUK	A3,1	CORRECT NIBBLE FOUND? 
	RF(N)	MAP:50	YES 
	SRL	A1,4	NEXT NIBBLE 
	RB	MAP:40
MAP:50	ECR	A3,A2	GET NUMBER OF 1K-DISPLACEMENTS 
	SRL	A3,2 
	ANK	A3,3	ISOLATE 
MAP:60	SUK	A3,1	CORRECT 1K-PARTITION? 
	RF(N)	MAP:65	YES 
	SRL	A1,1	NEXT 1K-PARTITION 
	RB	MAP:60
MAP:65	LD	A3,STKCOM+MAPLEN	GET LENGTH 
	ANKL	A2,/3FF	REMANING PART OF 1K-PAGE
	ADR	A3,A2	ADJUST LENGTH
	LDKL	A2,TTB:MT	DISPLACEMENT TO MMU TABLE 
	AD	A2,STKCOM+TTAB	ADD TTAB ENTRY ADDRESS 
MAP:70	ORRS	A1,A4	INDICATE 1K-PARTITION OCCUPIED
	LDR	A3,A3	GET LENGTH 
	RF(N)	MAP:80	>32K
	SUKL	A3,/400	DECREMENT LENGTH
	RF(NP)	MAP100	MAPPING FINISHED 
	RF	MAP:90
MAP:80	SUKL	A3,/400	DECREMENT LENGTH
MAP:90	SRL	A1,1	NEXT 1K-PARTITION 
	RB(NZ)	MAP:70	IN THE SAME BIT MAP ENTRY
	ADK	A4,2	NEXT BIT MAP ENTRY
	CWR	A4,A2	END OF BIT MAP?
	RF(E)	MAP100	YES!
	LDKL	A1,/8000	INIT BIT MASK
	RB	MAP:70
MAP100	EQU	*
	XIF
	RTN	A14
	EJECT

**            M  M  R  S  T                 **
**                                          **
**  RESET MMTAB ENTRIES FROM ADDRESS        **
**        INDICATED BY REGISTER A1 DOWNTO   **
**        MMTAB START.SET ENTRIES TO /FC00  **
**                                          **
**  INPUT : A1 = LAST USED ENTRY            **
**  OUTPUT: A1 = MMTAB START ADDRESS        **
**          A2 = MMTAB START ADDRESS        **
**          A12= /FC00                      **
**********************************************

MMRST	EQU	* 
	IFT	MMUPAG=1 
	LDKL	A2,MMTAB	WORK TABLE ADDRESS 
	ADR	A2,A13 
	SUK	A2,2 
	LDKL	A12,/FC00	INDICATOR 
MMRST1	EQU	*
	SUK	A1,2	NEXT ENTRY
	CWR	A1,A2	ALL DONE ? 
	RF(E)	MMRST2	YES 
	STR	A12,A1	INDICATE FREE ENTRY 
	RB	MMRST1	NEXT ENTRY 
MMRST2	EQU	*
	RTN	A14
	XIF
	EJECT
*               G E T A P P                *
*                                          *
* GET START OF APLTAB-BLOCK AND CONFIGURA- *
* TION-DATA FOR SPECIFIED APPLICATION      *
* AND IF MMU-CASE ,LOAD HARDWARE MMU-TABLE *
* AND MMTAB WITH MMU-TABLE FROM TTAB       *
*                                          *
* INPUT : A1=APPL.TYPE 'CR' 'CO' 'BA' 'AS' *
*         APPLNO=APPL.NUMBER OF CURRENT    *
*                APPL.TYPE 0,1,2,3...      *
*         CONSTA=START OF CONF.DATA        *
*                                          *
* OUTPUT: A1=ADDRESS TO FIRST ENTRY IN     *
*            APLTAB-BLOCK                  *
*         A2=BLOCK TYPE T/C/U/S, OR 0 IF   *
*            END OF CONFIGURATION-DATA     *
*         A11=START OF CONF. FOR SPECIFIED *
*             APPLICATION                  *
*         APPLNO=APPLNO+1 IF APPLICATION   *
*               IS FOUND                   *
*               ELSE APPLNO IS UNCHANGED   *
*         CONSTA=START OF CONF.DATA        *
*         COND.REG.=0 IF NO MORE APPL. OF  *
*                   CURRENT TYPE LEFT      *
*                                          *
* WORK REGISTERS : A1-A4,A11               *
*                                          *
********************************************
GETAPP	EQU	*
* INITIATE REGISTERS AND INCREMENT APPLNO 
	LD	A3,APLTAB+STKCOM	APLTAB ADDRESS 
	ADK	A3,2	FIRST APLTAB-BLOCK ADDRESS
	LDK	A4,0	CLEAR APPL.COUNTER OF 
			CURRENT APPL.TYPE
	LDK	A2,0	CLEAR APPL.COUNTER OF 
			ALL APPL.TYPES 
* FIND RIGHT APLTAB-BLOCK FOR SPECIFIED APPLICATION 
GTA100	EQU	*
	ADK	A2,1	INCREMENT APPL.COUNTER OF 
			ALL APPL.TYPES 
	CW*	A2,APLTAB+STKCOM	ANY APPLICATION LEFT? 
	RF(NG)	GTA150	YES! 
	SUR	A2,A2	A2=0 AND COND.REG.=0 
	RF	GTA900	LEAVE SUBRUTIN 
GTA150	EQU	*
	CW	A1,APLTYP,A3	RIGHT APPL.TYPE? 
	RF(E)	GTA200	YES!
	ADK	A3,ACBLEN	UPDATE APLTAB-BLOCK ADDRESS
	RB	GTA100	SHECK NEXT APLTAB-BLOCK
GTA200	EQU	*
	CW	A4,APPLNO+STKCOM	RIGHT APPL.NUMBER OF 
			CURRENT APPL.TYPE? 
	RF(E)	GTA300	YES!
	ADK	A4,1	INCREMENT APPL.COUNTER OF 
			CURRENT APPL.TYPE
	ADK	A3,ACBLEN	UPDATE APLTAB-BLOCK ADDRESS
	RB	GTA100	SHECK NEXT APLTAB-BLOCK
GTA300	EQU	*
	IFT	MMUPAG=1 
* GET MMU-TABLE FROM TTAB OF CURRENT TASK 
	LD*	A4,APLMMC,A3	GET TCTAB-ENTRY FOR CURRENT TASK
	ADKL	A4,TTB:MT	ADDRESS TO 1:ST MMU-TABLE ENTRY 
			IN TTAB
	TLR	A4	LOAD MMU-TABLE
	TS	MMTAB,A13	STORE MMU-TABLE IN MMTAB
	XIF
* FIND CONFIGURATION-DATA FOR SPECIFIED APPLICATION 
	LDK	A4,0	CLEAR APPL.COUNTER OF 
			ALL APPL.TYPES 
	LDR	A1,A3	LOAD APLTAB-BLOCK ADDRESS TO 
			OUTPUT REGISTER
	LD	A11,CONSTA+STKCOM	GET START OF CONF.DATA
	ADK	A4,1	INCREMENT APPL.COUNTER OF 
			ALL APPL.TYPES 
	CWR	A2,A4	IS IT THE FIRST APPLICATION
	RF(E)	GTA800	YES!
GTA400	EQU	*
	LDK	A3,0	CLEAR REGISTER
	LCR	A3,A11	GET CHAR. FROM CONF.DATA
	ADKL	A11,1	INCREMENT CONF.DATA POINTER 
	CCK	A3,/FFFF	IS CONF.DATA CHAR. /FF? 
	RB(NE)	GTA400	NO!
	ADK	A4,1	INCREMENT APPL.COUNTER OF 
			ALL APL.TYPES
	CWR	A2,A4	RIGHT APPL.NUMBER OF 
			ALL APPL.TYPES?
	RB(NE)	GTA400	NO!
* LOAD REGISTER A2 WITH ITS OUTPUT VALUE,REPLACE
* PSW OF CALLING PROGRAM TO PSW OF THIS 
* SUBRUTIN,AND RETURN FROM SUBRUTIN 
GTA800	EQU	*
	IM	APPLNO+STKCOM	INCREMENT APPL.NUMBER OF
			CURRENT APPL.TYPE
	LDK	A2,0	CLEAR REGISTER
	LCR	A2,A11	GET CHAR FROM CONF.DATA 
	LDK	A4,1	MAKE COND.REG.TO BE NOT EQUAL TO 0
GTA900	EQU	*
	CFI	A14,PSW,A13	REPLACE PSW
	RTN	A14	RETURN FROM SUBRUTIN 
	EJECT
				
				
**                  C O N V R T                 **
**                                              **
**                                              **
**  CONVERSION OF TWO ASCII-DIGITS TO BINARY    **
**                                              **
**  INPUT : A5=ASCII DIGITS                     **
**  OUTPUT: A1=BINARY RESULT                    **
**  WORK.REGS: A3,A2                            **
**************************************************
			 
CONVRT	EQU	*
	LDK	A1,0	CLEAR RESULT REG
	LDR	A3,A5
	SRL	A3,8	GET TEN'S 
	SUK	A3,/30 
	ADR	A1,A3
	LDR	A2,A1	MULT BY 10 
	ADR	A1,A1	.
	SLL	A2,3	. 
	ADR	A1,A2	.... 
	LDR	A3,A5
	ANK	A3,/F	GET ONE'S
	ADR	A1,A3
	RTN	A14
	EJECT

**                  N X T B L K                 **
**                                              **
**                                              **
**  SKIP TO NEXT BLOCK IN CONFIGURATION FILE    **
**                                              **
**  INPUT: A11=ADDRESS TO CURRENT BLOCK-START   **
**  OUTPUT:A11=ADDRESS TO NEXT BLOCK            **
**         A2=BLOCK TYPE (T,C,U) IN RIGTH BYTE  **
**  WORKREGS: A1,A3-A5                          **
**************************************************

NXTBLK	EQU	*
	ADKL	A11,TDBNC	NUMBER OF TERMINAL DEVICE CLASSES 
NXTCOM	EQU	*	ENTRY: SKIP TO NEXT COMMON-BLOCK 
	LCR	A5,A11 
	SLL	A5,8 
	LC	A5,1,A11
	CALL	CONVRT
	LDK	A2,TDBREC
	LDR	A3,A1
	CALL	MULT
	ADR	A11,A3 
	ADKL	A11,2 
	LCR	A5,A11	GET NUMBER OF SPEC, DEV. CLASSES
	SLL	A5,8 
	LC	A5,1,A11
	CALL	CONVRT
	LDK	A2,SDC	SPEC. DEV. CL. RECORD LENGTH
	LDR	A3,A1
	CALL	MULT
	ADR	A11,A3	A11=NEXT BLOCK
	ADKL	A11,2 
	LC	A2,TDBBT,A11	GET BLOCK TYPE 
	RTN	A14
	EJECT
				
				
**                     G E T N U M                **
**                                                **
**                                                **
**  CONVERT 3 ASCII-DIGITS TO BINARY              **
**                                                **
**  INPUT : A6=ADDRESS TO FIRST ASCII-CHARACTER   **
**  OUTPUT: A5=BINARY VALUE                       **
**  WORK.REGS: A2,A4                              **
****************************************************
			 
GETNUM	EQU	*
	LDK	A4,100	FIRST INCREMENT 
	LDK	A5,0	CLEAR RESULT REG
	SUK	A6,1	INIT POINTER
GET030	ADK	A6,1	NEXT DIGIT
	LCR	A2,A6	GET CHAR 
	ANK	A2,/F
GET050	SUK	A2,1 
	RF(N)	GET100	THIS DIGIT READY
	ADR	A5,A4	ACCUMULATE 
	RB	GET050
GET100	SUK	A4,90	NEXT INCREMENT (TEN'S) 
	RB(P)	GET030 
	ADK	A4,81	NEXT INCREMENT (ONE'S) 
	RB(P)	GET030	THIRD DIGIT 
	RTN	A14
	EJECT


**                    Q U E J O B                ** 
**                                               ** 
**                                               ** 
**  QUEUE TASK VIA 'ACTOT' AND SWITCH TO LEVEL   ** 
**  0, ENB.                                      ** 
**                                               ** 
**  INPUT: A12=T:D-ADDRESS
**         A5=TTAB-ADDRESS                       ** 
*************************************************** 

QUEJOB	EQU	*
* QUEUE THIS TASK (THIS TID)

	LDKL	A3,RETUR	GET RETURN (FROM A15) ADDRESS
	ADR	A3,A13	RELOCATE
	STR	A3,A15	PUT ON STACK
	LDKL	A3,/00C0	SET LEVEL 0 AND ENABLE 
	STR	A3,A15	PSW 
	CF	A15,SAVE8	SAVE 8 REGS 
	LDK	A7,0	CLEAR ABORT INDICATOR 
	IFT	MMUPAG=0 
	LD	A4,WATLEN,A12	NUMBER OF WAT-ELEMENTS
	ADK	A4,2 
	ANKL	A4,/FFFE
	ADK	A4,DWBFST+4
	ADR	A4,A12	ADD T:A-ADDRESS => START OF START-POINTS
	LDR*	A6,A4	NUMBER OF START POINTS
GETT30	SUK	A6,1	DEC. NUMBER OF STARTPOINTS
	RF(N)	GETT40	ALL!
	LD	A1,4,A4	DISP ADDRESS
	LD	A3,2,A4	SEGMENT NUMBER
	XIF
	IFT MMUPAG=1 
	EL	A4,WATLEN,A12	NUMBER OF WAT-ELEMENTS
	ADK	A4,2 
	ANKL	A4,/FFFE
	ADK	A4,DWBFST+4
	ADR	A4,A12	ADD T:A-ADDRESS => START OF START-POINTS
	ELR	A6,A4	NUMBER OF START-POINTS 
GETT30	SUK	A6,1	DEC. NUMBER OF STARTPOINTS
	RF(N)	GETT40	ALL!
	EL	A1,4,A4	DISP ADDRESS
	EL	A3,2,A4	SEGMENT NUMBER
	XIF
	CF	A15,ACTOT 
	ADK	A4,STPREC	NEXT START-POINT 
	RB	GETT30
GETT40	ABL	RETUR8	RELOAD 8 REGS 
RETUR	EQU	*-REL 
	RTN	A14
	EJECT

**              M O V M M T                  ** 
**                                           ** 
**                                           ** 
**  MOVE MM-TABLE                            ** 
**                                           ** 
**  INPUT :A2=TTAB-ADDRESS                   ** 
**         MMTAB HOLDS TABLE TO MOVE         ** 
**  OUTPUT:A2=START OF MM-TABLE IN TTAB      ** 
**          A9=TTAB ADDRESS                  ** 
**  WORKREGS:A1,A3                           ** 
*********************************************** 

MOVMMT	EQU	*
	IFT	MMUPAG=1 
	ADKL	A2,MMBEG	GET TO-TABLE ADDRESS 
	TL	MMTAB,A13	LOAD FROM-TABLE 
	TSR	A2	MOVE
	LDR	A3,A2
	CALL	MMENT	FILL LAST ENTRY ADDRESS 
	TL*	MMFROM+STKCOM	RELOAD TABLE 
	RTN	A14
	XIF
	EJECT
SYSINI	EQU	*	START OF SYSTEM INITIALIZATION 
	IFT DSKPAG-MMUPAG=1
* 
*  INITIATE DYNAMIC CORE FOR COBOL
* 
	LD	A2,SCTOPT	GET OPTION WORD 
	ANKL	A2,/2000	ANY COBOL APPL?
	RF(Z)	PBSEND	NO! 
	LD	A8,DYNSTA+STKCOM	GET START OF DYNTAB:S
	LDR*	A2,A8	GET NUMBER OF DYNTAB:S
	ADKL	A8,2	INCREMENT DYNTAB POINTER 
INDY05	EQU	*
	LDR*	A3,A8	GET DYNTAB LENGTH (BYTES) 
INDY10	EQU	*
	ADKL	A8,2	INCREMENT DYNTAB POINTER 
	LDR*	A7,A8	GET SPL-PBS ADR 
	LDR	A6,A13 
	ADKL	A6,PBSTAB	CONSTANT-TABLE ADDRESS
	SUK	A3,2	END OF DYNTAB 
	RF(Z)	INDY50	YES!
INDY20	EQU	*
	LDR*	A5,A6	GET NUMBER OF COPIES
	CWK	A5,/FFFF	END OF TABLE? 
	RF(E)	INDY40	YES!
	LD	A4,2,A6	GET WORD TO COPY
	ADK	A6,4	ADJUST PBSTAB 
INDY30	EQU	*
	SUK	A5,1	DECREMENT NBR.OF COPIES 
	RB(N)	INDY20	ALL DONE FOR THIS CHARACTER 
	STR	A4,A7	STORE CHARACTER IN SPL-PBS 
	ADK	A7,2	STEP SPL-PBS POINTER
	RB	INDY30	NEXT WORD
INDY40	EQU	*
	LDR*	A4,A8	SPL-PBS ADR 
	LDKL	A5,STKMAX	STACK-SIZE
	ST	A5,SPLSTS,A4	STORE IN SPL-PBS 
	LDKL	A7,ENTFIN	ENTRY-FINI (ADDRESS)
	ST	A7,SPLENT,A4	STORE IN SPL-PBS 
	LDR	A6,A4	SPL-PBS ADDR 
	ADK	A6,SPLSTA	POINT AT STACK AREA
	ADR	A5,A6	+STACK AREA ADDR 
	ST	A5,SPLSTB,A4	STORE IN SPL-PBS STACK-BASE
	RB	INDY10
INDY50	EQU	*
	SUK	A2,1	ANY DYNTAB:S LEFT?
	RB(NZ)	INDY05	YES! 
	RF	PBSEND	NO!
	EJECT
**************************************************
**                                              **
**  EACH WORD IN THIS TABLE CONSISTS OF:        **
** WORD1=COUNTER,NBR OF COPIES OF NEXT WORD     **
** WORD2=WORD                                   **
**                                              **
**  BYTE1 (COUNTER)=/FF MEANS END OF TABLE      **
**                                              **
**************************************************
PBSTAB	EQU	*-REL
	DATA	1	TERMINATION-CODE
	DATA	0 
	DATA	1	STACK-USED
	DATA	/6
	DATA	1	STACK-SIZE
	DATA	0 
	DATA	3	PROCEDURE-NAME
	DATA	/2020 
	DATA	20	PGM-DATA UNTIL STACK-BASE
	DATA	0 
	DATA	1	STACK-BASE
	DATA	0 
	DATA	1	ENTRY-FINI
	DATA	0 
	DATA	16	LAST-TS,RUNTIME-WORK-AREA
	DATA	0 
	DATA	/FFFF	E N D  O F  T A B L E 
PBSEND	EQU	*
	XIF
	IFF	MMUPAG+DSKPAG=0
* 
*  RESERVE PAGES IN MEMORY AND BUILD PAGE TABLE 
* 
PAGGEN	EQU	*
	LDKL	A2,PAGEX	EXIT ADDRESS 
	ADR	A2,A13	RELOCATE
	LD	A1,STKCOM+TOTSGM	ANY SEGMENTS IN APPLICATION? 
	ABR(Z)	A2	NO!
	LD	A1,SCTOPT	GET OPTION WORD 
	ANK	A1,3	PAGING? 
	ABR(Z)	A2	NO!
* 
*  RESERV SPACE FOR PAGE BLOCKS CORRESPONDING TO CORE RESIDENT SEGMENTS 
* 
	LD	A11,SCTSFA	GET START OF FREE AREA 
	ST	A11,SCTPAG	STORE IN SYSTAB
	LDR	A8,A13	GET RELOCATION BASE 
	ADKL	A8,INI70-REL	LIMIT FOR PAGE TABLE 
	LDK	A7,0	RESET PAGE COUNTER
PAG:10	EQU	*
	CW	A7,SCTNOP	EQUAL TO NUMBER OF PAGES? 
	RF(E)	PAG:30	YES!
	LDK	A1,0	RESET NUMBER OF WORDS 
PAG:20	EQU	*
	ADKL	A11,2	INCLUDE NEXT WORD 
	RF(Z)	MEMOFL	MEMORY OVERFLOW (64 KB LIMIT) 
	ADK	A1,1	INCREMENT WORD COUNTER
	CWK	A1,4	4 WORDS RESERVED? 
	RF(E)	PAG:25	YES!
	CWR	A11,A8	CHECK PROGRAM OVERWRITE 
	RF(E)	MEMOFL	MEMORY OVERFLOW!
	RB	PAG:20
PAG:25	ADK	A7,1	INCREMENT PAGE BLOCK COUNTER
	RB	PAG:10
PAG:30	EQU	*
* 
*  RESERV MEMORY PAGES IN UNUSED PART OF MEMORY 
*  AND EXTEND PAGE TABLE WITH CORRESPONDING NUMBER
*  OF PAGE BLOCKS.
* 
	XIF
	IFT	MMUPAG=1 
	LD	A1,STKCOM+FYSPAG	GET PHYSICAL PAGE
	LD	A2,STKCOM+LSTADR	GET LAST LOGICAL ADDRESS 
	ANKL	A2,/FFF	GET DISPLACEMENT
	SRL	A2,2	SKIP TWO RIGHTMOST BITS 
	ORR	A1,A2	16 BITS PHYSICAL PAGE ADDRESS
	LDR	A3,A1	SAVE 
	LD	A2,SCTPSZ	GET PAGE SIZE 
	SRL	A2,2	SKIP TWO RIGHTMOST BITS 
	LDR	A10,A2	SAVE
	ANKL	A1,/FC00	MAKE EVEN 4K-MULTIPLE ADDRESS
	ANKL	A2,/0300	MODIFY FOR PAGE SIZE 
	ANR	A2,A3	EVEN 1-KB LIMIT
	ORR	A1,A2	MODIFY PAGE ADDRESS LIMIT
	XIF
	IFT	DSKPAG-MMUPAG=1
	LD	A1,LSTADR+STKCOM	GET PHYSICAL LAST ADDRESS
	LD	A10,SCTPSZ	PAGE SIZE
	XIF
	IFF	MMUPAG+DSKPAG=0
	LDR	A9,A1	INIT PAGE ADDRESS
	LDR	A6,A9	SAVE 
PAG:31	EQU	*
	ST	A11,SCTSFA	UPDATE START OF FREE AREA
	TNM	A6,A10 
	RF(NN)	PAG:32
	CWR	A10,A6 
	RF	PAG:33
PAG:32	CWR	A6,A10 
PAG:33	RF(NG)	PAG:40
	SUR	A6,A10	COMPUTE ADDRESS TO NEXT PAGE
	LDR	A1,A6	GET PAGE ADDRESS 
	IFT	MMUPAG=1 
	ANKL	A1,/C000	ADDRESS IN SYSTEM AREA?
	RF(NZ)	PAG:34	 NO! 
	LDR	A1,A6	PHYSICAL ADDRESS IN SYSTEM AREA
	SLL	A1,2	ABSOLUTE ADDRESS IN SYSTEM AREA 
	RF	PAG:36
PAG:34	LDK	A1,0	END OF FREE AREA
	XIF
	IFF	MMUPAG+DSKPAG=0
PAG:36	LDK	A2,0	RESET WORD COUNTER
PAG:38	CWR	A11,A8	CHECK PROGRAM OVERWRITE 
	RF(E)	PAG:40	NO MORE MEMORY AVALIABLE
	ADKL	A11,2	INCR. PAGBLK POINTER
	ADK	A2,1	INCREMENT WORD COUNTER
	CWK	A2,4	BLOCK COMPLETE? 
	RF(E)	PAG:45	YES!
	LDR	A1,A1	ADDRESS IN SYSTEM AREA?
	RB(Z)	PAG:38	NO! 
	TNM	A11,A1	32-KB LIMIT CHECK 
	RF(NN)	PAG382
	CWR	A11,A1 
	RF	PAG384
PAG382	CWR	A1,A11 
PAG384	RB(G)	PAG:38	MORE MEMORY AVALIABLE 
PAG:40	EQU	*
	ADK	A7,0	ANY PAGES RESERVED? 
	RF(Z)	MEMOFL	NO! 
	CW	A7,SCTNOP	ONLY PAGES FOR CORE RESIDENT PAGES? 
	RF(G)	PAG:50	NO! 
	CW	A7,STKCOM+TOTSGM	ONLY CORE RESIDENT SEGMENTS IN APPLICATION?
	RF(E)	PAG:50	YES!
MEMOFL	LDKL	A1,LMP3 
	OTR	A1,0,SOP	INDICATE MEMORY OVERFLOW
	HLT		HALT PROGRAM
PAG:45	CW	A7,STKCOM+TOTSGM	ONE PAGE/SEGMENT ALLOCATED?
	CW	A7,STKCOM+TOTSGM	MORE PAGES WANTED? 
	RF(E)	PAG:50	YES!
	ADK	A7,1	INCREMENT PAGE COUNTER
	LDR	A9,A6	SAVE PAGE ADDRESS
	RB	PAG:31
PAG:50	EQU	*
	ST	A7,SCTNOP	SAVE NUMBER OF PAGES
	LDR	A1,A9	GET ADDRESS TO FIRST PAGE
	LDR	A2,A1	SAVE 
	IFT	MMUPAG=1 
	SRL	A1,14	BIT 0-1 OF 18-BITS ADDRESS 
	ST	A1,SCTEFA	SAVE
	SLL	A2,2	GET BITS 2-15 OF 18-BITS ADDRESS
	XIF
	IFF	MMUPAG+DSKPAG=0
	ST	A2,SCTEFA+2	SAVE
	EJECT
PAGEX	EQU	*-REL 
	XIF
	LD	A12,SCTPAG	GET PAGE TABLE ADDRESS 
	LD	A7,STKCOM+APLTAB	GET START OF ACB:S 
	LDR*	A4,A7	GET NUMBER OF APPLICATIONS
INI10	LD*	A3,APLMMC+2,A7	GET TTAB ADDRESS 
	IFF	MMUPAG+DSKPAG=0
	LD	A11,TTB:SP,A3	GET SEGMENT TABLE ADDRESS 
	RF(Z)	INI40	NO SEGMENT TABLE 
	LD	A6,SEG:NS,A11	GET NUMBER OF SEGMENTS
	RF(Z)	INI40	NO SEGMENTS! 
	XIF
	IFT	MMUPAG=1 
	LD	A1,APLNPE+2,A7	GET DISPL WITHIN 4K PAGE 
	SRL	A1,2	SKIP TWO RIGHTMOST BITS 
	OR	A1,APLSEG+2,A7	MERGE WITH PHYSICL 4K PAGE ADDRESS 
	XIF
	IFT	DSKPAG-MMUPAG=1
	LD	A1,APLSEG+2,A7	GET PHYSICAL 4K PAGE ADDRESS 
	SLL	A1,2	MULTIPLY BY 4 
	OR	A1,APLNPE+2,A7	MERGE WITH DISPL WITHIN 4K PAGE
	XIF
	IFF	MMUPAG+DSKPAG=0
INI20	EQU	* 
* 
*  INITIALIZE PAGE BLOCK FOR CORE RESIDENT SEGMENTS 
*  AND STORE PAGE BLOCK ADDRESSES IN SEGMENT BLOCKS 
* 
	ADKL	A11,8	NEXT SEGMENT BLOCK
	LDR*	A2,A11	GET STATUS 
	RF(NN)	INI30	SEGMENT NOT LOADED IN CORE
	ST	A12,6,A11	STORE PAGE BLOCK ADDRESS
	CMR	A12	RESET QUEUE POINTER FORWARD
	CM	2,A12	RESET QUEUE POINTER BACKWARD
	ST	A1,4,A12	STORE PAGE ADDRESS 
	ST	A11,6,A12	STORE SEGMENT BLOCK ADDRESS 
	LD	A2,APLPSZ+2,A7	GET SEGMENT SIZE	=1
	XIF			=2 
	IFT	MMUPAG=1		=2 
	SRL	A2,2		=1 
	XIF			=2 
	IFF	MMUPAG+DSKPAG=0		=2
	ADR	A1,A2	ADDRESS TO NEXT PAGE	=1
	ADKL	A12,8	NEXT PAGE BLOCK 
INI30	SUK	A6,1	DECR. SEGMENT BLOCK COUNTER
	RB(P)	INI20
INI40	EQU	* 
	XIF
	IFT	MMUPAG+DSKPAG=0
* 
*  SAVE START OF DYNTAB:S IN SYSINI (STADYN)
*  BEFORE ENABLE IS SET BECAUSE INTERUPT
*  CAN DESTROY DYNSTA IN A15-STACK
* 
	LD	A1,DYNSTA+STKCOM	GET START OF DYNTAB:S
	ST	A1,SAVDYN,A13	SAVE IN SYSINI (STADYN) 
	XIF
* 
*  CHECK APPLICATION TYPE AND QUEUE FIRST TASK
*  FOR EACH ASSEMBLER APPLICATION 
* 
	LD	A1,APLMMP+2,A7	GET APPLICATION TYPE 
	CWK	A1,'AS'	ASSEMBLER APPLICATION? 
	RF(NE)	INI50	NO
* 
*  SWITCH TO LEVEL 0 & ENABLE 
* 
	LDKL	A1,INI45	RETURN ADDRESS 
	ADR	A1,A13	RELOCATE
	STR	A1,A15	STORE ON STACK
	LDKL	A1,/00C0	PSW
	STR	A1,A15	STORE ON STACK
	RTN	A15	SWITCH 
INI45	EQU	*-REL 
	LD*	A5,APLMMC+2,A7	GET TTAB ADDRESS
	LD	A2,APLSTA+2,A7	GET START ADDRESS
	AD	A2,APLREL+2,A7	RELOCATE 
	LDK	A3,0	SEGMENT NUMBER
	CF	A15,ACTOT	QUEUE TASK
	EJECT
INI50	EQU	* 
	IFT	MMUPAG=1 
	LD	A1,APLLAP+2,A7	GET LOGICAL PAGE ADDRESS 
	RF(NZ)	INI55	NO PAGE ENTRIES RESERVED
	XIF
	CM	APLNPE+2,A7	CLEAR NUMBER OF PAGE ENTRIES
	CM	APLMMP+2,A7	CLEAR DISPL. TO PAGE ENTRY
	IFT	MMUPAG=1 
	RF	INI60 
INI55	EQU	* 
	SRL	A1,12	PAGE ENTRY NUMBER
	LDK	A2,16	NUMBER OF MMU ENTRIES
	SUR	A2,A1	NUMBER OF PAGE ENTRIES 
	ST	A2,APLNPE+2,A7	SAVE 
	SLL	A1,1	MULTIPLY BY 2 
	ADKL	A1,TTB:MT	DISPL TO FIRST PAGE ENTRY 
	ST	A1,APLMMP+2,A7	SAVE 
INI60	LD	A1,APLLAC+2,A7	GET LOGICAL ADDR. TO COMMON PART
	SRL	A1,11	ENTRY NUMBER 
	ANK	A1,/1E	2*ENTRY NUMBER
	ADKL	A1,TTB:MT	DISPL TO FIRST COMMON PART ENTRY
	ST	A1,APLMMC+2,A7	SAVE 
	XIF
	ADK	A7,ACBLEN	NEXT ACB 
	SUK	A4,1	MORE APPLICATIONS?
	RB(P)	INI10	YES
	IFF	MMUPAG+DSKPAG=0
* 
*  INITIATE PAGE BLOCK FOR FREE PAGES AND LINK TO PAGQUE
* 
	LDR	A12,A12	ANY PAGES? 
	RF(Z)	INI90	NO!
	CW	A12,SCTSFA	ANY FREE BLOCKS? 
	RF(E)	INI90	NO!
	ST	A12,PAGQUE	POINTER TO FIRST FREE PAGE BLOCK 
	LDKL	A11,PAGQUE	POINTER TO PAGQUE
	LDR	A1,A12	SAVE ADDRESS TO FIRST PAGE BLOCK
	LDK	A2,0 
INI70	ST	A11,2,A12	STORE BACKWARD POINTER 
	ST	A9,4,A12	STORE PAGE ADDRESS 
	ST	A2,6,A12	INDICATE PAGE FREE 
	ADK	A1,8	ADDRESS NEXT PAGE BLOCK 
	CW	A1,SCTSFA	LAST PAGE BLOCK?
	RF(E)	INI80	YES! 
	LDR	A11,A12	SAVE ADDRESS TO PAGE BLOCK 
	STR	A1,A12	STORE FORWARD POINTER 
	LDR	A12,A1	NEXT PAGE BLOCK 
	ADR	A9,A10	NEXT PAGE 
	RB	INI70 
INI80	EQU	* 
	LDKL	A1,PAGQUE	POINTER TO PAGQUE 
	STR	A1,A12	STORE IN LAST BLOCK 
	ST	A12,PAGQUE+2	STORE IN PAGQUE+2
INI90	EQU	* 
	EJECT
	XIF


* START BUGGER (IF ANY) 


* GET APPLICATION START 
	LD	A14,STKCOM+APLTAB	GET START OF ACB:S
	LD	A14,APLREL+2,A14	GET RELOCATION BASE
	ADKL	A13,INI100	CONTINUATION ADDRESS 
	LDK	A1,0	INDICATE SYSLOAD ENDED
	OTR	A1,0,SOP 
	LD	A1,SCTBUG	GET BUGGER ADDRESS
	ABR(NZ)	A1 

INI100	EQU	*-REL
	LDR	A13,P
INI110	EQU	*-REL
	SUKL	A13,INI110	RESTORE PROGRAM BASE OINTER
* 
*  INIT A15 STACK 
* 
	LD	A15,SCTSTB
	SUKL	A15,4 

* START APPLICATION 

	LD	A1,IHRTC	GET INTERRUPT ADDRESS FOR RTC
	ST	A1,SAVRTC,A13	SAVE
	LDKL	A1,IHRTCO	LOAD TEMPORARY INTERRUPT ADDRESS
	ADR	A1,A13	RELOCATE
	ST	A1,IHRTC	STORE IN INTERRUPT VECTOR
	CF	A15,PFINIT	INITIALIZE DEVICES 
	CF	A15,SAVE8	SAVE REGISTERS
	CF	A15,SWL48	SWITCH TO LEVEL 48
* 
*  WAIT APPROXIMATELY 0.62 SECONDS BEFORE BRANCHING TO DISPATCHER 
* 
	LDKL	A1,/FFFF	SET COUNTER
DELAY	SRC	A2,31 
	SUK	A1,1 
	RB(NZ)	DELAY 
	INH
	LDKL	A1,0	GET RTC INTERRUPT ADDRESS
SAVRTC	EQU	*-REL-2
	ST	A1,IHRTC	RESTORE
	LDR	A1,A13	GET START OF SYSINI 
	ADKL	A1,INISTA	START OF INIT. INSTR. SEQ.
	ADKL	A13,INILEN	END OF INIT. INSTR. SEQ. 
	LDKL	A2,STKEND	START OF A15-STACK
INI150	LDR*	A3,A1	GET MEMORY WORD 
	STR	A3,A2	STORE IN A15-STACK 
	ADK	A1,2	INCREMENT FROM-ADDRESS
	ADK	A2,2	INCREMENT TO-ADDRESS
	CWR	A1,A13	ALL WORDS MOVED?
	ABL(E)	STKEND	YES
	RB	INI150
* 
*  TEMPORARY INTERRUPT ROUTINE FOR RTC
* 
IHRTCO	EQU	*-REL
	RIT	RTCDA
	RTN	A15
INISTA	EQU	*-REL
	IFT MMUPAG+DSKPAG=0
* 
*  INITIATE DYNAMIC CORE FOR COBOL
*  APPLICATIONS AND BRANCH TO DISPATCHER
* 
INDY00	EQU	*
	LD	A2,SCTOPT	GET OPTION WORD 
	ANKL	A2,/2000	ANY COBOL APPL?
	RF(Z)	PBSEND	NO! 
	LDKL	A2,STKEND 
	LD	A8,STADYN,A2	GET START OF DYNTAB:S
	RF(Z)	PBSEND	NO COBOL APPL. LOADED 
	LDR*	A2,A8	GET NUMBER OF DYNTAB:S
	ADKL	A8,2	INCREMENT DYNTAB POINTER 
INDY05	EQU	*
	LDR*	A3,A8	GET DYNTAB LENGTH (BYTES) 
INDY10	EQU	*
	ADKL	A8,2	INCREMENT DYNTAB POINTER 
	LDR*	A7,A8	GET SPL-PBS ADR 
	LDKL	A6,STKEND	START OF INIT.INSTR.SEQ.
	ADKL	A6,PBSTAB	CONSTANT-TABLE ADDRESS
	SUK	A3,2	END OF DYNTAB 
	RF(Z)	INDY50	YES!
INDY20	EQU	*
	LDR*	A5,A6	GET NUMBER OF COPIES
	CWK	A5,/FFFF	END OF TABLE? 
	RF(E)	INDY40	YES!
	LD	A4,2,A6	GET WORD TO COPY
	ADK	A6,4	ADJUST PBSTAB 
INDY30	EQU	*
	SUK	A5,1	DECREMENT NBR.OF COPIES 
	RB(N)	INDY20	ALL DONE FOR THIS CHARACTER 
	STR	A4,A7	STORE CHARACTER IN SPL-PBS 
	ADK	A7,2	STEP SPL-PBS POINTER
	RB	INDY30	NEXT WORD
INDY40	EQU	*
	LDR*	A4,A8	SPL-PBS ADR 
	LDKL	A5,STKMAX	STACK-SIZE
	ST	A5,SPLSTS,A4	STORE IN SPL-PBS 
	LDKL	A7,ENTFIN	ENTRY-FINI (ADDRESS)
	ST	A7,SPLENT,A4	STORE IN SPL-PBS 
	LDR	A6,A4	SPL-PBS ADDR 
	ADK	A6,SPLSTA	POINT AT STACK AREA
	ADR	A5,A6	+STACK AREA ADDR 
	ST	A5,SPLSTB,A4	STORE IN SPL-PBS STACK-BASE
	RB	INDY10
INDY50	EQU	*
	SUK	A2,1	ANY DYNTAB:S LEFT?
	RB(NZ)	INDY05	YES! 
	RF	PBSEND	NO!
SAVDYN	EQU	*-REL
STADYN	EQU	*-INDY00 
	DATA	0	SAVE AREA FOR DYNSTA
	EJECT
**************************************************
**                                              **
**  EACH WORD IN THIS TABLE CONSISTS OF:        **
** WORD1=COUNTER,NBR OF COPIES OF NEXT WORD     **
** WORD2=WORD                                   **
**                                              **
**  BYTE1 (COUNTER)=/FF MEANS END OF TABLE      **
**                                              **
**************************************************
PBSTAB	EQU	*-INDY00 
	DATA	1	TERMINATION-CODE
	DATA	0 
	DATA	1	STACK-USED
	DATA	/6
	DATA	1	STACK-SIZE
	DATA	0 
	DATA	3	PROCEDURE-NAME
	DATA	/2020 
	DATA	20	PGM-DATA UNTIL STACK-BASE
	DATA	0 
	DATA	1	STACK-BASE
	DATA	0 
	DATA	1	ENTRY-FINI
	DATA	0 
	DATA	16	LAST-TS,RUNTIME-WORK-AREA
	DATA	0 
	DATA	/FFFF	E N D  O F  T A B L E 
PBSEND	EQU	*
	XIF
	ABL	TDISP
INILEN	EQU	*-REL	PROGRAM LENGTH 
INIEND	EQU	*
	END

Full view