Spectrum ROM | Routines |
Prev: 13769 | Up: Map |
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 | 13790 | LD HL,(23645) | The current value of CH-ADD is preserved on the machine stack. | ||||
13793 | PUSH HL | ||||||
13794 | LD A,B | The 'offset' for 'val' or 'val$' must be in the B register; it is now copied to A. | |||||
13795 | ADD A,227 | Produce +00 and carry set for 'val', +FB and carry reset for 'val$'. | |||||
13797 | SBC A,A | Produce +FF (bit 6 therefore set) for 'val', but +00 (bit 6 reset) for 'val$'. | |||||
13798 | PUSH AF | Save this 'flag' on the machine stack. | |||||
13799 | 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. | |||||
13802 | PUSH DE | ||||||
13803 | INC BC | ||||||
13804 | RST 48 | ||||||
13805 | POP HL | The starting address of the string goes to HL as a source address. | |||||
13806 | LD (23645),DE | The pointer to the first new space goes to CH-ADD and to the machine stack. | |||||
13810 | PUSH DE | ||||||
13811 | LDIR | The string is copied to the work space, together with an extra byte. | |||||
13813 | EX DE,HL | Switch the pointers. | |||||
13814 | DEC HL | The extra byte is replaced by a 'carriage return' character. | |||||
13815 | LD (HL),13 | ||||||
13817 | RES 7,(IY+1) | The syntax flag is reset and the string is scanned for correct syntax. | |||||
13821 | CALL SCANNING | ||||||
13824 | RST 24 | The character after the string is fetched. | |||||
13825 | CP 13 | A check is made that the end of the expression has been reached. | |||||
13827 | JR NZ,V_RPORT_C | If not, the error is reported. | |||||
13829 | POP HL | The starting address of the string is fetched. | |||||
13830 | POP AF | The 'flag' for 'val/val$' is fetched and bit 6 is compared with bit 6 of the result of the syntax scan. | |||||
13831 | XOR (IY+1) | ||||||
13834 | AND 64 | ||||||
V_RPORT_C | 13836 | JP NZ,REPORT_C | Report the error if they do not match. | ||||
13839 | LD (23645),HL | Start address to CH-ADD again. | |||||
13842 | SET 7,(IY+1) | The flag is set for line execution. | |||||
13846 | CALL SCANNING | The string is treated as a 'next expression' and a 'last value' produced. | |||||
13849 | POP HL | The original value of CH-ADD is restored. | |||||
13850 | LD (23645),HL | ||||||
13853 | JR STK_PNTRS | The subroutine exits via STK_PNTRS which resets the pointers. |
Prev: 13769 | Up: Map |