Routines |
Prev: 2951 | Up: Map | Next: 2A52 |
This subroutine is used either to find the parameters that define an existing string entry in the variables area, or to return in the HL register pair the base address of a particular element or an array of numbers. When called from DIM the subroutine only checks the syntax of the BASIC statement.
Note that the parameters that define a string may be altered by calling SLICING if this should be specified.
Initially the A and the B registers are cleared and bit 7 of the C register is tested to determine whether syntax is being checked.
|
||||||||||||||
STK_VAR | 2996 | XOR A | Clear the array flag. | |||||||||||
2997 | LD B,A | Clear the B register for later. | ||||||||||||
2998 | BIT 7,C | Jump forward if syntax is being checked. | ||||||||||||
299A | JR NZ,SV_COUNT | |||||||||||||
Next, simple strings are separated from array variables.
|
||||||||||||||
299C | BIT 7,(HL) | Jump forward if dealing with an array variable. | ||||||||||||
299E | JR NZ,SV_ARRAYS | |||||||||||||
The parameters for a simple string are readily found.
|
||||||||||||||
29A0 | INC A | Signal 'a simple string'. | ||||||||||||
SV_SIMPLE | 29A1 | INC HL | Move along the entry. | |||||||||||
29A2 | LD C,(HL) | Pick up the low length counter. | ||||||||||||
29A3 | INC HL | Advance the pointer. | ||||||||||||
29A4 | LD B,(HL) | Pick up the high length pointer. | ||||||||||||
29A5 | INC HL | Advance the pointer. | ||||||||||||
29A6 | EX DE,HL | Transfer the pointer to the actual string. | ||||||||||||
29A7 | CALL STK_STO | Pass these parameters to the calculator stack. | ||||||||||||
29AA | RST $18 | Fetch the present character and jump forward to see if a 'slice' is required. | ||||||||||||
29AB | JP SV_SLICE2 | |||||||||||||
The base address of an element in an array is now found. Initially the 'number of dimensions' is collected.
|
||||||||||||||
SV_ARRAYS | 29AE | INC HL | Step past the length bytes. | |||||||||||
29AF | INC HL | |||||||||||||
29B0 | INC HL | |||||||||||||
29B1 | LD B,(HL) | Collect the 'number of dimensions'. | ||||||||||||
29B2 | BIT 6,C | Jump forward if handling an array of numbers. | ||||||||||||
29B4 | JR Z,SV_PTR | |||||||||||||
If an array of strings has its 'number of dimensions' equal to '1' then such an array can be handled as a simple string.
|
||||||||||||||
29B6 | DEC B | Decrease the 'number of dimensions' and jump if the number is now zero. | ||||||||||||
29B7 | JR Z,SV_SIMPLE | |||||||||||||
Next a check is made to ensure that in the BASIC line the variable is followed by a subscript.
|
||||||||||||||
29B9 | EX DE,HL | Save the pointer in DE. | ||||||||||||
29BA | RST $18 | Get the present character. | ||||||||||||
29BB | CP "(" | Is it a '('? | ||||||||||||
29BD | JR NZ,REPORT_3 | Report the error if it is not so. | ||||||||||||
29BF | EX DE,HL | Restore the pointer. | ||||||||||||
For both numeric arrays and arrays of strings the variable pointer is transferred to the DE register pair before the subscript is evaluated.
|
||||||||||||||
SV_PTR | 29C0 | EX DE,HL | Pass the pointer to DE. | |||||||||||
29C1 | JR SV_COUNT | Jump forward. | ||||||||||||
The following loop is used to find the parameters of a specified element within an array. The loop is entered at the mid-point - SV_COUNT - where the element count is set to zero.
The loop is accessed B times, this being, for a numeric array, equal to the number of dimensions that are being used, but for an array of strings B is one less than the number of dimensions in use as the last subscript is used to specify a 'slice' of the string.
|
||||||||||||||
SV_COMMA | 29C3 | PUSH HL | Save the counter. | |||||||||||
29C4 | RST $18 | Get the present character. | ||||||||||||
29C5 | POP HL | Restore the counter. | ||||||||||||
29C6 | CP "," | Is the present character a ','? | ||||||||||||
29C8 | JR Z,SV_LOOP | Jump forward to consider another subscript. | ||||||||||||
29CA | BIT 7,C | If a line is being executed then there is an error. | ||||||||||||
29CC | JR Z,REPORT_3 | |||||||||||||
29CE | BIT 6,C | Jump forward if dealing with an array of strings. | ||||||||||||
29D0 | JR NZ,SV_CLOSE | |||||||||||||
29D2 | CP ")" | Is the present character a ')'? | ||||||||||||
29D4 | JR NZ,SV_RPT_C | Report an error if not so. | ||||||||||||
29D6 | RST $20 | Advance CH-ADD. | ||||||||||||
29D7 | RET | Return as the syntax is correct. | ||||||||||||
For an array of strings the present subscript may represent a 'slice', or the subscript for a 'slice' may yet be present in the BASIC line.
|
||||||||||||||
SV_CLOSE | 29D8 | CP ")" | Is the present character a ')'? | |||||||||||
29DA | JR Z,SV_DIM | Jump forward and check whether there is another subscript. | ||||||||||||
29DC | CP $CC | Is the present character a 'TO'? | ||||||||||||
29DE | JR NZ,SV_RPT_C | It must not be otherwise. | ||||||||||||
SV_CH_ADD | 29E0 | RST $18 | Get the present character. | |||||||||||
29E1 | DEC HL | Point to the preceding character and set CH-ADD. | ||||||||||||
29E2 | LD ($5C5D),HL | |||||||||||||
29E5 | JR SV_SLICE | Evaluate the 'slice'. | ||||||||||||
Enter the loop here.
|
||||||||||||||
SV_COUNT | 29E7 | LD HL,$0000 | Set the counter to zero. | |||||||||||
SV_LOOP | 29EA | PUSH HL | Save the counter briefly. | |||||||||||
29EB | RST $20 | Advance CH-ADD. | ||||||||||||
29EC | POP HL | Restore the counter. | ||||||||||||
29ED | LD A,C | Fetch the discriminator byte. | ||||||||||||
29EE | CP $C0 | Jump unless checking the syntax for an array of strings. | ||||||||||||
29F0 | JR NZ,SV_MULT | |||||||||||||
29F2 | RST $18 | Get the present character. | ||||||||||||
29F3 | CP ")" | Is it a ')'? | ||||||||||||
29F5 | JR Z,SV_DIM | Jump forward as finished counting elements. | ||||||||||||
29F7 | CP $CC | Is to 'TO'? | ||||||||||||
29F9 | JR Z,SV_CH_ADD | Jump back if dealing with a 'slice'. | ||||||||||||
SV_MULT | 29FB | PUSH BC | Save the dimension-number counter and the discriminator byte. | |||||||||||
29FC | PUSH HL | Save the element-counter. | ||||||||||||
29FD | CALL DE_DE_1 | Get a dimension-size into DE. | ||||||||||||
2A00 | EX (SP),HL | The counter moves to HL and the variable pointer is stacked. | ||||||||||||
2A01 | EX DE,HL | The counter moves to DE and the dimension-size to HL. | ||||||||||||
2A02 | CALL INT_EXP1 | Evaluate the next subscript. | ||||||||||||
2A05 | JR C,REPORT_3 | Give an error if out of range. | ||||||||||||
2A07 | DEC BC | The result of the evaluation is decremented as the counter is to count the elements occurring before the specified element. | ||||||||||||
2A08 | CALL GET_HLxDE | Multiply the counter by the dimension-size. | ||||||||||||
2A0B | ADD HL,BC | Add the result of INT_EXP1 to the present counter. | ||||||||||||
2A0C | POP DE | Fetch the variable pointer. | ||||||||||||
2A0D | POP BC | Fetch the dimension-number and the discriminator byte. | ||||||||||||
2A0E | DJNZ SV_COMMA | Keep going round the loop until B equals zero. | ||||||||||||
The SYNTAX/RUN flag is checked before arrays of strings are separated from arrays of numbers.
|
||||||||||||||
2A10 | BIT 7,C | Report an error if checking syntax at this point. | ||||||||||||
SV_RPT_C | 2A12 | JR NZ,SL_RPT_C | ||||||||||||
2A14 | PUSH HL | Save the counter. | ||||||||||||
2A15 | BIT 6,C | Jump forward if handling an array of strings. | ||||||||||||
2A17 | JR NZ,SV_ELEM | |||||||||||||
When dealing with an array of numbers the present character must be a ')'.
|
||||||||||||||
2A19 | LD B,D | Transfer the variable pointer to the BC register pair. | ||||||||||||
2A1A | LD C,E | |||||||||||||
2A1B | RST $18 | Fetch the present character. | ||||||||||||
2A1C | CP ")" | Is it a ')'? | ||||||||||||
2A1E | JR Z,SV_NUMBER | Jump past the error report unless it is needed. | ||||||||||||
REPORT_3 | 2A20 | RST $08 | Call the error handling routine. | |||||||||||
2A21 | DEFB $02 | |||||||||||||
The address of the location before the actual floating-point form can now be calculated.
|
||||||||||||||
SV_NUMBER | 2A22 | RST $20 | Advance CH-ADD. | |||||||||||
2A23 | POP HL | Fetch the counter. | ||||||||||||
2A24 | LD DE,$0005 | There are 5 bytes to each element in an array of numbers. | ||||||||||||
2A27 | CALL GET_HLxDE | Compute the total number of bytes before the required element. | ||||||||||||
2A2A | ADD HL,BC | Make HL point to the location before the required element. | ||||||||||||
2A2B | RET | Return with this address. | ||||||||||||
When dealing with an array of strings the length of an element is given by the last 'dimension-size'. The appropriate parameters are calculated and then passed to the calculator stack.
|
||||||||||||||
SV_ELEM | 2A2C | CALL DE_DE_1 | Fetch the last dimension-size. | |||||||||||
2A2F | EX (SP),HL | The variable pointer goes on the stack and the counter to HL. | ||||||||||||
2A30 | CALL GET_HLxDE | Multiply 'counter' by 'dimension-size'. | ||||||||||||
2A33 | POP BC | Fetch the variable pointer. | ||||||||||||
2A34 | ADD HL,BC | This gives HL pointing to the location before the string. | ||||||||||||
2A35 | INC HL | So point to the actual 'start'. | ||||||||||||
2A36 | LD B,D | Transfer the last dimension-size to BC to form the 'length'. | ||||||||||||
2A37 | LD C,E | |||||||||||||
2A38 | EX DE,HL | Move the 'start' to DE. | ||||||||||||
2A39 | CALL STK_ST_0 | Pass these parameters to the calculator stack. Note: the first parameter is zero indicating a string from an 'array of strings' and hence the existing entry is not to be reclaimed. | ||||||||||||
There are three possible forms of the last subscript:
The last of these is the default form and indicates that the whole string is required.
|
||||||||||||||
2A3C | RST $18 | Get the present character. | ||||||||||||
2A3D | CP ")" | Is it a ')'? | ||||||||||||
2A3F | JR Z,SV_DIM | Jump if it is so. | ||||||||||||
2A41 | CP "," | Is it a ','? | ||||||||||||
2A43 | JR NZ,REPORT_3 | Report the error if not so. | ||||||||||||
SV_SLICE | 2A45 | CALL SLICING | Use SLICING to modify the set of parameters. | |||||||||||
SV_DIM | 2A48 | RST $20 | Fetch the next character. | |||||||||||
SV_SLICE2 | 2A49 | CP "(" | Is It a '('? | |||||||||||
2A4B | JR Z,SV_SLICE | Jump back if there is a 'slice' to be considered. | ||||||||||||
When finished considering the last subscript a return can be made.
|
||||||||||||||
2A4D | RES 6,(IY+$01) | Signal - string result (reset bit 6 of FLAGS). | ||||||||||||
2A51 | RET | Return with the parameters of the required string forming a 'last value' on the calculator stack. |
Prev: 2951 | Up: Map | Next: 2A52 |