	IFND	EXEC_ABLES_I
EXEC_ABLES_I	EQU	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!

	ifnd	__m68

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

	else	;is Macro68

DISABLE     MACRO	0,2
	IFC	'\1',''
	move.w	#$04000,(_intena)
	addq.b	#1,(IDNestCnt,a6)
	MEXIT
	ENDC
	IFC	'\2','NOFETCH'
	move.w	#$04000,(_intena)
	addq.b	#1,(IDNestCnt,\1)
	MEXIT
	ENDC
	IFNC	'\1',''
	movea.l	(4).w,\1
	move.w	#$04000,(_intena)
	addq.b	#1,(IDNestCnt,\1)
	MEXIT
	ENDC
	ENDM

ENABLE	MACRO	0,2
	IFC	'\1',''
	subq.b	#1,(IDNestCnt,a6)
	bge.b	ENABLE\@
	move.w	#$0C000,(_intena)
ENABLE\@:
	MEXIT
	ENDC
	IFC	'\2','NOFETCH'
	subq.b	#1,(IDNestCnt,\1)
	bge.b	ENABLE\@
	move.w	#$0C000,(_intena)
ENABLE\@:
	MEXIT
	ENDC
	IFNC	'\1',''
	movea.l	(4).w,\1
	subq.b	#1,(IDNestCnt,\1)
	bge.b	ENABLE\@
	move.w	#$0C000,(_intena)
ENABLE\@:
	MEXIT
	ENDC
	ENDM

	endc	;__m68



*-------------------------------------------------------------------------
*
*   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)

	ifnd	__m68

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

	else	;is Macro68

FORBID	MACRO	0,2
	IFC	'\1',''
	addq.b	#1,(TDNestCnt,a6)
	MEXIT
	ENDC
	IFC	'\2','NOFETCH'
	addq.b	#1,(TDNestCnt,\1)
	MEXIT
	ENDC
	IFNC	'\1',''
	movea.l	(4).w,\1
	addq.b	#1,(TDNestCnt,\1)
	MEXIT
	ENDC
	ENDM

PERMIT	MACRO	0,2
	IFC	'\1',''
	jsr	(_LVOPermit,a6)
	MEXIT
	ENDC
	IFC	'\2','NOFETCH'
	exg.l	A6,\1
	jsr	(_LVOPermit,a6)
	exg.l	A6,\1
	MEXIT
	ENDC
	IFNC	'\1',''
	move.l	a6,-(sp)
	movea.l	(4).w,a6
	jsr	(_LVOPermit,a6)
	move.l	(sp)+,a6
	MEXIT
	ENDC
	ENDM

	endc	;__m68


	ENDC	; EXEC_ABLES_I
