Save routine |
Up: Map |
The standard speed code block consists of two sections of data. The first section contains the 16572 bytes of data for addresses 16384-32955. The second section contains 32892 bytes of data starting at address 32976, moving forward in steps of 247 bytes (rolling back to page 127 every time the 64K boundary is reached), and ending at 33149.
Note that the second section does not contain data for addresses 33396-65506 (step 247); these addresses are filled in by the routine at 33046 after the fast code block has loaded. Also note that although the byte for address 33149 is saved to tape, it is not loaded by the load routine; instead, it is also filled in by the routine at 33046.
|
||||||
33010 | LD SP,23806 | |||||
33013 | LD HL,33224 | 33224 is where the game starts after loading | ||||
33016 | LD (23835),HL | Store this address where it will be popped off the stack by the load routine | ||||
33019 | EXX | Prepare BC' for saving the second section of data | ||||
33020 | LD BC,247 | |||||
33023 | EXX | |||||
33024 | LD IX,16384 | 16384 to 32955 will be saved first | ||||
33028 | LD DE,16571 | |||||
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,15118 | B=59 (timing constant), C=14 (MIC off, border yellow) | ||||
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 the first section of data (16384-32955).
|
||||||
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,66 | |||||
33110 | DJNZ 33110 | |||||
33112 | OUT (254),A | |||||
33114 | LD B,62 | 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 section (16384-32955) 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,49 | 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 32955 yet? | ||||
33138 | INC A | |||||
33139 | JP NZ,33082 | Jump back if not | ||||
Now a further 32892 bytes are saved: starting at 32976, moving forward in steps of 247 bytes, rolling back to page 127 whenever the 64K boundary is hit, and ending at 33149.
|
||||||
33142 | RET NZ | This return does not happen | ||||
33143 | LD DE,32892 | We need to save a further 32892 bytes | ||||
33146 | LD A,49 | Change the instruction at 32902 (in the load routine) to LD SP,23835 | ||||
33148 | LD (32902),A | |||||
33151 | LD B,46 | |||||
33153 | LD A,D | Have we saved every byte of the second section yet? | ||||
33154 | OR E | |||||
33155 | JR Z,33169 | Jump if so | ||||
33157 | LD L,(IX+20) | Otherwise pick up the next byte to save | ||||
33160 | LD A,H | A=current parity byte | ||||
33161 | XOR L | Update this for the next byte to be saved | ||||
33162 | LD H,A | H=new parity byte | ||||
33163 | LD A,1 | A=1 (MIC on, border blue) | ||||
33165 | SCF | Set the carry flag (which will act as the marker bit) | ||||
33166 | JP 33192 | Jump forward to save the byte | ||||
This is where we come when all 49464 bytes have been saved.
|
||||||
33169 | LD L,0 | |||||
33171 | RET | |||||
This is the bit-saving loop for the second section of data.
|
||||||
33172 | LD A,C | A=14 (MIC off, border yellow) for the second pass | ||||
33173 | BIT 7,B | Set the zero flag to indicate that this is the second pass through the loop | ||||
33175 | DJNZ 33175 | |||||
33177 | JR NC,33183 | Jump if we are saving a '0' | ||||
33179 | LD B,66 | |||||
33181 | DJNZ 33181 | |||||
33183 | OUT (254),A | |||||
33185 | LD B,62 | Set the timing constant for the second pass | ||||
33187 | JR NZ,33172 | Jump back for the second pass if we've just done the first | ||||
33189 | DEC B | |||||
33190 | XOR A | Clear the carry flag | ||||
33191 | INC A | A=1 (MIC on, border blue) | ||||
33192 | RL L | Move the bit to be saved into the carry flag, and the marker bit leftwards | ||||
33194 | JP NZ,33175 | Jump unless we've saved all 8 bits of the byte | ||||
A byte from the second section has just been saved. Are there any more left?
|
||||||
33197 | DEC DE | Decrease the length counter | ||||
33198 | EXX | Move forward 247 bytes to the next byte to be saved | ||||
33199 | ADD IX,BC | |||||
33201 | EXX | |||||
33202 | LD B,47 | Set the timing constant for the first bit of the next byte | ||||
33204 | JR NC,33208 | Jump unless IX was incremented beyond the 64K boundary | ||||
33206 | LD IXh,127 | Reset the high byte of the IX register | ||||
33209 | LD A,127 | These instructions check the BREAK key but do not act on the result | ||||
33211 | IN A,(254) | |||||
33213 | RRA | |||||
33214 | NOP | |||||
33215 | NOP | |||||
33216 | NOP | |||||
33217 | JP 33153 | Save the next byte |
Up: Map |