; Parse string in (HL) and return its numerical value whether its a number ; literal or a symbol. Returns value in DE. ; HL is advanced to the character following the last successfully read char. ; Sets Z if number or symbol is valid, unset otherwise. parseNumberOrSymbol: call isLiteralPrefix jp z, parseLiteral ; Not a number. try symbol ld a, (hl) cp '$' jr z, .PC cp '@' jr z, .lastVal call symParse ret nz ; HL at end of symbol name, DE at tmp null-terminated symname. push hl ; --> lvl 1 ex de, hl call symFindVal ; --> DE pop hl ; <-- lvl 1 ret z ; not found ; When not found, check if we're in first pass. If we are, it doesn't ; matter that we didn't find our symbol. Return success anyhow. ; Otherwise return error. Z is already unset, so in fact, this is the ; same as jumping to zasmIsFirstPass ; however, before we do, load DE with zero. Returning dummy non-zero ; values can have weird consequence (such as false overflow errors). ld de, 0 jp zasmIsFirstPass .PC: ex de, hl call zasmGetPC ; --> HL ex de, hl ; result in DE inc hl ; char after last read ; Z already set from cp '$' ret .lastVal: ; last val ld de, (DIREC_LASTVAL) inc hl ; char after last read ; Z already set from cp '@' ret