ASMB,R,L,C  ** RTE-M I  MULTI-PROGRAM SCHEDULING MODULE **
      HED  ** RTE-M I  MULTI-PROGRAM SCHEDULING MODULE ** 
* 
*     NAME  : $MMP
*     SOURCE: 92064-18018 
*     RELOC:  92064-16006 
*     PROGMR: E.J.W.,J.U.F. 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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 $MMP,0  92064-16006  REV.1940  780716 
* 
      ENT $SABR,$MPT1,$MPT4,$MPT5,$MPT7 
      EXT $TREM,$WORK,$LIST,$XEQ,$WATR,$PRAM
      EXT $TIMR,$TNAM,$ERAB,$IOCL,$ABRT 
* 
      SPC 1 
* 
*     THE SOFT ABORT ROUTINE CLEARS ANY RESOURCE FLAGS
*     CALLS THE TERMINATION ROUTINE AND REMOVES A PROGRAM FROM
*     THE TIME LIST.
* 
*     IT ALSO SETS THE ABORT FLAG (100000) IN THE FATHERS ID-SEG. 
*     (IF THERE IS A FATHER AND HE IS WAITING) SO THAT RMPAR
*     MAY RECOVER THE PRAMETER. 
* 
*     IF THE PROGRAM IS WAITING FOR A SON IT CLEARS THE SONS
*     "FATHER IS WAITING" FLAG. 
* 
*     CALLING SEQUENCE: 
* 
*     LDB ID-SEG. ADDRESS 
*     JSB $SABR 
* 
*     RETURN REGISTERS MEANING LESS.
* 
*     THIS ROUTINE DOES NOT GENERATE AN ABORT MESSAGE NOR DOES IT 
*     PULL A PROGRAM OUT OF AN I/O LIST. ($LIST DOES SET A FLAG 
*     WHICH WILL PUT THE PROGRAM DORMANT ON I/O COMPLETION. 
* 
$SABR NOP 
      STB TEMPH     SAVE THE ID ADDRESS 
      ADB D16       GET ADDR OF TIME LIST WORD
      JSB $TREM     REMOVE PGM FROM THE TIME LIST 
      LDB TEMPH     RESTORE THE ID ADDRESS AND
      ADB D15       INDEX TO THE STATUS WORD
      LDB B,I       AND FETCH IT
      BLF,SLB       IF PROGRAM'S WAITING FOR SON
      JMP SABT2      GO CLEAR THE SON'S FLAG
* 
SABT1 LDB TEMPH     RESTORE THE ID-SEG. ADDRESS AND 
      JSB TERM      CALL THE TERMINATION PROCESSOR
      ISZ POP       STEP TO THE FATHER'S FIRST PRAM WORD
      RSS 
      JMP $SABR,I 
      LDA SIGN      SET SIGN BIT FOR FATHER ABORT FLAG
      STA POP,I     SET THE ABORT FLAG
      LDB POP       CACULATE THE B-REG ADDRESS
      ADB D9        AND 
      LDA POP   SET IT TO 
      STA B,I       POINT TO THE ABORT WORD 
      JMP $SABR,I   DONE RETURN 
* 
SABT2 LDB TEMPH     GET THE SONS ID ADDRESS 
      INB           FROM WORD TWO 
      LDB B,I       OF THE ID-SEGMENT 
      ADB D20       INDEX TO THE FATHER WAIT FLAG WORD
      LDA B,I       GET THE WORD
      RAL,CLE,RAL   CLEAR BIT 14
      ERA,RAR       AND 
      STA B,I       RESTORE THE WORD
      JMP SABT1     GO TERMINATE THE PROGRAM
      SPC 2 
D12   DEC 12
D14   DEC 14
      SPC 1 
*         MEMORY PROTECT VIOLATION SCHEDULER PREPROCESSORS
******************************************************************* 
*        THE $MPT1 THRU $MPT7 PREPROCESSORS CONSIST OF MEMORY 
*        PROTECT VIOLATION CALLS FROM EXEC THAT INVOLVE LIST
*        PROCESSING.
*        THE FOLLOWING REQUESTS ARE HANDLED:
*              PROGRAM COMPLETION (DORMANT) 
*              SUSPEND (OPERATOR) 
*              BACKGROUND SEGMENT LOAD
*              SCHEDULE WITH WAIT 
*              SCHEDULE WITHOUT WAIT
*              CURRENT SYSTEM TIME (TIME ROUTINE CALL)
*              SET ID SEGMENT TIME VALUES (TIMER ROUTINE CALL)
******************************************************************* 
      SPC 3 
* 
*     DORMANT REQUEST - PROGRAM HAS RUN TO COMPLETION 
* 
$MPT1 JSB GETID     GET THE ID-SEGMENT ADDRESS OF AFFECTED
      STB P2        PROG - SAVE ID ADDRESS FOR PRAM MOVE
      CPB XEQT      IF CURRENT PGM. SKIP
      JMP MPT1A     FATHER CHECKS 
* 
      ADB D20       CHECK FOR FATHER KILLING SON
      CCA 
      ADA B,I 
      AND B377      STEP TO FATHER PTR
      ADA KEYWD     ADDRESS OF FATHER'S ID IN A 
      LDA A,I 
      CPA XEQT      CURRENT PROGRAM?
      RSS            YES SKIP 
      JMP ESC04      NO GO FLUSH
* 
      LDB $WORK     RESTORE THE ID-SEGMENT ADDRESS TO B 
* 
MPT1A LDA RQRTN     UPDATE RETURN (B)= ID ADDR
      STA XSUSP,I 
      CLA           SET A TO ZERO IN CASE 
      LDA RQP3,I     PRAMETER NOT SUPPLIED
      CMA,SZA,RSS   (-1) SERIALLY REUSABLE? 
      JMP MPT1E      YES, GO DO IT
      INA,SZA,RSS 
      JMP MPT1B     (0) STANDARD TERMINATION CALL.
* 
      INA,SZA,RSS 
      JMP MPT1C     (1) SAVE RESOURCES
* 
      INA,SZA,RSS 
      JMP M0240     (2) SOFT ABORT
* 
      INA,SZA,RSS   (3) HARD ABORT (LAST CHANCE)
      JMP M0250     WOW THAT WAS CLOSE! 
* 
      LDB D2
      JMP ESCXX     GO ABORT HIM
* 
M0240 JSB $SABR     DO SOFT ABORT 
      JMP $XEQ      AND GO TO DISPATCHER
* 
M0250 LDA WSTAT,I   DO HARD ABORT 
      AND D15       GET CURRENT STATUS
      SWP           PUT ID-SEG. ADDRESS IN A, STAT IN B 
      CPB D2        IF I/O SUSP THEN
      JMP $IOCL     GO ABORT THE I/O
* 
      JSB $ABRT     GO TO ABORT ROUTINE 
      JMP $XEQ      AND GO TO DISPATCHER
* 
MPT1C LDA WSTAT,I   B=WORK, SET 
      IOR B200      RESOURCE BIT IN THE STATUS
      STA WSTAT,I   AND THEN
      CPB XEQT      IF CURRENT PROGRAM
      JMP MPT1D     SKIP DORMANT REQUEST
      JSB $LIST 
       OCT 400
      JMP $XEQ      GO TO DISPATCHER
* 
MPT1E CPB XEQT      TERM SON AS REUSABLE
      RSS 
      JMP MPT1B     GO DO NORMAL TERMINATE
      JSB TERM      CALL TERMINATE ROUTINE
      ISZ TMP,I     IF OK, SET FLAG FOR SERIAL REUSE
      JMP MPT1F     GO FINISH PROCESSING
* 
MPT1D JSB $WATR     FIND WAITERS
      LDB XEQT
MPT1B JSB TERM      CALL TERMINATION ROUTINE
MPT1F LDA DM3       IF REQUEST PRAMS
      ADA RQCNT     THEN
      SSA           SKIP
      JMP $XEQ      ELSE GO TO THE DISPATCHER 
* 
      LDB DEFR4     GET DEF TO PRAMS
      LDA P2        GET ID-ADDRESS
      JSB $PRAM     TRANSFER THE PRAMETERS
      JMP $XEQ      GO TO THE DISPATCHER
      SPC 1 
DM3   DEC -3
TEMPH NOP 
P2    NOP 
      SPC 3 
*     THE TERM SUBROUTINE PERFORMS THE FOLLOWING FUNCTIONS: 
* 
*     1. CALL $LIST TO PUT THE PROGRAM IN THE DORMANT LIST
*     2. IF THE PROGRAM HAS A FATHER WHO IS WAITING THE 
*         FATHER IS RESCHEDULED 
*     3. CHECKS TO SEE IF ANOTHER PROGRAM IS WAITING FOR THIS ONE 
*         AND SCHEDULES IT IF SO. 
* 
*     CALLING SEQUENCE: 
* 
*     LDB ID ADDRESS
*     JSB TERM
* 
*     ON RETURN THE FATHER POINTER (IF ANY) IS IN POP.
*     AND IF HE WAS WAITING E WILL BE SET ELSE E=0. 
* 
TERM  NOP 
      JSB $LIST     PUT PGM. IN DORMANT 
       OCT 400       LIST 
      LDB $WORK     GET ID SEG ADDRESS
* 
      ADB D20       INDEX TO THE PA POINTER 
      LDA B,I       GET THE WORD
      STB TMP       SAVE THE ADDRESS
      RAL,ELA       SET E IF FATHER IS WAITING
      CCB,SEZ,CME,RSS E=0 IF FATHER/1 IF NO FATHER
      JMP TERM2     IF NO FATHER GO SET -1. 
      ADB KEYWD     KEYWD-1 TO B (SETS E) 
      RAR,CLE,RAR   RESTORE A AND SET E TO FATHER WAITING.
      AND B377      GET THE FATHER ID NUMBER
      ADB A         ID ADDRSS TO B
      LDB B,I       GET THE ID-SEG ADDRESS
TERM2 STB POP       SAVE THE ADDRESS
      ADB D15       REMOVE THE POP'S WAIT BIT 
      LDA B,I       GET POP'S STATUS
      AND B7777     KNOCK OUT THE WAIT BIT
      SEZ,RSS       IF WAITING
      STA B,I       RESTORE THE WORD
      AND D15       IF POP'S
      CPA D3        IN THE WAIT LIST
      SEZ           AND WAITING 
      JMP TERM3 
      JSB $LIST     THEN RESCHEDULE 
       OCT 101       THE FATHER 
POP   DEF POP 
* 
TERM3 LDA TMP,I     GET THE FLAG WORD 
      AND B7400      AND KEEP ONLY RE,RM,RN FLAGS 
      STA TMP,I      IN WORD
      JMP TERM,I    RETURN
* 
* 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
D9    DEC 9 
D10   DEC 10
D15   DEC 15
D16   DEC 16
D20   DEC 20
DM4   DEC -4
DM5   DEC -5
DM7   DEC -7
SIGN  OCT 100000
B200  OCT 200 
B377  OCT 377 
B7777 OCT 7777
TMP   NOP 
WSTAT NOP 
B7400 OCT 7400
DEFR4 DEF RQP4,I
      SPC 2 
      SPC 3 
*     PRAMO PASSES PRAMETERS FORM RQP3,4,5,6,AND 7 TO 
*     THE ID-SEGMENT POINTED TO BY WORK.
*             *** ONLY CALLED BY IDCKK ***
* 
*     CALLING SEQUENCE: 
* 
*     SET UP $WORK
*     JSB PRAMO 
* 
*     ID-SEGMENT MUST NOT HAVE NO PRAM BITS SET IN IT'S STATUS. 
* 
PRAMO NOP 
      CLB,INB       IF NO PRAMS 
      CPB RQCNT     THEN
      JMP PRAMO,I   JUST EXIT 
* 
      LDA $WORK     SET ADDRESS IN A
      LDB DEFR3     PRAM ADDRESS IN B AND 
      JSB $PRAM     GO MOVE THE PRAMS.
      JMP PRAMO,I   RETURN. 
* 
*    SCHEDULE REQUEST WITH WAIT 
* 
$MPT4 JSB IDCKK     CHECK IF PROGRAM DORMANT
      LDB XEQT      GET THE ADDRESS 
      ADB D20       OF THE BATCH FLAG 
      LDB B,I       AND SET IT
      RBL,SLB,ERB   INTO THE
      RAL,ERA       THE NEW PROGRAM 
      IOR B40K      SET THE FATHER IS WAITING BIT 
      STA $IDNO,I   SET THE WORD IN THE SON'S ID. 
      JSB $LIST     PUT CURRENT PGM IN
       OCT 503       THE WAIT LIST
      LDB XEQT
      ADB D15 
      LDA B,I 
      IOR B10K     SET STATUS WAIT REQUEST BIT
      STA B,I       INTO CURRENT EXEC PROGRAM 
      RSS 
* 
*     SCHEDULE REQUEST WITHOUT WAIT 
* 
$MPT5 JSB IDCKK     CHECK IF PROGRAM DORMANT
      LDB TMP       GET SAVED A-REG AT SCHED QUEUED CALL
      LDA RQP1       AND RESTORE BEFORE RETURN
      AND D16        ONLY IF QUEUED CALL
      SZA 
      STB XA,I
* 
MEM15 LDA RQRTN 
      STA XSUSP,I  POINT
      JMP $XEQ
* 
* 
ESC01 CLB,INB,RSS   ILLEGAL PARAMETER COUNT 
ESC03 LDB D3
      RSS 
ESC04 LDB D4
ESCXX LDA ASY      OUTPUT SC ERROR CODE 
      JMP $ERAB    CALL SYSTEM ERROR MESSAGE ROUTINE
* 
ESC05 LDB D5        NO SUCH PROG ERROR CODE 
      JMP ESCXX 
* 
ESC02 LDB D2        .TOO FEW PARAMETERS ? 
      JMP ESCXX 
      SPC 1 
B40K  OCT 40000 
B77   OCT 77
D28   DEC 28
      SKP 
* 
*     GETID IS A SUBROUTINE TO GET THE ID-SEGMENT ADDRESS 
*     FROM PRAMETER NUMBER TWO WHERE THE USER MAY 
*     SUPPLY  ZERO (HIS ID) OR NOTHING (HIS ID) OR
*     AN ASCII NAME.
* 
*     CALLING SEQUENCE: 
* 
*     JSB GETID 
*     RETURN B= THE ID-SEGMENT ADDRESS. 
*     IF NOT FOUND THEN ERROR "SC05"IS GENERATED
*     E=0 
*     A=0  ON ALL RETURNS 
*     WORK = THE ID-ADDRESS 
*     WSTAT = THE ID-STATUS ADDRESS 
* 
GETID NOP 
      CLA           IF NOT SUPPLIED PRESET TO ZERO
      LDB XEQT      AND CURRENT PGM 
      ADB D12       SET B TO POINT TO CURRENT NAME
      LDA RQP2,I    GET THE PRAMETER
      SZA           IF ZERO OR NOT SUPPLIED SKIP
      LDB RQP2      GET ADDRESS OF NAME 
      JSB $TNAM     GO SEARCH FOR IT
      LDA $WORK     SET UP ADDR OF STATUS WORD
      ADA D15 
      STA WSTAT 
      CLA,SEZ       IF FOUND SKIP 
      JMP ESC05     ELSE FLUSH HIM OUT OF THE SYSTEM
* 
      JMP GETID,I   RETURN
      SPC 2 
*     $IDNO COMPUTES THE ID-SEGMENT NUMBER OF A PROGRAM 
*          *** CALLED BY IDCKK, MTDB, CLASS I/O *** 
* 
*     CALLING SEQUENCE
*     LDB ID-SEGMENT ADDRESS
*     JSB $IDNO 
*     RETURN ID NUMBER IN B 
* 
$IDNO NOP 
      STB GETID     SAVE THE REQUESTED ID-ADDRESS 
      LDB KEYWD 
IDNO  LDA B,I       GET KEYWORD BLOCK ENTRY 
      INB           STEP FOR NEXT ONE 
      CPA GETID     THIS IT?
      CMB,INB,RSS   YES NEGATE AND SKIP 
      JMP IDNO      NO CONTINUE LOOP
* 
      ADB KEYWD     NEGATIVE OF NUMBER TO B 
      CMB,INB       SET POSITIVE AND
      JMP $IDNO,I   RETURN
      SKP 
* 
*     SCHEDULE BY TIME
* 
$MPT7 LDA DM7       CHECK PARAM COUNT FOR  7
      ADA RQCNT 
      SZA,RSS 
      JMP MPT7A     7 OK
      ADA D3        CHECK FOR 4 PARAMETERS
      SZA 
      JMP ESC01     ERROR IN PARAM COUNT
      LDA RQP5,I    4 PARAM OK - CHECK FOR NEGATIVE 
      SSA,RSS       INITIAL OFFSET
      JMP ESC02       NOT NEGATIVE AN ERROR 
* 
MPT7A LDA RQP3,I    IF RESOLUTION CODE
      LDB D6
      SZA           ZERO OR 
      ADA DM5       GREATER THAN 4
      SSA,RSS       THEN
      JMP ESCXX     ABORT 
* 
      JSB GETID     GO GET THE ID-SEGMENT ADDRESS TO B
      LDA RQRTN     PUT RETURN
      STA XSUSP,I   ADDRESS IN THE ID SEG.
      JMP $TIMR     GO CONTINUE REQUEST IN TIME ROUTINE 
      SPC 1 
*     CHECK IF PROGRAM DORMANT AND THEN SCHEDULE
*           *** CALLED BY $MPT4, $MPT5 ***
* 
IDCKK NOP 
      LDB RQP2      GET ID SEGMENT ADDRESS
      JSB $TNAM 
      SEZ 
      JMP ESC05     NO SUCH PROGRAM ERROR 
* 
      LDA XA,I      SAVE A-REG IN CASE OF 
      STA TMP        QUEUED CALL
* 
      LDB XEQT      COMPUTE THE ID NUMBER 
      JSB $IDNO     AND 
      STB GETID     SAVE IT 
      LDA $WORK     ALSO COMPUTE THE
      ADA D15 
      STA WSTAT      STATUS WORD ADDR 
      ADA D5         AND FATHER WORD ADDR 
      STA $IDNO      AND SAVE IT
      LDA WSTAT,I   CHECK PROGRAM STATUS FOR DORMANT
      AND S&NP      KEEP JUST THE IMPORTANT BITS
      STA XA,I      RETURN PROG STATUS IN A REG 
      SZA           DORMANT?
      JMP IDCK2      NO - CHECK FURTHER 
* 
IDCK3 JSB PRAMO     PASS THE PRAMETERS IF ANY 
      LDB XEQT      INDEX TO WORD 29 OF 
      ADB D28        FATHER'S ID SEG
      LDA B,I 
      AND B77       GET CONSOLE LU
      IOR SIGN       AND SET NEW-RUN FLAG 
      LDB $WORK 
      ADB D28       STORE INTO WORD 29 OF 
      STA B,I        SON'S ID SEG 
      JSB $LIST      THEN - SCHEDULE
       OCT 301
      STA XA,I      SHOW THAT IT WAS DONE 
      LDA $WORK     SET UP THE WAIT POINTER 
      STA XTEMP,I   INCASE IT IS A 9 REQUEST
      LDA $IDNO,I   GET THE CURRENT FLAG BITS 
      IOR GETID     ADD THE FATHER NUMBER 
      STA $IDNO,I   AND RESET IT. 
      JMP IDCKK,I   RETURN
      SPC 1 
IDCK2 RAL,ALR       IF JUST THE NO PRAMS
      CMA,CLE,INA   SET E 
      LDA $IDNO,I   CHECK TO SEE
      AND B377      IF THIS GUY IS THE FATHER 
      CPA B         IF NOT
      RSS           THEN
      JMP MPT15     GO TEST FOR QUEING
* 
      SEZ           IF JUST "NP" BIT THEN 
      JMP IDCK3+1   GO SCHEDULE HIM 
* 
      LDA WSTAT,I   IF "R" AND "D" BITS BOTH SET
      AND B300      THEN JUST 
      CPA B300      CLEAR THEM ELSE 
      CLB,RSS 
      JMP MPT15     GO CHECK FOR QUEUEING 
* 
      XOR WSTAT,I   CLEAR THE "R" AND "D" BITS
      STA WSTAT,I   AND RESET IN SON'S ID 
      STB XA,I      INDICATE SUCESS.
      JMP MEM15     AND EXIT. 
* 
*SCHEDULE WITH WAIT WITH WAIT REQUEST 
* 
*     IF REQUESTED PROGRAM IS NOT DORMANT THE REQUESTER IS
*     SUSPENDED UNTIL IT IS.
* 
MPT15 LDA RQP1      HERE AFTER FINDING REQUESTED PGM BUSY 
      CPA D9        IF NO WAIT
      RSS           THEN JUST DO
      CPA D10       THE OLD 
      JMP MEM15     THING 
* 
      LDB $WORK     ELSE SET THE SUSPEND REASON 
      STB XTEMP,I   IN REQUESTERS ID-SEGMENT
      LDA $IDNO,I   TO INDICATE 
      IOR B1000     WE WERE HERE
      STA $IDNO,I 
      JSB $LIST     PUT REQUESTER IN WAIT LIST
       OCT 503
      LDA TMP       RESTORE A-REG FOR QUEUED CALL 
      STA XA,I
      JMP $XEQ      GO TRY SOMEBODY ELSE. 
      SPC 2 
ASY   ASC 1,SC     ASCII -SC- FOR SCHED ERROR 
DEFR3 DEF RQP3,I
B10K  OCT 10000 
S&NP  OCT 20017     STATUS PLUS NO PRAMS BIT MASK 
B300  OCT 300 
B1000 OCT 1000
      HED ** SYSTEM BASE PAGE COMMUNICATION AREA ** 
* 
* 
*** SYSTEM BASE PAGE  COMMUNICATION  AREA *** 
* 
.     EQU 1650B     ESTABLISH ORIGIN OF AREA
* 
* SYSTEM TABLE DEFINITION * 
* 
KEYWD EQU .+7      FWA  OF  KEYWORD BLOCK 
* 
* SYSTEM REQUEST PROCESSOR /'EXEC' COMMUNICATION *
* 
RQCNT EQU .+22     # OF REQUEST PARAMETERS -1 
RQRTN EQU .+23      RETURN POINT ADDRESS
RQP1  EQU .+24      ADDRESSES 
RQP2  EQU .+25
RQP3  EQU .+26       OF REQUEST 
RQP4  EQU .+27
RQP5  EQU .+28
* 
* DEFINITION OF SYSTEM LISTS (QUEUES) * 
* 
* 
* DEFINITION OF EXECUTING PROGRAM  ID SEGMENT' *
* 
XEQT  EQU .+39     ID SEGMENT ADDR. OF CURRENT PROG.
XTEMP EQU .+41       'TEMPORARY (5-WORDS) 
XSUSP EQU .+48       'POINT OF SUSPENSION'
XA    EQU .+49       'A REGISTER' AT SUSPENSION 
* 
* SYSTEM MODULE COMMUNICATION FLAGS * 
* 
* 
* DEFINITION OF MEMORY ALLOCATION BASES * 
* 
* 
A     EQU 0B        LOCATION OF A REGISTER
B     EQU 1B        LOCATION OF B REGISTER
      ORG *         PROGRAM LENGTH
      END 
                                        