Routines |
Prev: 35C9 | Up: Map | Next: 361F |
The address of this routine is found in the table of addresses. It is called indirectly via fp_calc_2.
This subroutine handles the functions VAL X$ and VAL$ X$. When handling VAL X$, it returns a 'last value' that is the result of evaluating the string (without its bounding quotes) as a numerical expression. when handling VAL$ X$, it evaluates X$ (without its bounding quotes) as a string expression, and returns the parameters of that string expression as a 'last value' on the calculator stack.
|
||||||||
val | 35DE | LD HL,($5C5D) | The current value of CH-ADD is preserved on the machine stack. | |||||
35E1 | PUSH HL | |||||||
35E2 | LD A,B | The 'offset' for 'val' or 'val$' must be in the B register; it is now copied to A. | ||||||
35E3 | ADD A,$E3 | Produce +00 and carry set for 'val', +FB and carry reset for 'val$'. | ||||||
35E5 | SBC A,A | Produce +FF (bit 6 therefore set) for 'val', but +00 (bit 6 reset) for 'val$'. | ||||||
35E6 | PUSH AF | Save this 'flag' on the machine stack. | ||||||
35E7 | CALL STK_FETCH | The parameters of the string are fetched; the starting address is saved; one byte is added to the length and room made available for the string (+1) in the work space. | ||||||
35EA | PUSH DE | |||||||
35EB | INC BC | |||||||
35EC | RST $30 | |||||||
35ED | POP HL | The starting address of the string goes to HL as a source address. | ||||||
35EE | LD ($5C5D),DE | The pointer to the first new space goes to CH-ADD and to the machine stack. | ||||||
35F2 | PUSH DE | |||||||
35F3 | LDIR | The string is copied to the work space, together with an extra byte. | ||||||
35F5 | EX DE,HL | Switch the pointers. | ||||||
35F6 | DEC HL | The extra byte is replaced by a 'carriage return' character. | ||||||
35F7 | LD (HL),$0D | |||||||
35F9 | RES 7,(IY+$01) | The syntax flag (bit 7 of FLAGS) is reset and the string is scanned for correct syntax. | ||||||
35FD | CALL SCANNING | |||||||
3600 | RST $18 | The character after the string is fetched. | ||||||
3601 | CP $0D | A check is made that the end of the expression has been reached. | ||||||
3603 | JR NZ,V_RPORT_C | If not, the error is reported. | ||||||
3605 | POP HL | The starting address of the string is fetched. | ||||||
3606 | POP AF | The 'flag' for 'val/val$' is fetched and bit 6 is compared with bit 6 of the result (FLAGS) of the syntax scan. | ||||||
3607 | XOR (IY+$01) | |||||||
360A | AND $40 | |||||||
V_RPORT_C | 360C | JP NZ,REPORT_C | Report the error if they do not match. | |||||
360F | LD ($5C5D),HL | Start address to CH-ADD again. | ||||||
3612 | SET 7,(IY+$01) | The flag (bit 7 of FLAGS) is set for line execution. | ||||||
3616 | CALL SCANNING | The string is treated as a 'next expression' and a 'last value' produced. | ||||||
3619 | POP HL | The original value of CH-ADD is restored. | ||||||
361A | LD ($5C5D),HL | |||||||
361D | JR STK_PNTRS | The subroutine exits via STK_PNTRS which resets the pointers. |
Prev: 35C9 | Up: Map | Next: 361F |