ASMB,R,L,C     ** RTE-M DISPATCHER MODULE **
* 
*     NAME  : $MDI1 
*     SOURCE: 92064-18004 
*     RELOC:  PART OF 92064-16001 
*     PROGMR: E.J.W.  BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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 $MDI1,0  92064-16001  REV.1726  770512
* 
      SUP 
* 
*   DISPATCHER ENTRY POINT NAMES
* 
      ENT $RENT,$ZZZZ,$XEQ
      ENT $MPFT,$EMRP,$CON
* 
*   DISPATCHER EXTERNAL REFERENCE NAMES 
* 
      EXT $WATR,$IRT,$ABRE,$LIST
      EXT $MIC
      MIC STR,105623B,1     SEQUENTIAL STORE VALUE
      SKP 
*        THE DISPA MODULE OF THE HP-2100 REAL TIME EXECUTIVE       *
*    PERFORMS THE FOLLOWING FUNCTIONS:                             *
*        1. IDLE LOOP WHEN NO PROGRAMS ARE SCHEDULED OR CANNOT 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      *
* 
*     CALLING SEQUENCE
*     JMP $XEQ
* 
* 
$XEQ  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 
* 
      LDA SKEDD     LOAD TOP OF SCHEDULE LIST 
      CLB 
      STB $LIST     PREVENT NEEDLESS LIST SCANS 
      RSS           SKIP FIRST TIME 
      LDA ZWORK,I   GET THE NEXT PGM IN THE LIST
      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 *                                           *
*                                                                  *
      STA XEQT      SET BP POINTERS TO DUMMY ID 
      LDB VSUSP 
      STB XSUSP 
      INB 
      STB XA        SET POINTERS TO DUMMY REGS
      STB XB
      STB XEO 
      STB XI        SET X,Y REG POINTER TO DUMMY
      JMP X0029     SET UP MP FENCE, EXIT 
* 
IDLE  JMP *        IDLE LOOP
* 
VSUSP DEF *+1 
      DEF IDLE
      NOP 
      NOP 
      SKP 
ABORT LDA B,I       GET POSSIBLE NEXT PGM 
      STA $ZZZZ     AND SET IT FOR ABORT
      CLA           CLEAR THE XSUSP ADDRESS 
STABI STA B,I       FOR THE NEXT START
      ADB DM8       BACK UP TO ID-SEG ADDRESS 
      STB A         SAVE THE ID-SEG. ADDRESS
      STB TMP       A FEW TIMES 
      JSB $ABRE     RELEASE ANY RE-ENTRANT MEMORY.
* 
      LDB TMP 
      JSB $WATR     SCHEDULE ANYONE WAITING 
      LDB TMP 
      ADB D20 
      CLA 
      STA B,I       CLEAR ID WORD 21
      JMP $XEQ      ABORTION DONE.
* 
      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
* 
      LDA XEQT    ANY PROGRAM CURRENTLY EXECUTING?
      SZA,RSS       YES, TEST FOR HIGHEST PRIORITY
      JMP X0030     NO, EXECUTE NEW SCHEDULED PROG
      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 RNOLD     CURR PROG HIGHER PRIOR THAN SCHED PROG
* 
* 
* 
* 
X0030 EQU * 
      CLA 
      STA MPN       STORE MPFT INDEX
      LDA ZWORK 
      ADA MI        GET ADR FOR INDEX REGISTERS 
      STA XI        SET POINTER TO INDEX REGISTERS
      ADA D30 
      STA $CON      SET POINTER TO CONSOLE LU (WORD 29) 
* 
      LDA ZWORK     IF SAME AS CURRENT PGM
      CPA XEQT      THEN
      JMP $RENT     SKIP BASE PAGE SET UP.
      JSB $X041     SET UP BASE PAGE ID SEG PTRS
      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 
* 
*      CHECK IF PT OF SUSPENSION IN LIBRARY AREA
* 
$RENT EQU * 
      LDB XTEMP+4   GET THE RENT BIT
      ADB D15 
      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
      LDA LBORG     SET THE LIBRARY FENCE 
      JMP X0029     GO SET IT UP
* 
* 
* 
$X041 NOP           SET UP B.P. ID SEG PTRS 
      LDB DM12       (12 WORDS) 
      STB TMP 
      LDB XQDEF     PUT THEM AT XEQT
      STA XEQT
X0041 JMP MIC  OR STA B,I  IF NO MICRO
      INA 
      INB 
      ISZ TMP 
      JMP X0041 
      JMP $X041,I   RETURN WHEN DONE
* 
XQDEF DEF XLINK 
* 
MIC   STR 12        CALL MICROCODE
      JMP $X041,I   RETURN
* 
RNOLD LDA XEQT      RESET POINTERS FOR CURR PROG
      STA ZWORK      SINCE WE WILL NOT RUN SCHED PROG 
      ADA D14 
      STA ZTYPE 
      ADA D7
      STA ZMPID 
      JMP $RENT 
* 
* 
* 
*     SET MEMORY PROTECT ACCORDING TO PROG TYPE 
* 
* 
X0028 LDA MPN       GET MPFT INDEX
      ADA $MPFT 
      LDA A,I       GET FENCE 
X0029 STA FENCE 
* 
*    RESTORE REGISTERS, MEMORY PROTECT, AND TURN ON INTERRUPT SYSTEM
* 
      JMP $IRT      GO EXECUTE THE PROGRAM
      SPC 3 
*         XEQ PROCESSOR--BUFFERS, CONSTANTS, POINTERS, ETC
* 
* 
ZWORK NOP          SCHED LIST ID SEGMENT ADDRESS
ZPRIO NOP          SCHED LIST PRIORITY LIST 
ZTYPE NOP          SCHED LIST TYPE ADDRESS
ZMPID NOP          SCHED LIST MAP & MPFTI WORD
TMP   NOP           TEMPORARY WORKING STORAGE 
* 
D1    DEC 1 
D6    DEC 6 
D7    DEC 7 
D8    DEC 8 
D14   DEC 14
D15   DEC 15
D20   DEC 20
D30   DEC 30
DM8   DEC -8
DM12  DEC -12 
* 
$EMRP NOP           FWA SAM-1 (SET BY GENERATOR)
$MPFT NOP           ADDR M.P. FENCE TABLE (SET BY GENERATOR)
MPN NOP             INDEX TO MPFT, BP FLAG
MI    DEC -2        NEG # OF INDEX REGS 
      SPC 2 
*                MPFT INDEX 
* 
*  BUILT BY THE GENERATOR AS FOLLOWS: 
*        0  ON-LINE ADDED PROGRAM, NO COMMON
*        1  SYSTEM GENERATED PROGRAM, NO COMMON 
*        2  RT COMMON, ANY PROGRAM
*        3  -- NOT USED --
*        4  SSGA, ANY PROGRAM 
* 
* 
      HED SYSTEM START UP 
********************************************************************
*        THE START SECTION:                                        *
*              CLEARS INTERRUPT SYSTEM                             *
*              INITIALIZES MAPS IN RTE-M III                       *
********************************************************************
* 
$ZZZZ NOP 
      CLC 0         CLEAR INTERRUPT SYSTEM
      LDB STABI 
      LDA $MIC
      SZA,RSS       ANY MICRO?
      STB X0041      NO, PUT STA B,I THERE
      JMP $ZZZZ,I   END DISPATCHER INITIALIZE 
* 
      ORG *         SIZE OF MODULE
      HED ** SYSTEM BASE PAGE COMMUNICATION AREA ** 
* 
* 
*** SYSTEM BASE PAGE  COMMUNICATION  AREA *** 
* 
XI    EQU 1647B 
.     EQU 1650B     ESTABLISH ORIGIN OF AREA
* 
* SYSTEM TABLE DEFINITION * 
* 
* DEFINITION OF SYSTEM LISTS (QUEUES) * 
* 
SKEDD EQU .+33      'SCHEDULE' LIST,
* 
* DEFINITION OF EXECUTING PROGRAM  ID SEGMENT' *
* 
XEQT  EQU .+39     ID SEGMENT ADDR. OF CURRENT PROG.
XLINK EQU .+40       'LINKAGE'
XTEMP EQU .+41       'TEMPORARY (5-WORDS) 
XPRIO EQU .+46       'PRIORITY' WORD
XPENT EQU .+47       'PRIMARY ENTRY POINT'
XSUSP EQU .+48       'POINT OF SUSPENSION'
XA    EQU 1731B 
XB    EQU 1732B 
XEO   EQU 1733B 
* 
* 
* DEFINITION OF MEMORY ALLOCATION BASES * 
* 
LBORG EQU .+61     FWA OF RESIDENT LIBRARY AREA 
* 
* UTILITY PARAMETERS
* 
$CON  EQU 1736B     POINTER TO CURRENT SESSION TABLE
FENCE EQU .+85      MEM PROTECT FENCE ADDRESS 
* 
* 
* 
* 
A     EQU 0B        LOCATION OF A REGISTER
B     EQU 1B        LOCATION OF B REGISTER
* 
      ORG *         PROGRAM LENGTH
      END $ZZZZ 
                                                          