Submitted by Steve Fewell
Description:
Call routine &9D2F to set BASIC text Pointer B to the BASIC text pointer A value and get the result of the expression
pointed to by BASIC text pointer B.
Call routine &9B91 to check for the end of the Statement - if the end of statement (either a ':', '<cr>' or 'ELSE'
character) is not found after the expression then issue 'Syntax error', as the UNTIL statement does not finish correctly.
Call routine &96BC to check the result type of the expression (location &27), and convert the expression result
value to an Integer if it is a Floating-Point value, or issue 'Type mismatch' error if it is a String value.
The IWA now contains the value of the result of the expression.
Load X with the current REPEAT level (from location &24).
If X is zero, then no outstanding REPEAT statements are active, so issue 'No REPEAT' error.
Check the IWA result value - if the IWA contains zero, then the result of the UNTIL expression is false, so [&BA33]
load Y with the LSB of the REPEAT start address from the REPEAT start address stack (&04FF + X (current REPEAT
level)) and load A with the MSB of the REPEAT start address from the REPEAT start address stack (&0513 + X (current
REPEAT level)), and jump to &B732 to set the BASIC text pointer A to the REPEAT start address value (in Y and A) and
jump to &900B to continue executing the program from the REPEAT start address.
Otherwise, the UNTIL expression is true, and we have finished the REPEAT...UNTIL loop, so decrement the current
REPEAT level - so that it is now set to the level before the REPEAT loop began, and jump to &9005 to continue
executing the program, starting with the next program statement after the UNTIL statement.
BA17 | / | 032 047 157 | 20 2F 9D | JSR &9D2F Ptr B = Ptr A & Get result of expression [PTR B] |
BA1A | 032 145 155 | 20 91 9B | JSR &9B91 X = A; Check for end of Statement (PTR B) | |
BA1D | 032 188 150 | 20 BC 96 | JSR &96BC Check result type (location &27) - if Float then convert to Integer | |
BA20 | $ | 166 036 | A6 24 | LDX &24 |
BA22 | 240 215 | F0 D7 | BEQ -41 --> &B9FB No REPEAT error | |
BA24 | * | 165 042 | A5 2A | LDA &2A |
BA26 | + | 005 043 | 05 2B | ORA &2B |
BA28 | , | 005 044 | 05 2C | ORA &2C |
BA2A | - | 005 045 | 05 2D | ORA &2D |
BA2C | 240 005 | F0 05 | BEQ 5 --> &BA33 | |
BA2E | $ | 198 036 | C6 24 | DEC &24 |
BA30 | L | 076 005 144 | 4C 05 90 | JMP &9005 Continue running program (execute next statement) |
BA33 | 188 255 004 | BC FF 04 | LDY &04FF,X | |
BA36 | 189 019 005 | BD 13 05 | LDA &0513,X | |
BA39 | L2 | 076 050 183 | 4C 32 B7 | JMP &B732 Jump to the address in Y (MSB) and A (LSB) and continue executing the program from this address |