; 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