apps/ed: handle +[n] and -[n] addresses

This commit is contained in:
Virgil Dupras 2019-07-13 16:30:30 -04:00
parent 3861670bcc
commit 8cf68dc7ad

View File

@ -124,13 +124,56 @@ edMain:
; Parse the string at (HL) and sets its corresponding address in DE, properly ; Parse the string at (HL) and sets its corresponding address in DE, properly
; considering implicit values (current address when nothing is specified). ; considering implicit values (current address when nothing is specified).
; advances HL to the char next to the last parsed char. ; advances HL to the char next to the last parsed char.
; It handles "+" and "-" addresses such as "+3", "-2", "+", "-".
; Sets Z on success, unset on error. Line out of bounds isn't an error. Only ; Sets Z on success, unset on error. Line out of bounds isn't an error. Only
; overflows. ; overflows.
edReadAddr: edReadAddr:
ld a, (hl) ld a, (hl)
cp '+'
jr z, .plusOrMinus
cp '-'
jr z, .plusOrMinus
call parseDecimalDigit call parseDecimalDigit
jr c, .NaN jr c, .notHandled
; straight number
call .parseDecimalM ; Z has proper value
dec de ; from 1-based to 0-base. 16bit doesn't affect flags.
ret
.notHandled:
; something else. Something we don't handle. Our addr is therefore
; (ED_CURLINE).
push hl
ld hl, (ED_CURLINE)
ex de, hl
pop hl
cp a ; ensure Z
ret
.plusOrMinus:
push af ; preserve that + or -
inc hl ; advance cmd cursor
ld a, (hl)
ld de, 1 ; if .pmNoSuffix
call parseDecimalDigit
jr c, .pmNoSuffix
call .parseDecimalM ; --> DE
.pmNoSuffix:
pop af ; bring back that +/-
push hl
ld hl, (ED_CURLINE)
cp '-'
jr z, .pmIsMinus
add hl, de
jr .pmEnd
.pmIsMinus:
sbc hl, de
.pmEnd:
ex de, hl
pop hl
cp a ; ensure Z
ret
; call parseDecimal and set HL to the character following the last digit
.parseDecimalM:
push bc push bc
push ix push ix
push hl push hl
@ -155,15 +198,6 @@ edReadAddr:
ex de, hl ; put end of string back from DE to HL ex de, hl ; put end of string back from DE to HL
; Put addr in its final register, DE ; Put addr in its final register, DE
push ix \ pop de push ix \ pop de
dec de ; from 1-based to 0-base. 16bit doesn't affect flags.
pop ix pop ix
pop bc pop bc
ret ret
.NaN:
; Not a number, return current line
push hl
ld hl, (ED_CURLINE)
ex de, hl
pop hl
cp a ; ensure Z
ret