/* sync with common.fs */
#define MEMSIZE 0x10000
#define SP_ADDR 0xfffa
#define RS_ADDR 0xff00
#define SYSVARS RS_ADDR-0x90
/* Port for block reads. Each read or write has to be done in 5 IO writes:
* 1 - r/w. 1 for read, 2 for write.
* 2 - blkid MSB
* 3 - blkid LSB
* 4 - dest addr MSB
* 5 - dest addr LSB */
#define BLK_PORT 0x03
/* About memory: the C VM is designed to run on modern POSIX environments, but
* also on 16-bit DOS ones, where 64K of memory is the limit. In these
* environments, we can't bluntly allocate 64K of VM memory. Instead, we
* allocate 32K and mirror it. Most of Collapse OS applications don't use more
* than 32K, so it works fine. */
typedef struct {
byte mem[MEMSIZE];
word SP; /* parameter Stack Pointer */
word RS; /* Return Stack pointer */
word IP; /* Interpreter Pointer */
word PC; /* Program Counter for HAL bytecode interpreter */
/* Array of 0x100 function pointers to IO read and write routines. Leave to
* NULL when IO port is unhandled. */
IORD iord[0x100];
IOWR iowr[0x100];
/* Used for keeping track of max RS and min SP during the lifetime of the
* program. Useful for debugging. */
word maxRS;
word minSP;
Bool running;
} VM;