version 1.116, 2011/12/31 15:29:26
|
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,2010,2011 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 303 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 315 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 363 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 371 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 381 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 */ |
/* for ABI-CODE and ;ABI-CODE */ |
typedef Cell *abifunc(Cell *sp, Float **fpp); |
typedef Cell *abifunc(Cell *sp, Float **fpp); |
Line 391 typedef Cell *semiabifunc(Cell *sp, Floa
|
Line 420 typedef Cell *semiabifunc(Cell *sp, Floa
|
|
|
/* 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); |
DCell timespec2ns(struct timespec *tvp); |
Line 407 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 464 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 |
|
|