version 1.108, 2010/04/05 22:17:56
|
version 1.133, 2012/12/31 15:25:19
|
Line 1
|
Line 1
|
/* common header file |
/* common header file |
|
|
Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc. |
Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Line 100
|
Line 100
|
#define DOFIELD 5 |
#define DOFIELD 5 |
#define DOVAL 6 |
#define DOVAL 6 |
#define DODOES 7 |
#define DODOES 7 |
#define DOESJUMP 8 |
#define DOABICODE 8 |
#define DOABICODE 9 |
#define DOSEMIABICODE 9 |
#define DOER_MAX 9 |
#define DOER_MAX 9 |
|
|
/* the size of the DOESJUMP, which resides between DOES> and the does-code */ |
|
#define DOES_HANDLER_SIZE (2*sizeof(Cell)) |
|
|
|
#include "machine.h" |
#include "machine.h" |
|
|
/* C interface data types */ |
/* C interface data types */ |
|
|
typedef WYDE_TYPE Wyde; |
typedef WYDE_TYPE Wyde; |
typedef TETRABYTE_TYPE Tetrabyte; |
typedef TETRABYTE_TYPE Tetrabyte; |
|
typedef OCTABYTE_TYPE Octabyte; |
typedef unsigned WYDE_TYPE UWyde; |
typedef unsigned WYDE_TYPE UWyde; |
typedef unsigned TETRABYTE_TYPE UTetrabyte; |
typedef unsigned TETRABYTE_TYPE UTetrabyte; |
|
typedef unsigned OCTABYTE_TYPE UOctabyte; |
|
|
/* Forth data types */ |
/* Forth data types */ |
/* Cell and UCell must be the same size as a pointer */ |
/* Cell and UCell must be the same size as a pointer */ |
Line 270 typedef Label *Xt;
|
Line 269 typedef Label *Xt;
|
ca is the code address */ |
ca is the code address */ |
#define MAKE_CF(cfa,ca) ((*(Label *)(cfa)) = ((Label)ca)) |
#define MAKE_CF(cfa,ca) ((*(Label *)(cfa)) = ((Label)ca)) |
/* make a code field for a defining-word-defined word */ |
/* make a code field for a defining-word-defined word */ |
#define MAKE_DOES_CF(cfa,does_code) ({MAKE_CF(cfa,DOES_CA); \ |
|
((Cell *)cfa)[1] = (Cell)(does_code);}) |
|
|
|
#define CF(const) (-const-2) |
#define CF(const) (-const-2) |
|
|
Line 285 typedef Label *Xt;
|
Line 282 typedef Label *Xt;
|
#define NO_DYNAMIC_DEFAULT 1 |
#define NO_DYNAMIC_DEFAULT 1 |
#endif |
#endif |
|
|
|
#ifndef CHECK_PRIM |
|
#define CHECK_PRIM(start,len) 0 |
|
#endif |
|
|
#if defined(GFORTH_DEBUGGING) || defined(INDIRECT_THREADED) || defined(DOUBLY_INDIRECT) || defined(VM_PROFILING) |
#if defined(GFORTH_DEBUGGING) || defined(INDIRECT_THREADED) || defined(DOUBLY_INDIRECT) || defined(VM_PROFILING) |
#define STACK_CACHE_DEFAULT 0 |
#define STACK_CACHE_DEFAULT 0 |
#else |
#else |
Line 302 typedef Label *Xt;
|
Line 303 typedef Label *Xt;
|
#define rpTOS (rp[0]) |
#define rpTOS (rp[0]) |
|
|
typedef struct { |
typedef struct { |
|
Cell next_task; |
|
Cell prev_task; |
|
Cell save_task; |
|
Cell* sp0; |
|
Cell* rp0; |
|
Float* fp0; |
|
Address lp0; |
|
Xt *throw_entry; |
|
} user_area; |
|
|
|
typedef struct { |
Address base; /* base address of image (0 if relocatable) */ |
Address base; /* base address of image (0 if relocatable) */ |
UCell checksum; /* checksum of ca's to protect against some |
UCell checksum; /* checksum of ca's to protect against some |
incompatible binary/executable combinations |
incompatible binary/executable combinations |
Line 314 typedef struct {
|
Line 326 typedef struct {
|
UCell locals_stack_size; |
UCell locals_stack_size; |
Xt *boot_entry; /* initial ip for booting (in BOOT) */ |
Xt *boot_entry; /* initial ip for booting (in BOOT) */ |
Xt *throw_entry; /* ip after signal (in THROW) */ |
Xt *throw_entry; /* ip after signal (in THROW) */ |
Cell unused1; /* possibly tib stack size */ |
Xt *quit_entry; |
|
Xt *execute_entry; |
|
Xt *find_entry; |
Label *xt_base; /* base of DOUBLE_INDIRECT xts[], for comp-i.fs */ |
Label *xt_base; /* base of DOUBLE_INDIRECT xts[], for comp-i.fs */ |
Address data_stack_base; /* this and the following fields are initialized by the loader */ |
|
Address fp_stack_base; |
|
Address return_stack_base; |
|
Address locals_stack_base; |
|
} ImageHeader; |
} ImageHeader; |
/* the image-header is created in main.fs */ |
/* the image-header is created in main.fs */ |
|
|
Line 362 typedef struct saved_regs {
|
Line 372 typedef struct saved_regs {
|
Xt *sr_saved_ip; |
Xt *sr_saved_ip; |
Cell *sr_rp; |
Cell *sr_rp; |
} saved_regs; |
} saved_regs; |
extern saved_regs saved_regs_v, *saved_regs_p; |
extern saved_regs saved_regs_v; |
|
extern PER_THREAD saved_regs *saved_regs_p; |
#define saved_ip (saved_regs_p->sr_saved_ip) |
#define saved_ip (saved_regs_p->sr_saved_ip) |
#define rp (saved_regs_p->sr_rp) |
#define rp (saved_regs_p->sr_rp) |
/* for use in gforth_engine header */ |
/* for use in gforth_engine header */ |
Line 370 extern saved_regs saved_regs_v, *saved_r
|
Line 381 extern saved_regs saved_regs_v, *saved_r
|
#define sr_proto , struct saved_regs *saved_regs_p0 |
#define sr_proto , struct saved_regs *saved_regs_p0 |
#define sr_call , saved_regs_p |
#define sr_call , saved_regs_p |
#else /* !defined(GLOBALS_NONRELOC) */ |
#else /* !defined(GLOBALS_NONRELOC) */ |
extern Xt *saved_ip; |
extern PER_THREAD Xt *saved_ip; |
extern Cell *rp; |
extern PER_THREAD Cell *rp; |
#define sr_proto |
#define sr_proto |
#define sr_call |
#define sr_call |
#endif /* !defined(GLOBALS_NONRELOC) */ |
#endif /* !defined(GLOBALS_NONRELOC) */ |
Line 380 extern Cell *rp;
|
Line 391 extern Cell *rp;
|
#define sr_call |
#define sr_call |
#endif /* !defined(GFORTH_DEBUGGING) */ |
#endif /* !defined(GFORTH_DEBUGGING) */ |
|
|
Label *gforth_engine(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); |
Label *gforth_engine(Xt *ip sr_proto); |
Label *gforth_engine2(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); |
Label *gforth_engine2(Xt *ip sr_proto); |
Label *gforth_engine3(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); |
Label *gforth_engine3(Xt *ip sr_proto); |
|
|
|
|
|
int gforth_main(int argc, char **argv, char **env); |
|
void gforth_args(int argc, char ** argv, char ** path, char ** imagename); |
|
Address gforth_loader(char* imagename, char* path); |
|
user_area* gforth_stacks(Cell dsize, Cell rsize, Cell fsize, Cell lsize); |
|
void gforth_free_stacks(user_area* t); |
|
void gforth_free(); |
|
Cell gforth_go(Xt* ip0); |
|
int gforth_boot(int argc, char** argv, char* path); |
|
int gforth_start(int argc, char ** argv); |
|
int gforth_quit(); |
|
Xt gforth_find(Char * name); |
|
int gforth_execute(Xt xt); |
|
void gforth_cleanup(); |
|
void gforth_printmetrics(); |
|
#if defined(DOUBLY_INDIRECT) |
|
int gforth_make_image(int debugflag); |
|
#endif |
|
|
|
/* for ABI-CODE and ;ABI-CODE */ |
|
typedef Cell *abifunc(Cell *sp, Float **fpp); |
|
typedef Cell *semiabifunc(Cell *sp, Float **fpp, Address body); |
|
|
/* engine/prim support routines */ |
/* engine/prim support routines */ |
Address gforth_alloc(Cell size); |
Address gforth_alloc(Cell size); |
char *cstr(Char *from, UCell size, int clear); |
char *cstr(Char *from, UCell size); |
char *tilde_cstr(Char *from, UCell size, int clear); |
char *tilde_cstr(Char *from, UCell size); |
Cell opencreate_file(char *s, Cell wfam, int flags, Cell *wiorp); |
Cell opencreate_file(char *s, Cell wfam, int flags, Cell *wiorp); |
DCell timeval2us(struct timeval *tvp); |
DCell timeval2us(struct timeval *tvp); |
|
DCell timespec2ns(struct timespec *tvp); |
void cmove(Char *c_from, Char *c_to, UCell u); |
void cmove(Char *c_from, Char *c_to, UCell u); |
void cmove_up(Char *c_from, Char *c_to, UCell u); |
void cmove_up(Char *c_from, Char *c_to, UCell u); |
Cell compare(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
Cell compare(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
Line 401 struct Cellpair parse_white(Char *c_addr
|
Line 436 struct Cellpair parse_white(Char *c_addr
|
Cell rename_file(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
Cell rename_file(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); |
struct Cellquad read_line(Char *c_addr, UCell u1, FILE *wfileid); |
struct Cellquad read_line(Char *c_addr, UCell u1, FILE *wfileid); |
struct Cellpair file_status(Char *c_addr, UCell u); |
struct Cellpair file_status(Char *c_addr, UCell u); |
Cell to_float(Char *c_addr, UCell u, Float *r_p); |
Cell to_float(Char *c_addr, UCell u, Float *r_p, Char dot); |
Float v_star(Float *f_addr1, Cell nstride1, Float *f_addr2, Cell nstride2, UCell ucount); |
Float v_star(Float *f_addr1, Cell nstride1, Float *f_addr2, Cell nstride2, UCell ucount); |
void faxpy(Float ra, Float *f_x, Cell nstridex, Float *f_y, Cell nstridey, UCell ucount); |
void faxpy(Float ra, Float *f_x, Cell nstridex, Float *f_y, Cell nstridey, UCell ucount); |
UCell lshift(UCell u1, UCell n); |
UCell lshift(UCell u1, UCell n); |
Line 458 extern int debug;
|
Line 493 extern int debug;
|
# define debug 0 |
# define debug 0 |
#endif |
#endif |
|
|
extern Cell *gforth_SP; |
extern PER_THREAD Cell *gforth_SP; |
extern Cell *gforth_RP; |
extern PER_THREAD Cell *gforth_RP; |
extern Address gforth_LP; |
extern PER_THREAD Address gforth_LP; |
extern Float *gforth_FP; |
extern PER_THREAD Float *gforth_FP; |
extern Address gforth_UP; |
extern PER_THREAD user_area* gforth_UP; |
#ifndef HAS_LINKBACK |
|
extern void * gforth_pointers[]; |
extern void * gforth_pointers(Cell n); |
#endif |
|
|
|
#ifdef HAS_FFCALL |
#ifdef HAS_FFCALL |
extern Cell *gforth_RP; |
|
extern Address gforth_LP; |
|
extern void gforth_callback(Xt* fcall, void * alist); |
extern void gforth_callback(Xt* fcall, void * alist); |
#endif |
#endif |
|
|
Line 515 extern unsigned long int strtoul(const c
|
Line 547 extern unsigned long int strtoul(const c
|
|
|
#define GROUP(x, n) |
#define GROUP(x, n) |
#define GROUPADD(n) |
#define GROUPADD(n) |
|
|
|
#ifdef HAVE_ENDIAN_H |
|
#include <endian.h> |
|
#else |
|
#define BSWAP16(x) ((((x) >> 8) & 0xff | (((x) & 0xff) << 8))) |
|
#define BSWAP32(x) ((BSWAP16((x) >> 16) | (BSWAP16(x) << 16))) |
|
#define BSWAP64(x) ((BSWAP32((x) >> 32) | (BSWAP32(x) << 32))) |
|
#ifdef WORDS_BIGENDIAN |
|
#define htobe16(x) (x) |
|
#define htobe32(x) (x) |
|
#define htobe64(x) (x) |
|
#define be16toh(x) (x) |
|
#define be32toh(x) (x) |
|
#define be64toh(x) (x) |
|
#define htole16(x) BSWAP16(x) |
|
#define htole32(x) BSWAP32(x) |
|
#define htole64(x) BSWAP64(x) |
|
#define le16toh(x) BSWAP16(x) |
|
#define le32toh(x) BSWAP32(x) |
|
#define le64toh(x) BSWAP64(x) |
|
#else |
|
#define htobe16(x) BSWAP16(x) |
|
#define htobe32(x) BSWAP32(x) |
|
#define htobe64(x) BSWAP64(x) |
|
#define be16toh(x) BSWAP16(x) |
|
#define be32toh(x) BSWAP32(x) |
|
#define be64toh(x) BSWAP64(x) |
|
#define htole16(x) (x) |
|
#define htole32(x) (x) |
|
#define htole64(x) (x) |
|
#define le16toh(x) (x) |
|
#define le32toh(x) (x) |
|
#define le64toh(x) (x) |
|
#endif |
|
#endif |