diff options
Diffstat (limited to '')
| -rw-r--r-- | src/syscall.asm | 21 |
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: |
