Evaluates a condition. A condition has three mandatory parts : a left-hand side expression, a comparison operator, and a right-hand side expression. Examples are 'A=2', 'B<=4' and so on.
The comparison operator is one or more of the three operators '>', '=', and '<'. Since these three operators can appear more than once, and in any order, the code does something rather clever to convert them to a single 'comparison operator value'. This value has bit 0 set if '>' is present, bit 1 for '=', and bit 2 for '<'. Thus the comparison operators '<=' and '=<' are both 6, likewise '>=' and '=>' are both 3, and '<>' is 5
You can therefore get away with stupid operators such as '>>>>>' (value 1, the same as a single '>') and '>=<' (value 7), the latter being particularly dense as it causes the condition to always evaluate to true.
Get left-hand side expression onto stack. Also get first byte of comparison operator into A. | ||||
0516 | CD8A06 | If | CALL EvalExpression | |
0519 | 7E | MOV A,M | ||
051A | CD020A | CALL FPush | ||
Get value for comparison operator. Fixme: This needs proper working out as I suspect it's brilliant! | ||||
051D | 1600 | MVI D,00 | ||
051F | D69C | GetCompareOpLoop | SUI KWID_> | |
0521 | DA3205 | JC GotCompareOp | ||
0524 | FE03 | CPI 03 | ||
0526 | D23205 | JNC GotCompareOp | ||
0529 | FE01 | CPI 01 | ||
052B | 17 | RAL | ||
052C | B2 | ORA D | ||
052D | 57 | MOV D,A | ||
052E | D7 | RST NextChar | ||
052F | C31F05 | JMP GetCompareOpLoop | ||
If no comparison operator value, then syntax error out. | ||||
0532 | 7A | GotCompareOp | MOV A,D | |
0533 | B7 | ORA A | ||
0534 | CAD001 | JZ SyntaxError | ||
Preserve comparison operator value on stack and evaluate the right hand side of the condition. | ||||
0537 | F5 | PUSH PSW | ||
0538 | CD8A06 | CALL EvalExpression | ||
Syntax check for the THEN keyword. | ||||
053B | CF | RST SyntaxCheck | ||
053C | 96 | KWID_THEN | ||
053D | 2B | DCX H | ||
053E | F1 | POP PSW | ||
053F | C1 | POP B | ||
0540 | D1 | POP D | ||
0541 | E5 | PUSH H | ||
0542 | F5 | PUSH PSW | ||
0543 | CD4C0A | CALL FCompare | ||
0546 | 3C | INR A | ||
0547 | 17 | RAL | ||
0548 | C1 | POP B | ||
0549 | A0 | ANA B | ||
054A | E1 | POP H | ||
054B | CAF704 | JZ 04F7 | ||
Condition evaluated to True. Here we get the first character of the THEN statement, and if it's a digit then we jump to GOTO's handler as it's an implicit GOTO. Otherwise we jump to near the top of Exec to run the THEN statement. | ||||
054E | D7 | RST NextChar | ||
054F | DACF04 | JC Goto | ||
0552 | C34304 | JMP Exec+5 |