apps/ed: add (dummy) line number processing

Starting to feel interactive...
This commit is contained in:
Virgil Dupras 2019-07-13 11:53:30 -04:00
parent 3491c26132
commit 6dbbfa837d
6 changed files with 86 additions and 59 deletions

View File

@ -4,6 +4,7 @@
jp edMain
#include "lib/parse.asm"
.equ IO_RAMSTART USER_RAMSTART
#include "ed/io.asm"
#include "ed/main.asm"

View File

@ -35,6 +35,11 @@
; to it. It repeatedly presents a prompt, waits for a command, execute the
; command. 'q' to quit.
;
; Enter a number to print this line's number. For ed, we break with Collapse
; OS's tradition of using hex representation. It would be needlessly confusing
; when combined with commands (p, c, d, a, i). All numbers in ed are
; represented in decimals.
;
; *** Requirements ***
; BLOCKDEV_SIZE
; blkGetC
@ -43,6 +48,7 @@
; printcrlf
; stdioReadC
; stdioGetLine
; unsetZ
edMain:
; Dummy test. Read first line of file
@ -70,9 +76,22 @@ edLoop:
; Sets Z if we need to quit
.processLine:
call printstr
ld a, (hl)
cp 'q'
ret z
call parseDecimal
jr z, .processNumber
; nothing
jr .processEnd
.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
call printstr
call printcrlf
; continue to end
.processEnd:
call printcrlf
jp unsetZ

1
apps/lib/README.md Normal file
View File

@ -0,0 +1 @@
Common code used by more than one app, but not by the kernel.

63
apps/lib/parse.asm Normal file
View File

@ -0,0 +1,63 @@
; *** Requirements ***
; unsetZ
;
; *** Code ***
; Parse the decimal char at A and extract it's 0-9 numerical value. Put the
; result in A.
;
; On success, the carry flag is reset. On error, it is set.
parseDecimalDigit:
; First, let's see if we have an easy 0-9 case
cp '0'
ret c ; if < '0', we have a problem
sub '0' ; our value now is valid if it's < 10
cp 10 ; on success, C is set, which is the opposite
; of what we want
ccf ; invert C flag
ret
; Parse string at (HL) as a decimal value and return value in IX under the
; same conditions as parseLiteral.
parseDecimal:
push hl
push de
push bc
ld ix, 0
.loop:
ld a, (hl)
or a
jr z, .end ; success!
call parseDecimalDigit
jr c, .error
; Now, let's add A to IX. First, multiply by 10.
push ix \ pop de
add ix, ix ; x2
jr c, .error
add ix, ix ; x4
jr c, .error
add ix, ix ; x8
jr c, .error
add ix, de ; x9
jr c, .error
add ix, de ; x10
jr c, .error
ld d, 0
ld e, a
add ix, de
jr c, .error
inc hl
jr .loop
.error:
call unsetZ
.end:
pop bc
pop de
pop hl
ret

View File

@ -58,6 +58,7 @@ jp zasmMain
#include "zasm/io.asm"
.equ TOK_RAMSTART IO_RAMEND
#include "zasm/tok.asm"
#include "lib/parse.asm"
#include "zasm/parse.asm"
#include "zasm/expr.asm"
#include "zasm/instr.asm"

View File

@ -1,61 +1,3 @@
; Parse the decimal char at A and extract it's 0-9 numerical value. Put the
; result in A.
;
; On success, the carry flag is reset. On error, it is set.
parseDecimalDigit:
; First, let's see if we have an easy 0-9 case
cp '0'
ret c ; if < '0', we have a problem
sub '0' ; our value now is valid if it's < 10
cp 10 ; on success, C is set, which is the opposite
; of what we want
ccf ; invert C flag
ret
; Parse string at (HL) as a decimal value and return value in IX under the
; same conditions as parseLiteral.
parseDecimal:
push hl
push de
push bc
ld ix, 0
.loop:
ld a, (hl)
or a
jr z, .end ; success!
call parseDecimalDigit
jr c, .error
; Now, let's add A to IX. First, multiply by 10.
push ix \ pop de
add ix, ix ; x2
jr c, .error
add ix, ix ; x4
jr c, .error
add ix, ix ; x8
jr c, .error
add ix, de ; x9
jr c, .error
add ix, de ; x10
jr c, .error
ld d, 0
ld e, a
add ix, de
jr c, .error
inc hl
jr .loop
.error:
call unsetZ
.end:
pop bc
pop de
pop hl
ret
; Parse string at (HL) as a hexadecimal value and return value in IX under the
; same conditions as parseLiteral.
parseHexadecimal: