Prev: CBDE Up: Map Next: D22E
D1AA: Demo Entry Point
DemoEntryPoint D1AA DI Disable interrupts.
D1AB LD ($D22E),SP Stash the current stack pointer at *Storage_StackPointer.
D1AF LD SP,$FFFA SP=FFFA.
Write FD from InterruptLowOrderByteJumpTable for 0100 bytes. All will become clear soon...
D1B2 LD HL,$FE00 HL=FE00.
D1B5 LD BC,$00FD Set a counter in B of 00 (as it's a DJNZ this is really 0100) and set C to FD for the value to write.
WriteInterruptJumpAddress_Loop D1B8 LD (HL),C Write FD to *HL.
D1B9 INC HL Increment HL by one.
D1BA DJNZ WriteInterruptJumpAddress_Loop Decrease counter by one and loop back to WriteInterruptJumpAddress_Loop until counter is zero.
One more for luck...
D1BC LD (HL),C Write C to *HL.
This sets interrupt mode 02; when the system generates an interrupt, it'll use the high-order byte set here, together with a low-order byte generated from the system to form a 16-bit address to jump to.
As we've just set FD to every address, this means that every generated interrupt will jump to FEFD which in turn will jump to F47A.
D1BD LD A,$FE Set FE as the high-order byte in I.
D1BF LD I,A
D1C1 IM 2 Interrupt mode 02.
This entry point is used by the routine at StartGame.
DemoEntryPoint_0 D1C3 DI Disable interrupts.
D1C4 LD HL,$61A8 Write 61A8 to *D5B0.
D1C7 LD ($D5B0),HL
D1CA LD BC,$0000 Write 0000 to:
D1CD LD ($D590),BC
D1D1 LD ($D591),BC
D1D5 LD ($E0D0),BC
D1D9 XOR A Write 00 to *D589.
D1DA LD ($D589),A
Print the in-game surround.
D1DD LD A,$05 Set border colour to CYAN.
D1DF OUT ($FE),A
D1E1 LD HL,$C2A6 HL=Data_PlayareaSurround.
D1E4 CALL UnpackScreenData Call UnpackScreenData.
Set the starting lives.
D1E7 LD A,$04 Write 04 to *Lives.
D1E9 LD ($D543),A
D1EC LD HL,$5ADA Write 5ADA (attribute buffer location) to *D58E.
D1EF LD ($D58E),HL
Initialise the new game with the level 1 data.
D1F2 LD HL,$D232 Write Table_LevelData to *Pointer_CurrentLevelData.
D1F5 LD ($D230),HL
Note, this level counter counts down instead of up.
D1F8 LD B,$01 Set a counter in B for the total number of levels (01).
This level counter is used for display purposes.
D1FA XOR A Write 00 to *Level.
D1FB LD ($D58A),A
The game loops here in-game to begin a new level.
DemoEntryPoint_1 D1FE PUSH BC Stash the level counter on the stack.
D1FF LD HL,($D230) HL=*Pointer_CurrentLevelData.
D202 LD E,(HL) DE=current level data pointer.
D203 INC HL
D204 LD D,(HL)
D205 INC HL Increment the level data pointer by one to point to the next level.
D206 LD ($D230),HL Write the next level pointer to *Pointer_CurrentLevelData.
D209 EX DE,HL Exchange the DE and HL registers.
D20A LD A,($D58A) A=*Level.
D20D INC A Increment A by one.
D20E DAA DAA.
D20F LD ($D58A),A Write A to *Level.
D212 CALL Game_Initialisation Call Game_Initialisation.
D215 LD A,$01 A=01.
D217 POP BC Restore BC from the stack.
D218 PUSH BC Stash BC on the stack.
D219 CALL Print_HelperPreviewImage Call Print_HelperPreviewImage.
D21C CALL Colourise_PreviewGrid Call Colourise_PreviewGrid.
D21F EI Enable interrupts.
D220 CALL StartGame Call StartGame.
D223 POP BC Restore BC from the stack.
D224 DJNZ DemoEntryPoint_1 Decrease counter by one and loop back to DemoEntryPoint_1 until counter is zero.
D226 LD SP,($D22E) Restore the original stack pointer from *Storage_StackPointer.
D22A IM 1 Interrupt mode 01.
D22C EI Enable interrupts.
D22D RET Return.
Prev: CBDE Up: Map Next: D22E