From e0f2a71dfcd752dc2c90174963512abb216f4e12 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 13 Jul 2019 14:01:20 -0400 Subject: [PATCH] apps/ed: print specified line --- apps/ed/buf.asm | 73 +++++++++++++++++++++++++++++++++++++++++++++ apps/ed/glue.asm | 2 ++ apps/ed/main.asm | 41 +++++++++++++++++-------- tools/emul/shell/shell_.asm | 2 ++ tools/emul/shell/user.h | 10 ++++--- 5 files changed, 111 insertions(+), 17 deletions(-) create mode 100644 apps/ed/buf.asm diff --git a/apps/ed/buf.asm b/apps/ed/buf.asm new file mode 100644 index 0000000..ec695c9 --- /dev/null +++ b/apps/ed/buf.asm @@ -0,0 +1,73 @@ +; buf - manage line buffer +; +; Lines in edited file aren't loaded in memory, their offsets is referenced to +; in this buffer. +; +; *** Consts *** +; +; Maximum number of lines allowed in the buffer. +.equ BUF_MAXLINES 0x800 + +; *** Variables *** +; Number of lines currently in the buffer +.equ BUF_LINECNT BUF_RAMSTART +; List of words pointing to scratchpad offsets +.equ BUF_LINES BUF_LINECNT+2 +.equ BUF_RAMEND BUF_LINES+BUF_MAXLINES*2 + +; *** Code *** + +bufInit: + xor a + ld (BUF_LINECNT), a + ret + +; Add a new line with offset HL to the buffer +bufAddLine: + push de + push hl + ld hl, BUF_LINES + ld de, (BUF_LINECNT) + add hl, de + add hl, de ; twice, because two bytes per line + ; HL now points to the specified line offset in memory + pop de ; what used to be in HL ends up in DE + ; line offset popped back in HL + ld (hl), e + inc hl + ld (hl), d + ; increase line count + ld hl, (BUF_LINECNT) + inc hl + ld (BUF_LINECNT), hl + ; our initial HL is in DE. Before we pop DE back, let's swap these + ; two so that all registers are preserved. + ex de, hl + pop de + ret + +; Read line number specified in HL and loads the I/O buffer with it. +; Like ioGetLine, sets HL to line buffer pointer. +; Sets Z on success, unset if out of bounds. +bufGetLine: + push de + ld de, (BUF_LINECNT) + call cpHLDE + jr nc, .outOfBounds ; HL > (BUF_LINECNT) + ex de, hl + ld hl, BUF_LINES + add hl, de + add hl, de ; twice, because two bytes per line + ; HL now points to seek offset in memory + ld e, (hl) + inc hl + ld d, (hl) + ; DE has seek offset + ex de, hl + ; and now HL has it. We're ready to call ioGetLine! + pop de + cp a ; ensure Z + jp ioGetLine ; preserves AF +.outOfBounds: + pop de + jp unsetZ diff --git a/apps/ed/glue.asm b/apps/ed/glue.asm index c8256ba..166608f 100644 --- a/apps/ed/glue.asm +++ b/apps/ed/glue.asm @@ -7,5 +7,7 @@ #include "lib/parse.asm" .equ IO_RAMSTART USER_RAMSTART #include "ed/io.asm" +.equ BUF_RAMSTART IO_RAMEND +#include "ed/buf.asm" #include "ed/main.asm" diff --git a/apps/ed/main.asm b/apps/ed/main.asm index b20b511..64bb583 100644 --- a/apps/ed/main.asm +++ b/apps/ed/main.asm @@ -40,27 +40,38 @@ ; when combined with commands (p, c, d, a, i). All numbers in ed are ; represented in decimals. ; +; Like in ed, line indexing is one-based. This is only in the interface, +; however. In the code, line indexes are zero-based. +; ; *** Requirements *** ; BLOCKDEV_SIZE +; addHL ; blkGetC ; blkSeek +; blkTell +; cpHLDE +; intoHL ; printstr ; printcrlf -; stdioReadC ; stdioGetLine +; stdioPutC +; stdioReadC ; unsetZ edMain: - ; Dummy test. Read first line of file - ld hl, 0 + ; Fill line buffer +.loop: + call blkTell ; --> HL + call blkGetC + jr nz, edLoop + call bufAddLine call ioGetLine - call printstr - call printcrlf + jr .loop ; Continue to loop edLoop: - ld hl, .prompt - call printstr + ld a, ':' + call stdioPutC .inner: call stdioReadC jr nz, .inner ; not done? loop @@ -71,9 +82,6 @@ edLoop: ret z jr edLoop -.prompt: - .db ":", 0 - ; Sets Z if we need to quit .processLine: ld a, (hl) @@ -81,17 +89,24 @@ edLoop: ret z call parseDecimal jr z, .processNumber - ; nothing - jr .processEnd + jr .error .processNumber: ; number is in IX ; Because we don't have a line buffer yet, let's simply print seek ; offsets. push ix \ pop hl - call ioGetLine + dec hl ; from 1-based to zero-based + call bufGetLine + jr nz, .error call printstr call printcrlf ; continue to end .processEnd: call printcrlf jp unsetZ +.error: + ld a, '?' + call stdioPutC + call printcrlf + jp unsetZ + diff --git a/tools/emul/shell/shell_.asm b/tools/emul/shell/shell_.asm index 97df063..624fea9 100644 --- a/tools/emul/shell/shell_.asm +++ b/tools/emul/shell/shell_.asm @@ -35,10 +35,12 @@ jp _blkSeek jp _blkTell jp printcrlf + jp stdioPutC jp stdioReadC jp stdioGetLine jp blkGetC jp blkSeek + jp blkTell #include "core.asm" #include "err.h" diff --git a/tools/emul/shell/user.h b/tools/emul/shell/user.h index 6f42a14..feeb864 100644 --- a/tools/emul/shell/user.h +++ b/tools/emul/shell/user.h @@ -28,7 +28,9 @@ .equ _blkSeek 0x42 .equ _blkTell 0x45 .equ printcrlf 0x48 -.equ stdioReadC 0x4b -.equ stdioGetLine 0x4e -.equ blkGetC 0x51 -.equ blkSeek 0x54 +.equ stdioPutC 0x4b +.equ stdioReadC 0x4e +.equ stdioGetLine 0x51 +.equ blkGetC 0x54 +.equ blkSeek 0x57 +.equ blkTell 0x5a