retroforth/ffi-testing/retroforth.h

102 lines
2.6 KiB
C
Raw Normal View History

/* Configuration ----------------------------------------------------- */
#include <unistd.h>
#include <stdio.h>
#ifdef ENABLE_MULTICORE
#define CORES 8
#else
#define CORES 1
#endif
#ifndef BIT64
#define CELL int32_t
#define CELL_MIN INT_MIN + 1
#define CELL_MAX INT_MAX - 1
#else
#define CELL int64_t
#define CELL_MIN LLONG_MIN + 1
#define CELL_MAX LLONG_MAX - 1
#endif
#ifndef IMAGE_SIZE
#define IMAGE_SIZE 524288 /* Amount of RAM, in cells */
#endif
#ifndef ADDRESSES
#define ADDRESSES 256 /* Depth of address stack */
#endif
#ifndef STACK_DEPTH
#define STACK_DEPTH 256 /* Depth of data stack */
#endif
#define TIB vm->memory[7] /* Location of TIB */
#define MAX_DEVICES 32
#define MAX_OPEN_FILES 32
typedef struct NgaState NgaState;
typedef void (*Handler)(NgaState *);
struct NgaCore {
CELL sp, rp, ip; /* Stack & instruction pointers */
CELL active; /* Is core active? */
CELL u; /* Should next operation be */
/* unsigned? */
CELL data[STACK_DEPTH]; /* The data stack */
CELL address[ADDRESSES]; /* The address stack */
#ifdef ENABLE_MULTICORE
CELL registers[24]; /* Internal Registers */
#endif
};
struct NgaState {
/* System Memory */
CELL memory[IMAGE_SIZE + 1];
/* CPU Cores */
struct NgaCore cpu[CORES];
int active;
/* I/O Devices */
int devices;
Handler IO_deviceHandlers[MAX_DEVICES];
Handler IO_queryHandlers[MAX_DEVICES];
CELL Dictionary, NotFound, interpret; /* Interfacing */
char string_data[8192];
#ifdef ENABLE_FLOATS
double Floats[256], AFloats[256]; /* Floating Point */
CELL fsp, afsp;
#endif
/* Scripting */
char **sys_argv;
int sys_argc;
char scripting_sources[64][8192];
int current_source;
int perform_abort;
CELL currentLine;
CELL ignoreToEOL, ignoreToEOF;
/* Configuration of code & test fences for Unu */
char code_start[256], code_end[256];
char test_start[256], test_end[256];
int codeBlocks;
FILE *OpenFileHandles[MAX_OPEN_FILES];
};
/* Function Prototypes ----------------------------------------------- */
extern CELL stack_pop(NgaState *);
extern void stack_push(NgaState *, CELL);
extern CELL string_inject(NgaState *, char *, CELL);
extern char *string_extract(NgaState *, CELL);
extern void process_opcode_bundle(NgaState *, CELL);
extern void include_file(NgaState *, char *, int);
extern void register_device(NgaState *, void *, void *);
extern void execute(NgaState *, CELL);