Browse Source

ed: add '.' and '$' support

pull/10/head
Virgil Dupras 4 years ago
parent
commit
8db1bdb245
3 changed files with 25 additions and 5 deletions
  1. +4
    -0
      apps/ed/README.md
  2. +14
    -3
      apps/ed/cmd.asm
  3. +7
    -2
      apps/ed/main.asm

+ 4
- 0
apps/ed/README.md View File

@@ -63,3 +63,7 @@ Addresses can be expressed relatively to the current line with `+` and `-`.
lines before current line and ending 2 lines after it`.

`+` alone means `+1`, `-` means `-1`.

`.` means current line. It can usually be ommitted. `p` is the same as `.p`.

`$` means the last line of the buffer.

+ 14
- 3
apps/ed/cmd.asm View File

@@ -7,8 +7,7 @@
.equ ABSOLUTE 0
; handles +, - and ".". For +, easy. For -, addr is negative. For ., it's 0.
.equ RELATIVE 1
.equ BOF 2
.equ EOF 3
.equ EOF 2

; *** Variables ***

@@ -86,6 +85,10 @@ cmdParse:
jr z, .plusOrMinus
cp '-'
jr z, .plusOrMinus
cp '.'
jr z, .dot
cp '$'
jr z, .eof
call parseDecimalDigit
jr c, .notHandled
; straight number
@@ -95,14 +98,22 @@ cmdParse:
ret nz
dec de ; from 1-based to 0-base
jr .end
.dot:
inc hl ; advance cmd cursor
; the rest is the same as .notHandled
.notHandled:
; something else. Something we don't handle. Our addr is therefore "."
; something else. It's probably our command. Our addr is therefore "."
ld a, RELATIVE
ld (ix), a
xor a ; sets Z
ld (ix+1), a
ld (ix+2), a
ret
.eof:
inc hl ; advance cmd cursor
ld a, EOF
ld (ix), a
ret ; Z set during earlier CP
.plusOrMinus:
push af ; preserve that + or -
ld a, RELATIVE


+ 7
- 2
apps/ed/main.asm View File

@@ -14,8 +14,7 @@
; That's on a resourceful UNIX system.
;
; That doubly linked list on the z80 would use 7 bytes per line (prev, next,
; offset, len), which is a bit much. Moreover, there's that whole "scratchpad
; being loaded in memory" thing that's a bit iffy.
; offset, len), which is a bit much.
;
; We sacrifice speed for memory usage by making that linked list into a simple
; array of pointers to line contents in scratchpad. This means that we
@@ -159,6 +158,8 @@ edResolveAddr:
ld a, (ix)
cp RELATIVE
jr z, .relative
cp EOF
jr z, .eof
; absolute
ld l, (ix+1)
ld h, (ix+2)
@@ -171,6 +172,10 @@ edResolveAddr:
add hl, de
pop de
ret
.eof:
ld hl, (BUF_LINECNT)
dec hl
ret

; Read absolute addr1 in HL and addr2 in DE. Also, check bounds and set Z if
; both addresses are within bounds, unset if not.


Loading…
Cancel
Save