*  *********************************************************************
*
*  $Header:  002  20-NOV-89 15:31  BEVIER    BEVIER                    $
*  $Log:   @ISCSRC^(DV.TXPM.SYSM)TXPM.PRE                              $
*
*       Rev  002  20-NOV-89 15:31  BEVIER    BEVIER
*  Update for MPX 3.5 flags.
*
*       Rev  001  09-NOV-88 08:16  GANN      GANN
*   Version control header added
*
*
* PRE FILE FOR NON-EXTENDED MODE OF MPX-32 REV 3  RELEASE 3.5   MPX_NON
C.3227   SETT
C.TRACF  SETF
C.SALONE SETF
C.SYSGON SETF
C.TXTEST SETF
C.MEMO   SETF
BOPT_MPX SETF
C.FWMID  SETF                                                   EMMM-35A
C.DPMODE SETF                                                   EMMM-35B
C.DPDEV  SETF                                                   EMMM-35B
C.MPXOUT SETF                                                   EOUT-35
MPX_SVC  SET       6                                            ECAL-35
         REIS                                                   EOUT-35
         SPACE                                                  EOUT-35
         LIST     OFF
****************************************************************EDPG-35
*        MACRO:   M.LMEML                                       EDPG-35
*                                                               EDPG-35
*  THIS MACRO WILL SET UP %P1 WITH CONTENTS OF MEML IN BITS     EDPG-35
*  0-15 AND CONTENTS OF MEML2 IN 16-31.                         EDPG-35
*  NOTE: IF NOT C.DPMODE AND HALFWORD MIDS THEN %P1 WILL HAVE   EDPG-35
*  THE MEML CONTENTS IN BITS 0-15 OF THE REGISTER.              EDPG-35
*                                                               EDPG-35
*  NOTE: R0 IS DESTROYED                                        EDPG-35
*                                                               EDPG-35
****************************************************************EDPG-35
M.LMEML  DEFM      P1,P2,P3                                     EDPG-35
         IFT       C.DPMODE,%CONT                               EDPG-35
         IFF       C.FWMID,%CONT                                EDPG-35
         LCH       %P1,%P2,%P3     GET MEML                     EDPG-35
         SLL       %P1,16          MOVE TO LEFT HALF OF REG     EDPG-35
         TRR       %P3,R0          SAVE MEML IN R0              EDPG-35
         M.TSAD    %P3             GET TSA ADDRESS              EDPG-35
         LCW       %P3,T.MEMLO,%P3 GET MEML OFFSET              EDPG-35
         ADR       R0,%P3          GET MEML2 ENTRY ADDRESS      EDPG-35
         LCH       %P3,%P2,%P3     GET MEML2                    EDPG-35
         SLL       %P3,16          CLEAR UPPER HALF             EDPG-35
         SRL       %P3,16                                       EDPG-35
         ORR       %P3,%P1         SET UP RIGHT HALF IN P1      EDPG-35
         TRR       R0,%P3          RESTORE P3                   EDPG-35
         GOTO      %END                                         EDPG-35
%CONT    ANOP                                                   EDPG-35
         M.LDMID   %P1,%P2,%P3                                  EDPG-35
         IFF       C.FWMID,%END                                 EDPG-35
         SLL       %P1,16          PUT IT IN BITS 0-15          EDPG-35
%END     ANOP                                                   EDPG-35
         ENDM                                                   EDPG-35
         SPACE                                                  EOUT-35
****************************************************************EDPG-35
*        MACRO:   M.SMEML                                       EDPG-35
*                                                               EDPG-35
*  THIS MACRO WILL SET UP MEML WITH LEFT HALF OF P1 AND         EDPG-35
*  SET UP MEML2 WITH RIGHT HALF OF P1.                          EDPG-35
*  NOTE: IF NOT C.DPMODE AND HALFWORD MIDS THEN %P1 WILL BE     EDPG-35
*  SET UP TO MOVE MEML CONTENTS TO BITS 16-32 FOR RESTORE.      EDPG-35
*                                                               EDPG-35
*  NOTE: R0 IS DESTROYED                                        EDPG-35
*                                                               EDPG-35
****************************************************************EDPG-35
M.SMEML  DEFM      P1,P2,P3                                     EDPG-35
         IFT       C.DPMODE,%CONT                               EDPG-35
         IFF       C.FWMID,%CONT                                EDPG-35
         TRR       %P3,R0          SAVE P3 IN R0                EDPG-35
         M.TSAD    %P3             GET TSA ADDRESS              EDPG-35
         LCW       %P3,T.MEMLO,%P3 GET MEML OFFSET              EDPG-35
         ADR       R0,%P3          GET MEML2 ENTRY ADDRESS      EDPG-35
         STCH      %P1,%P2,%P3     STORE RIGHT  HALF IN MEML2   EDPG-35
         TRR       R0,%P3          RESTORE MEML ADDRESS         EDPG-35
         TRR       %P1,R0          SET R0 W/ %P1 CONTENTS       EDPG-35
         SRL       R0,16           MOVE TO RIGHT HALF OF REG    EDPG-35
         STCH      R0,%P2,%P3      STORE LEFT HALF IN MEML      EDPG-35
         GOTO      %END                                         EDPG-35
%CONT    ANOP                                                   EDPG-35
         IFF       C.FWMID,%FWMID                               EDPG-35
         SRL       %P1,16          PUT IT IN BITS 16-32         EDPG-35
%FWMID   ANOP                                                   EDPG-35
         M.STMID   %P1,%P2,%P3                                  EDPG-35
         IFF       C.FWMID,%END                                 EDPG-35
         SLL       %P1,16          PUT IT IN BITS 0-15          EDPG-35
%END     ANOP                                                   EDPG-35
         ENDM                                                   EDPG-35
         LIST      ON
************************************************************************
         LIST      OFF
*  *********************************************************************
*
*  $Header:  002  25-MAY-89 12:27  GANN      GANN                      $
*  $Log:   @ISCSRC^(DV.TXPM.SYSM)SM.XPMMAC                             $
*
*       Rev  002  25-MAY-89 12:27  GANN      GANN
*  The version originally added to the version control system
*  was an old one.  I deleted all of the old macros and added
*  the new ones.  No lines are marked for this mod because the
*  entire file was modified.
*
*       Rev  001  09-NOV-88 06:15  GANN      GANN
*   Version control header added
*
*
************************************************************************
*
* ASSEMBLE MACRO T.TXPM
*
* PURPOSE: Used by SYSTEM modules (user SVC's/int. handlers) to see if
*          the current task is a T-XPM task.
*
*          This macro is not for use at the Task level.
*
* CALLING SEQUENCE:
*
*          T.TXPM
*
* RETURN:
*
*        R2 is destroyed, condition code 1 is set if the current
*        Task is a T-XPM task.
*
************************************************************************
*
T.TXPM   DEFM
         LW        R2,C.CTXT            FIRST SEE IF TXPM IS PRESENT
         BEQ       %NOTXPM              NOPE C.CTXT NOT SET UP
         T.DQECXT                       GET CONTEXT ADDRESS
         TBM       TSK.TXPM,TSK.FLG1,X2 IS THIS A TXPM TASK?
%NOTXPM  EQU       $                    RETURN WITH CONDITION CODE SET
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO TXPM.LV  (FOR CPU)
*
* PURPOSE: Allow SYSTEM modules to dispatch to tasks running in either
*          the MPX or T-XPM environments. This macro will typically
*          replace LPSD instructions when converting SYSTEM modules to
*          execute on behalf of T-XPM tasks.
*
*          This macro is for use by an operating SYSTEM module that
*          performs an LPSD to return to a previous context.  It is
*          not to be used at the task level.
*
* CALLING SEQUENCE:
*
*          TXPM.LV   ADDRESS
*
* Where ADDRESS is the address of the User's PSD.
* R0-R7 must contain the user's registers.
*
* RETURN:
*
*        T-XPM TASK: control is transferred to the T-XPM task.
*        MPX   TASK: Control is returned to the instruction after
*                    the macro call with the user's registers
*                    loaded.
*
************************************************************************
*
TXPM.LV  DEFM      ADDR
         BEI
         STF       R0,%REGS        SAVE USER REGS
         LW        R0,C.GINT       INTERRUPT IN PROGRESS?
         BNZ       %MPX            IF SO, LEAVE
         LW        R0,C.CURR
         CI        R0,C.CURR       TASK IN EXECUTION?
         BEQ       %MPX            IF NOT, LEAVE
         T.TXPM                    IS TASK A TXPM TASK?
         BNS       %MPX            BRANCH IF NOT
         LA        R2,%REGS        GET ADDRESS OF REG SAVE AREA
         LD        R6,%ADDR        GET THE RETURN PSD
         BL        *C.XPMRET       DISPATCH IF T-XPM TASK
         BU        %MPX            SKIP OVER REG SAVE AREA
*
%REGS    RES       1F              USER REGS
*
%MPX     EQU       $
         LF        R0,%REGS        RESTORE USER'S REGISTERS
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO TXPM.RET (FOR CPU)   FAST OR NESTED INTERRUPT RETURN
*
* PURPOSE: Allow SYSTEM modules to dispatch to tasks running in either
*          the MPX or T-XPM environments. This macro will typically
*          replace LPSD instructions when converting SYSTEM modules to
*          execute on behalf of T-XPM tasks.
*
*          This macro is for use by an operating SYSTEM module that
*          performs an LPSD to return to a previous context.  It is
*          not to be used at the task level.
*
* CALLING SEQUENCE:
*
*          TXPM.RET  ADDRESS
*
* Where ADDRESS is the address of the User's PSD.
* R0-R7 must contain the user's registers.
*
* RETURN:
*
*        T-XPM TASK: control is transferred to the T-XPM task.
*        MPX   TASK: Control is returned to the instruction after
*                    the macro call with the user's registers
*                    loaded.
*
************************************************************************
*
TXPM.RET DEFM      ADDR
         BEI
         STW       R2,%REG2        SAVE USER REG 2
         LW        R2,C.CTXT       IS TXPM ON SYSTEM
         BZ        %MPX            BR IF NOT
         LW        R2,%REG2        RESTORE USER'S R2
         STF       R0,*C.TASKR     PASS REGS TO TXPM
         LD        R6,%ADDR        GET RETURN PSD WD 2
         LW        R2,C.TASKR      REG SAVE AREA ADDRESS
         BL        *C.RETURN       DISPATCH IF T-XPM TASK
         LF        R0,*C.TASKR     RESTORE USER'S REGS
         BU        %RMPX           SKIP OVER REG SAVE AREA & RETURN
*
%REG2    RES       1W              USER REG  2
*
%MPX     EQU       $
         LW        R2,%REG2        RESTORE USER'S REGISTER  2
%RMPX    EQU       $               RETURN TO CALLER
         ENDM
*
***********************************************************
*
*        MACRO TO GET REAL ADDRESS
*
* USAGE: USED INPLACE OF LEAR INSTRUCTION IN HANDLERS WHEN THE
*        ADDRESS PROVIDED IS IN AN OVERFLOW MAP THAT CAN NOT BE
*        MAPPED INTO THE TASK'S ADDRESS SPACE WHEN IN THE MPX
*        ENVIRONMENT.
*
*        X.REAL    DEST.REG,SRCE.REG
*
* WHERE  DEST.REG IS THE REGISTER NUMBER TO RECEIVE THE REAL
*        ADDRESS
*        SRCE.REG IS THE REGISTER NUMBER CONTAINING AN MPX
*        ADDRESS.  IT HAS ALREADY BEEN BIASED USING THE X.BIAS
*        OR T.BIAS MACRO TO CONVERT IT FROM A TXPM ADDRESS PASSED
*        BY THE USER TO AN MPX ADDRESS.
*
***********************************************************
*
X.REAL   DEFM      RD,RS
         STF       R0,%REG         SAVE REGS
         LA        R2,%REG         SAVE AREA ADDR
         LW        R6,1W*%RS,X2    GET ADDRESS TO CONVERT
         ANMW      R6,=X'FFFFFF'   ONLY 24 BITS
         LB        R5,C.MACH       GET MACHINE TYPE
         LW        R1,C.TSAD       GET TSA ADDR
         TRR       R6,R7           COPY ADDR
         CI        R5,2            SEE IF 7X
         BLT       %7X             BR IF 7X
         SRL       R6,13           CONVERT TO MAP NUMBER
         LW        R1,T.MIDLA,X1   GET MIDL ADDRESS
         BU        %MRG            MERGE CODE
%7X      SRL       R6,15           CONVERT TO MAP NUMBER
         ADI       R1,T.MIDL       GET MIDL ADDRESS
%MRG     SUMB      R6,C.MSD        SUBT OFF SIZE OF O/S
         SLL       R6,1            MAKE HW BIAS
         ADR       R6,R1           ADD OFFSET TO CORRECT DESR
         LH        R4,0H,X1        GET MAP DESCR
         CI        R5,2            SEE IF 7X
         BLT       %7Y             BR IF 7X
         SLL       R4,13           CONVERT TO ADDRESS
         ANMW      R7,=X'1FFF'     GET OFFSET IN MAP
         BU        %MRGE           MERGE CODE
%7Y      SLL       R4,15           CONVERT TO ADDRESS
         ANMW      R7,=X'7FFF'     GET OFFSET IN MAP
%MRGE    ADR       R7,R4           R7 NOW HAS REAL ADDRESS
         ANMW      R4,=X'FFFFFF'   LEAVE ONLY 24 BITS
         STW       R4,1W*%RD,X2    PUT IN CORRECT REG
         LF        R0,%REG         RESTORE USERS REGS
         BU        %RET            RETURN
         BOUND     1F
%REG     RES       1F              REG SAVE AREA
%RET     EQU       $
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO TXPM.LVI  (FOR IPU)
*
* PURPOSE: Allow SYSTEM modules to dispatch to tasks running in either
*          the MPX or T-XPM environments. This macro will typically
*          replace LPSD instructions when converting SYSTEM modules to
*          execute on behalf of T-XPM tasks.
*
*          This macro is for use by an operating SYSTEM module that
*          performs an LPSD to return to a previous context.  It is
*          not to be used at the task level.
*
*
* CALLING SEQUENCE:
*
*          TXPM.LVI  ADDRESS
*
* Where ADDRESS is the address of the user's PSD.
* R0-R7 must contain the user's registers.
*
* RETURN:
*
*        T-XPM TASK: Control is transferred to the T-XPM task.
*        MPX   TASK: Control is returned to the instruction after
*                    the macro call with the user's registers
*                    loaded.
*
************************************************************************
*
TXPM.LVI DEFM      ADDR
         STF       R0,%REGS        SAVE USER REGS
         T.TXPM                    TXPM TASK?
         BNS       %RETURN         JUST GET OUT, IF NOT
*
         IFF       C.3227,%GOT7X
         EXT       EXEC.FLAG      (2.X SYSTEMS)
IPU.GATE EQU       6
         SBM       IPU.GATE,EXEC.FLG    GATE THE IPU (2.X)
%GOT7X   ANOP
*
         IFT       C.3227,%NO7X
         SBM       C.ICSIPU,C.BIT  GATE THE IPU (3.X)
%NO7X    ANOP
         LA        R2,%REGS        GET ADDRESS OF REG SAVE AREA
         LD        R6,%ADDR        GET THE USER PSD
         BL        *C.XPMRET       DISPATCH IF T-XPM TASK
         IFF       C.3227,%GOT7X
         ZBM       IPU.GATE,EXEC.FLG  UNGATE THE IPU (2.X)
%GOT7X   ANOP
*
         IFT       C.3227,%NO7X
         ZBM       C.ICSIPU,C.BIT  UNGATE THE IPU (3.X)
%NO7X    ANOP
         BU        %RETURN         SKIP OVER REG SAVE AREA
*
%REGS    RES       1F              USER REGS
*
%RETURN  EQU       $
         LF        R0,%REGS        RESTORE USER'S REGISTERS
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO T.BIAS
*
* PURPOSE: Convert a tasks T-XPM address to a MPX address.  This macro
*          is used by SYSTEM modules that need to adjust an address
*          from the T-XPM environment to the MPX environment.
*
*          This macro is not for use at the Task level.
*
* CALLING SEQUENCE:
*
*          T.BIAS    R
*
* Where R is a register which contains the address to be converted.
*
* RETURN:
*
*        R2 is destroyed (R must not be equal to 2)
*        Register R contains the converted address.
*
************************************************************************
*
T.BIAS   DEFM      R
         LW        R2,C.CTXT       FIRST SEE IF TXPM IS PRESENT
         BEQ       %NO.BIAS        NOPE
         TRR       %R,%R           DO NOT BIAS 0
         BZ        %NO.BIAS
         T.DQECXT
         ADMW      %R,TSK.BIAS,X2  BIAS THE ADDRESS
%NO.BIAS EQU       $
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO M.FAST
*
* PURPOSE: Convert an interrupt to a fast TXPM interrupt.
*          This Macro is used during SYSGEN initialization to indicate
*          to TXPM that the interrupt is to be special cased.
*
* CALLING SEQUENCE:
*
*          M.FAST    R
*
* Where R is a register which contains the interrupt priority.
*
* RETURN:
*
*        R is destroyed (R must be an index register 1-3)
*
************************************************************************
*
M.FAST   DEFM      R
         SLL       %R,2            MAKE WORD OFFSET
         ADI       %R,X'80'*1W     OFFSET TO INTERRUPTS IN SPAD
         ADMW      %R,C.SPAD       SPAD BASE ADDRESS
         SBM       3,0W,%R         SET SPL INT FLAG FOR TXPM
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO X.BIAS
*
* PURPOSE: Convert a tasks T-XPM address to a MPX address.  This macro
*          is used by SYSTEM modules that need to adjust an address
*          from the T-XPM environment to the MPX environment.
*          This special Macro uses the cpix from the supplied
*          return PSD instead of C.CURR for DQE address.
*
*          This macro is not for use at the Task level.
*
* CALLING SEQUENCE:
*
*          X.BIAS    R,PSD
*
* Where R is a register which contains the address to be converted.
* Where PSD is the return PSD to use the CPIX from.
*
* RETURN:
*
*        R2 is destroyed (R must not be equal to 2)
*        Register R contains the converted address.
*
************************************************************************
*
X.BIAS   DEFM      R,PSD
         LW        R2,C.CTXT       First see if TXPM is present
         BEQ       %NO.BIAS        Nope
         TRR       %R,%R           Do not bias 0
         BEQ       %NO.BIAS
         LB        R2,C.MACH       Get machine type
         CI        R2,2            7X?
         BLT       %7X             Br if yes
         LA        R2,%PSD         Get address of return PSD
         LW        R2,1W,X2        Get CPIX from PSD
         ANMW      R2,=X'3FFC'     Just use CPIX
         SRL       R2,3            Concept CPIX shift
         BU        %MRG            Merge with 7X code
%7X      LA        R2,%PSD         Get address of return PSD
         LW        R2,1W,X2        Get CPIX from PSD
         ANMW      R2,=X'3FFC'     Extract CPIX
         SRL       R2,2            7X CPIX shift
%MRG     SLL       R2,2            Word adjust DQE number
         ADMW      R2,C.ADAT       DQE address table
         LW        R2,0W,X2        Get DQE address
         LW        R2,DQE.CXTA,X2  Get context address
         ADMW      %R,TSK.BIAS,X2  Bias the address
%NO.BIAS EQU       $               Done with biasing
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO T.RBIAS
*
* PURPOSE: To convert a MPX Environment address to a T-XPM Environment
*          address.
*
*          This macro is not for use at the Task level.
*
* CALLING SEQUENCE:
*
*          T.RBIAS   R
*
* Where R is a register that contains an address to rebias.
*
* RETURN:
*
*        R2 is destroyed (R must not be equal to R2)
*        Register R contains the rebiased address.
*
************************************************************************
*
T.RBIAS  DEFM      R
         LW        R2,C.CTXT       SEE IF TXPM IS PRESENT
         BZ        %NO.BIAS        NOPE
         TRR       %R,%R           DO NOT BIAS 0
         BZ        %NO.BIAS
         T.DQECXT
         SUMW      %R,TSK.BIAS,X2  REBIAS THE ADDRESS
%NO.BIAS EQU       $
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO T.FBIAS
*
* PURPOSE: Return the T-XPM Bias for the current task.  The T-XPM
*          Bias is the number of bytes of MPX that are mapped out
*          for the current task.
*
*          This macro is not for use at the Task level.
*
*
* CALLING SEQUENCE:
*
*          T.FBIAS   R
*
* Where R is the register to contain the bias upon return
*
* RETURN:
*
*        R2 is destroyed unless R=2
*        R contains the T-XPM Bias for the current task
*
************************************************************************
*
T.FBIAS  DEFM      R
         LW        R2,C.CTXT            SEE IF TXPM IS PRESENT
         BEQ       %NOTXPM              NOPE
         T.DQECXT
         LW        %R,TSK.BIAS,X2       JUST GET THE BIAS
%NOTXPM  EQU       $
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO T.DQECXT
*
* PURPOSE: Return the address of the DQE context area for the current
*          task.  Each task (whether a T-XPM task or not) has a 14 word
*          context area inside of H.TXPM.  The context area contains
*          information about the task which is important to H.TXPM
*          for removing MPX from the task address space.  The DQE
*          context area for a non T-XPM task is zero.  This macro is
*          a "support" macro in that it usually will not be invoked
*          directly by the user, but rather by other T-XPM macros,
*          such as T.TXPM, etc.
*
* CALLING SEQUENCE:
*
*        T.DQECXT
*
* RETURN:
*
*        R2 contains the address of the DQE context area.
*
************************************************************************
*
T.DQECXT DEFM
         IFF       C.3227,%327X
         LW        R2,=X'910000'   GET SPAD ADDRESS
         TSCR      R2,R2           READ IPU STATUS WD
%327X    ANOP
         IFT       C.3227,%3227
         RDSTS     R2              GET CPU STATUS WD
%3227    ANOP
         TBR       R2,27           ARE WE IN IPU
         BS        $+3W            BR IF WE ARE
         LW        R2,C.CURR       ADDRESS OF CURRENT TASK'S DQE
         BU        $+2W            SKIP IPU STUFF
         LW        R2,C.CIPU       DQE ADDRESS IF IN IPU
         LW        R2,DQE.CXTA,X2  CURRENT TASK'S CONTEXT ADDRESS
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO T.LPSDCM
*
* PURPOSE: Allow a T-XPM task to execute an LPSDCM instruction.
*          This macro is necessary in order to insure that the correct
*          maps are loaded since MPL entry 0 (for MPX) may be set up
*          for the MPX environment.  This macro should only be used
*          where the current T-XPM task wants to retain control of
*          the CPU. The main purpose of the macro is only to allow
*          the task to re-load its own maps.  This macro can not
*          be used to perform a context switch.
*
* CALLING SEQUENCE:
*
*        T.LPSDCM  PSD2,RETURN
*
* Where 'PSD2' remains for compatability with previous releases.
*       'RETURN'  is the address to which control shall be returned
*                 if the current task is not a T-XPM task.
*
* RETURN:
*
*        !!! FOR T-XPM TASKS !!!
*
*        Control is returned to the user at the next instruction
*        after the macro.  Upon return, the new maps are loaded.
*
*        !!! FOR MPX TASKS !!!
*
*        Control is returned to the address specified by 'RETURN',
*        without any change to the user's maps.
*
*        R2 IS DESTROYED UPON RETURN (CONTAINS TSA ADDRESS)
*
*        This macro is for use at the task level.
*
************************************************************************
*
T.LPSDCM DEFM      PSD2,RETURN
         LW        R2,C.TSAD       GET OUR TSA ADDRESS
         CAMW      R2,C.TSAD       TXPM TASK
         BEQ       %RETURN         IF EQUAL, NOT TXPM TASK
*                                  ELSE, MAPS NOW RELOADED BY TXPM
*                                  TAKING UNIMPLEMENTED INSTRUCTION
*                                  TRAP FOR TSA REFERENCE.
         SVC       1,3             TURN OFF TSA BIASING
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO TXPM.LVP
*
* PURPOSE: Allow system modules to dispatch to tasks running in
*          MPX or T-XPM environments.  This macro will usually be
*          inserted at the LPSD instruction where dispatch control is
*          returned to the user.
*
*          This macro is for use by a privileged 'MPX' task who is
*          set up to handle interrupts.
*
*          !!! THIS MACRO SHOULD NOT BE USED BY A T-XPM TASK !!!
*
* CALLING SEQUENCE:
*
*        TXPM.LVP  ADDRESS
*
* Where 'ADDRESS' is the address of the return PSD.
* R0-R7 must contain the user's registers.
*
* RETURN:
*
*        Interrupted task was --
*
*        T-XPM task: control is transfered to the T-XPM task.
*        MPX   task: control is returned to the instruction after
*                    the macro call with the user's registers
*                    loaded and interrupts blocked.
*
************************************************************************
*
TXPM.LVP DEFM      ADDR
         BEI
         STF       R0,%REGS        SAVE THE REGS UNTIL WE KNOW IF TXPM
*                                  IS PRESENT.
         T.TXPM
         BNS       %MPX            BRANCH IF MPX TASK
         LF        R0,%REGS        RESTORE USER'S REGISTERS
         STF       R0,*C.TASKR     PASS THE USER REGISTERS TO H.TXPM
         LD        R6,%ADDR        GET THE USER PSD
         BL        *C.RETURN       REDISPATCH IF T-XPM TASK
         BU        %MPX            SKIP OVER REG SAVE AREA
*
%REGS    RES       1F              USER REGS
%MPX     EQU       $
         LF        R0,%REGS        RESTORE USER'S REGISTERS
         ENDM
*
************************************************************************
*
* ASSEMBLE MACRO M.TXPM
*
* PURPOSE: Set equates needed for all other T-XPM macros
*
* CALLING SEQUENCE:
*
*        M.TXPM
*
* RETURN:
*
*        Equates set.
*
************************************************************************
*
M.TXPM   DEFM
*
*--------------------------------------------------------------------
*
*   H.TXPM Equates for internal structures and global values
*
         LIST      OFF
C.TXPM   EQU       X'C4'           T-XPM COPY OF C.TSAD
C.UBIAS  EQU       X'C8'           HAT ADDRESS OF H.UBIAS ROUTINE
C.TASKR  EQU       X'CC'           TXPM LOC FOR USER REGS
C.RETURN EQU       X'D0'           TXPM FAST INT DISP/RETURN
C.INTVA  EQU       X'D4'           CPU INT VECTOR TABLE ADDRESS
C.EVNT   EQU       X'D8'           POINTER TO EVNT.PTR
C.CTXT   EQU       X'DC'           POINTER TO DQE CONTEXT AREA
C.XPMRET EQU       X'E0'           ADDRESS OF S.TXPM.0 IN H.TXPM
C.TRPCA  EQU       X'E4'           ADDRESS OF TRAP CONTEXT AREA
*
DQE.CXTA EQU       X'60'           ADDRESS OF CONTEXT AREA IN DQE
DQE.PSDA EQU       X'64'           INT PSD ADDRESS IN DQE
*
*--------------------------------------------------------------------
*
*   TASK CONTEXT AREA EQUATES
*
TSK.NMAP EQU       0B              # OF OS MAPS TO INCLUDE
TSK.FLG1 EQU       1B              1ST FLAG BYTE
TSK.ATI  EQU       2B              CURRENT INTERRUPT LEVEL (WORD OFFST)
TSK.FLG2 EQU       3B              2ND FLAG BYTE
TSK.BIAS EQU       1W              BIAS DIFFERENCE BETWEEN MPX & TXPM
TSK.DBHT EQU       2W              'REAL' DEBUG HAT ADDRESS
TSK.NORM EQU       3W              NUMBER OF OVERRUN MAPS (BYTE 0)
TSK.LVLP EQU       3W              CURRENT LVL POINTER (BYTES 1-3)
TSK.LVL0 EQU       4W              INTERRUPT LEVEL 0 (NORMAL)
TSK.LVL1 EQU       5W              INTERRUPT LEVEL 1 (MESSAGE)
TSK.LVL2 EQU       6W              INTERRUPT LEVEL 2 (END ACT PRIOR 2)
TSK.LVL3 EQU       7W              INTERRUPT LEVEL 3 (BREAK)
TSK.LVL4 EQU       8W              INTERRUPT LEVEL 4 (DEBUG)
TSK.LINE EQU       9W              ADDRESS OF BLOCKING BUFFER WHICH
*                                  CONTAINS COPY OF T.LINEBUF
TSK.RPSD EQU       10W             RETURN PSD FOR USER
TSK.REGP EQU       12W             POINTER TO REG SAVE AREA FOR USER
TSK.RET  EQU       13W             RETURN ADDRESS FOR SVC PROCESSING
TSK.DQE  EQU       14W             DQE ADDRESS FOR THIS TASK       *E3*
TSK.SPR  EQU       15W             SPARE WORD IN CONTEXT AREA      *E3*
*
*--------------------------------------------------------------------
*
*   EQUATES FOR TSK.FLG1
*
USR.TSAB EQU       0               IF SET, TASK REFERENCING TSA    *E3*
TSK.TSAB EQU       1               IF SET, TSA IS REBIASED (FOR TXPM) *E
TSK.DBAT EQU       2               NOT USED                        *E3*
TSK.EACT EQU       3               NOT USED                        *E3*
STK.BIAS EQU       4               IF SET, AID STACK REBIASED (FOR TXPM)
TSK.AID  EQU       5               IF SET, TASK USES AID CALL STACK
TSK.FORC EQU       6               IF SET, TASK FORCED TO T-XPM
TSK.TXPM EQU       7               IF SET, TASK IS A T-XPM TASK
*
*--------------------------------------------------------------------
*
*   EQUATES FOR TSK.FLG2
*
TSK.CMD  EQU       0               IF SET, M.CMD SVC IN PROCESS
TSK.AUTO EQU       1               IF SET, AUTO OPEN REQUESTED
EXEC.SVC EQU       2               NOT USED                        *E3*
ORG.SVC2 EQU       3               NOT USED                        *E3*
DSP.TXPM EQU       4               IF SET, THIS IS A T-XPM DISPATCH
TSK.MORN EQU       5               IF SET, MAP OVERRUN OCCURRED
TSK.IPU  EQU       6               NOT USED                        *E3*
TSK.OMPX EQU       7               IF SET, ONLY RUN AS MPX TASK
*
DQE.LCXT EQU       16W             LENGTH OF CONTEXT STRUCTURE     *E3*
*
*--------------------------------------------------------------------
*
*  EQUATES FOR INTERRUPT LEVEL IN DQE CONTEXT AREA
*
SVC.TYPA EQU       0               TYPE 'A' SVC
SVC.AID  EQU       1               'AID' SVC
TSK.SVC  EQU       2               IF SET, CURRENTLY EXEC. SVC (1 OR 2)
TSK.SVC1 EQU       3               IF SET, SVC IS TYPE 1; ELSE TYPE 2
TSK.CNP  EQU       4               CNP SUPPLIED FOR CURRENT SVC
TSK.XXX  EQU       5               NOT USED                        *E3*
TSK.RTYP EQU       6               IF SET, RESOURCE TYPE NOT IDENTIFIED
TSK.ECP  EQU       7               NOT USED                        *E3*
*
TSK.LVL  EQU       0B              FIRST BYTE OF LEVEL INFO
TSK.IPUB EQU       1B              NOT USED
TSK.SVCT EQU       2B              SVC CALL # FOR SVC TYPES 1, 2 AND 15
DQE.RTYP EQU       3B              RESOURCE TYPE INDICATOR
*
*--------------------------------------------------------------------
*
*  EQUATES FOR TRAP INFORMATION BLOCK (OF WHICH THERE IS ONE FOR
*  EACH TRAP/INTERRUPT FOUND BY TXPM AT ENTRY POINT 8).
*
PSD.WRD2 EQU       0W              ORIGINAL NEW PSD WORD 2 FROM HANDLER
PSD.OMPX EQU       1W              ADDRESS OF MPX ICB IN HANDLER
PSD.OTMP EQU       2W              ADDRESS OF T-XPM ICB
ICXT.FLG EQU       3W              INTERRUPT CONTEXT FLAGS
RPL.INST EQU       4W              REPLACED INSTRUCTION
PSD.RET1 EQU       5W              BRANCH BACK TO INT/TRAP HANDLER
*
ICXT.SPL EQU       0               IF SET, THIS IS SPECIAL INT     *E3*
ICXT.CLD EQU       1               IF SET, NON CLASS F INTERRUPT
ICXT.CLF EQU       2               IF SET, CLASS F INTERRUPT
*
TRAP.LEN EQU       6W              LENGTH OF EACH TRAP BLOCK
ITC.LEN  EQU       10W             LENGTH OF INT/TRAP CXT CODE
TOT.LEN  EQU       TRAP.LEN+ITC.LEN  TOTAL LENGTH OF CXT FOR TRAP/INTS
*
*
*--------------------------------------------------------------------
*
*  EQUATES FOR 'EVENT.PTR'
*
EVNT.DSP EQU       0               IF SET, RECORD T-XPM DISPATCHS
EVNT.TSH EQU       1               IF SET, RECORD J.* & OPCOM      *E3*
EVNT.TRP EQU       2               IF SET, RECORD TRAPS
EVNT.INT EQU       3               IF SET, RECORD INTERRUPTS
NO.TXPM  EQU       4               IF SET, DISABLE TXPM OPERATION
NO.AE    EQU       5               IF SET, DISABLE A.E. TRAPS      *E3*
TXPM.ACC EQU       6               IF SET, TURN ON ACCELERATOR
MPX.ONLY EQU       7               IF SET, DO NOT FORCE TXPM TASKS
*
*--------------------------------------------------------------------
*
*  EQUATES USED IN FCB.SPST BYTE IN FCB                            *E3*
*                                                                  *E3*
FCB.ECP  EQU       4               IF SET, XEQ CHAN PROG IN EFFECT *E3*
FCB.FBIT EQU       5               IF SET, 'F' BIT IN USE          *E3*
FCB.EA   EQU       6               IF SET, TCW ADDRESS IN EXT MEM  *E3*
FCB.BSED EQU       7               IF SET, FCB BIAS FOR THIS SVC   *E3*
*
         LIST      ON
         ENDM
*
         LIST      ON
