aboutsummaryrefslogtreecommitdiffstats
path: root/src/syscall.asm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/syscall.asm21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/syscall.asm b/src/syscall.asm
index 4b8771c..bf75865 100644
--- a/src/syscall.asm
+++ b/src/syscall.asm
@@ -36,7 +36,7 @@ SyscallTrap::
SyscallTable:
dw sys_exit ; 0
dw sys_fork ; 1 FORK
- dw sys_nosys ; 2 READ (TODO)
+ dw sys_read ; 2 READ
dw sys_write ; 3 WRITE
dw sys_nosys ; 4 OPEN (TODO)
dw sys_nosys ; 5 CLOSE (TODO)
@@ -71,6 +71,25 @@ sys_write:
ret
; -----------------------------------------------------------------------------
+; sys_read() -> A = one input byte from the console (blocking).
+; Uses an external-clock serial transfer as a clean RX: it completes only when
+; the host has a byte (no stdout echo). While waiting we yield so other procs
+; run. Preserves BC/DE/HL (the context switch saves/restores them).
+; -----------------------------------------------------------------------------
+sys_read:
+.poll
+ ld a, $80
+ ld [rSC], a ; request a byte (external clock)
+ ld a, [rSC]
+ bit 7, a
+ jr z, .got ; bit7 clear => transfer completed
+ call SchedYield ; nothing yet: let others run, then retry
+ jr .poll
+.got
+ ld a, [rSB]
+ ret
+
+; -----------------------------------------------------------------------------
; sys_getpid() -> A = current pid
; -----------------------------------------------------------------------------
sys_getpid: