Although FOR indicates the beginning of a program loop, the handler only gets called the once. Subsequent iterations of the loop return to the following statement or program line, not the FOR statement itself.
| First we call LET to assign the initial value to the variable. On return, HL points to the next bit of program (the TO clause with any luck) | ||||
| 03D5 | CD0205 | For | CALL Let | |
| Stick program ptr onto stack. We lose the return address, since we don't need it as this function conveniently falls into ExecNext by itself. | ||||
| 03D8 | E3 | XTHL | ||
| 03D9 | CD9201 | CALL GetFlowPtr | ||
| Get program ptr into DE. | ||||
| 03DC | D1 | POP D | ||
| 03DD | C2E203 | JNZ 03E2 | ||
| 03E0 | 09 | DAD B | ||
| 03E1 | F9 | SPHL | ||
| HL=prog ptr, DE=stack. Here we check we've at least 8*4 bytes of space to use for the flow struct. | ||||
| 03E2 | EB | XCHG | ||
| 03E3 | 0E08 | MVI C,08 | ||
| 03E5 | CDB601 | CALL CheckEnoughVarSpace | ||
| Get pointer to end of statement (or end of program line) onto stack. This is the prog ptr that NEXT will return to. | ||||
| 03E8 | E5 | PUSH H | ||
| 03E9 | CDF504 | CALL FindNextStatement | ||
| 03EC | E3 | XTHL | ||
| Push current line number onto stack. | ||||
| 03ED | E5 | PUSH H | ||
| 03EE | 2A6101 | LHLD CURRENT_LINE | ||
| 03F1 | E3 | XTHL | ||
| Syntax check that TO clause is next. | ||||
| 03F2 | CF | RST SyntaxCheck | ||
| 03F3 | 95 | KWID_TO | ||
| Evaluate expression following 'TO', and push the result of that expression (a floating point number of course) on the stack | ||||
| 03F4 | CD8A06 | CALL EvalExpression | ||
| 03F7 | E5 | PUSH H | ||
| 03F8 | CD1D0A | CALL FCopyToBCDE | ||
| 03FB | E1 | POP H | ||
| 03FC | C5 | PUSH B | ||
| 03FD | D5 | PUSH D | ||
| Initialise the STEP value in BCDE to 1. | ||||
| 03FE | 010081 | LXI B,8100 | ||
| 0401 | 51 | MOV D,C | ||
| 0402 | 5A | MOV E,D | ||
| If a STEP clause has not been given, skip ahead with the direction byte (in A) as 0x01. | ||||
| 0403 | 7E | MOV A,M | ||
| 0404 | FE97 | CPI KWID_STEP | ||
| 0406 | 3E01 | MVI A,01 | ||
| 0408 | C21404 | JNZ PushStepValue | ||
| STEP clause has been given so we evaluate it and get it into BCDE. The sign of this value becomes the direction byte (0x01 for fowards, 0xFF for backwards). | ||||
| 040B | CD8B06 | CALL EvalExpression+1 | ||
| 040E | E5 | PUSH H | ||
| 040F | CD1D0A | CALL FCopyToBCDE | ||
| 0412 | EF | RST FTestSign | ||
| 0413 | E1 | POP H | ||
| Push the STEP value onto the stack. | ||||
| 0414 | C5 | PushStepValue | PUSH B | |
| 0415 | D5 | PUSH D | ||
| Push A onto stack. (A=1 if no step clause, else ???) | ||||
| 0416 | F5 | PUSH PSW | ||
| 0417 | 33 | INX SP | ||
| Push the prog ptr to the end of the FOR statement (kept on PROG_PTR_TEMP) on the stack. | ||||
| 0418 | E5 | PUSH H | ||
| 0419 | 2A5D01 | LHLD PROG_PTR_TEMP | ||
| 041C | E3 | XTHL | ||
| Push KWID_FOR onto the stack, and fall into ExecNext | ||||
| 041D | 0681 | EndOfForHandler | MVI B,KWID_FOR | |
| 041F | C5 | PUSH B | ||
| 0420 | 33 | INX SP | ||