![]() |
Data |
| Prev: D694 | Up: Map | Next: DADF |
|
The tape's long block does not load these bytes: the loader's second stage put them here, and they are as its turbo stage left them. At the start of that stage (a snapshot taken there) the block begins with a jump to LOADER_CLEARED, and from offset 3 the table the loader pops, with SP, as it goes: a zero (no more screen lines), then a length and an address for each piece of the game, the first of which (14 bytes at offset 9) writes the rest of the table ahead of where it is being read, and a zero length to end. As the stack pointer worked up through the table, the loader's calls pushed their return addresses into the words it had read, which is why most of it now holds two return addresses over and over.
After the table: at offset 23, the address the loader returned to when the table ran out, the checksum test at the end of LOADER_CLEARED; at offset 25, the last piece loaded, three bytes: the address the loader's final RET goes to, START, and a byte of the checksum; at offset 28, the byte the checksum test wants (it adds H to the byte at offset 27 and compares); at offset 29, the header the long block starts with, which the loader checks ($03F6).
|
||||
| LOADER_TABLE | DAC0 | DEFB $DB,$49,$DB | Once a jump to the turbo stage; the table's first zero; return addresses over the table; its zero length; the return to the checksum test; the return to START and the checksum's byte; what the test wants; the header | |
| DAC3 | DEFB $00,$00 | |||
| DAC5 | DEFB $D9,$DB,$49,$DB,$D9,$DB,$49,$DB | |||
| DACD | DEFB $D9,$DB,$49,$DB,$D9,$DB,$49,$DB | |||
| DAD5 | DEFB $00,$00 | |||
| DAD7 | DEFB $B2,$DC | |||
| DAD9 | DEFB $7C,$C4 | |||
| DADB | DEFB $58 | |||
| DADC | DEFB $36 | |||
| DADD | DEFB $F6,$03 | |||
| Prev: D694 | Up: Map | Next: DADF |