typedef char s8int;
typedef short s16int;
typedef int s32int;
typedef vlong s64int;

extern u32int r[16];
extern u32int ps;
extern u32int curpc;
extern int trace;

#define U32(x) ((x)[0] | (x)[1] << 8 | (x)[2] << 16 | (x)[3] << 24)

typedef struct Segment Segment;
typedef struct Chan Chan;

struct Segment {
       enum {
               SEGRO = 1,
       } flags;
       u32int start, size;
       u32int *data;
};

extern Segment segs[3];

enum {
       STACKSIZE = 16*1024*1024
};

enum {
       EPERM = 1,
       ENOENT = 2,
       EIO = 5,
       EBADF = 9,
       EINVAL = 22,
       EMFILE = 24,
       ENOTTY = 25,
};

struct Chan {
       int fd;
       enum {
               DONTCLOSE = 1,
               DIR = 2,
               FAKETTY = 4,
       } flags;
       char *buf, *bufp, *bufe;
};

enum { NCHANS = 128 };

enum {
       FLAGN = 8,
       FLAGZ = 4,
       FLAGV = 2,
       FLAGC = 1,
};