1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-23 15:48:05 +11:00

apps/ed: print specified line

This commit is contained in:
Virgil Dupras 2019-07-13 14:01:20 -04:00
parent 237d04fefd
commit e0f2a71dfc
5 changed files with 111 additions and 17 deletions

73
apps/ed/buf.asm Normal file
View File

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

View File

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

View File

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

View File

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

View File

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