From c4b9a1b1c4f8c211f765a089b34b66a2d046f3be Mon Sep 17 00:00:00 2001 From: user Date: Fri, 17 Jul 2026 01:39:29 +0200 Subject: 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', ' hey gameboy!', ' 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. --- src/net.asm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/net.asm') diff --git a/src/net.asm b/src/net.asm index 939b975..f2c4279 100644 --- a/src/net.asm +++ b/src/net.asm @@ -39,3 +39,25 @@ sys_srecv:: .got ld a, [rSB] ret + +; sys_srecv_nb() -> A = byte, CF set if none available (non-blocking). +sys_srecv_nb:: + ld a, $80 + ld [rSC], a + ld a, [rSC] + bit 7, a + jr z, .got + scf + ret +.got + ld a, [rSB] + and a ; CF = 0 (got a byte) + ret + +; sys_pollin() -> A = char typed on the OSK this poll, or 0 if none. +sys_pollin:: + call pad_poll + call osk_handle ; CF set + A = char if a key was pressed + ret c + xor a + ret -- cgit v1.3.1-sl0p