1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-12-04 04:48:06 +11:00

apps/ed: first steps

This commit is contained in:
Virgil Dupras 2019-07-13 09:57:37 -04:00
parent 921a109749
commit 3d474c9121
6 changed files with 100 additions and 24 deletions

7
apps/ed/glue.asm Normal file
View File

@ -0,0 +1,7 @@
#include "user.h"
.org USER_CODE
jp edMain
#include "ed/main.asm"

62
apps/ed/main.asm Normal file
View File

@ -0,0 +1,62 @@
; ed - line editor
;
; A text editor modeled after UNIX's ed, but simpler. The goal is to stay tight
; on resources and to avoid having to implement screen management code (that is,
; develop the machinery to have ncurses-like apps in Collapse OS).
;
; ed has a mechanism to avoid having to move a lot of memory around at each
; edit. Each line is an element in an doubly-linked list and each element point
; to an offset in the "scratchpad". The scratchpad starts with the file
; contents and every time we change or add a line, that line goes to the end of
; the scratch pad and linked lists are reorganized whenever lines are changed.
; Contents itself is always appended to the scratchpad.
;
; 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. We sacrifice speed for
; memory usage.
;
; So here's what we do. First, we have two scratchpads. The first one is the
; file being read itself. The second one is is memory, for modifications we
; make to the file. When reading the file, we note the offset at which it ends.
; All offsets under this limit refer to the first scratchpad. Other offsets
; refer to the second.
;
; Then, our line list if just an array of 16-bit offsets. This means that we
; don't have an easy access to line length and we have to move a lot of memory
; around whenever we add or delete lines. Hopefully, "LDIR" will be our friend
; here...
;
; *** Requirements ***
; printstr
; printcrlf
; stdioReadC
; stdioGetLine
edMain:
edLoop:
ld hl, .prompt
call printstr
.inner:
call stdioReadC
jr nz, .inner ; not done? loop
; We're done. Process line.
call printcrlf
call stdioGetLine
call edProcessLine
ret z
jr edLoop
.prompt:
.db ":", 0
; Sets Z if we need to quit
edProcessLine:
call printstr
ld a, (hl)
cp 'q'
ret z
call printcrlf
jp unsetZ

View File

@ -3,4 +3,5 @@
/runbin/runbin
/*/*-bin.h
/cfsin/zasm
/cfsin/ed
/cfsin/user.h

View File

@ -4,7 +4,7 @@ KERNEL = ../../kernel
APPS = ../../apps
ZASMBIN = zasm/zasm
ZASMSH = ../zasm.sh
SHELLAPPS = $(addprefix cfsin/, zasm)
SHELLAPPS = $(addprefix cfsin/, zasm ed)
CFSIN_CONTENTS = $(SHELLAPPS) cfsin/user.h
.PHONY: all

View File

@ -34,6 +34,9 @@
jp _blkPutC
jp _blkSeek
jp _blkTell
jp printcrlf
jp stdioReadC
jp stdioGetLine
#include "core.asm"
#include "err.h"

View File

@ -27,3 +27,6 @@
.equ _blkPutC 0x3f
.equ _blkSeek 0x42
.equ _blkTell 0x45
.equ printcrlf 0x48
.equ stdioReadC 0x4b
.equ stdioGetLine 0x4e