Hamazing/source/includes/exec/ables.i
2023-05-22 18:29:18 +02:00

131 lines
3.6 KiB
OpenEdge ABL

IFND EXEC_ABLES_I
EXEC_ABLES_I SET 1
**
** $Filename: exec/ables.i $
** $Release: 2.04 Includes, V37.4 $
** $Revision: 36.6 $
** $Date: 90/05/10 $
**
** Task switch and interrupt control macros
**
** (C) Copyright 1985-1991 Commodore-Amiga, Inc.
** All Rights Reserved
**
IFND EXEC_TYPES_I
INCLUDE "exec/types.i"
ENDC ; EXEC_TYPES_I
IFND EXEC_EXECBASE_I
INCLUDE "exec/execbase.i"
ENDC ; EXEC_EXECBASE_I
*-------------------------------------------------------------------------
*
* Interrupt Exclusion Macros. Disable all tasks and interrupts.
*
*-------------------------------------------------------------------------
INT_ABLES MACRO ; externals used by DISABLE and ENABLE
XREF _intena
ENDM
;Disable interrupts. Avoid use of DISABLE if at all possible.
;Please realize the danger of this macro! Don't disable for long periods!
DISABLE MACRO ; [scratchReg],[NOFETCH] or have ExecBase in A6.
IFC '\1','' ;Case 1: Assume A6=ExecBase
MOVE.W #$04000,_intena ;(NOT IF_SETCLR)+IF_INTEN
ADDQ.B #1,IDNestCnt(A6)
MEXIT
ENDC
IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase
MOVE.W #$04000,_intena
ADDQ.B #1,IDNestCnt(\1)
MEXIT
ENDC
IFNC '\1','' ;Case 3: Use \1 as scratch
MOVE.L 4,\1 ;Get ExecBase
MOVE.W #$04000,_intena
ADDQ.B #1,IDNestCnt(\1)
MEXIT
ENDC
ENDM
;Enable interrupts. Please realize the danger of this macro!
ENABLE MACRO ; [scratchReg],[NOFETCH] or have ExecBase in A6.
IFC '\1','' ;Case 1: Assume A6=ExecBase
SUBQ.B #1,IDNestCnt(A6)
BGE.S ENABLE\@
MOVE.W #$0C000,_intena ;IF_SETCLR+IF_INTEN
ENABLE\@:
MEXIT
ENDC
IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase
SUBQ.B #1,IDNestCnt(\1)
BGE.S ENABLE\@
MOVE.W #$0C000,_intena
ENABLE\@:
MEXIT
ENDC
IFNC '\1','' ;Case 3: Use \1 as scratch
MOVE.L 4,\1 ;Get ExecBase
SUBQ.B #1,IDNestCnt(\1)
BGE.S ENABLE\@
MOVE.W #$0C000,_intena
ENABLE\@:
MEXIT
ENDC
ENDM
*-------------------------------------------------------------------------
*
* Tasking Exclusion Macros. Forbid all other tasks (but not interrupts)
*
*-------------------------------------------------------------------------
TASK_ABLES MACRO ; externals used by FORBID and PERMIT
XREF _LVOPermit
ENDM
;Prevent task switching (disables reschedule)
FORBID MACRO ; [scratchReg],[NOFETCH] or ExecBase in A6!
IFC '\1','' ;Case 1: Assume A6=ExecBase
ADDQ.B #1,TDNestCnt(A6)
MEXIT
ENDC
IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase
ADDQ.B #1,TDNestCnt(\1)
MEXIT
ENDC
IFNC '\1','' ;Case 3: Use \1 as scratch
MOVE.L 4,\1 ;Get ExecBase
ADDQ.B #1,TDNestCnt(\1)
MEXIT
ENDC
ENDM
;Enable task switching
PERMIT MACRO ; [saveFlag],[NOFETCH] or ExecBase in A6!
IFC '\1','' ;Case 1: Assume A6=ExecBase
JSR _LVOPermit(A6)
MEXIT
ENDC
IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase
EXG.L A6,\1 ;put execbase in A6
JSR _LVOPermit(A6) ;no registers touched. A6=ExecBase
EXG.L A6,\1
MEXIT
ENDC
IFNC '\1','' ;Case 2: save/restore A6
MOVE.L A6,-(SP)
MOVE.L 4,A6
JSR _LVOPermit(A6)
MOVE.L (SP)+,A6
MEXIT
ENDC
ENDM
ENDC ; EXEC_ABLES_I