Prev: 09399 Up: Map Next: 09487
09467: THE 'SCANNING' SUBROUTINE
Used by the routines at PROGNAME, VAL_FET_1, NEXT_2NUM, DATA, DEF_FN, PR_ITEM_1, S_BRACKET, S_FN_SBRN and val.
This subroutine is used to produce an evaluation result of the 'next expression'.
The result is returned as the 'last value' on the calculator stack. For a numerical result, the last value will be the actual floating point number. However, for a string result the last value will consist of a set of parameters. The first of the five bytes is unspecified, the second and third bytes hold the address of the start of the string and the fourth and fifth bytes hold the length of the string.
Bit 6 of FLAGS is set for a numeric result and reset for a string result.
When a next expression consists of only a single operand (e.g. 'A', 'RND', 'A$(4,3 TO 7)'), then the last value is simply the value that is obtained from evaluating the operand.
However when the next expression contains a function and an operand (e.g. 'CHR$ A', 'NOT A', 'SIN 1'), the operation code of the function is stored on the machine stack until the last value of the operand has been calculated. This last value is then subjected to the appropriate operation to give a new last value.
In the case of there being an arithmetic or logical operation to be performed (e.g. 'A+B', 'A*B', 'A=B'), then both the last value of the first argument and the operation code have to be kept until the last value of the second argument has been found. Indeed the calculation of the last value of the second argument may also involve the storing of last values and operation codes whilst the calculation is being performed.
It can therefore be shown that as a complex expression is evaluated (e.g. 'CHR$ (T+A-26*INT ((T+A)/26)+65)'), a hierarchy of operations yet to be performed is built up until the point is reached from which it must be dismantled to produce the final last value.
Each operation code has associated with it an appropriate priority code and operations of higher priority are always performed before those of lower priority.
The subroutine begins with the A register being set to hold the first character of the expression and a starting priority marker - zero - being put on the machine stack.
SCANNING 09467 RST 24 The first character is fetched.
09468 LD B,0 The starting priority marker.
09470 PUSH BC It is stacked.
This entry point is used by the routines at S_U_PLUS and S_LETTER.
S_LOOP_1 09471 LD C,A The main re-entry point.
09472 LD HL,9622 Index into the scanning function table with the code in C.
09475 CALL INDEXER
09478 LD A,C Restore the code to A.
09479 JP NC,S_ALPHNUM Jump if code not found in table.
09482 LD B,0 Use the entry found in the table to build up the required address in HL, and jump to it.
09484 LD C,(HL)
09485 ADD HL,BC
09486 JP (HL)
Prev: 09399 Up: Map Next: 09487