aboutsummaryrefslogtreecommitdiffstats
path: root/usr/gbos.h
blob: 5fd897a4541db1b9c44a6c9e1617f35247fdda12 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/* gbos userland C API (thin wrappers over rst $30 syscalls; see c/libc.s) */
#ifndef GBOS_H
#define GBOS_H
#define EOF 4                 /* readc() returns this at end of input */

void          writes(const char *buf, unsigned char len);
void          putc(char c);
void          puts(const char *s);        /* write a NUL-terminated string */
void          nl(void);                   /* newline (CRLF)                */
unsigned char strlen(const char *s);
char         *getargs(void);              /* this program's argument string */
char          readc(void);                /* one input byte, EOF at end    */
void          sexit(unsigned char code);
unsigned char getpid(void);
unsigned char pipe(void);         /* -> read fd; write end is read+1 */
void          ssend(unsigned char b);   /* link-port: transmit one byte */
unsigned char srecv(void);              /* link-port: receive one byte (blocks) */
int           srecv_nb(void);           /* link-port: receive, or -1 if none */
unsigned char pollin(void);             /* poll OSK for a typed char, or 0 */
unsigned char pollcon(void);            /* poll console ring (link-injected
                                           input, filled by net pumps), or 0 */
unsigned char sys_net(void *req);       /* socket layer trap (see sock.h)  */
void          gsleep(unsigned char units); /* delay units*(1/64)s (raw trap)  */
void          gticks(unsigned char buf[4]); /* 64 Hz uptime ticks, 32-bit LE  */
void          msleep(unsigned int ms);     /* delay ~ms milliseconds          */

/* helpers (c/libc.c) */
void          putu(unsigned int n);              /* print decimal          */
unsigned char atou(const char *s);               /* parse decimal          */
unsigned char argv_parse(char **argv, unsigned char maxv); /* argc/argv     */
unsigned char hasflag(char **argv, unsigned char argc, char f);   /* -x flag  */
char         *optval(char **argv, unsigned char argc, char opt);  /* -x VALUE */

/* filesystem (c/libc.s -> kernel syscalls) */
unsigned char open(const char *name, unsigned char mode);  /* 0=read 1=write */
void          close(unsigned char fd);
int           fgetc(unsigned char fd);          /* a byte, or -1 at EOF */
void          fputc(unsigned char fd, char ch);
unsigned char flist(unsigned char slot, char *namebuf); /* 1 if slot used */
void          fremove(const char *name);
unsigned char mkdir(const char *path);
unsigned char chdir(const char *path);
unsigned char opendir(const char *path);
void          poweroff(void);   /* clean emulator shutdown (saves) */
#define O_READ  0
#define O_WRITE 1
#define NOFD    0xFF
#define EISDIR  0xFE     /* open() failed: path is a directory */

/* process control (c/libc.s) */
unsigned char fork(void);
void          exec(unsigned char id);       /* replace image; never returns */
unsigned char wait(void);
void          setin(unsigned char fd);      /* redirect stdin  ($FF=console) */
void          setout(unsigned char fd);     /* redirect stdout ($FF=console) */
unsigned char lookup(const char *name);     /* command name -> program id    */
unsigned char kill(unsigned char pid);      /* terminate a pid (1 is immortal)*/
unsigned char psget(unsigned char slot, unsigned char *buf); /* {pid,state,prog}*/
void          progname(unsigned char id, char *buf);         /* id -> name     */
void          yield(void);
unsigned char reap(void);                   /* reap a finished bg job, or 0   */
void          bfill(unsigned char block, unsigned char byte); /* [debug] disk */
unsigned char bpeek(unsigned char block);                     /* [debug] disk */
unsigned char bpeek2(unsigned char block, unsigned char off);
#endif