diff options
-rw-r--r-- | baremetal/112read-byte.subx | 9 | ||||
-rw-r--r-- | baremetal/115write-byte.subx | 9 | ||||
-rw-r--r-- | baremetal/309stream.subx | 21 |
3 files changed, 33 insertions, 6 deletions
diff --git a/baremetal/112read-byte.subx b/baremetal/112read-byte.subx index c6dd3ddf..4c8fcc5a 100644 --- a/baremetal/112read-byte.subx +++ b/baremetal/112read-byte.subx @@ -23,7 +23,7 @@ read-byte: # s: (addr stream byte) -> result/eax: byte 8b/copy 1/mod/*+disp8 6/rm32/esi . . . 1/r32/ecx 4/disp8 . # copy *(esi+4) to ecx # if (f->read >= f->write) abort 3b/compare 0/mod/indirect 6/rm32/esi . . . 1/r32/ecx . . # compare ecx with *esi - 0f 8d/jump-if->= $read-byte:end/disp32 # TODO: abort + 0f 8d/jump-if->= $read-byte:abort/disp32 # result = f->data[f->read] 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax 8a/copy-byte 1/mod/*+disp8 4/rm32/sib 6/base/esi 1/index/ecx . 0/r32/AL 0xc/disp8 . # copy byte at *(esi+ecx+12) to AL @@ -38,4 +38,11 @@ $read-byte:end: 5d/pop-to-ebp c3/return +$read-byte:abort: + (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "read-byte: empty stream" 3) # 3=cyan + { + eb/jump loop/disp8 + } + # never gets here + # . . vim:nowrap:textwidth=0 diff --git a/baremetal/115write-byte.subx b/baremetal/115write-byte.subx index 3ac587f0..45cf9950 100644 --- a/baremetal/115write-byte.subx +++ b/baremetal/115write-byte.subx @@ -22,7 +22,7 @@ append-byte: # f: (addr stream byte), n: int 8b/copy 0/mod/indirect 7/rm32/edi . . . 1/r32/ecx . . # copy *edi to ecx # if (f->write >= f->size) abort 3b/compare 1/mod/*+disp8 7/rm32/edi . . . 1/r32/ecx 8/disp8 . # compare ecx with *(edi+8) - 7d/jump-if->= $append-byte:end/disp8 # TODO: abort + 7d/jump-if->= $append-byte:abort/disp8 $append-byte:to-stream: # write to stream # f->data[f->write] = LSB(n) @@ -40,6 +40,13 @@ $append-byte:end: 5d/pop-to-ebp c3/return +$append-byte:abort: + (draw-text-wrapping-down-then-right-from-cursor-over-full-screen 0 "append-byte: out of space\n" 3) # 3=cyan + { + eb/jump loop/disp8 + } + # never gets here + test-append-byte-single: # - check that append-byte writes to first byte of 'file' # setup diff --git a/baremetal/309stream.subx b/baremetal/309stream.subx index 720ee0eb..0d470ca6 100644 --- a/baremetal/309stream.subx +++ b/baremetal/309stream.subx @@ -65,11 +65,11 @@ write-to-stream: # s: (addr stream _), in: (addr byte), n: int 8b/-> *(ebp+8) 7/r32/edi # var swrite/edx: int = s->write 8b/-> *edi 2/r32/edx - # if (swrite + n > s->size) return + # if (swrite + n > s->size) abort 8b/-> *(ebp+0x10) 1/r32/ecx 01/add-to %ecx 2/r32/edx 3b/compare 1/r32/ecx *(edi+8) - 0f 8f/jump-if-> $write-to-stream:end/disp32 # TODO: abort + 0f 8f/jump-if-> $write-to-stream:abort/disp32 # var out/edx: (addr byte) = s->data + s->write 8d/copy-address *(edi+edx+0xc) 2/r32/edx # var outend/ebx: (addr byte) = out + n @@ -97,6 +97,13 @@ $write-to-stream:end: 5d/pop-to-ebp c3/return +$write-to-stream:abort: + (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "write-to-stream: stream full" 3) # 3=cyan + { + eb/jump loop/disp8 + } + # never gets here + read-from-stream: # s: (addr stream _), out: (addr byte), n: int # . prologue 55/push-ebp @@ -111,11 +118,11 @@ read-from-stream: # s: (addr stream _), out: (addr byte), n: int 8b/-> *(ebp+8) 6/r32/esi # var sread/edx: int = s->read 8b/-> *(esi+4) 2/r32/edx - # if (sread + n > s->write) return + # if (sread + n > s->write) abort 8b/-> *(ebp+0x10) 1/r32/ecx 01/add-to %ecx 2/r32/edx 3b/compare 1/r32/ecx *esi - 0f 8f/jump-if-> $read-from-stream:end/disp32 # TODO: abort + 0f 8f/jump-if-> $read-from-stream:abort/disp32 # var in/edx: (addr byte) = s->data + s->read 8d/copy-address *(esi+edx+0xc) 2/r32/edx # var inend/ebx: (addr byte) = in + n @@ -143,6 +150,12 @@ $read-from-stream:end: 5d/pop-to-ebp c3/return +$read-from-stream:abort: + (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "read-from-stream: stream empty" 3) # 3=cyan + { + eb/jump loop/disp8 + } + stream-first: # s: (addr stream byte) -> result/eax: byte # . prologue 55/push-ebp |