@@ -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 |
@@ -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" | |||
@@ -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 | |||
@@ -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" | |||
@@ -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 |