![]() |
Routines |
![]() |
This is the program used to save the fast code block for Skool Daze. |
| 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) |