Submitted by Steve Fewell
Routine:loadstring
Name: Load String value
Starting Address: &B1F7
Entry criteria: &2A and &2B point to the address of the variable's value; or
&2B contains 0 and &2A contains the character for a 1-character string.
Y is &80 for a 1 character string or a String input that is terminated with &0D.
Y is anything else (probably &81) for a String variable).
Exit: The SWA contains the value of the variable.
Description:
If Y is &80 then the value is either a string input (which is terminated by a carriage return
(<CR> character) or a single character (determined by the address MSB being zero).
Otherwise (Y is &81) the string value is a String variable.
Each of these cases is explained in their own section below:
String Variable
The address pointed to by (&2A, &2B) is the string parameter block.
The first 2 bytes of this parameter block point to the address of the String value
[first byte = Low byte, second byte = High byte of address].
The third byte contains the maximum size allocated to the string value (not needed during
the Load operation).
The forth byte contains the current length of the string.
To load the string variable, the following is done:
* Store the forth byte of the parameter block (length of string) in &36 (length of SWA).
* Set (&37 and &38) to the address of the string value (low byte first).
* Load each character of the string value (last character first), and store the character
at the appropriate SWA potition.
* Exit with A = &00 (indicating a string result) when the entire string has been copied
to the SWA.
String Input (terminated by a carriage return character)
The address pointed to by (&2A, &2B) is the first character of the value.
Store each character of the value in the next available SWA position (Starting at &0600).
When a &0D (carriage return) character is found then store the &0D character in the SWA,
stop getting further characters, set &36 to the current SWA position and exit.
After 255 characters have been processed, without a &0D character being found,
exit with A = &00 and &36 (SWA length) also set to zero.
Single Character value
&2A contains the character to place in the SWA and &2B contains zero.
Load A with the character (&2A) and jump to &AE6C (part of GET$) to put
the ASCII character (in A) into the SWA, set the SWA length (&36 to 1) and exit
with A = &00 (as the result is a string value).
B1F7 | 192 128 | C0 80 | CPY#&80 | |
B1F9 | 240 030 | F0 1E | BEQ 30 --> &B219 Load SWA with String input (terminated with <CR>) or a 1 char value | |
B1FB | 160 003 | A0 03 | LDY#&03 | |
B1FD | * | 177 042 | B1 2A | LDA (&2A),Y |
B1FF | 6 | 133 054 | 85 36 | STA &36 |
B201 | 240 021 | F0 15 | BEQ 21 --> &B218 | |
B203 | 160 001 | A0 01 | LDY#&01 | |
B205 | * | 177 042 | B1 2A | LDA (&2A),Y |
B207 | 8 | 133 056 | 85 38 | STA &38 |
B209 | * | 178 042 | B2 2A | LDA (&2A) |
B20B | 7 | 133 055 | 85 37 | STA &37 |
B20D | 6 | 164 054 | A4 36 | LDY &36 |
B20F | 136 | 88 | DEY | |
B210 | 7 | 177 055 | B1 37 | LDA (&37),Y |
B212 | 153 000 006 | 99 00 06 | STA &0600,Y | |
B215 | 152 | 98 | TYA | |
B216 | 208 247 | D0 F7 | BNE -9 --> &B20F | |
B218 | ` | 096 | 60 | RTS |
B219 | + | 165 043 | A5 2B | LDA &2B |
B21B | 240 021 | F0 15 | BEQ 21 --> &B232 Set SWA to 1-character value | |
B21D | 160 000 | A0 00 | LDY#&00 | |
B21F | * | 177 042 | B1 2A | LDA (&2A),Y |
B221 | 153 000 006 | 99 00 06 | STA &0600,Y | |
B224 | I | 073 013 | 49 0D | EOR#&0D |
B226 | 240 004 | F0 04 | BEQ 4 --> &B22C | |
B228 | 200 | C8 | INY | |
B229 | 208 244 | D0 F4 | BNE -12 --> &B21F | |
B22B | 152 | 98 | TYA | |
B22C | 6 | 132 054 | 84 36 | STY &36 |
B22E | ` | 096 | 60 | RTS |