Skip to content

Latest commit

 

History

History
92 lines (81 loc) · 2.23 KB

File metadata and controls

92 lines (81 loc) · 2.23 KB
#ifndef UTILITY_HOOKS_H
#define UTILITY_HOOKS_H TRUE
/*
**	$Filename: utility/hooks.h $
**	$Release: 2.04 Includes, V37.4 $
**	$Revision: 36.1 $
**	$Date: 90/07/12 $
**
**	callback hooks
**
**	(C) Copyright 1989-1999 Amiga, Inc.
**		All Rights Reserved
*/

#ifndef EXEC_TYPES_H
#include "exec/types.h"
#endif

#ifndef EXEC_NODES_H
#include "exec/nodes.h"
#endif

/* new standard hook structure */
struct Hook	{
struct MinNode	h_MinNode;
ULONG		(*h_Entry)();	/* assembler entry point	*/
ULONG		(*h_SubEntry)();/* often HLL entry point	*/
VOID		*h_Data;	/* owner specific		*/
};

/*
* Hook calling conventions:
*	A0 - pointer to hook data structure itself
*	A1 - pointer to parameter structure ("message") typically
*	     beginning with a longword command code, which makes
*	     sense in the context in which the hook is being used.
*	A2 - Hook specific address data ("object," e.g, GadgetInfo)
*
* Control will be passed to the routine h_Entry.  For many
* High-Level Languages (HLL), this will be an assembly language
* stub which pushes registers on the stack, does other setup,
* and then calls the function at h_SubEntry.
*
* The C standard receiving code is:
* CDispatcher( hook, object, message )
*     struct Hook	*hook;
*     APTR		object;
*     APTR		message;
*
* NOTE that register natural order differs from this convention
* for C parameter order, which is A0,A2,A1.
*
* The assembly language stub for "vanilla" C parameter conventions
* could be:

_hookEntry:
move.l	a1,-(sp)		; push message packet pointer
move.l	a2,-(sp)		; push object pointer
move.l	a0,-(sp)		; push hook pointer
move.l	h_SubEntry(a0),a0	; fetch C entry point ...
jsr	(a0)			; ... and call it
lea	12(sp),sp		; fix stack
rts

* with this function as your interface stub, you can write
* a Hook setup function as:

SetupHook( hook, c_function, userdata )
struct Hook	*hook;
ULONG		(*c_function)();
VOID		*userdata;
{
ULONG	(*hookEntry)();

hook->h_Entry =		hookEntry;
hook->h_SubEntry =	c_function;
hook->h_Data =			userdata;
}

* with Lattice C pragmas, you can put the C function in the
* h_Entry field directly if you declare the function:

ULONG __saveds __asm
CDispatcher(	register __a0 struct Hook	*hook,
register __a2 VOID		*object,
register __a1 ULONG		*message );
*
****/

#endif