ASMB,R,Q,C     ** DISP4 -- RTE-IV DISPATCHER MODULE **
      HED DISP4 -- RTE-IV DISPATCHER
*     DATE:   2/16/77 
*     NAME:   DISP4 
*     SOURCE: 92067-18015 
*     RELOC:  PART OF 92067-16014 
*     PGMR:   G.A.A.,L.W.A.,D.L.S.,E.J.W.,C.M.M.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM DISP4,0 92067-16014 REV.1926 790221 
* 
***** AMD ***** JUL,73  GAA 
***** GSD ***** FEB,77  EJW 
* 
*   DISPATCHER ENTRY POINT NAMES
* 
      ENT $RENT,$BRED,$ZZZZ,$XCQ
      ENT $ALDM,$DMAL,$SMAP,$PRCN 
      ENT $XDM,$MAXP,$UNPE
      ENT $LOW,$HIGH
* 
      ENT $BG1,$BG2,$BG3,$BG4,$BG5
      ENT $RT1,$RT2,$RT3,$RT4,$RT5
      ENT $MM1,$MM2,$MM3,$MM4,$MM5
* 
*   DISPATCHER EXTERNAL REFERENCE NAMES 
* 
      EXT $MRMP,$MATA,$MPFT,$BGFR,$RTFR 
      EXT $EMRP,$RSRE,$ABRT,$XSIO,$DREQ 
      EXT $WATR,$TIME,$DREL,$TRRN,$SZIT 
      EXT $ABRE,$LIST,$RTST,$SGAF,$ERMG 
      EXT $MCHN,$MBGP,$MRTP,$CFR,$WORK
      EXT $IOCL,$IRT,$IDLE,$DVPT,$IDEX,$CMST
      EXT $SDA,$SDT2,$MNP,$XDMP 
      EXT $ABRE,$LIST,$RTST,$SGAF,$SCXX 
* 
* 
      SKP 
*           MAT ENTRY 
* 
*   WORD   DESCRIPTION
*          !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--!
*          !15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00!
*          !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--!
*          !  !        !        !        !        !        !
* MLNK   0 !00!         LINK TO NEXT ENTRY IN LIST         !
*          !  !        !        !        !        !        !
*          !--!--------!--------!--------!--------!--------!
*          !  !        !        !        !        !        !
* MPRIO  1 !00!          PRIORITY OF PARTITION OCCUPANT    !
*          !  !        !        !        !        !        !
*          !--!--------!--------!--------!--------!--------!
*          !  !        !        !        !        !        !
* MID    2 !00!         ID SEGMENT ADDRESS OF OCCUPANT     !
*          !  !        !        !        !        !        !
*          !--!--------!--------!--------!--------!--------!
*          !  !        !        !        !        !        !
* MADR   3 ! M!**  D ********     BEGIN PHYSICAL PAGE#     !
*          !@@!        !      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@!
*          !--!--------!--------!--------!--------!--------!
*          !  !        !        !        !        !        !
* MLTH   4 ! R! C ***********     NUMBER OF PAGES IN PTTN  !
*          !@@!        !      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@!
*          !--!--------!--------!--------!--------!--------!
*          !  !        !        !        !        !        !
* MRDFL  5 !RT!***********************************! STATUS !
*          !@@!        !        !        !        !        !
*          !--!--------!--------!--------!--------!--------!
*          !  !        !        !        !        !        !
* MSUBL  6 !00!       POINTER TO NEXT SUBPTTN OR 0         !
*          !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!
*          !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--!
*          !15!14 13 12!11 10 09!08 07 06!05 04 03!02 01 00!
*          !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--!
* 
* "@" MARKS THE PARTS WHICH ARE SET AT GENERATION TIME: 
* "*" MARKS THE RESERVED PARTS
* 
*  ACTIVITY                  PART'N STATUS         ID STATUS
*................................................................ 
*  PROGRAM BEING LOADED            0                    2 
*  PROGRAM IS IN PARTITION         1                   1-6
*  SWAPPING OUT                    2                   1-6
*  SEGMENT BEING LOADED            2                    2 
*  PROGRAM IS SWAPPED OUT          3                   1-6
*  SUBPARTITIONS BEING SWAPPED OUT 4                   1-6
*  SUBPARTITIONS ALL SWAPPED OUT   5                    1 
* 
      SKP 
* 
********************************************************************
* 
*        THE DISP MODULE OF THE REAL TIME EXECUTIVE PERFORMS:      *
*        1. IDLE LOOP IF NO PROGRAMS ARE SCHEDULED OR CAN'T BE EXECUTED 
*        2. SWITCHES PROGRAM EXECUTION SUCH THAT THE HIGHEST       *
*           PRIORITY EXECUTABLE PROGRAM EXECUTES.                  *
*        3. SETS THE FENCE REGISTER ACCORDING TO PROGRAM TYPE.     *
*        4. LOADS, SWAPS, AND EXECUTES DISC RESIDENT PROGRAMS      *
      SPC 2 
ABORT LDA B,I       GET POSSIBLE NEXT PGM 
      STA $ZZZZ     AND SET IT FOR ABORT
      CLA           CLEAR THE XSUSP ADDRESS 
      STA B,I       FOR THE NEXT START
      ADB DM8       BACK UP TO ID-SEG ADDRESS 
* 
      CPB BPOWN     DOES THIS GUY OWN THE CPU ? 
      STA BPOWN     YES, BUT NOT ANY MORE.
* 
      STB A         SAVE THE ID-SEG. ADDRESS
      STB TMP       A FEW TIMES 
      ADA D14       CHECK IF DISC RES.
      LDA A,I       PROGRAM 
      AND D15 
      STA ATMP      SAVE TYPE FOR LATER CHECK 
      CPA D1        IS IT DISC RES. PROG? 
      RSS            NO, SKIP.
      JSB DREL      RELEASE ANY SWAP TRACKS 
* 
      LDA ATMP      GET PROGRAM TYPE
      CPA D1        IF MEM RES A <> 0 
      RSS 
      CLA           IF DISC RES A = 0 
* 
      LDB TMP       RELEASE ANY RE-ENTRENT
      JSB $ABRE     MEMORY PROGRAM OWNS.
      LDB TMP       RELEASE ANY STRING STORAGE
      JSB $RTST      MEMORY THAT THE PROGRAM OWNS.
* 
      LDB TMP 
      JSB $WATR     SCHEDULE ANYONE WAITING 
      LDB TMP 
      LDA B 
      ADA D20 
      STA TEMP      SAVE ADDR OF FLAG WORD
      LDA A,I 
      ALF,ALF       GET FLAG WORD 
      SLA             ANY RESOURCES HELD? 
      JSB $TRRN      YES, RELEASE THEM
* 
      CLA           IF CURRENTLY
      LDB TEMP,I
      STA TEMP,I     (CLEAR FLAG WORD)
      SLB           IS HE SERIALLY REUSABLE 
      JMP $XCQ      YES,LEAVE IN MEMORY 
* 
      LDA ATMP      GET TYPE
      CPA D1        IS IT MEM RES?
      JMP $XCQ      YES,DONT FOOL WITH PARTITION
* 
      LDA TMP       GET ID SEG ADR
      JSB MATEN     GO SET UP POINTERS
      LDB MID,I     GET PARTITION OCCUPANT WORD 
      CPB TMP       IS PROG STILL RESIDENT? 
      RSS            YES
      JMP $XCQ       NO, DONT BOTHER WITH IT
* 
      LDA MLNK,I    DID PTTN GET UNDEFINED
      INA,SZA,RSS    BY A PARITY ERROR? 
      JMP X0154      YES. KILL POSSIBLE I/O TRANSFER
* 
      LDA MADR,I
      SSA           IS IT A MOTHER PTTN?
      JMP XN353      YES, MOVE PTTN FROM ALLOC TO FREE
* 
      LDB MFLGS 
      SSB           IS IT A REAL TIME PARTITION?
      JMP XN253      YES, RT. MOVE PTTN FROM ALLOC TO FREE
      JMP XN153      NO, BG. MOVE PTTN FROM ALLOC TO FREE 
      SPC 2 
DM8   DEC -8
D17   DEC 17
      SPC 2 
$MAXP NOP           RE-ESTABLISH MAXIMUM PTTN LIST SIZE WORDS 
      CLA           INIT ALL MAX SIZE WORD TO ZERO
      STA $MCHN 
      STA $MRTP 
      STA $MBGP 
      STA NUMCH     INIT ALL PTTN COUNTS BY TYPE TO ZERO
      STA NUMBG 
      STA NUMRT 
      LDA $MNP
      CMA,INA,SZA,RSS 
      JMP MXPDN     IN CASE 0, EXIT DONE
* 
      STA CNT       SAVE NEG NUMBER OF PTTN ENTRIES 
      LDA $MATA     START AT FIRST PTTN 
* 
MXPSL JSB MATAD     SET UP PTRS TO MAT ENTRY
      LDA MLNK,I
      INA,SZA,RSS   IS THIS ENTRY UNDEFINED?
      JMP MXPNX      YES, CHECK NEXT PTTN 
* 
      LDA MADR,I
      SSA           IS THIS A MOTHER PTTN?
      JMP MXPCH      YES, INCRE COUNT 
* 
      LDA MFLGS 
      SSA           IS THIS A RT PTTN?
      JMP MXPRT      YES, INCRE COUNT 
* 
      LDB DMBGP     SET ADDR OF BG POINTER
      ISZ NUMBG     INCRE COUNT OF BG PTTNS 
      JMP MXPSZ     CHECK PTTN SIZE FOR MAX 
* 
MXPCH LDB DMCHN     SET ADDR OF MOTHER PTTN PTR 
      ISZ NUMCH     INCRE COUNT OF CH PTTNS 
      JMP MXPSZ     CHECK PTTN SIZE FOR MAX 
* 
MXPRT LDB DMRTP     SET ADDR OF RT POINTER
      ISZ NUMRT     INCRE COUNT OF RT PTTNS 
* 
MXPSZ LDA MLTH,I
      RAL,CLE,ERA 
      SEZ           IS THIS PTTN RESERVED?
      JMP MXPNX      YES, SKIP MAX SIZE CHECK 
* 
      AND B1777     CHECK LENGTH OF THIS PTTN 
      STA TEMP       AGAINST MAX SIZE SO FAR
      CMA,INA 
      ADA B,I 
      SSA,RSS       IS THIS ONE LARGER? 
      JMP MXPNX      NO, TRY NEXT PTTN
* 
      LDA TEMP       YES, SET UP NEW MAX
      STA B,I 
* 
MXPNX LDA MLNK
      ADA MATSZ     INCRE TO NEXT PTTN MAT ENTRY
      ISZ CNT       DONE YET? 
      JMP MXPSL      NO, DO NEXT PTTN 
* 
MXPDN LDA NUMCH      YES, DONE
      SZA,RSS       SET THE PROPER FREE LIST PTR
      STA $CFR       TO ZERO IF THE LIST IS EMPTY 
      LDA NUMRT      FOR THE LSTIN SUBROUTINE 
      SZA,RSS 
      STA $RTFR 
      LDA NUMBG 
      SZA,RSS 
      STA $BGFR 
      JSB LSTIN     RE-INIT MAT LIST PTRS 
      JMP $MAXP,I   RETURN
* 
* 
NUMCH NOP           0 AT BOOT UP
NUMBG NOP           0 AT BOOT UP
NUMRT NOP           0 AT BOOT UP
DMCHN DEF $MCHN+0 
DMBGP DEF $MBGP+0 
DMRTP DEF $MRTP+0 
* 
* 
*     INITIALIZE PARTITION MEMORY ALLOCATION TABLE ENTRY LIST POINTERS
*     CALLED BY BOTH DISPATCHER'S STARTUP CODE AND $MAXP
* 
LSTIN NOP 
      LDA $RTFR     IS THERE A RT LIST OR 
      CPA NUMRT      WERE ANY IN ALLOC' LIST WHEN A 
      SZA            PARITY ERROR OCCURRED? 
      JMP LSTI1      YES, CHECK BG LIST 
* 
      LDA ABGFR      NO, SET UP RT TO SAME AS BG
      STA ARTFR 
      LDA ABGPR 
      STA ARTPR 
      LDA ABGDM 
      STA ARTDM 
      LDA $MBGP 
      STA $MRTP 
      JMP LSTI2 
* 
LSTI1 LDA $BGFR     IS THERE A BG LIST OR 
      CPA NUMBG      WERE ANY IN ALLOC' LIST WHEN A 
      SZA            PARITY ERROR OCCURRED? 
      JMP LSTI2      YES, CHECK MOTHER PTTN LIST
* 
      LDA ARTFR      NO, SET BG LIST POINTERS TO RT 
      STA ABGFR 
      LDA ARTPR 
      STA ABGPR 
      LDA ARTDM 
      STA ABGDM 
      LDA $MRTP 
      STA $MBGP 
* 
LSTI2 LDA $CFR      IS THERE A MOTHER PTTN LIST OR
      CPA NUMCH      WERE ANY IN ALLOC' LIST WHEN A 
      SZA            PARITY ERROR OCCURRED? 
      JMP LSTIN,I    YES, RETURN
* 
      LDA ABGFR      NO, SET MOTHER LIST SAME AS BG 
      STA ACHFR 
      LDA ABGPR 
      STA ACHPR 
      LDA ABGDM 
      STA ACHDM 
      LDA $MBGP 
      STA $MCHN 
      JMP LSTIN,I   RETURN.  AT LEAST ONE LIST REQUIRED 
* 
* 
      SKP 
*     CALLING SEQUENCE
*     JMP $XCQ      DIRECT ENTRY IN SYSTEM MAP
*               OR
*     JMP $XEQ      ENTRY VIA TABLE AREA I IN EITHER MAP
* 
$XCQ  LDB $ZZZZ     CHECK IF PROGRAM TO BE ABORTED
      SZB 
      JMP ABORT     YES GO HANDLE IT
      LDB $LIST     IF LIST NOT ENTERED 
      SZB,RSS       THEN NOTHING NEW SO 
      JMP $IRT      GO CONTINUE CURRENT PGM 
* 
X0005 LDA SKEDD     LOAD TOP OF SCHEDULE LIST 
      CLB 
      STB $LIST     PREVENT NEEDLESS LIST SCANS 
      RSS           SKIP FIRST TIME 
X0035 LDA ZWORK,I   GET THE NEXT PGM IN THE LIST
      SZA,RSS       ANY MORE IN SKEDD LIST? 
      JMP ILOOP      NO, GO TO IDLE LOOP
* 
      CPA SGSUP     IS THIS PROG SEGMENT SUSPENDED? 
      LDA A,I        YES, SKIP TO NEXT PROG 
      SZA           IF ZERO,THEN NO PROG SCHED
      JMP X0010    GO TO PROCESS SCHED LIST 
* 
*     NO PROGRAM SCHEDULED--SETUP FOR IDLE LOOP 
*                                                                  *
*        THE IDLE LOOP SECTION CONSISTS OF:                        *
*              CLEARING XEQT WORD TO SIGNIFY THAT NO PROGRAM       *
*                   CURRENTLY EXECUTING.                           *
*              STORE ADDRESS OF 4 DUMMY WORDS INTO XSUSP-XSUSP+3   *
*                   DUE TO I/O PROCESSING.                         *
*              SET MEMORY PROTECT REGISTER TO ZERO.                *
*              CALL INTERRUPT RESTORE ROUTINE, $IRT 
*              JUMP TO *                                           *
*                                                                  *
ILOOP STA FENCE     SET THE FENCE TO ZERO 
      OTA 5 
      STA XEQT     CLEAR XEQT ADDRESS VALUE 
      LDB DIDLE 
      RSS 
      LDB B,I       GET DIRECT ADDR 
      RBL,CLE,SLB,ERB   FOR IDLE LOOP 
      JMP *-2 
      STB XSUSP     SET BASE PAGE POINTERS
      INB            TO POINT TO DUMMY
      STB XA         LOCATIONS. 
      STB XB
      STB XEO 
      STB XI
      JMP $IRT      GO TO IDLE LOOP (JMP *) 
* 
DIDLE DEF $IDLE+0   DIRECT ADDR TO IDLE LOOP
      SKP 
* 
*        THE SWITCHING SECTION USES THE SCHEDULE LIST TO DETERMINE *
*        WHICH PROGRAM TO EXECUTE-STARTING FROM TOP OF LIST.       *
*              IF PROGRAM FROM LIST OF LOWER OR EQUAL PRIORITY,    *
*                   THEN EXECUTION OF CURRENT PROGRAM CONINUES.   * 
*              IF PROGRAM FROM LIST OF HIGHER PRIORITY AND         *
*                   TYPE EITHER REAL TIME RESIDENT OR BACKGROUND   *
*                        RESIDENT, EXECUTION SWITCHING TAKES PLACE.*
*                   TYPE IS BACKGROUND DISC RESIDENT,              *
*                        GO TO BACKGROUND DISC PROCESSING.         *
*                   TYPE IS REAL TIME DISC RESIDENT, GO TO REAL    *
*                        TIME DISC RESIDENT PROCESSING             *
* 
X0010 STA ZWORK    SCHED LIST PROG ID SEG ADDRESS 
      ADA D6
      STA ZPRIO     PRIORITY ADDRESS
      ADA D8
      STA ZTYPE    TYPE ADDRESS 
      ADA D7
      STA ZMPID     MAP WORD ADDRESS
      ADA D7
      STA ZEMA      EMA WORD (ID WORD 28) 
      LDA A,I 
      JSB IDXAD     GET ID EXT ADDR 
       JMP X0012      NOT EMA, CLEAR ZIDEX
X0012 STA ZIDEX     SAVE ADDR OF ID EXT OR 0
* 
*     CHECK IF CURRENT PGM IS STILL TOP.
* 
      LDA XEQT    SEE IF PROGRAM CURRENTLY EXECUTING
      SZA,RSS       YES  SKIP 
      JMP X0030     NO, SO GO XECUTE IT 
* 
      ADA D15      CHECK STATUS OF XEQT ID SEGMENT
      LDA A,I 
      AND D15       MASK TO MAJOR STATUS
      CPA D1
      RSS          SCHEDULED-SO GO TO CHECK PRIORITY
      JMP X0030    NOT SCHEDULED -SO GO SWITCH
* 
      LDA XPRIO,I   LOAD TEST PROGRAM PR
      CMA,INA       MAKE NEGATIVE 
      ADA ZPRIO,I   SUPTRACT FROM CURRENT PGM PR. 
      SSA,RSS       IF SIGN A=0 THEN PROG OF HIGHER PR
      JMP $RENT     PROGRAM OF HIGHER PRIORITY
* 
*     CHECK PROGRAM TYPE
* 
X0030 LDA ZTYPE,I  PROGRAM TYPE 
      AND D15 
      CPA D1        CHECK IF MEMORY RESIDENT
      JMP X0F40      YES, SET UP TO RUN NOW 
* 
      LDB ZMPID,I 
      SSB           ASSIGNED TO A PARTITION?
      JMP PCHK       YES, GO SEE WHAT TYPE
* 
      LDB ZIDEX 
      SZB           IS THIS AN EMA PROG?
      JMP X0300      YES
* 
      CPA D2        REAL TIME DISC RESIDENT?
      JMP X0200      YES
* 
      CPA D3        BACKGROUND DISC RESIDENT? 
      JMP X0100      YES, TREAT AS BG 
* 
      CPA D4        LARGE BACKGROUND DISC RESIDENT? 
      JMP X0100      YES
* 
      JMP X0035     NOT LEGAL TYPE, IGNORE
* 
PCHK  LDA B         ASSIGNED TO PTTN AT LOAD TIME?
      AND B77 
      MPY MATSZ 
      ADA $MATA      GET PTTN ADDR
      ADA D3
      LDB A,I 
      SSB           IS IT MOTHER PTTN?
      JMP X0300      YES
* 
      ADA D2        GET FLAG WORD 
      LDA A,I 
      SSA           IS IT RT? 
      JMP X0200      YES
      JMP X0100     NO,BACKGROUND 
* 
ATMP  NOP 
MPN   NOP             INDEX TO MPFT, BP FLAG
LTH   NOP 
LSTHD NOP 
NPGN  NOP 
SPRIO NOP 
BPOWN NOP           BPOWN IS CURRENT OWNER OF BP & THUS CPU 
      HED DISP4 -- SET UP PROGRAM ID SEG ADR IN XEQT AREA 
* 
* 
********************************************************************
* 
*     OK, WE HAVE ARRIVED AT THE POINT THAT WE KNOW WHICH 
*     PROGRAM WE INTEND TO EXECUTE.  SO LETS SET UP THE 
*     BASE PAGE POINTERS ON BEHALF OF THE NEW XEQT PROGRAM. 
* 
*     REMEMBER XEQT OWNS ALL OF BASE PAGE FOR AS LONG AS HE 
*     EXECUTES.  ON SIMPLE INTERUPTS WE DON'T NEED TO RESET 
*     UP BASE PAGE BECAUSE IT IHAS ALREADY BEEN SET UP TO 
*     BELONG TO XEQT. 
* 
********************************************************************
* 
* 
* 
* 
*             ******************************************
*             *                                        *
*             *  INITIAL (RE)DISPATCH OF MEM RES PROG  *
*             *                                        *
*             ******************************************
* 
* 
X0F40 LDA ZWORK     GET THE ID OF PROG WE WANT TO DISPATCH
      LDB ZMPID 
      CPA BPOWN     DOES HE ALREADY OWN CPU ? 
      JMP XRENT     YES, SO SKIP THE BASE PAGE SET UP 
* 
      CLA 
      STA XMATA 
      STA XIDEX 
* 
      LDA $EMRP 
      LDB A         GET THE MEM RES BP LIMITS.
      JMP RTSET     NOW SET EM UP.
* 
* 
*             ******************************************
*             *                                        *
*             *   INITIAL (RE)DISPATCH DISC RES PROG   *
*             *                                        *
*             ******************************************
* 
* 
X0040 LDA ZWORK     GET THE ID OF PROG WE WANT TO DISPATCH
      LDB ZMPID 
      CPA BPOWN     DOES HE OWN THE CPU ? 
      JMP XRENT     YES, SO SKIP THE BASE PAGE SET UP.
* 
      LDA MLNK      GET THE MATA LINK ADDRESS 
      STA XMATA     SET INTO BASE PAGE
      LDA ZIDEX     SAME WITH EMA PROG FLAG 
      STA XIDEX 
* 
      LDB ZWORK 
      ADB D21 
      LDA B,I       GET LENGTH OF PROG
      AND B76K
      ADA DM1 
      STA LTH 
      ADB DM7 
      LDA B,I       GET TYPE
      ADB D8        INDEX TO LOW MAIN 
      LDB B,I       B = LOW MAIN, A = TYPE WORD 
* 
      ERA,RAR       NOW SET  E= 0 FOR RT PROGRAM
      SEZ,CCE,SLA,RSS   AND  E= 1 FOR BG PROGRAM
      CLE 
* 
      LDA B         A = B = LOW MAIN
      ADA LTH       A = XX777   IE HIGHEST ADDRESS OF PROGRAM 
      SEZ,RSS       THIS A RT PROGRAM ? 
      JMP RTSET     YES.
* 
      STB BGDRA     NO, BG.  SET UP THE BASE PAGE 
      ADB DM1       B = LOW MAIN - 1
      STB AVMEM 
      JMP R.SET 
* 
RTSET STA BGDRA     SET UP THE RT BP WORDS
      STA AVMEM 
R.SET STA BGLWA 
      STB RTDRA 
* 
      LDB ZWORK     GET THE ID SEG ADDRESS AND
      ADB D21       INDEX TO MEMORY PROTECT FENCE SETTING 
      LDA B,I 
      RAL,ALF 
      ALF           SET UP THE VALUE FOR LATER
      AND D7
      STA MPN        MPN = INDEX INTO MEMORY PROTECT FENCE
* 
XRENT INB 
      LDA B,I 
      STA XI         SET AS X REGISTER SAVE AREA
* 
      LDB ZWORK      !!!!!!!!!!!!!!  COMMIT  !!!!!!!!!!!!!!!! 
      STB XEQT       !!!!!!!!!!!!!!  RTE IV  !!!!!!!!!!!!!!!! 
* 
      STB BPOWN      BPOWN IS THE CURRENT OWNER OF BASE PAGE
      LDA DM12      LOAD PROGRAM TO BE EXECUTED 
      STA TMP       INTO XEQT AREA
      LDA XQDEF 
X0041 STB A,I 
      INA 
      INB 
      ISZ TMP 
      JMP X0041 
* 
      LDB XSUSP,I  CHECK IF PROGRAM SUSPENDED 
      CMB,INB,SZB   IF SO THEN
      JMP $RENT     GO SET IT UP
      LDB XPENT,I   GET PRIMARY ENTRY PT. 
      STB XSUSP,I   SET ENTRY ADDRESS 
* 
* 
      SKP 
*             ******************************************* 
*             *                                         * 
*             *             CONTINUE WITH XEQT          * 
*             *                                         * 
*             ******************************************* 
* 
* 
*            CHECK IF POINT OF SUSPENSION IS LIBRARY AREA 
* 
* 
* 
$RENT LDA XEQT       (RETURN FROM EXEC) INDEX TO TYPE 
      ADA D14           WORD
      STA ZTYPE            AND SAVE FOR A MOMENT
      LDA A,I 
      LDB $MRMP       & ADDRESS OF MEM RES MAP
      AND D7          KEEP ONLY TYPE BITS 
      CPA D1          THIS A MEM RES PROG ? 
      USB             YES, SO SET UP USER MAP 
* 
      LDB XEQT      GET THE RENT BIT
      ADB D20 
      LDB B,I       GET THE WORD
      BLF,RBL       ROTATE TO PUT RENT BIT IN SIGN
      SSB,RSS       IF RENT NOT IN CONTROL
      JMP X0028     GO SET FENCE
* 
      SLB           IF MEMORY MOVED 
      JSB $RSRE     GO RESTORE IT 
      LDA ZTYPE,I 
      ERA,RAR 
      CMA,SSA,SLA,RSS  IS THE PROG MEM RESIDENT ? 
      JMP X0028      NO, DISC RES CAN'T BE USING MEM RES LIB
* 
      LDA LBREG     MEMORY RESIDENT AND REENTRANT 
      LDB LB#PG 
      CBX           CLEAR WRITE-PROTECT BITS FROM 
      LDB LBPG#      RESIDENT LIBRARY PAGES 
      XMS 
      LDA MPN       CHECK MRP'S MPFTI 
      ARS 
      SZA           MPN > 1 ? 
      JMP X0028      YES, USE THAT MP FENCE SETTING 
* 
      LDA LBORG      NO, LOWER MP FENCE FOR M.R.L.
      JMP X0029      FROM MRP WITH NO COMMON
* 
* 
*     SET MEMORY PROTECT ACCORDING TO PROG TYPE 
* 
* ID SEG WORD 21  !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! 
*                 !RP/   #PAGES     / MPFTI  /**/  PARTITION #    ! 
*                 !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! 
*                 !15!14 13 12!11 10 09!08 07 06!05 04 03!02 01 00! 
* 
*  MPFTI (MPN) = 0  DISC RESIDENT(TYPE 4), NO COMMON
*                1  MEMORY RESIDENT, NO COMMON
*                2  ANY PROGRAM, RT COMMON
*                3  ANY PROGRAM, BG COMMON
*                4  ANY PROGRAM, SSGA 
*                5  DISC RESIDENT(TYPE 2 & 3), NO COMMON
* 
X0028 LDA MPN       GET MPFT INDEX
      ADA $MPFT 
      LDA A,I       GET FENCE 
X0029 STA FENCE 
      OTA 5B
* 
*    RESTORE REGISTERS, MEMORY PROTECT, AND TURN ON INTERRUPT SYSTEM
* 
      JMP $IRT      GO EXECUTE THE PROGRAM
* 
XQDEF DEF XLINK 
* 
LBREG NOP           RES. LIB. REGISTER # IN USER MAP
LBPG# NOP           RES. LIB. PHYSICAL PAGE # 
LB#PG NOP           RES. LIB. SIZE IN # OF PAGES
      HED DISP4 -- BUFFERS, CONSTANTS, POINTERS, ETC
* 
ZIDEX NOP 
ZEMA  NOP 
ZMPID NOP 
* 
ZWORK NOP          SCHED LIST ID SEGMENT ADDRESS
ZPRIO NOP          SCHED LIST PRIORITY LIST 
ZTYPE LDB SKEDD    SCHED LIST PRIORITY ADDRESS
      SPC 1 
TEMP  ADB D6       TEMPORARY WORKING STORAGE AREA 
TEMP1 STB ZPRIO 
TEMP2 INA 
TEMP3 LDB B,I 
TEMP4 STB A,I 
TEMP5 CLB 
TEMP6 STB ZPRIO,I 
ZEXIT JMP $ZZZZ,I 
TMP   NOP           TEMPORARY WORKING STORAGE 
TMP1  NOP 
TMP2  NOP 
CN#SC NOP         CURRENT # SECTORS/TRACK (-) 
* 
DM12  DEC -12 
DM3   DEC -3
* 
D1    DEC 1 
D2    DEC 2 
D4    DEC 4 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
D8    DEC 8 
D14   DEC 14
D15   DEC 15
D20   DEC 20
D21   DEC 21
D22   DEC 22
D27   DEC 27
D32   DEC 32
D33   DEC 33
* 
C77   OCT 177700
* 
B7    EQU D7
B17   EQU D15 
B37   OCT 37
B77   OCT 77
B100  OCT 100 
B177  OCT 177 
B377  OCT 377 
B1777 OCT 1777
B76K  OCT 76000 
* 
      HED DISP4 -- USER MAP BUILDING ROUTINES 
********************************************
*ROUTINE TO SET USER MAP    CALLED BY DISP4 AND RTIO4 
*CALL:
*         (B) =ADDR MAT ENTRY 
*         (E) = 0  REBUILD USER MAP, SAVE IN BP COPY
*         (E) = 1  USE CURRENT BP COPY OF USER MAP, IF ANY
*         JSB $SMAP 
*          <RETURN>    REGISTERS MEANINGLESS
********************************************
* 
* 
$SMAP NOP 
      STB XMAT      SAVE MAT ENTRY ADDR 
      ADB D2
      LDA B,I       GET ID SEG ADDR 
      STA XIDA
      ADA D8
      LDA A,I 
      SEZ,SZA       PT SUSP=0?  OR  (E)=0?
      JMP REMAP      NO, USE BP COPY OF USER MAP
* 
      INB            YES, HAVE TO REBUILD USER MAP
      LDA B,I 
      AND B1777 
      STA XSTP      SAVE PTTN START PAGE #
* 
      LDB XIDA
      ADB D21 
      LDA B,I 
      AND B76K      GET BITS 10-14
      ALF 
      RAL,RAL 
      STA XNUM      SAVE # OF PROG PAGES
* 
      LDA B,I 
      ALF,ALF 
      RAL 
      AND B7        GET MPFT INDEX VALUE
      SZA,RSS 
      JMP NOCOM      =0, DISC RES(TYPE 4), NO COMMON
* 
      LDA XIDA       =2,3,4 TYPE BG/RT USING COMMON 
      ADA D14         OR TYPE 2 OR 3 WITHOUT COMMON 
      LDA A,I 
      AND B7        GET ID SEG TYPE 
      CCB           SET UP FOR TYPES 2,3, OR 4 WITH COMMON
      ADB $SDA
      CLE 
      CPA D2        IS IT TYPE 2? 
      RSS            YES, RT NEEDS TAII + SDA 
      CPA D3        IS IT TYPE 3? 
      CCE            YES, SET E=1  MAP COMMON + TAII + SDA
      JMP SYSRG      NO, LEAVE E=0  MAP ONLY COMMON 
* 
NOCOM CCB           NO COMMON, TYPE 4 
      ADB $CMST 
      CLE           (E)=0 FOR NOT PRIVILEGED
* 
SYSRG CBX           (X)= # PAGES IN TABLES, ETC.
      LDA D33       (A)= START REG # 33 FOR USER MAP
      CLB,INB       (B)= 1
      XMS 
      SEZ,RSS       PRIVILEGED PROG?
      JMP USERG      NO 
* 
      LDB $SDT2      YES, SET WRITE PROTECT BIT 
      CBX           (X)= # PAGES IN SDA + $$TB2 
      LDB $SDA
      ADB WRPRT     (B)= PAGE # OF SDA WITH WRITE PROTECT 
      XMS 
* 
USERG LDB XNUM      NOW MAP USER CODE PAGES 
      CBX 
      LDB XSTP
      INB 
      XMS           MAP USER PROGRAM
* 
      LDB A 
      CMB,INB 
      ADB B100
      CBX           (X)= # REGISTERS LEFT 
      LDB RWPMP     (B)= READ-WRITE PROTECT FLAGS SET 
      XMS 
* 
      CLB,INB 
      CBX           (X)= 1 REGISTER 
      LDB XSTP      (B)= 1ST PAGE OF PTTN FOR BASE PAGE 
                                                                                                                                                                                                                              