home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / config / m68k-emul / preparecontext.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-06  |  2.1 KB  |  97 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: preparecontext.c,v 1.5 1996/12/06 11:07:55 aros Exp $
  4.     $Log: preparecontext.c,v $
  5.     Revision 1.5  1996/12/06 11:07:55  aros
  6.     Vector shuffle
  7.  
  8.     Revision 1.4  1996/12/05 15:31:00  aros
  9.     Patches by Geert Uytterhoeven integrated
  10.  
  11.     Revision 1.3  1996/10/24 15:51:28  aros
  12.     Use the official AROS macros over the __AROS versions.
  13.  
  14.     Revision 1.2  1996/08/01 17:41:32  digulla
  15.     Added standard header for all files
  16.  
  17.     Desc:
  18.     Lang:
  19. */
  20. #include <exec/types.h>
  21. #include <aros/libcall.h>
  22.  
  23. /*****************************************************************************
  24.  
  25.     NAME */
  26.  
  27.     AROS_LH3I(APTR, PrepareContext,
  28.  
  29. /*  SYNOPSIS */
  30.     AROS_LHA(APTR, stackPointer, A0),
  31.     AROS_LHA(APTR, entryPoint,   A1),
  32.     AROS_LHA(APTR, fallBack,     A2),
  33.  
  34. /*  LOCATION */
  35.     struct ExecBase *, SysBase, 6, Exec)
  36.  
  37. /*  FUNCTION
  38.     Allocates the space required to hold a new set of registers on the
  39.     Stack given by stackPointer and clears the area except for pc which
  40.     is set to the address given by entryPoint.
  41.  
  42.     INPUTS
  43.     stackPointer - Pointer to a scpecific stack
  44.     entryPoint   - Address of the function to call when the new context
  45.                becomes active.
  46.     fallBack     - Address to be called when the entryPoint function ended
  47.                with an rts.
  48.  
  49.     RESULT
  50.     The new Stackpointer with the underlying context.
  51.  
  52.     NOTES
  53.     This function is for internal use by exec only.
  54.  
  55.     This function is processor dependant.
  56.  
  57.     EXAMPLE
  58.  
  59.     BUGS
  60.  
  61.     SEE ALSO
  62.     SwitchTasks()
  63.  
  64.     INTERNALS
  65.  
  66.     HISTORY
  67.  
  68. ******************************************************************************/
  69. {
  70.     AROS_LIBFUNC_INIT
  71.     UBYTE *sp=(UBYTE *)stackPointer;
  72.     int i;
  73.  
  74.     /*
  75.     mc68000 version. As long as no FPU is in use this works for the
  76.     other mc680xx brands as well.
  77.     */
  78.  
  79.     /* Push fallback address */
  80.     sp-=sizeof(APTR);
  81.     *(APTR *)sp=fallBack;
  82.  
  83.     /* Now push the context. Prepare a rts first (pc). */
  84.     sp-=sizeof(APTR);
  85.     *(APTR *)sp=entryPoint;
  86.  
  87.     /* Push 15 registers */
  88.     for(i=0;i<15;i++)
  89.     {
  90.     sp-=sizeof(LONG);
  91.     *(LONG *)sp=0;
  92.     }
  93.  
  94.     return sp;
  95.     AROS_LIBFUNC_EXIT
  96. } /* PrepareContext */
  97.