Submitted by Steve Fewell
Routine:Tokenise
Name: Tokenise Command Line (and insert into program if line number found)
Starting Address: &BAEB
Entry criteria: &0700-&07EF (the command line input location) contains the program text to tokenise
Exit: C = 0 if the command is a direct command and not part of a program - this inputt is requried to be executed
immediately.
C = 1 if a program line was entered (and inserted into the program) - not required to be executed immediately.
Description:
Set &28 (OPT flag) to #&FF.
Set &3C to #&FF (this tells the &8DB2 routine to Check for a Line Number at the start of the line).
Call routine &BBCF to initialise the Program start address (&1C, &1D), Stack pointer & REPEAT/FOR/GOSUB
levels and also reset the top bit of the LISTO flag (#&1F, to cancel *EDIT mode).
Note: variables are NOT reset by this initialisation.
Set pointer (&37, &38) to point to BASIC Text Pointer A (i.e. the Command Line input text).
Zero &3B (to initialise routine &8DB2 to be in 'Start of Statement' mode).
Zero BASIC Text pointer A offset (as we will start processing from the beginning of the command line text).
Call routine &8DB2 to tokenise the command line text pointed to by (&37, &38).
Call routine &9B1E to set the IWA to the Line Number (which is now tokenised) at the location pointed to by BASIC Text
Pointer A (i.e. the start of the command line input), and set Y to point to the next character after the Line Number.
If the carry flag is not set then a Line Number was not present, so exit as we do not need to alter the current BASIC
program at all (no lines to insert, change or delete).
[&BB08] If the LISTO flag (&1F) is not 0, then skip any multiple leading spaces after the line number - meaning
that a maximum of 1 space character will be kept after the line number. This enables helps LIST command with its
formatting. Additionally, if no spaces are specified, then none will be stored.
Set location &3B to Y - that is the offset (from &0700) to the start of the program line (after the Line Number),
with any extra leading spaces ignored (if the LISTO flag is not 0).
Call routine &BA98 to remove the line number (specified in the IWA) from the program (if it is found).
Set location &3C to 7 and Y to 0.
Now pointer (&3B, &3C) points to the first character (after the Line Number) of the tokenised program line,
and Y contains the offset (from this pointer) of the current character that we are working with.
If the start of the program line (pointed to by (&3B, &3C)) contains the '<cr>' character then exit as
there is no line to insert - and we have deleted the specified line from the program (as per the user's request).
[&BB26] Search for the next '<cr>' character and set Y to the length of the program line (excluding the Line Number
and the '<cr>' character.
Reduce Y (if necessary) so that it points to the last non-space character on the line. This is done in order to skip any
trailing spaces on the command line.
Store a '<cr>' character at location (&37, &38 + offset Y+1) [i.e. at the end of the program line].
Add 4 to Y (to take into account the 4-byte tokenised Line Number [1 byte for Line Number token and 3 for the Line
Number value]).
Store Y (the line length) in location &3F.
Set &39-&3A to TOP.
Update TOP (by adding Y tm the TOP value via routine &BE04).
Set (&37, &38) to the new TOP value.
Set Y to 0 (Y is 1 on return from &BE04).
If HIMEM (&06, &07) is less than the new TOP value then there is not enough space for the program line to be stored,
so:
* Call &BBAC to check that the program can be read correctly (and to set the correct TOP value).
[at this stage the new/changed Line will not be present in the program at all].
* generate a 'LINE space' error.
BAEB | 162 255 | A2 FF | LDX#&FF | |
BAED | ( | 134 040 | 86 28 | STX &28 |
BAEF | < | 134 060 | 86 3C | STX &3C |
BAF1 | 032 207 187 | 20 CF BB | JSR &BBCF Initialise Program start address, Stack pointer, *EDIT mode & REPEAT/FOR/GOSUB levels | |
BAF4 | 165 011 | A5 0B | LDA &0B | |
BAF6 | 7 | 133 055 | 85 37 | STA &37 |
BAF8 | 165 012 | A5 0C | LDA &0C | |
BAFA | 8 | 133 056 | 85 38 | STA &38 |
BAFC | d; | 100 059 | 64 3B | STZ &3B |
BAFE | d | 100 010 | 64 0A | STZ &0A |
BB00 | 032 178 141 | 20 B2 8D | JSR &8DB2 Tokenise Command Line | |
BB03 | 032 030 155 | 20 1E 9B | JSR &9B1E Detokenise the Line Number at PTR A & Set IWA to the Line Number value | |
BB06 | 144 226 | 90 E2 | BCC -30 --> &BAEA [RTS] | |
BB08 | 165 031 | A5 1F | LDA &1F | |
BB0A | 240 009 | F0 09 | BEQ 9 --> &BB15 | |
BB0C | 185 000 007 | B9 00 07 | LDA &0700,Y | |
BB0F | 200 | C8 | INY | |
BB10 | 201 032 | C9 20 | CMP#&20 | |
BB12 | 240 248 | F0 F8 | BEQ -8 --> &BB0C | |
BB14 | 136 | 88 | DEY | |
BB15 | ; | 132 059 | 84 3B | STY &3B |
BB17 | 032 152 186 | 20 98 BA | JSR &BA98 Remove Line Number (specified in IWA) from Program | |
BB1A | 160 007 | A0 07 | LDY#&07 | |
BB1C | < | 132 060 | 84 3C | STY &3C |
BB1E | 160 000 | A0 00 | LDY#&00 | |
BB20 | 169 013 | A9 0D | LDA#&0D | |
BB22 | ; | 210 059 | D2 3B | CMP (&3B) |
BB24 | 240 196 | F0 C4 | BEQ -60 --> &BAEA [RTS] | |
BB26 | 200 | C8 | INY | |
BB27 | ; | 209 059 | D1 3B | CMP (&3B),Y |
BB29 | 208 251 | D0 FB | BNE -5 --> &BB26 | |
BB2B | 169 032 | A9 20 | LDA#&20 | |
BB2D | 136 | 88 | DEY | |
BB2E | 240 004 | F0 04 | BEQ 4 --> &BB34 | |
BB30 | ; | 209 059 | D1 3B | CMP (&3B),Y |
BB32 | 240 249 | F0 F9 | BEQ -7 --> &BB2D | |
BB34 | 200 | C8 | INY | |
BB35 | 169 013 | A9 0D | LDA#&0D | |
BB37 | ; | 145 059 | 91 3B | STA (&3B),Y |
BB39 | 200 | C8 | INY | |
BB3A | 200 | C8 | INY | |
BB3B | 200 | C8 | INY | |
BB3C | 200 | C8 | INY | |
BB3D | ? | 132 063 | 84 3F | STY &3F |
BB3F | 165 018 | A5 12 | LDA &12 | |
BB41 | 9 | 133 057 | 85 39 | STA &39 |
BB43 | 165 019 | A5 13 | LDA &13 | |
BB45 | : | 133 058 | 85 3A | STA &3A |
BB47 | 032 004 190 | 20 04 BE | JSR &BE04 Update TOP (add Y to TOP value, set Y to 1 & exit) | |
BB4A | 7 | 133 055 | 85 37 | STA &37 |
BB4C | 165 019 | A5 13 | LDA &13 | |
BB4E | 8 | 133 056 | 85 38 | STA &38 |
BB50 | 136 | 88 | DEY | |
BB51 | 165 006 | A5 06 | LDA &06 | |
BB53 | 197 018 | C5 12 | CMP &12 | |
BB55 | 165 007 | A5 07 | LDA &07 | |
BB57 | 229 019 | E5 13 | SBC &13 | |
BB59 | 176 016 | B0 10 | BCS 16 --> &BB6B | |
BB5B | 032 229 189 | 20 E5 BD | JSR &BDE5 Check program can be read correctly ('Bad program' message if not) | |
BB5E | 032 172 187 | 20 AC BB | JSR &BBAC Initialise Page 7 & reset Variable pointers, etc... | |
BB61 | ... 'LINE space' error ... | |||
BB6B | 9 | 177 057 | B1 39 | LDA (&39),Y |
BB6D | 7 | 145 055 | 91 37 | STA (&37),Y |
BB6F | 152 | 98 | TYA | |
BB70 | 208 004 | D0 04 | BNE 4 --> &BB76 | |
BB72 | : | 198 058 | C6 3A | DEC &3A |
BB74 | 8 | 198 056 | C6 38 | DEC &38 |
BB76 | 136 | 88 | DEY | |
BB77 | 152 | 98 | TYA | |
BB78 | e9 | 101 057 | 65 39 | ADC &39 |
BB7A | : | 166 058 | A6 3A | LDX &3A |
BB7C | 144 001 | 90 01 | BCC 1 --> &BB7F | |
BB7E | 232 | E8 | INX | |
BB7F | = | 197 061 | C5 3D | CMP &3D |
BB81 | 138 | 8A | TXA | |
BB82 | > | 229 062 | E5 3E | SBC &3E |
BB84 | 176 229 | B0 E5 | BCS -27 --> &BB6B | |
BB86 | 160 001 | A0 01 | LDY#&01 | |
BB88 | + | 165 043 | A5 2B | LDA &2B |
BB8A | = | 145 061 | 91 3D | STA (&3D),Y |
BB8C | 200 | C8 | INY | |
BB8D | * | 165 042 | A5 2A | LDA &2A |
BB8F | = | 145 061 | 91 3D | STA (&3D),Y |
BB91 | 200 | C8 | INY | |
BB92 | ? | 165 063 | A5 3F | LDA &3F |
BB94 | = | 145 061 | 91 3D | STA (&3D),Y |
BB96 | 8 | 056 | 38 | SEC |
BB97 | 152 | 98 | TYA | |
BB98 | e= | 101 061 | 65 3D | ADC &3D |
BB9A | = | 133 061 | 85 3D | STA &3D |
BB9C | 144 002 | 90 02 | BCC 2 --> &BBA0 | |
BB9E | > | 230 062 | E6 3E | INC &3E |
BBA0 | 160 255 | A0 FF | LDY#&FF | |
BBA2 | 200 | C8 | INY | |
BBA3 | ; | 177 059 | B1 3B | LDA (&3B),Y |
BBA5 | = | 145 061 | 91 3D | STA (&3D),Y |
BBA7 | 201 013 | C9 0D | CMP#&0D | |
BBA9 | 208 247 | D0 F7 | BNE -9 --> &BBA2 | |
BBAB | ` | 096 | 60 | RTS |