![]() |
Routines |
|
||||
33013 | LD HL,33204 | 33204 is where the game starts after loading | ||
33016 | LD (23833),HL | Store this address where it will be popped off the stack by the load routine | ||
33019 | EXX | |||
33020 | LD BC,23 | |||
33023 | EXX | |||
33024 | LD IX,16384 | 16384 to 32956 will be saved first | ||
33028 | LD DE,16572 | |||
33031 | LD A,255 | A flag byte of 255 (the first byte saved) indicates a data block | ||
33033 | LD HL,3224 | This constant will give a leader tone of about 2 seconds | ||
33036 | EX AF,AF' | |||
33037 | INC DE | Adjust the length and start address to allow for the flag byte | ||
33038 | DEC IX | |||
33040 | DI | Disable interrupts | ||
33041 | LD A,2 | MIC on, border red | ||
33043 | LD B,A | |||
First create the 2-second leader tone.
|
||||
33044 | DJNZ 33044 | |||
33046 | OUT (254),A | |||
33048 | XOR 15 | |||
33050 | LD B,164 | |||
33052 | DEC L | |||
33053 | JR NZ,33044 | |||
33055 | DEC B | |||
33056 | DEC H | |||
33057 | JP P,33044 | |||
Then create the sync pulse.
|
||||
33060 | LD B,47 | |||
33062 | DJNZ 33062 | |||
33064 | OUT (254),A | |||
33066 | LD A,13 | |||
33068 | LD B,55 | |||
33070 | DJNZ 33070 | |||
33072 | OUT (254),A | |||
It's time to save the first byte, which will be the flag byte (255).
|
||||
33074 | LD BC,6670 | |||
33077 | EX AF,AF' | A=255 | ||
33078 | LD L,A | L=255 | ||
33079 | JP 33091 | Jump forward to save the flag byte | ||
This is the main byte-saving loop.
|
||||
33082 | LD A,D | In the analagous ROM routine, the second instruction here is 'OR E', to check whether it's time to save the last byte (the parity byte) | ||
33083 | LD A,D | |||
33084 | JR Z,33098 | This jump (to save the parity byte) is never made | ||
33086 | LD L,(IX+0) | Fetch the next byte to be saved | ||
33089 | LD A,H | A=current parity byte | ||
33090 | XOR L | Update this for the next byte to be saved | ||
33091 | LD H,A | H=new parity byte | ||
33092 | LD A,1 | A=1 (MIC on, border blue) | ||
33094 | SCF | Set the carry flag (which will act as the marker bit) | ||
33095 | JP 33121 | Jump forward to save the byte | ||
This section of code, if it were used, would save the parity byte.
|
||||
33098 | LD L,H | Pick up the parity byte in L | ||
33099 | JR 33089 | Save it | ||
This is the bit-saving loop (for 16384-32956).
|
||||
33101 | LD A,C | A=14 (MIC off, border yellow) for the second pass | ||
33102 | BIT 7,B | Set the zero flag to indicate that this is the second pass through the loop | ||
33104 | DJNZ 33104 | |||
33106 | JR NC,33112 | Jump if we are saving a '0' | ||
33108 | LD B,32 | |||
33110 | DJNZ 33110 | |||
33112 | OUT (254),A | |||
33114 | LD B,29 | Set the timing constant for the second pass | ||
33116 | JR NZ,33101 | Jump back for the second pass if we've just done the first | ||
33118 | DEC B | |||
33119 | XOR A | Clear the carry flag | ||
33120 | INC A | A=1 (MIC on, border blue) | ||
33121 | RL L | Move the bit to be saved into the carry flag, and the marker bit leftwards | ||
33123 | JP NZ,33104 | Jump unless we've saved all 8 bits of the byte | ||
A byte from the first block (16384-32956) has just been saved. Are there any more left?
|
||||
33126 | DEC DE | Decrease the length counter | ||
33127 | INC IX | Move to the next byte to be saved | ||
33129 | LD B,16 | Set the timing constant for the first bit of the next byte | ||
33131 | LD A,127 | Return if the BREAK key is being pressed | ||
33133 | IN A,(254) | |||
33135 | RRA | |||
33136 | RET NC | |||
33137 | LD A,D | Have we saved 16384 to 32956 yet? | ||
33138 | INC A | |||
33139 | JP NZ,33082 | Jump back if not | ||
Now a further 65535 bytes are saved: starting at 32971, moving forward in steps of 23 bytes, and ending at 32925.
|
||||
33142 | LD A,D | IX=32957 and DE=65535 the first time we get here | ||
33143 | OR E | |||
33144 | JR Z,33158 | Jump if we have now saved 32971 onwards | ||
33146 | LD L,(IX+14) | IX+14=32971 the first time we get here | ||
33149 | LD A,H | A=current parity byte | ||
33150 | XOR L | Update this for the next byte to be saved | ||
33151 | LD H,A | H=new parity byte | ||
33152 | LD A,1 | A=1 (MIC on, border blue) | ||
33154 | SCF | Set the carry flag (which will act as the marker bit) | ||
33155 | JP 33181 | Jump forward to save the byte | ||
This is where we come when all 82108 bytes have been saved.
|
||||
33158 | LD L,0 | |||
33160 | RET | |||
This is the bit-saving loop (for the last 65535 bytes).
|
||||
33161 | LD A,C | A=14 (MIC off, border yellow) for the second pass | ||
33162 | BIT 7,B | Set the zero flag to indicate that this is the second pass through the loop | ||
33164 | DJNZ 33164 | |||
33166 | JR NC,33172 | Jump if we are saving a '0' | ||
33168 | LD B,32 | |||
33170 | DJNZ 33170 | |||
33172 | OUT (254),A | |||
33174 | LD B,29 | Set the timing constant for the second pass | ||
33176 | JR NZ,33161 | Jump back for the second pass if we've just done the first | ||
33178 | DEC B | |||
33179 | XOR A | Clear the carry flag | ||
33180 | INC A | A=1 (MIC on, border blue) | ||
33181 | RL L | Move the bit to be saved into the carry flag, and the marker bit leftwards | ||
33183 | JP NZ,33164 | Jump unless we've saved all 8 bits of the byte | ||
A byte from the second block has just been saved. Are there any more left?
|
||||
33186 | DEC DE | Decrease the length counter | ||
33187 | EXX | Move forward 23 bytes to the next byte to be saved | ||
33188 | ADD IX,BC | |||
33190 | EXX | |||
33191 | LD B,16 | Set the timing constant for the first bit of the next byte | ||
33193 | LD A,127 | These instructions check the BREAK key but do not act on the result | ||
33195 | IN A,(254) | |||
33197 | RRA | |||
33198 | JP 33142 | Save the next byte | ||
The last 5 bytes of the first group (16384 to 32956) saved make important changes to the load routine when the game is being loaded:
|
||||
32952 | JR NZ,32893 | This will replace the 'JR NZ,32907' at 32952, and kick off the loading of 65537 bytes from 32902 onwards (in steps of 23, all the way round to 32902 again) | ||
32954 | DEFB 32 | This byte will replace the 49 at 32902, changing the instruction there from 'LD SP,23833' to 'JR NZ,32929' | ||
32955 | DEFB 221 | This byte will be loaded into 32925 (which already contains 221) | ||
32956 | DEFB 173 | This byte will be loaded into 32948 (which already contains 173) |