*  *********************************************************************
*
*  $Header:  005  14-FEB-92 10:04  GANN      GANN                      $
*  $Log:   @ISCSRC^(DV.TXPM.SYSM)TXPM.PRE                              $
*
*       Rev  005  14-FEB-92 10:04  GANN      GANN
*  Added C.EXTD35 for new M.TSAD macro.
*
*       Rev  004  09-OCT-91 09:26  MJF       MJF
*  Delete macros that are now in regular MPX macro library.
*
*       Rev  003  08-JUN-90 14:44  MJF       MJF
*  Add MPX_SVC
*
*       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                                                   !003
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
C.EXTD35 SETT                                                       !005
MPX_SVC  SET      6                                             !003
         REIS                                                   EOUT-35
         SPACE                                                  EOUT-35
************************************************************************
         LIST      OFF
*  *********************************************************************
*
*  $Header:  009  03-DEC-92 15:09  SYSTEM    SYSTEM                    $
*  $Log:   @ISCSRC^(DV.TXPM.SYSM)SM.XPMMAC                             $
*
*       Rev  009  03-DEC-92 15:09  SYSTEM    SYSTEM
*  Added TTC.LEN and TTT.LEN equates to M.TXPM to compensate for
*  modifications made to CPU Trap handling
*
*       Rev  008  23-MAR-92 13:46  GANN      GANN
*  Added bit to remember when M.VADDR has an error.
*
*       Rev  007  04-MAR-92 11:17  MJF       MJF
*  Define PR.BTLB, which is looked at only for 3.4u03 and later.
*
*       Rev  006  10-OCT-91 13:11  MJF       MJF
*  Add TSK.SVCL
*
*       Rev  005  09-OCT-91 13:10  MJF       MJF
*  Modify M.TXPM to ensure that SH.TXPM, SH.PTCH, and the user
*  all use the same variables.  Also, added M.TXINTL to define
*  several variables that both SH.TXPM and SH.PTCH use.
*
*       Rev  004  05-APR-91 07:16  MJF       MJF
*  Update X.BIAS, X.REAL, etc., for machine type 0 == Seahawk.
*
*       Rev  003  20-MAR-90 09:23  BEVIER    BEVIER
*  REDEFINED TXPMFLGS AND LOCATION OF TXPMFLGS.  THEY ARE NOW
*  EQUATED TO BYTE ZERO OF C.UBIAS (X'C8').  ADDED TXPMOS (BIT 0)
*  IN TXPMFLGS TO SHOW TXPM IS ON SYSTEM.
*
*       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
*
*
************************************************************************
*
*  NOTE:  Several of the macros use an optional parameter, CPUO.    !004
*  When used, it tells the macro that there is no possibility that  !004
*  the task is running in the IPU.  This will save the macro several!004
*  instructions (one of them expensive).  If you are using the macro!004
*  in an svc handler, check to see if the SYSGEN entry point for the!004
*  handler defines the svc as being allowed to run in the IPU.  If  !004
*  the svc is allowed to run in the ipu, then do NOT use the CPUO   !004
*  argument.  Otherwise, it is wise to use the argument.  Note that !004
*  the argument need not be the string CPUO.  Any string qualifies  !004
*  as the CPUO argument.  For example:                              !004
*        T.BIAS    R1,CPUO                                          !004
*        T.BIAS    R1,XXX          Identical to the line above      !004
*                                                                   !004
* ----------------------------------------------------------------- !004
* 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    CPUO                                             !004
*
*  Where CPUO is an optional parameter.  If present, it tells       !004
*  T.TXPM that the task is running in the CPU.  You must be         !004
*  absolutely sure that a task cannot run in the IPU before         !004
*  using this argument.                                             !004
*
* RETURN:
*
*        R2 is destroyed, condition code 1 is set if the current
*        Task is a T-XPM task.
*
************************************************************************
*
T.TXPM   DEFM      CPUO                                             !004
         LW        R2,C.CTXT            FIRST SEE IF TXPM IS PRESENT
         BEQ       %NOTXPM              NOPE C.CTXT NOT SET UP
         T.DQECXT  %CPUO                GET CONTEXT ADDRESS         !004
         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    CPUO            IS TASK A TXPM TASK?             !004
         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
*004          CI        R5,2            SEE IF 7X
*004          BLT       %7X             BR IF 7X
         CI        R5,1            SEE IF 7X                        !004
         BEQ       %7X             BR IF 7X                         !004
         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,CPUO                                         !004
*
*  Where R is a register which contains the address to be converted.
*  If present, the second argument specifies that the module is     !004
*  running in the CPU, and the macro will NOT check to see if it    !004
*  is running in the IPU.  Use this argument ONLY if you are        !004
*  POSITIVE that the module will not run in the IPU.                !004
*
*  The value will not be biased if it is below C.TSAD.              !004
*
* RETURN:
*
*        R2 is destroyed (R must not be equal to 2)
*        Register R contains the converted address.
*
************************************************************************
*
T.BIAS   DEFM      R,CPUO                                           !004
         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  %CPUO                                            !004
         ADMW      %R,TSK.BIAS,X2  BIAS THE ADDRESS
         CAMW      %R,C.TSAD       Is the address a task address?   !004
         BGE       %NO.BIAS        Go if so                         !004
         SUMW      %R,TSK.BIAS,X2  Else restore original value      !004
%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
*004          CI        R2,2            7X?
*004          BLT       %7X             Br if yes
         CI        R2,1            SEE IF 7X                        !004
         BEQ       %7X             BR IF 7X                         !004
         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,CPUO                                         !004
*
*  Where R is a register that contains an address to rebias.        !004
*  CPUO is an optional argument.  If present, it tells T.RBIAS      !004
*  that there is no possibility that the task is running in the     !004
*  CPU.  This can be the case if the SVC that contains T.RBIAS      !004
*  is set to run in the CPU only.                                   !004
*
*  The value will not be biased if it is below C.TSAD.              !004
*
* RETURN:
*
*        R2 is destroyed (R must not be equal to R2)
*        Register R contains the rebiased address.
*
************************************************************************
*
T.RBIAS  DEFM      R,CPUO                                           !004
         LW        R2,C.CTXT       SEE IF TXPM IS PRESENT
         BZ        %NO.BIAS        NOPE
         CAMW      %R,C.TSAD       Don't bias if below TSA
         BLT       %NO.BIAS
         T.DQECXT  %CPUO                                            !004
         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,CPUO                                         !004
*
*  Where R is the register to contain the bias upon return          !004
*  CPUO is an optional argument; its presence tells the macro that  !004
*  the task cannot be running in the IPU.  This will be true for    !004
*  most SVCs.                                                       !004
*
* RETURN:
*
*        R2 is destroyed unless R=2
*        R contains the T-XPM Bias for the current task
*
************************************************************************
*
T.FBIAS  DEFM      R,CPUO                                           !004
         LW        R2,C.CTXT            SEE IF TXPM IS PRESENT
         BEQ       %NOTXPM              NOPE
         T.DQECXT  %CPUO                                            !004
         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  CPUO
*
*  Where CPUO, if present, signifies that the module is sure        !004
*  that the task is running in the CPU.                             !004
*
* RETURN:
*
*        R2 contains the address of the DQE context area.
*
************************************************************************
*
T.DQECXT DEFM      CPUO                                             !004
         IFA       %CPUO,DO.IPU                                     !004
         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
DO.IPU   ANOP                                                       !004
         LW        R2,C.CURR       ADDRESS OF CURRENT TASK'S DQE
         IFA       %CPUO,DO.IPU                                     !004
         BU        $+2W            SKIP IPU STUFF
         LW        R2,C.CIPU       DQE ADDRESS IF IN IPU
DO.IPU   ANOP                                                       !004
         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,CPUO                                     !004
*
*  Where 'ADDRESS' is the address of the return PSD.
*  R0-R7 must contain the user's registers.
*  CPUO is an optional argument; its presence tells the macro that  !004
*  there is no possibility that the task is running in the IPU.     !004
*  Misuse of this argument will cause errors.                       !004
*
* 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,CPUO                                        !004
         BEI
         STF       R0,%REGS        SAVE THE REGS UNTIL WE KNOW IF TXPM
*                                  IS PRESENT.
         T.TXPM    %CPUO                                            !004
         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
*
*005          LIST      OFF
C.TXPM   EQU       X'C4'           T-XPM COPY OF C.TSAD
C.UBIAS  EQU       X'C8'           HAT ADDRESS OF H.UBIAS ROUTINE   *003*
*                                  BYTE ZERO OF C.UBIAS IS TXPMFLGS *003*
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
*
*005 DQE.CXTA EQU       X'60'           ADDRESS OF CONTEXT AREA IN DQE
DQE.CXTA EQU       DQE.PSSF        ADDRESS OF CONTEXT AREA IN DQE
DQE.PSDA EQU       X'64'           INT PSD ADDRESS IN DQE
*
*--------------------------------------------------------------------
*
*  EQUATES FOR 'TXPMFLGS' - NOW BYTE ZERO OF C.UBIAS (C8)       *003*
*                                                               *003*
TXPMFLGS EQU       C.UBIAS         BYTE ZERO OF X'C8'           *003*
TXPMOS   EQU       0               IF SET, TXPM ON SYSTEM       *003*
RTC      EQU       1               IF SET, ACCEL IS ON          *003*
NOT.MPX  EQU       2               IF SET, MPX NOT MAPPED IN    *003*
IN.TXPM  EQU       3               IF SET, TXPM RUNNING IN IPU  *003*
AID.DSP  EQU       4               IF SET, H.AID DISPATCH       *003*
IPU.INIT EQU       5               IF SET, IPU HAS BEEN INIT'S  *003*
NO.AID   EQU       6               IF SET, AID NOT ON SYSTEM    *003*
*005 FLG.AV   EQU       7               AVAILABLE                    *003*
ONE.INIT EQU       7               PTCH has done its init           !005
*                                                               *003*
*--------------------------------------------------------------------
*
*   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) *E3*
*007 TSK.DBAT EQU       2               NOT USED                        *E3*
TSK.BTLB EQU       2               If set, DO play games with       !007
*                                  T.LINBUF                         !007
*008 TSK.EACT EQU       3               NOT USED                        *E3*
ERR.VADD EQU       3               If set, error entering M.VADDR   !008
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.NU1  EQU       3               NOT USED, SVC TYPE NOW IN TSK.SVCI *219*
*005 TSK.CNP  EQU       4               CNP SUPPLIED FOR CURRENT SVC
*005 TSK.NU2  EQU       5               NOT USED.                    *219*
*005 TSK.RTYP EQU       6               IF SET, RESOURCE TYPE NOT IDENTIFIED
*005 TSK.NU3  EQU       7               NOT USED.                    *219*
TSK.MODN EQU       4               4 bits of module number          !005
*
*  EQUATES FOR TSK.SVCI                                         *219*
*
*006 TSK.SVCX EQU       0               NOT USED                     *219*
TSK.SVCL EQU       0               M.CALL svc (0 or 6)              !006
TSK.SVC1 EQU       1               IF SET, SVC TYPE 1           *219*
TSK.SVC2 EQU       2               IF SET, SVC TYPE 2           *219*
TSK.SVC6 EQU       3               IF SET, SVC TYPE 6           *219*
TSK.SVC7 EQU       4               IF SET, SVC TYPE 7           *219*
TSK.SVCE EQU       5               IF SET, SVC TYPE E           *219*
*005 TSK.SVCY EQU       6               NOT USED                     *219*
*005 TSK.SVCZ EQU       7               NOT USED                     *219*
TSK.CNP  EQU       6               CNP supplied for current SVC     !005
TSK.RTYP EQU       7               If set, res. type not id'd       !005
*--------------------------------------------------------------------
TSK.LVL  EQU       0B              FIRST BYTE OF LEVEL INFO
*005 TSK.IPUB EQU       1B              NOT USED
TSK.SVCI EQU       1B              SVC type indicators              !005
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
TTC.LEN  EQU       12W             LENGTH OF CPU TRAP CXT CODE      !009
TTT.LEN  EQU       TRAP.LEN+TTC.LEN  TOTAL CXT LNGTH FOR CPU TRAPS  !009
*
*
*--------------------------------------------------------------------
*
*  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*
*
*005          LIST      ON
         ENDM
*
M.TXINTL DEFM                      Define internal equates          !005
* -----------------------------------------------------------------
*  EQUATES FOR LOAD MODULE PREAMBLE
*
PR.NPAGE EQU        X'131'         NUMBER OF DSECT PAGES
PR.NMAP  EQU        X'132'         NUMBER OF OS MAP BLOCKS TO INCLUDE
PR.NOMPX EQU        X'133'         BIT 7 SET SAYS THIS IS TXPM TASK
*                                  BIT 6 SET SAYS SEPARATE OVERLAYS
*                                  BIT 5 SET SAYS ONLY MPX TASK
PR.BTLB  EQU       4               Bit 4 set says play games with   !007
*                                  T.LINBUF (move it to within the  !007
*                                  task's TSA).                     !007
         ENDM                                                       !005
         LIST      ON
