aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authoruser <user@clank>2026-07-17 01:39:29 +0200
committeruser <user@clank>2026-07-17 01:39:29 +0200
commitc4b9a1b1c4f8c211f765a089b34b66a2d046f3be (patch)
tree2f9245dc8c0741a8e547cc8ae77073cf2d5c56d9 /include
parentnet: wget - real HTTP over the link port via the gateway (diff)
downloadgbos-c4b9a1b1c4f8c211f765a089b34b66a2d046f3be.tar.gz
gbos-c4b9a1b1c4f8c211f765a089b34b66a2d046f3be.tar.xz
gbos-c4b9a1b1c4f8c211f765a089b34b66a2d046f3be.zip
net: chat client - async receive + OSK send over the link port
The application layer of the link-port demo, and it ties the whole system together: the LCD terminal displays, the on-screen keyboard types, and the link port carries a live chat. Kernel: sys_srecv_nb (non-blocking link receive; A=byte, CF=none) and sys_pollin (poll the OSK for a typed char without blocking) - syscalls 31/32. Both are what a poll loop needs to receive and type at once. Userland: c/chat.c runs a poll loop - it feeds non-blocking bytes through a SLIP receive state machine and prints whole incoming frames as messages, while pollin() drives the on-screen keyboard; SELECT shows the keys, type a line, START sends it as a frame. libc srecv_nb()/pollin(). Host: tools/gateway.py --mode chat is a simple bot peer (echoes each GB message and injects a few async ones); --keys can drive the OSK for tests. Verified: the gateway pushes 'welcome', '<alice> hey gameboy!', '<bob> nice link cable' unprompted and the GB displays all three (async receive); typing 'hi' on the OSK echoes it and emits the SLIP frame \xC0hi\xC0 (send). A Game Boy in the chat, keyboard on screen, over the link cable.
Diffstat (limited to '')
-rw-r--r--include/gbos.inc5
1 files changed, 4 insertions, 1 deletions
diff --git a/include/gbos.inc b/include/gbos.inc
index 7103f48..a6467bf 100644
--- a/include/gbos.inc
+++ b/include/gbos.inc
@@ -128,7 +128,9 @@ DEF SYS_OPENDIR EQU 27 ; point ls at a directory (DE=path -> A=0/$FF)
DEF SYS_PIPE EQU 28 ; make a pipe (-> A=read fd; write=A+1)
DEF SYS_SSEND EQU 29 ; link-port: transmit one byte (E=byte)
DEF SYS_SRECV EQU 30 ; link-port: receive one byte (-> A=byte, blocks)
-DEF SYS_MAX EQU 31
+DEF SYS_SRECVNB EQU 31 ; link-port: receive, non-blocking (-> A=byte, CF=none)
+DEF SYS_POLLIN EQU 32 ; poll OSK for a typed char (-> A=char or 0)
+DEF SYS_MAX EQU 33
; SYS_KILL (9) is now implemented (B=pid -> A=0/$FF; pid 1 is immortal)
; (SYS_OPEN=4 / SYS_CLOSE=5 are now implemented by the filesystem)
@@ -215,5 +217,6 @@ DEF PROG_COUNT EQU 21
DEF PROG_PTEST EQU 22
DEF PROG_NECHO EQU 23
DEF PROG_WGET EQU 24
+DEF PROG_CHAT EQU 25
ENDC