ASMB,R
*USE 'ASMB,R,N' (RTE-M II) OR 'ASMB,R,Z' (RTE-M III)
* 
*     IFN OPTION
*     NAME:   $MEX2 
*     SOURCE: 92064-18007 
*     RELOC:  PART OF 92064-16002 
*     PROGMR: E.J.W.  BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S.
* 
*     IFZ OPTION
*     NAME  : $MEX3 
*     SOURCE: 92064-18007 
*     RELOC:  PART OF 92064-16003 
*     PROGMR: E.J.W.  BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S.
* 
*  **************************************************************** 
*  * (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.        * 
*  **************************************************************** 
* 
* 
      IFN 
* BEGIN NON-DMS CODE ***************
      NAM $MEX2  92064-16002  REV.2001  791012
*** END NON-DMS CODE ***************
      XIF 
      IFZ 
***** BEGIN DMS CODE ***************
      NAM $MEX3  92064-16003  REV.2001  791012
******* END DMS CODE ***************
      XIF 
* 
* 
      ENT EXEC,$ERMG,$RQST
      ENT $LIBR,$LIBX 
      ENT $ERAB,$PVCN,$REIO,$RSRE,$ABRE 
      ENT $PWR5,$SGAF 
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      ENT $MVBF 
      EXT $MATA,$MRMP,$MSBF 
******* END DMS CODE ********** 
      XIF 
      SPC 1 
* 
      EXT $CVT3,$SYMG,$LIST,$XEQ
      EXT $RENT,$ABRT,$IDNO 
      EXT $CGRN,$ALC,$RTN 
      SPC 1 
      IFN 
* BEGIN NON-DMS CODE ***************
      EXT .MVW
*** END NON-DMS CODE ***************
      XIF 
      SPC 1 
      SUP 
A     EQU 0 
B     EQU 1 
      MIC SVR,105620B,2 
      MIC RSR,105621B,2 
* 
*****  < EXEC >   PROGRAM  DESCRIPTION  ***** 
* 
*  THE PRIMARY FUNCTION OF THIS PROGRAM IS
* TO PROVIDE GENERAL CHECKING AND EXAMINATION 
* OF SYSTEM SERVICE REQUESTS AND TO CALL THE
* APPROPRIATE PROCESSING ROUTINE IN OTHER 
* SECTIONS OF THE REAL-TIME EXECUTIVE.
* 
*  THIS PROGRAM IS CALLED DIRECTLY FROM THE 
* CENTRAL INTERRUPT CONTROL <CIC> SECTION 
* WHEN A MEMORY PROTECT VIOLATION IS ACKNOWLEDGED.
* ALL SYSTEM REQUESTS BY A USER PROGRAM CAUSE A 
* PROTECT VIOLATION.
* 
*   SYSTEM REQUEST FORMAT:
*   ----------------------
* 
*     THE GENERAL FORMAT OF A SYSTEM REQUEST IS 
*    A BLOCK CONTAINING AN EXECUTABLE INSTRUCTION 
*    TO GAIN ENTRY TO THE EXECUTIVE AND AN ADDRESS
*    LIST OF PARAMETERS. THE FIRST PARAMETER IS 
*    A NUMERIC CODE IDENTIFYING THE REQUEST TYPE. 
*    THE LENGTH OF THE PARAMETER LIST VARIES
*    ACCORDING TO THE AMOUNT OF INFORMATION RE- 
*    QUIRED FOR EACH REQUEST (OR VARIATIONS WITHIN
*    A SINGLE REQUEST). THIS FORMAT ALLOWS SYSTEM 
*    REQUESTS TO BE SPECIFIED IN A FORTRAN CALL 
*    STATEMENT IN ADDITION TO ASSEMBLY LANGUAGE FORMAT. 
* 
*        CALL  EXEC  (P1,P2,...PN)
* 
*     OR
* 
*        EXT   EXEC 
*        JSB   EXEC   (CAUSES MEMORY PROTECT VIOLATION) 
*        DEF   *+1+N  DEFINE EXIT POINT, N= # PARAMETERS
*        DEF   RCODE  DEFINE REQUEST CODE 
*        DEF   P1     DEFINE PARAMETER LIST, 1 TO N 
*        .
*        .            (PARAMETERS MAY BE INDIRECTLY 
*        .             REFERENCED, E.G. DEF P3,I) 
*        DEF   PN 
*       - EXIT POINT -
* 
*     RCODE  DEC  N 
*     P1     DEC/OCT/DEF,ETC  TO DEFINE A VLAUE 
* 
* 
*   RE-ENTRANT LIBRARY REQUEST
*   --------------------------
* 
*     THE SYSTEM LIBRARY (RESIDENT) CONTAINS
*    PROGRAMS STRUCTURED IN 'RE-ENTRANT' FORMAT 
*    OR IN 'PRIVILEGED' EXECUTION FORMAT. 
* 
*     - RE-ENTRANT FORMAT ALLOWS A LIBRARY
*    PROGRAM TO BE RE-ENTERED BY A CALL FROM
*    A HIGHER-PRIORITY PROGRAM DURING THE 
*    PROCESSING OF A CALL FROM A LOWER-PRIORITY 
*    PROGRAM. 
* 
*     - PRIVILEGED EXECUTION FORMAT ALLOWS A
*    SHORT-RUNNING LIBRARY PROGRAM TO BE EXECUTED 
*    WITH THE INTERRUPT SYSTEM DISABLED.
* 
* 
* 
*  MEMORY PROTECT ERROR:
*  ---------------------
* 
*    IF THE INSTRUCTION CAUSING THE PROTECT VIOLATION 
*   IS NOT A JSB EXEC OR A JSB TO LIBRARY 
*   PROGRAM, THEN A USER PROGRAM ERROR IS 
*   ASSUMED. A DIAGNOSTIC IS OUTPUT TO THE SYSTEM 
*   TELETYPE LISTING THE PROGRAM NAME AND ADDRESS 
*   OF VIOLATING INSTRUCTION AND THE PROGRAM IS 
*   SET DORMANT IN THE PROGRAM ABORT PROCEDURE. 
* 
      SKP 
************DMS INSTRUCTIONS***************** 
EXEC  NOP 
      HLT 0        PROTECTION AGAINST DIRECT CALL.
* 
$RQST LIB 5        GET ADDRESS OF VIOLATION.
      LIA 4         DO NOT REARRANGE!!! 
      CPA D4       POWER FAIL?
      LDB $PWR5     YES, USE LAST INTERRUPT ADDR. 
      STF 5         REENABLE PARITY ERROR OPTION. 
      STB VADR     SAVE VIOLATION ADDRESS.
      STB XSUSP,I  SET AS POINT OF SUSPENSION.
      STB $LIBR    SAVE (P+1) OF
      ISZ $LIBR     CALL.  WE ARE IN USER MAP!
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      SFC 5         IF FLAG CLEAR,NOT DMS VIOL
      JMP DMSER 
******* END DMS CODE ********** 
      XIF 
      SPC 1 
      RBL,CLE,SLB,ERB  CHECK FOR PARITY ERROR.
      HLT 5            HALT IF PARITY ERROR!
      LDA B,I      GET WORD.
      AND B074K    ISOLATE INSTR. CODE. 
      CPA JSBI     IF INSTRUCTION IS JSB
      RSS           CHECK OPERAND ADDRESS.
      JMP MPERR     -MEMORY PROTECT ERROR-
      LDA B,I       CHECK FOR EFFECTIVE 
      AND B2000     ADDRESS 
      SZA           LINK THRU CURRENT PAGE? 
      LDA VADR       YES, USE CURRENT PAGE BITS 
      XOR VADR,I    MIRGE THE PAGE OFFSET 
      AND G76       UNDER THE RULES OF WOO. 
      XOR VADR,I    NOW HAVE THE ADDRESS
      RAL,CLE,SLA,ERA IF INDIRECT 
INDR  LDA A,I       GET NEXT LEVEL
      RAL,CLE,SLA,ERA  WATCH OUT FOR JTS'S INDIRECTS
      JMP INDR
* 
      CPA EXECA     -EXEC-. 
      JMP R0        YES, REQUEST TO BE ANALYSED.
      CPA LIBRA    -LIBRARY ROUTINE CALLING FOR 
      JMP LIBRC     RE-ENTRANT OR PRIVILEGED RUN. 
      CPA LIBXA    -LIBRARY ROUTINE RETURNING 
      JMP LIBXC     TO CALLER.
* 
* CHECK FOR USER CALL TO LIBRARY PROGRAM
* 
      STA B        SAVE OPERAND ADDRESS.
      LDA LBORG    SUBTRACT LIBRARY 
      CMA,CLE,INA   AREA ORIGIN FROM
      ADA B          OPERAND ADDRESS. 
      LDA B         (E = 0 IF SYSTEM VIOLATION )
      CMA,SEZ,CLE,INA SKIP IF VIOLATION ALREADY ELSE
      ADA $SGAF     TEST FOR ABOVE LIB. 
      SEZ,RSS      IF NOT CALL TO LIBRARY RESIDENT, 
      JMP MPERR     THEN VALID MEMORY PROTECT ERROR.
      LDA $LIBR    -CALL TO LIBRARY.
      STA B,I       SET (P+1) ADDRESS IN ENTRY POINT
      ADB D2        SET (P+1) OF
      STB $LIBR      JSB  $LIBR IN -$LIBR-. 
      JMP LIBRC     - TRANSFER TO $LIBR SECTION 
      SPC 1 
$SGAF NOP           SSGA START ADR
JSBI  JSB 0 
B074K OCT 074000
G76   OCT 76000 
EXECA DEF EXEC
RQP2A DEF RQP2
VADR  NOP 
$PWR5 NOP            ADDR OF INTERRUPT BEFORE POWER FAIL
DM9   DEC -9
* 
* ANALYZE SYSTEM REQUEST
* 
R0    LDA $LIBR,I   (A) = RETURN ADDRESS OF JSB EXEC. 
      ISZ $LIBR     SET $LIBR TO FIRST PRAM. (RQ) ADDRESS.
      STA RQRTN     SAVE IN BASE PAGE 
      LDB $LIBR     CACULATE THE NUMBER OF
      CMB,CLE       PARAMETERS IN REQUEST 
      ADB A         LESS THE REQUEST CODE.
      STB RQCNT     AND SAVE # OF ACTUAL PARAMETERS.
      STB A 
      STB CNT 
      CMB,SEZ,CME   SKIP IF RETURN IS BAD (< JSB +2)
* 
      ADA DM9 
      CLA,SEZ 
      JMP RQERR     ERROR IF >8.
* 
      STA RQP2      ZERO
      STA RQP3       PARAMETER
      STA RQP4
      STA RQP5       ADDRESS
      STA RQP6
      STA RQP7       AREA 
      STA RQP8
      STA RQP9
* 
* 
* CHECK LEGALITY OF REQUEST CODE
* 
      LDA $LIBR     GET ADDR OF THE REQ PARAM 
      LDA A,I 
      RAL,CLE,SLA,ERA  REMOVE INDIRECTS 
      JMP *-2 
      LDA A,I       GET ACTUAL REQ CODE 
      LDB XEQT     COMPUTE
      ADB D15       THE STATUS WORD 
      STB TEMP3      ADDRESS AND SAVE 
      LDB B,I      GET STATUS 
      RAL,CLE,ERA     PUT ABORT OPTION BIT
      RBL,ERB           IN SIGN OF STATUS 
      STB TEMP3,I        AND RESET IN ID-SEG. 
      SSB          IF OPTION SELECTED 
      ISZ RQRTN     STEP RETURN ADDRESS.
      STA RQP1       SAVE THE REQUEST CODE. 
      SZA           IF ZERO SKIP TO REJECT
      ADA CODE#     IF RQUEST CODE IF NOT DEFINED 
      SSA,RSS      -THEN
      JMP RQERR     TOUGH LUCK, YOU'RE A DEAD DUCK! 
* 
      ADA RQTBL     GET ADDRESS OF PROCESSOR TO A 
      LDA A,I       GET ADDRESS 
      SZA,RSS       IF NOT LOADED 
      JMP RQERR     THEN REQUEST CODE ERROR 
* 
      STA VADR      SAVE THE ADDRESS
* 
*     TEST EACH PRAMETER FOR BEING BELOW THE FENCE IF 
*     THE CALL CAUSES A STORE TO THE AREA DEFINED.
* 
      LDB RQP1      USE REQUEST CODE
      CLE,ERB       TO INDEX INTO 
      ADB RQTBL     THE BY NAME TABLE 
      LDA B,I       GET THE FLAG WORD 
      SEZ,RSS       IF EVEN REQUEST, ROTATE BITS
      ALF,ALF        TO USE HIGH HALF 
      STA FLAGS 
* 
      ISZ $LIBR 
      LDA $LIBR     GET ADDR OF 2ND PARAM 
      LDB RQP2A     GET ADDR OF 2ND BP PARAM
MIC1  JMP NOMC2   -LRR- IF HAVE MICROCODE 
*     OCT 105622    MACRO CALL FOR LRR
CNT    OCT 0        COUNT OF PARAMS LEFT
FLAGS  OCT 0        BITS FOR PARAM ADDR CHECK 
       DEF FENCE    ADDR OF FENCE WORD
       RSS          ERROR RETURN
      JMP VADR,I    SUCCESSFUL RETURN 
* 
      SZB,RSS 
      JMP ER1 
      JMP RQERR 
* 
NOMC2 STB TEMP2     SAVE BP PTR 
      LDA CNT 
      CMA,INA,SZA,RSS  NEGATE COUNT 
      JMP VADR,I       DO REQ. IF 0 PARAMS
      STA CNT 
* 
R3    LDA $LIBR     GET ADDR OF PARAM ADDR
R1D1  LDA A,I       GET ACTUAL PARAM ADDR 
      SZA 
      CPA D1        IS IT POINTING TO A OR B REGS?
      JMP RQERR      YES, ERROR.
      RAL,CLE,SLA,ERA    INDIRECT?
      JMP R1D1      GO GET DIRECT ADDR
* 
      STA TEMP2,I   SAVE DIRECT ADDR ON BP
      CMA,CLE       READY TO SUBTR FROM FENCE 
      LDB FLAGS 
      SLB,RBR       NEED TO TEST AGAINST MP FENCE?
      ADA FENCE      YES, SUBTRACT
      STB FLAGS     SAVE SHIFTED FLAG BITS
      CLB,SEZ       PARAM ADDR < FENCE? 
      JMP ER1        YES, RQ00 ERROR
* 
      ISZ $LIBR     INCRE TO NEXT USER PARAM
      ISZ TEMP2     INCRE TO NEXT BP LOC
      ISZ CNT       DONE YET? 
      JMP R3         NO 
      JMP VADR,I    YES, DO THE REQUEST 
* 
ER1   LDA RQ1       SET A FOR ERROR 
      JMP $ERAB     GO SEND 'RQ00' ERROR
      SPC 1 
D1    DEC 1 
D2    DEC 2 
D15   DEC 15
CODE# ABS TBL-TBLE-1 NEGATIVE OF NUMBER OF REQUEST+1
RQTBL DEF TBLE      ADDRESS INDIRECT OF LAST + 1. 
      HED ** SUPERVISORY CONTROL OF LIBRARY PROGRAM EXECUTION **
* 
* SUPERVISORY CONTROL OF PROGRAM LIBRARY EXECUTION
* 
*  ALL LIBRARY PROGRAMS REFERENCED BY USER PROGRAMS 
* IN THE SYSTEM ARE COMBINED IN A BLOCK OF MEMORY 
* WHICH IS PROTECTED FROM THE REAL-TIME AREA. THE 
* LIBRARY AREA IS IMMEDIATELY BELOW THE RT AREA 
* AND JUST ABOVE THE SYSTEM AREA. 
* 
*  A USER LIBRARY CALL CAUSES A PROTECT VIOLATION.
* THIS SECTION FACILITATES ENTRY INTO THE LIBRARY 
* PROGRAM BY PERFORMING THE NECESSARY PROCESSING
* FOR RE-ENTRANCY OR OPERATING THE PROGRAM WITH H=
* THE INTERRUPT SYSTEM TURNED OFF FOR A 'PRIVILEGED'
* EXECUTION PROGRAM.
* 
*  RE-ENTRANT OR PRIVILEGED PROGRAM FORMAT: 
*  ---------------------------------------- 
* 
*   ENTRY   NOP 
*           JSB  $LIBR
*           DEF  TDB  (OR 'NOP' IF PRIVILEGED)
*          - FIRST INSTRUCTION FOR FUNCTION - 
*            -    CODE
*            -     TO 
*            -     PERFORM
*            -     PROGRAM FUNCTION 
*    EXIT   JSB  $LIBX
*           DEF  TDB  (OR  DEF ENTRY IF PRIVILEGED) 
*           DEC  N   RETURN ADJUSTMENT FOR RE-ENTRANT 
*            -
*   TDB     NOP    HOLDS SYSTEM POINTER TO ID-EXTENSION.
*           DEC N  LENGTH OF TEMPORARY DATA BLOCK 
*           NOP    RETURN ADDRESS OF CALL.
*         - BLOCK USED FOR
*             HOLDING TEMPORARY 
*              VALUES GENERATED 
*               BY THE ROUTINE. 
* 
* 
*  < $LIBR> IS ENTERED WHEN A LIBRARY 
* PROGRAM IS CALLED.  IF THE CALLED 
* PROGRAM IS 'RE-ENTRANT' AND IS CALLED 
* DURING THE PROCESSING OF A PREVIOUS 
* CALL, THE TEMPORARY-DATA-BLOCK IS 
* MOVED INTO A BLOCK IN AVAILABLE MEMORY
* BEFORE THE ROUTINE IS ENTERED.
* 
* 
PVEXC JSB RSTR
      JMP LIBRX 
* 
LIBRA DEF $LIBR 
* 
$LIBR NOP           DIRECT ENTRY HAS TO BE PRIV.
      STA XA,I      AND GOING DEEPER
      LDA $LIBR,I   MAKE SURE 
      SZA           AND IF GOING RENT 
      JMP MPERR     SEND SOUTH INSTEAD. 
* 
LIBRX LDA XA,I      RESTORE AND RETURN
      ISZ $LIBR     SET RIGHT ADDRESS 
      ISZ $PVCN     AND STEP THE DEPTH COUNTER
      JMP $LIBR,I   RETURN TO USER
* 
LIBRC LDB $LIBR,I   GET (P+2) OF -$LIBR- CALL.
      SZB,RSS      IF (P+2) = 0, THEN CALLED PROGRAM
      JMP PVEXC     IS IN 'PRIVILEGED' FORMAT.
* 
* 
      STB TEMP1    SAVE -TDB- ADDRESS.
      LDA B,I      GET WORD 1 OF DATA BLOCK.
      LDA A,I       GET ID SEG ADDRESS OR ZERO
      RAL,CLE,ERA   REMOVE POSSIBLE SIGN BIT
      CPA XEQT      RECURSIVE ENTRY?
      JMP ERE01     YES GO ABORT HIM
      INB           STEP TO LENGTH WORD IN TDB
      SZA           IF BLOCK IN USE GET LENGTH
      LDA B,I       ELSE
      ADA D4        USE JUST FOUR WORDS 
      STA TEMP4     SAVE LENGTH FOR ALLOCATE CALL 
      LDB DHED      GET POINTER TO HEAD OF RENT 
      LDA XEQT      LIST
      ADA D20       CHECK IF ALREADY IN LIST
      STA TEMP3     SAVE ID-SEG POINTER 
      LDA A,I       GET THE STATUS WORD 
      ALF,RAL       BIT 10 IS RENT BIT
      SSA,RSS       IF CLEAR THEN THIS IS FIRST ENTRY 
      JMP RE2       SO GO SET UP
* 
      LDB XEQT      NOT FIRST ENTRY SO FIND OTHERS
      JSB FINDL     USING FINDL ROUTINE 
      JMP ERE01     LIST ERROR ABORT THE PGM
      ADB D3        STEP TO SUB QUE HED 
RE2   STB TEMP2     SET POINTER TO LIST HEAD
* 
      JSB $ALC      ALLOCATE THE MEMORY 
TEMP4 NOP           NUMBER OF WORDS REQUIRED
       JMP NVRM     IF NEVER ANY MEMORY, TRY 4 ONLY 
       JMP LB05     NO MEMORY NOW, SUSPEND. 
       CCE          ALLOC DONE. 
* 
      CPB TEMP4     DID WE GET THE REQUESTED NUMBER?
B40   CLE           YES CLEAR E AS A FLAG 
* 
      SPC 1 
      IFN 
******* BEGIN NON-DMS CODE **** 
      LDB TEMP2,I   GET OLD POINTER 
      STA TEMP2,I   SET NEW BLOCK ADDRESS 
      STB A,I       LINK OLD BLOCKS INTO THE LIST 
******* END NON-DMS CODE ****** 
      XIF 
      SPC 1 
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      XLB TEMP2,I   GET OLD POINTER 
      XSA TEMP2,I   SET NEW BLOCK ADDRESS 
      XSB A,I       LINK OLD BLOCKS INTO THE LIST 
******* END DMS CODE ********** 
      XIF 
      SPC 1 
      LDB XEQT      GET THE ID-SEG ADDRESS
      SEZ,INA       STEP A AND SKIP IF EXACT ALLOCATION 
      ADB SIGN      ELSE ADD SIGN BIT TO ID-ADDRESS 
      SPC 1 
      IFN 
******* BEGIN NON-DMS CODE **** 
      STB A,I       SET IN WORD 2 
******* END NON-DMS CODE ****** 
      XIF 
      SPC 1 
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      XSB A,I       SET IN WORD 2 
******* END DMS CODE ********** 
      XIF 
      SPC 1 
      STA TEMP4     SET TDB ADDRESS POINTER 
      INA           SET TO WORD 3 ADDRESS 
      LDB TEMP1     SET TDB ADDRESS IN WORD THREE 
      SPC 1 
      IFN 
******* BEGIN NON-DMS CODE **** 
      STB A,I 
******* END NON-DMS CODE ****** 
      XIF 
      SPC 1 
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      XSB A,I 
******* END DMS CODE ********** 
      XIF 
      SPC 1 
      INA           CLEAR 
      CLB            WORD 
      SPC 1 
      IFN 
******* BEGIN NON-DMS CODE **** 
      STB A,I       FOUR
******* END NON-DMS CODE ****** 
      XIF 
      SPC 1 
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      XSB A,I       FOUR
******* END DMS CODE ********** 
      XIF 
      SPC 1 
* 
      LDB TEMP1,I   IF BLOCK AVAILABLE THEN 
      SZB,RSS       SKIP THE
      JMP RE4       MOVE
* 
      SEZ,INA       SET A TO SAVE BLOCK ADDRESS 
      INA           (EXTRA WORD USED IN ID-EXTENSION) 
      LDB TEMP1     DIG THE TDB SIZE OUT
      CLE,INB        OF THE TDB 
      LDB B,I       AND SET IN B
      JSB MTDB      MOVE OUT THE TDB
RE4   LDA TEMP4     GET THE ADDRESS OF THE ID-SEG. ADDRESS
      STA TEMP1,I   AND SET IN THE TDB
      LDA TEMP3,I   GET THE ID-STATUS WORD
      IOR B2000     SET THE RENT BIT
      STA TEMP3,I   RESTORE THE WORD
      LDB TEMP1    (B) = ADDR. OF TDB.
      ADB D2       SET
      LDA $LIBR     (P+1) 
      ADA DM2       OF ORIGINAL 
      LDA A,I       CALL IN 
      STA B,I       WORD 3 OF TDB IN PROGRAM. 
      ISZ $LIBR    SET TO FIRST INSTR IN LIB. PROG. 
* 
      LDB $LIBR     SET RETURN ADDRESS
      STB XSUSP,I   IN THE ID-SEG.
      JMP $RENT     RETURN TO THE DISPATCHER
$PVCN NOP 
* 
* REJECT SECTION CAUSED BY NO MEMORY
*  AVAILABLE FOR -TDB-. CALLING USER PROGRAM
*  IS SUSPENDED BACK TO POINT OF CALL AND 
*  LINKED INTO MEMORY SUSPENSION LIST.
* 
NVRM  LDA D4        NEVER ENOUGH MEMORY, REQUEST 4 NEXT TIME
      STA XTEMP,I 
LB5   JSB $LIST    SUSPEND
      OCT 504       PROGRAM 
      JMP $XEQ     TRANSFER TO EXECUTE SECTION. 
* 
LB05  LDA $LIBR     NO MEMORY ON SECOND LEVEL 
      ADA DM2        REENTRANT CALL, GET PROPER RETURN
      CCB            ADDRESS SO THAT WE REMAKE CALL 
      ADB A,I 
      STB XSUSP,I 
      JMP LB5 
* 
* 
* 
*         $LIBX EXIT PROCESSOR FOR RENT/PRIV LIB ROUTINES 
* 
*  < $LIBX> IS ENTERED WHEN A LIBRARY 
* PROGRAM TERMINATES ITS EXECUTION. A 
* TEMPORARY DATA BLOCK IS MOVED BACK
* INTO THE LIBRARY PROGRAM, IF REQUIRED,
* BEFORE RETURN TO THE ORIGINAL CALLER. 
* 
* 
LIBXA DEF $LIBX 
* 
$LIBX NOP           NON MP ENTRY - MUST BE
      STA XA,I      RETURNING FORM PRIV. SUB. 
      LDA $PVCN     SUBTRACT ONE FORM THE COUNT 
      CMA,INA       WITH OUT AFFECTING
      CMA,SZA,RSS    "E" ($PVCN >0 )
      JMP LB10      IF NOT STILL PRIV. JMP
* 
      STA $PVCN     STILL PRIV. SET THE COUNTER BACK
      LDA $LIBX,I   TRACK DOWN THE RETURN 
      LDA A,I       ADDRESS 
      STA $LIBX     AND SET IT
      LDA XA,I      RESTORE A AND 
      JMP $LIBX,I   RETURN
* 
LB10  STA $PVCN     RETURN NON PRIV. SET COUNTER
      STB XB,I      TO ZERO AND FINISH THE REG. SAVE
      ERA,ALS       E 
      SOC           O 
      INA 
      STA XEO,I 
      LDA $LIBX,I   GET THE 
      LDA A,I       RETURN ADDRESS
      STA XSUSP,I   AND SAVE IT 
      IFN 
SAVXY JMP $RENT     (CXA IF MX CPU) 
      XIF 
      IFZ 
      CXA 
      XIF 
      CYB           SAVE THE X,Y REGS.
      DST XI,I      IN THE X,Y SAVE AREA
      JMP $RENT     NOW GO SET THE FENCE
* 
* 
* RE-ENTRANT PROGRAM RETURNING TO USER CALL.
* 
LIBXC LDB $LIBR,I   SET  -TDB- ADDRESS. 
      STB TEMP1     IN TEMP1. 
      ISZ $LIBR     SET TO (P+2) OF CALL TO -$LIBX-.
      ADB D2       GET
      LDA B,I       RETURN POINT ADJUSTMENT.
      ADA $LIBR,I    ADD TO (P+1) OF LIBRARY CALL 
      STA XSUSP,I   AND SET FOR RETURN TO USER. 
* 
      LDB XEQT      GET ID EXTENSION
      JSB FINDL     ADDRESS 
      JMP MPERR     NOT FOUND???
      JMP LB14      START SEARCH
* 
LB15  SEZ,CCE,RSS   FIND NEXT ENTRY ADDRESS 
      ADB D3
      STB TEMP5     SAVE POINTER
      SPC 1 
      IFN 
******* BEGIN NON-DMS CODE **** 
      LDB B,I       GET ADDRESS 
******* END NON-DMS CODE ****** 
      XIF 
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      XLB B,I       GET ADDRESS 
******* END DMS CODE ********** 
      XIF 
      SPC 1 
LB14  STB A         GET ADDRESS OF
      INA           ID WORD 
      CPA TEMP1,I   THIS ONE??
      RSS           YES GO DO IT
      JMP LB15      NO TRY NEXT ONE 
* 
      STB TEMP2     SAVE BLOCK ADDRESS
      SPC 1 
      IFN 
******* BEGIN NON-DMS CODE **** 
      LDB B,I       RELINK THE BLOCKS 
      STB TEMP5,I 
******* END NON-DMS CODE ****** 
      XIF 
      SPC 1 
      IFZ 
******* BEGIN DMS CODE ******** 
      XLB B,I       RELINK THE BLOCKS 
      XSB TEMP5,I 
******* END DMS CODE ********** 
      XIF 
      SPC 1 
      JSB RTN4      RETURN THE ID-EXTENSION 
      JMP $RENT     TDB = 0, GO TO CHECK RETURN.
* 
      SKP 
* SUBROUTINES: <SAVER> AND <RSTR> USED FOR
*              SAVING AND RESTORING REGISTERS 
*              IN LIBRARY PROGRAM PROCESSING. 
* 
SAVER NOP 
MIC3  JMP MIC4  OR  STA XA,I  IF NO MICRO 
      STB XB,I
      ERA,ALS 
      SOC 
      INA 
      STA XEO,I 
      SPC 1 
      IFN 
* BEGIN NON-DMS CODE ***************
MX3   JMP SAVER,I   RETURN IF NOT MX, CXA IF MX 
*** END NON-DMS CODE ***************
      XIF 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ***************
      CYB 
******* END DMS CODE ***************
      XIF 
      SPC 1 
      DST XI,I
      JMP SAVER,I 
* 
MIC4  SVR XA,I XI,I   SAVE REGS MICRO CALL
      JMP SAVER,I   RETURN
* 
RSTR  NOP 
MIC5  JMP MIC6  OR  LDA XEO,I  IF NO  MICRO 
      CLO 
      SLA,ELA 
      STF 1 
      SPC 1 
      IFN 
* BEGIN NON-DMS CODE ***************
MX4   JMP NMX4   IF NOT MX, DLD IF MX 
       DEF XI,I 
*** END NON-DMS CODE ***************
      XIF 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ***************
      DLD XI,I
******* END DMS CODE ***************
      XIF 
      SPC 1 
      CAX 
      CBY 
NMX4  LDA XA,I
      LDB XB,I
      JMP RSTR,I    RETURN
* 
MIC6  RSR XA,I XI,I   RESTORE REGS MICRO CALL 
      JMP RSTR,I    RETURN
* 
                                                                                                                    