| Routines

02230: THE 'MERGE' CONTROL ROUTINE

Used by the routine at SAVE_ETC. There are three main parts to this routine. Load the data block into the work space. Merge the lines of the new program into the old program. Merge the new variables into the old variables. Start therefore with the loading of the data block.
Input
IX | Address of the header loaded from tape
ME_CONTRL | 02230 | LD C,(IX+11) | Fetch the 'length' of the data block.
| 02233 | LD B,(IX+12)
| 02236 | PUSH BC | Save a copy of the 'length'.
| 02237 | INC BC | Now make 'length+1' locations available in the work space.
| 02238 | RST 48
| 02239 | LD (HL),128 | Place an end marker in the extra location.
| 02241 | EX DE,HL | Move the 'start' pointer to the HL register pair.
| 02242 | POP DE | Fetch the original 'length'.
| 02243 | PUSH HL | Save a copy of the 'start'.
| 02244 | PUSH HL | Now set the IX register pair for the actual load.
| 02245 | POP IX
| 02247 | SCF | Signal 'LOAD'.
| 02248 | LD A,255 | Signal 'data block only'.
| 02250 | CALL LD_BLOCK | Load the data block.
The lines of the new program are merged with the lines of the old program.
| 02253 | POP HL | Fetch the 'start' of the new program.
| 02254 | LD DE,(23635) | Initialise DE to the 'start' of the old program (PROG).
Enter a loop to deal with the lines of the new program.
ME_NEW_LP | 02258 | LD A,(HL) | Fetch a line number and test it.
| 02259 | AND 192
| 02261 | JR NZ,ME_VAR_LP | Jump when finished with all the lines.
Now enter an inner loop to deal with the lines of the old program.
ME_OLD_LP | 02263 | LD A,(DE) | Fetch the high line number byte and compare it. Jump forward if it does not match but in any case advance both pointers.
| 02264 | INC DE
| 02265 | CP (HL)
| 02266 | INC HL
| 02267 | JR NZ,ME_OLD_L1
| 02269 | LD A,(DE) | Repeat the comparison for the low line number bytes.
| 02270 | CP (HL)
ME_OLD_L1 | 02271 | DEC DE | Now retreat the pointers.
| 02272 | DEC HL
| 02273 | JR NC,ME_NEW_L2 | Jump forward if the correct place has been found for a line of the new program.
| 02275 | PUSH HL | Otherwise find the address of the start of the next old line.
| 02276 | EX DE,HL
| 02277 | CALL NEXT_ONE
| 02280 | POP HL
| 02281 | JR ME_OLD_LP | Go round the loop for each of the 'old lines'.
ME_NEW_L2 | 02283 | CALL ME_ENTER | Enter the 'new line' and go round the outer loop again.
| 02286 | JR ME_NEW_LP
In a similar manner the variables of the new program are merged with the variables of the old program.
ME_VAR_LP | 02288 | LD A,(HL) | Fetch each variable name in turn and test it.
| 02289 | LD C,A
| 02290 | CP 128 | Return when all the variables have been considered.
| 02292 | RET Z
| 02293 | PUSH HL | Save the current new pointer.
| 02294 | LD HL,(23627) | Fetch VARS (for the old program).
Now enter an inner loop to search the existing variables area.
ME_OLD_VP | 02297 | LD A,(HL) | Fetch each variable name and test it.
| 02298 | CP 128
| 02300 | JR Z,ME_VAR_L2 | Jump forward once the end marker is found. (Make an 'addition'.)
| 02302 | CP C | Compare the names (first bytes).
| 02303 | JR Z,ME_OLD_V2 | Jump forward to consider it further, returning here if it proves not to match fully.
ME_OLD_V1 | 02305 | PUSH BC | Save the new variable's name whilst the next 'old variable' is located.
| 02306 | CALL NEXT_ONE
| 02309 | POP BC
| 02310 | EX DE,HL | Restore the pointer to the DE register pair and go round the loop again.
| 02311 | JR ME_OLD_VP
The old and new variables match with respect to their first bytes but variables with long names will need to be matched fully.
ME_OLD_V2 | 02313 | AND 224 | Consider bits 7, 6 and 5 only.
| 02315 | CP 160 | Accept all the variable types except 'long named variables'.
| 02317 | JR NZ,ME_VAR_L1
| 02319 | POP DE | Make DE point to the first character of the 'new name'.
| 02320 | PUSH DE
| 02321 | PUSH HL | Save the pointer to the 'old name'.
Enter a loop to compare the letters of the long names.
ME_OLD_V3 | 02322 | INC HL | Update both the 'old' and the 'new' pointers.
| 02323 | INC DE
| 02324 | LD A,(DE) | Compare the two letters.
| 02325 | CP (HL)
| 02326 | JR NZ,ME_OLD_V4 | Jump forward if the match fails.
| 02328 | RLA | Go round the loop until the 'last character' is found.
| 02329 | JR NC,ME_OLD_V3
| 02331 | POP HL | Fetch the pointer to the start of the 'old' name and jump forward - successful.
| 02332 | JR ME_VAR_L1
ME_OLD_V4 | 02334 | POP HL | Fetch the pointer and jump back - unsuccessful.
| 02335 | JR ME_OLD_V1
Come here if the match was found.
ME_VAR_L1 | 02337 | LD A,255 | Signal 'replace' variable.
And here if not. (A holds 128 - variable to be 'added'.)
ME_VAR_L2 | 02339 | POP DE | Fetch pointer to 'new' name.
| 02340 | EX DE,HL | Switch over the registers.
| 02341 | INC A | The zero flag is to be set if there is to be a 'replacement', reset for an 'addition'.
| 02342 | SCF | Signal 'handling variables'.
| 02343 | CALL ME_ENTER | Now make the entry.
| 02346 | JR ME_VAR_LP | Go round the loop to consider the next new variable.