BASIC IV ROM Routines 
    Page Last Altered: 
    
     
Submitted by Steve Fewell
  
Routine: ExtStr
  Name: Extract String
  Starting Address: &AD19
  Entry criteria: Text Pointer B points
to the " character [quote] of the String. Y contains the Text
Pointer B Offset (&1B).
Exit: SWA contains the extracted String. 
Description:
Set X to 0 (X is a pointer to the next free position in the SWA).
Increment Y to point to the character after the quote. If the current
character is a carriage return (ASCII 13), then the end of line has been reached
before the closing quote, so a Missing " error is generated.
Otherwise, store the character in the next free location in the SWA, and
increment the next free location (X), and the Text Pointer B Offset (Y).
If the character that was just stored wasn't a quote ["] then process the next character.
Otherwise, if a quote was just processed, then check the next character. If the next character is not a quote then branch to the end of string routine (&AD11), otherwise increment Y to the next character (ignoring the second quote, as the first quote has already been stored in the SWA), before processing the next character.
End of string routine (&AD11):
When the end of string is reached (a quote which isn't followed by a second
quote), the length of the string (X) is decremented by 1 (as the end quote is
not part of the string). This length is stored in &36 (The SWA length byte),
and the current Text Pointer B Offset position (Y) is stored back in the Text
Pointer B working area (&1B), the offset now points to the character after
the end quotes. Load the Accumulator with 0 (to signify that a String type has
just been processed) and exit.
Disassembly for the Extract String routine
| AD19 | 162 000 | A2 00 | LDX#&00 | |
| AD1B | 200 | C8 | INY | |
| AD1C | 177 025 | B1 19 | LDA (&19),Y | |
| AD1E | 201 013 | C9 0D | CMP#&0D | |
| AD20 | 240 017 | F0 11 | BEQ 17 --> &AD33 | |
| AD22 | 157 000 006 | 9D 00 06 | STA &0600,X | |
| AD25 | 200 | C8 | INY | |
| AD26 | 232 | E8 | INX | |
| AD27 | " | 201 034 | C9 22 | CMP#&22 | 
| AD29 | 208 241 | D0 F1 | BNE -15 --> &AD1C | |
| AD2B | 177 025 | B1 19 | LDA (&19),Y | |
| AD2D | " | 201 034 | C9 22 | CMP#&22 | 
| AD2F | 240 234 | F0 EA | BEQ -22 --> &AD1B | |
| AD31 | 208 222 | D0 DE | BNE -34 --> &AD11 | |
| AD33 | L | 076 148 146 | 4C 94 92 | JMP &9294 Missing " error | 
Complete the Extraction of the String
| AD11 | 202 | CA | DEX | |
| AD12 | 6 | 134 054 | 86 36 | STX &36 | 
| AD14 | 132 027 | 84 1B | STY &1B | |
| AD16 | 169 000 | A9 00 | LDA#&00 | |
| AD18 | ` | 096 | 60 | RTS |