diff options
Diffstat (limited to 'src/tasks.asm')
| -rw-r--r-- | src/tasks.asm | 62 |
1 files changed, 4 insertions, 58 deletions
diff --git a/src/tasks.asm b/src/tasks.asm index 028d074..687bddf 100644 --- a/src/tasks.asm +++ b/src/tasks.asm @@ -1,67 +1,13 @@ ; ============================================================================= -; tasks.asm - init exercises the full process lifecycle. -; -; init fork()s three children; each child exec()s PROG_WORKER, which prints 'w' -; and exit()s with its pid as the status. init then wait()s in a loop, printing -; 'R' + the reaped pid digit for each child, until wait() returns $FF (no more -; children), then prints '!' and idles. This drives fork + exec + exit + wait + -; zombie reaping + cart-RAM bank recycling. -; -; The fork counter lives at $A000 (bottom of init's own RAM bank) because the -; register file does not survive a fork() call. +; tasks.asm - init just becomes the shell. +; init (pid 1) exec()s PROG_SH; the shell then drives fork+exec+wait to run +; commands typed on the serial console. As pid 1 it is also the orphan reaper. ; ============================================================================= INCLUDE "include/gbos.inc" -DEF ASCII0 EQU $30 ; '0', added to a pid to print it as a digit -DEF CH_R EQU $52 ; 'R' -DEF CH_BANG EQU $21 ; '!' - SECTION "tasks", ROM0 TaskInit:: - ld a, 3 - ld [$A000], a ; children left to spawn - -.forkloop - ld c, SYS_FORK - rst $30 - or a - jr z, .child ; A==0 -> we are the child - ; parent: one more child spawned - ld a, [$A000] - dec a - ld [$A000], a - jr nz, .forkloop - -.waitloop - ld c, SYS_WAIT - rst $30 ; A = reaped pid (B = code), or $FF if none left - cp $FF - jr z, .done - ; print 'R' then the reaped pid as a digit - push af - ld a, CH_R - ld [$FF01], a - ld a, $81 - ld [$FF02], a - pop af - add ASCII0 - ld [$FF01], a - ld a, $81 - ld [$FF02], a - jr .waitloop - -.done - ld a, CH_BANG - ld [$FF01], a - ld a, $81 - ld [$FF02], a -.idle - ld c, SYS_YIELD - rst $30 - jr .idle - -.child - ld b, PROG_WORKER + ld b, PROG_SH ld c, SYS_EXEC rst $30 ; never returns |
