// #LAYOUT# STD * #TAKE // #LAYOUT# * BASIC_0 #TAKE // #LAYOUT# * * #IGNORE // Parse a number from the input buffer at (TXTPTR) // Result is put into FAC1. // TXTPTR is updated with first position after the number. // XXX - Remember decimal position and exponent, and apply them // after to produce normalised floating point number. // XXX - Does not use routines to access memory under ROMs etc. // This is important, because this routine operates on numbers in BASIC text. ij_not_a_digit: // XXX check for "." or "E" // Other chars terminate the accumulation. // Look for exponentiation marker // XXX - Implement me! // Probably should have a flag so that we know if we are accumulating // exponent or mantissa digits // Look for decimal point cmp #$2e bne ij_not_decimal lda __tokenise_work4 cmp #$ff beq ij_found_decimal // More than one decimal point in a number means we have reached the end of the number clc rts ij_found_decimal: // Found decimal. // Thus start counting digits after the decimal, so that we // can do the necessary number of divide by 10s on the final // number. lda #$00 sta __tokenise_work4 jmp ij_consider_next_digit ij_not_decimal: clc rts injest_number: // Clear FAC1 jsr erase_fac1 // Clear decimal position flag lda #$ff sta __tokenise_work4 // Check if leading char is a - sign // Note: the - will have been tokenised to $AB // XXX - implement ldy #$00 lda (TXTPTR),y cmp #$AB bne ij_loop1 // not minus // Set sign to negative lda #$ff sta FAC1_sign // Skip over the minus sign jsr consume_character ij_loop1: ldy #$00 lda (TXTPTR),y cmp #$30 bcc ij_not_a_digit cmp #$3a bcs ij_not_a_digit // It is a digit // Only add digit if we have not overflowed the accuracy of // the mantissa lda FAC1_exponent beq ij_accept_precision // We have an extra digit after saturating our precision. // Thus we should ignore the digit, and just multiply the FAC // by 10, but only if we have not seen a decimal point. // If we have seen a decimal point, then we can completely ignore // the digit, as it is contributing not recordable information lda __tokenise_work4 cmp #$ff bne ij_seen_decimal_point jsr fac1_mul10 // Fall through ij_seen_decimal_point: jmp ij_consider_next_digit ij_accept_precision: // We can accept more precision, so multiply the mantissa by 10, so that // we can add the new digit in jsr fac1_mul10 lda FAC1_exponent bne ij_consider_next_digit // Get digit ldy #$00 lda (TXTPTR),y sec sbc #$30 // Add to FAC1 mantissa clc adc FAC1_mantissa+0 sta FAC1_mantissa+0 ldx #1 ldy #3 ij_loop2: lda FAC1_mantissa,x adc #$00 sta FAC1_mantissa,x inx dey bne ij_loop2 bcc !+ // Carry set, so we have overflowed. // We should shift everything right one digit, and increase // the exponent by one. The non-zero exponent tells us that we // can not fit any more precision in. jsr fac1_mantissa_div2 !: ij_consider_next_digit: // Consider next digit jsr consume_character jmp ij_loop1 rts erase_fac1: lda #$00 ldx #8 !: sta FAC1_exponent,x dex bpl !- sta FACOV rts