diff --git a/apps/ed/README.md b/apps/ed/README.md index 19b7220..015038f 100644 --- a/apps/ed/README.md +++ b/apps/ed/README.md @@ -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. diff --git a/apps/ed/cmd.asm b/apps/ed/cmd.asm index cfa761f..e7b8f23 100644 --- a/apps/ed/cmd.asm +++ b/apps/ed/cmd.asm @@ -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 diff --git a/apps/ed/main.asm b/apps/ed/main.asm index 9da07a5..fbdd3f8 100644 --- a/apps/ed/main.asm +++ b/apps/ed/main.asm @@ -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.