version 1.3, 1995/10/07 17:38:17
|
version 1.7, 1996/10/13 19:56:22
|
Line 1
|
Line 1
|
/* |
/* This is the machine-specific part for the 68000 and family |
$Id$ |
|
Copyright 1992 by the ANSI figForth Development Group |
|
|
|
This is the machine-specific part for the 68000 and family |
Copyright (C) 1995 Free Software Foundation, Inc. |
|
|
|
This file is part of Gforth. |
|
|
|
Gforth is free software; you can redistribute it and/or |
|
modify it under the terms of the GNU General Public License |
|
as published by the Free Software Foundation; either version 2 |
|
of the License, or (at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program; if not, write to the Free Software |
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
*/ |
*/ |
|
|
#include "32bit.h" |
#include "32bit.h" |
|
|
#define FLUSH_ICACHE(addr,size) cache_$clear() |
|
/* Clearing the whole cache is a bit drastic, but this is the only |
/* Clearing the whole cache is a bit drastic, but this is the only |
cache control available on the apollo. |
* cache control available on the apollo and NeXT |
*/ |
*/ |
|
#if defined(apollo) |
|
# define FLUSH_ICACHE(addr,size) cache_$clear() |
|
#else |
|
# if defined(NeXT) |
|
# define FLUSH_ICACHE(addr,size) asm("trap #2"); |
|
# endif |
|
#endif |
|
|
#ifdef DIRECT_THREADED |
#ifdef DIRECT_THREADED |
|
#warning untested |
/* PFA gives the parameter field address corresponding to a cfa */ |
/* PFA gives the parameter field address corresponding to a cfa */ |
#define PFA(cfa) (((Cell *)cfa)+2) |
#define PFA(cfa) (((Cell *)cfa)+2) |
/* PFA1 is a special version for use just after a NEXT1 */ |
/* PFA1 is a special version for use just after a NEXT1 */ |
Line 26
|
Line 46
|
_cfa[0] = 0x4ef9; /* jmp.l */ \ |
_cfa[0] = 0x4ef9; /* jmp.l */ \ |
*(long *)(_cfa+1) = (long)(ca);}) |
*(long *)(_cfa+1) = (long)(ca);}) |
|
|
/* this is the point where the does code starts if label points to the |
/* this is the point where the does code for the word with the xt cfa |
* jump dodoes */ |
starts. */ |
#define DOES_CODE(label) ((Xt *)(((char *)CODE_ADDRESS(label))+DOES_HANDLER_SIZE)) |
#define DOES_CODE(cfa) \ |
|
({ short *_cfa=(short *)(cfa); \ |
|
short *_ca; |
|
((_cfa[0] == 0x4ef9 \ |
|
&& (_ca=CODE_ADDRESS(cfa), _ca[0] == 0x4ef9) \ |
|
&& *(long *)(_cfa+1) == &&docol) \ |
|
? ((unsigned)_ca)+DOES_HANDLER_SIZE \ |
|
: 0); }) |
|
|
/* this is a special version of DOES_CODE for use in dodoes */ |
/* this is a special version of DOES_CODE for use in dodoes */ |
#define DOES_CODE1(label) DOES_CODE(label) |
#define DOES_CODE1(cfa) ((Xt *)(((char *)CODE_ADDRESS(cfa))+DOES_HANDLER_SIZE)) |
|
|
/* this stores a call dodoes at addr */ |
/* this stores a call dodoes at addr */ |
#define MAKE_DOES_HANDLER(addr) MAKE_CF(addr,symbols[DODOES]) |
#define MAKE_DOES_HANDLER(addr) MAKE_CF(addr,symbols[DODOES]) |