diff options
Diffstat (limited to 'src/pipe.asm')
| -rw-r--r-- | src/pipe.asm | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/pipe.asm b/src/pipe.asm index f9473a4..1a77c5e 100644 --- a/src/pipe.asm +++ b/src/pipe.asm @@ -108,19 +108,23 @@ pipe_close:: dec [hl] ret -; pipe_bufptr - C = idx, A = pos -> HL = &wPipeBuf[idx*PIPE_BUFSZ + pos]. keeps BC. -; (idx*64 + pos <= 255, so the whole offset fits in one byte.) +; pipe_bufptr - C = idx, A = pos -> HL = &wPipeBuf[idx*PIPE_BUFSZ + pos]. +; (idx*64 + pos <= 255, so the whole offset fits in one byte.) Preserves B,C,D. pipe_bufptr: ld e, a ; E = pos ld a, c swap a add a add a ; A = idx*64 - add e ; + pos + add e ; + pos (0..255) ld e, a - ld d, 0 ld hl, wPipeBuf - add hl, de + ld a, l + add e + ld l, a + ld a, h + adc 0 + ld h, a ret ; pipe_read - A = read fd -> A = byte, CF set on EOF. Blocks while empty w/ writer. @@ -140,7 +144,9 @@ pipe_read:: ld a, [hl] or a jr z, .eof ; none -> EOF - call SchedYield ; block: let the writer run + push bc ; block: let the writer run (keep idx) + call SchedYield + pop bc jr .retry .data ld hl, wPipeHead @@ -175,6 +181,9 @@ pipe_write:: sub PIPE_FD_BASE srl a ld c, a ; C = idx + ld a, [wPipeByte] + ld d, a ; D = byte (must survive yields; wPipeByte + ; is shared and gets clobbered by others) .retry ld hl, wPipeCnt ld b, 0 @@ -187,15 +196,19 @@ pipe_write:: ld a, [hl] or a jr z, .epipe ; none -> SIGPIPE - call SchedYield ; block: let the reader drain + push bc ; block: let the reader drain (keep idx+byte) + push de + call SchedYield + pop de + pop bc jr .retry .space ld hl, wPipeTail add hl, bc ld a, [hl] ; tail push af - call pipe_bufptr ; A=tail, C=idx -> HL = &buf byte - ld a, [wPipeByte] + call pipe_bufptr ; A=tail, C=idx -> HL (preserves D) + ld a, d ; the byte ld [hl], a pop af ; tail inc a |
