apps/ed: handle +[n] and -[n] addresses
This commit is contained in:
parent
3861670bcc
commit
8cf68dc7ad
@ -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
|
|
||||||
|
Loading…
Reference in New Issue
Block a user