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
|
/* 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 */
/* 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
|