home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD v1.2 / amidev_cd_12.iso / inc&ad2.0 / includes / exec / ables.i next >
Text File  |  1992-09-01  |  4KB  |  131 lines

  1.     IFND    EXEC_ABLES_I
  2. EXEC_ABLES_I    SET    1
  3. **
  4. **    $Filename: exec/ables.i $
  5. **    $Release: 2.04 Includes, V37.4 $
  6. **    $Revision: 36.6 $
  7. **    $Date: 90/05/10 $
  8. **
  9. **    Task switch and interrupt control macros
  10. **
  11. **    (C) Copyright 1985-1991 Commodore-Amiga, Inc.
  12. **        All Rights Reserved
  13. **
  14.  
  15.     IFND EXEC_TYPES_I
  16.     INCLUDE "exec/types.i"
  17.     ENDC    ; EXEC_TYPES_I
  18.  
  19.     IFND EXEC_EXECBASE_I
  20.     INCLUDE "exec/execbase.i"
  21.     ENDC    ; EXEC_EXECBASE_I
  22.  
  23.  
  24. *-------------------------------------------------------------------------
  25. *
  26. *   Interrupt Exclusion Macros.  Disable all tasks and interrupts.
  27. *
  28. *-------------------------------------------------------------------------
  29.  
  30. INT_ABLES   MACRO        ; externals used by DISABLE and ENABLE
  31.         XREF    _intena
  32.         ENDM
  33.  
  34. ;Disable interrupts.  Avoid use of DISABLE if at all possible.
  35. ;Please realize the danger of this macro!  Don't disable for long periods!
  36. DISABLE     MACRO   ; [scratchReg],[NOFETCH] or have ExecBase in A6.
  37.         IFC     '\1',''             ;Case 1: Assume A6=ExecBase
  38.           MOVE.W  #$04000,_intena    ;(NOT IF_SETCLR)+IF_INTEN
  39.           ADDQ.B  #1,IDNestCnt(A6)
  40.           MEXIT
  41.         ENDC
  42.         IFC     '\2','NOFETCH'      ;Case 2: Assume \1=ExecBase
  43.           MOVE.W  #$04000,_intena
  44.           ADDQ.B  #1,IDNestCnt(\1)
  45.           MEXIT
  46.         ENDC
  47.         IFNC    '\1',''             ;Case 3: Use \1 as scratch
  48.           MOVE.L  4,\1        ;Get ExecBase
  49.           MOVE.W  #$04000,_intena
  50.           ADDQ.B  #1,IDNestCnt(\1)
  51.           MEXIT
  52.         ENDC
  53.         ENDM
  54.  
  55. ;Enable interrupts.  Please realize the danger of this macro!
  56. ENABLE        MACRO   ; [scratchReg],[NOFETCH] or have ExecBase in A6.
  57.         IFC     '\1',''             ;Case 1: Assume A6=ExecBase
  58.           SUBQ.B  #1,IDNestCnt(A6)
  59.           BGE.S   ENABLE\@
  60.           MOVE.W  #$0C000,_intena    ;IF_SETCLR+IF_INTEN
  61. ENABLE\@:
  62.           MEXIT
  63.         ENDC
  64.         IFC     '\2','NOFETCH'      ;Case 2: Assume \1=ExecBase
  65.           SUBQ.B  #1,IDNestCnt(\1)
  66.           BGE.S   ENABLE\@
  67.           MOVE.W  #$0C000,_intena
  68. ENABLE\@:
  69.           MEXIT
  70.         ENDC
  71.         IFNC    '\1',''             ;Case 3: Use \1 as scratch
  72.           MOVE.L  4,\1        ;Get ExecBase
  73.           SUBQ.B  #1,IDNestCnt(\1)
  74.           BGE.S   ENABLE\@
  75.           MOVE.W  #$0C000,_intena
  76. ENABLE\@:
  77.           MEXIT
  78.         ENDC
  79.         ENDM
  80.  
  81.  
  82. *-------------------------------------------------------------------------
  83. *
  84. *   Tasking Exclusion Macros.  Forbid all other tasks (but not interrupts)
  85. *
  86. *-------------------------------------------------------------------------
  87.  
  88. TASK_ABLES  MACRO        ; externals used by FORBID and PERMIT
  89.         XREF    _LVOPermit
  90.         ENDM
  91.  
  92. ;Prevent task switching (disables reschedule)
  93. FORBID        MACRO   ; [scratchReg],[NOFETCH] or ExecBase in A6!
  94.         IFC     '\1',''             ;Case 1: Assume A6=ExecBase
  95.           ADDQ.B  #1,TDNestCnt(A6)
  96.           MEXIT
  97.         ENDC
  98.         IFC     '\2','NOFETCH'      ;Case 2: Assume \1=ExecBase
  99.           ADDQ.B  #1,TDNestCnt(\1)
  100.           MEXIT
  101.         ENDC
  102.         IFNC    '\1',''             ;Case 3: Use \1 as scratch
  103.           MOVE.L  4,\1    ;Get ExecBase
  104.           ADDQ.B  #1,TDNestCnt(\1)
  105.           MEXIT
  106.         ENDC
  107.         ENDM
  108.  
  109. ;Enable task switching
  110. PERMIT        MACRO   ; [saveFlag],[NOFETCH] or ExecBase in A6!
  111.         IFC     '\1',''             ;Case 1: Assume A6=ExecBase
  112.           JSR     _LVOPermit(A6)
  113.           MEXIT
  114.         ENDC
  115.         IFC     '\2','NOFETCH'      ;Case 2: Assume \1=ExecBase
  116.           EXG.L   A6,\1        ;put execbase in A6
  117.           JSR     _LVOPermit(A6)    ;no registers touched.  A6=ExecBase
  118.           EXG.L   A6,\1
  119.           MEXIT
  120.         ENDC
  121.         IFNC    '\1',''             ;Case 2: save/restore A6
  122.           MOVE.L  A6,-(SP)
  123.           MOVE.L  4,A6
  124.           JSR     _LVOPermit(A6)
  125.           MOVE.L  (SP)+,A6
  126.           MEXIT
  127.         ENDC
  128.         ENDM
  129.  
  130.     ENDC    ; EXEC_ABLES_I
  131.