diff options
| author | user <user@clank> | 2026-07-18 00:38:38 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-07-18 00:38:38 +0200 |
| commit | ba2d7ae1d7b319645b10aaa31a7f664f9f80c25c (patch) | |
| tree | e01e6c7c710a661defe2515ff9657f08cddcb283 /usr/gbos.h | |
| parent | tools: gbtype prints hub errors to stderr and exits 1 (diff) | |
| download | gbos-ba2d7ae1d7b319645b10aaa31a7f664f9f80c25c.tar.gz gbos-ba2d7ae1d7b319645b10aaa31a7f664f9f80c25c.tar.xz gbos-ba2d7ae1d7b319645b10aaa31a7f664f9f80c25c.zip | |
refactor: c/ -> usr/, compiled program blobs out of the source tree
Userland sources live in usr/ (fits the Unix theme better than 'c').
SDCC output .bin blobs land in build/usr/ with the other build artifacts
instead of littering the source dir; programs.asm INCBINs them from there.
Byte-identical ROM.
Diffstat (limited to 'usr/gbos.h')
| -rw-r--r-- | usr/gbos.h | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/usr/gbos.h b/usr/gbos.h new file mode 100644 index 0000000..2350665 --- /dev/null +++ b/usr/gbos.h @@ -0,0 +1,64 @@ +/* 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 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 |
