Submitted by Steve Fewell
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.
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|
|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|
|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
|AD12||6||134 054||86 36||STX &36|
|AD14||132 027||84 1B||STY &1B|
|AD16||169 000||A9 00||LDA#&00|