Prev: AA49 Up: Map Next: ADBE
AA65: Main entry point
Move memory buffers into the correct place
AA65 LD SP,$5BFF Put the stack somewhere safe
AA68 LD HL,$8AC0 Work out the size of what to copy based on the current location of the theme tune data
AA6B LD DE,($A475)
AA6F AND A
AA70 SBC HL,DE
AA72 LD B,H
AA73 LD C,L
AA74 LD HL,$A464 First address to move (to make space for game status data)
AA77 LD DE,$7AFF Target address
AA7A LDDR Move it
AA7C LD A,$01 Select screen 2
AA7E LD ($A45B),A
Display the title screen
AA81 LD A,$09 Blue border
AA83 LD ($A421),A
AA86 LD HL,($A475) Get the location just past end of main screen
AA89 LD DE,$F040 Minus FC0 bytes to find the start
AA8C ADD HL,DE
AA8D LD DE,$4000 Copy to start of screen
AA90 LD B,$C0 Number of lines to copy
AA92 LD A,B Remember these
AA93 PUSH BC
AA94 PUSH DE
AA95 LD BC,$0020 Number of characters to copy on this line
AA98 CP $61 Have we got to the bottom section yet?
AA9A JR C,$AAA5 Yes, move forward
AA9C LD B,$1E On the top half of the screen, everything but the right two characters is blank
AA9E XOR A
AA9F LD (DE),A
AAA0 INC E
AAA1 DJNZ $AA9F
AAA3 LD C,$02 Copy the last two actual characters
AAA5 LDIR Do the copy
AAA7 POP DE Restore
AAA8 INC D Next line
AAA9 LD A,D Done all the lines?
AAAA AND $07
AAAC JR NZ,$AAB8 Yes, move on
AAAE LD A,E Recalculate next line
AAAF ADD A,$20
AAB1 LD E,A
AAB2 JR C,$AAB8 Move on if there are no more lines
AAB4 LD A,D Calculate next screen address
AAB5 SUB $08
AAB7 LD D,A
AAB8 POP BC Restore
AAB9 DJNZ $AA92 Loop if there are more lines to copy
AABB LD BC,$0300 Copy the attributes
AABE LDIR
AAC0 LD A,$05
AAC2 LD ($A425),A
AAC5 LD DE,$A85C Copy the title screen UDG to screen 2
AAC8 LD HL,$9000
AACB LD ($A426),HL
AACE LD C,$FF
AAD0 CALL $B763
AAD3 CALL $B74A Copy title text to screen 2
AAD6 LD A,$0E Wait for ENTER or H to be pressed
AAD8 LD ($A448),A
AADB LD A,$01
AADD LD ($A400),A
AAE0 LD HL,$A8C9
AAE3 LD ($A455),HL
AAE6 LD HL,$5800
AAE9 LD ($A457),HL
AAEC CALL $C1C0 Display the title screen
AAEF EX AF,AF' Restore flags
AAF0 JR Z,$AA86 Loop back if end of sequence reached
AAF2 RRA Get the carry flag
AAF3 JR C,$AB4C Move ahead if we're starting the game
Display instructions
AAF5 PUSH DE Store this
AAF6 LD HL,$4000 Clear the display file
AAF9 LD DE,$4001
AAFC LD BC,$17FF
AAFF LD (HL),$00
AB01 LDIR
AB03 INC HL Onto the attributes
AB04 INC DE
AB05 LD (HL),$07 Fill with white paper / blank ink
AB07 LD BC,$02FF
AB0A LDIR
AB0C LD DE,$A95A Pointer to instruction text
AB0F LD HL,$4000 Start of display file
AB12 LD A,(DE) Get the next character
AB13 CP $20 Is this a printable character? ( > 20 )
AB15 JR NC,$AB22 Jump forward if it is
AB17 AND A Is this the null terminating character?
AB18 JR Z,$AB33 Jump forward if it is
AB1A XOR L Skip to new line
AB1B AND $1F
AB1D XOR L
AB1E LD L,A
AB1F INC DE Next character
AB20 JR $AB12
AB22 CALL $B74A Print the character
AB25 LD A,L Continue if we've not hit the end of this third of the screen
AB26 AND $E0
AB28 ADD A,$20
AB2A LD L,A
AB2B JR NC,$AB12
AB2D LD A,H Move to next third of the screen
AB2E ADD A,$08
AB30 LD H,A
AB31 JR $AB12
AB33 POP DE Restore DE
AB34 LD A,$1E
AB36 LD ($A448),A
AB39 LD A,$01
AB3B LD ($A400),A
AB3E LD HL,$A959 Set next command to exit on keypress
AB41 LD ($A455),HL
AB44 DI Turn off interrupts - using the game's system instead
AB45 CALL $C05C Yield to the game's interrupt handler
AB48 EX AF,AF' Restore flags
AB49 JR Z,$AAEC If tune finished, go back to the title sequence
AB4B EI Interrupts back on
Start a new game
AB4C LD HL,$5000 Blank the bottom third of the screen
AB4F LD DE,$5001
AB52 LD BC,$07FF
AB55 LD (HL),$00
AB57 LDIR
AB59 LD A,$80
AB5B LD ($A42B),A
AB5E XOR A
AB5F LD ($A42C),A Full set of lives
AB62 LD ($A45E),A No tasks completed
AB65 LD ($A437),A
AB68 LD ($A439),A Not dead
AB6B LD ($A43A),A Not visited any previous room
AB6E LD ($A43B),A
AB71 LD A,$01 Tick once on every frame
AB73 LD ($A440),A
AB76 LD C,$05 Set time to 08:30
AB78 LD DE,$A425
AB7B LD HL,$A8B7
AB7E LDIR
AB80 LD HL,$A45B Set tune on
AB83 LD A,(HL)
AB84 AND $01
AB86 LD (HL),A
Detect a Kempston joystick
AB87 LD BC,$001F Port 31 for Kempston
AB8A XOR A Check for any bits set
AB8B IN D,(C) Read it
AB8D OR D Set zero flag if nothing read
AB8E DJNZ $AB8B Try 256 times to read a port
AB90 AND $20 Did we get a read on bit 5?
AB92 JR NZ,$AB96 No, keyboard only
AB94 SET 5,(HL) Set Kempston active
Initialize game flags
AB96 XOR A
AB97 LD ($A438),A Tick counter to 0
AB9A LD ($A40E),A On the ground
AB9D LD ($A403),A
ABA0 LD ($A422),A Move to The Factory Gates
ABA3 LD HL,$88AC Put Ted at the starting position
ABA6 LD ($A406),HL
ABA9 LD HL,$A57B Put Ted facing right
ABAC LD ($A408),HL
ABAF LD HL,$00E0 Set the default frame
ABB2 LD ($A40A),HL
ABB5 LD HL,$010D
ABB8 LD ($A40C),HL
ABBB LD A,$01
ABBD LD ($A40F),A
ABC0 LD HL,$0000
ABC3 LD ($A44B),HL
ABC6 LD HL,($A477) Set theme tune to be in the in-game one
ABC9 LD ($A451),HL
ABCC LD A,$01
ABCE LD ($A450),A
ABD1 LD HL,$AA23
ABD4 LD ($A459),HL
ABD7 LD HL,($A46D) Point to default room flags
ABDA LD DE,$7DC0 Copy to working store at 7DC0
ABDD LD IX,$AA53 Point to offset table
ABE1 LD B,$31 Number of rooms
ABE3 LD A,(HL) Get the entry
ABE4 SUB (IX+$00) Subtract the offset
ABE7 LD (DE),A Set the copy in the working store
ABE8 INC HL Next room
ABE9 INC DE
ABEA LD A,(IX+$00) Next entry
ABED INC IX
ABEF CP $DC Have we reached the end of the offset table?
ABF1 JR NZ,$ABF7 No, skip this
ABF3 LD IX,$AA49 If we reached the end of the decryption table, loop back to the beginning
ABF7 DJNZ $ABE3 Loop back if more to do
Main game loop starts here
ABF9 XOR A
ABFA LD ($A436),A
ABFD CALL $AE77 Set up the room data
AC00 LD A,($A45B)
AC03 BIT 3,A
AC05 LD A,$00
AC07 JR NZ,$AC0F
AC09 LD ($A42E),A First frame of conveyor belt graphics
AC0C LD ($A42F),A
AC0F LD ($5C78),A Set the FRAMES system variable
AC12 LD HL,$A403 Copy current flags over to the "last visited" copy
AC15 LD DE,$A410
AC18 LD BC,$000D
AC1B LDIR
AC1D LD HL,$A439 Get game flags
AC20 LD A,(HL)
AC21 AND $E6 Turn off bits 0, 3 and 4
AC23 LD (HL),A Store this
AC24 LD HL,($A40A) Get Ted's graphic offset
AC27 LD DE,($A408) Get graphic set
AC2B ADD HL,DE Combine to get graphic frame
AC2C EX DE,HL Put this in DE
AC2D LD HL,($A406) Put current screen address for Ted in HL
AC30 LD A,($A40F)
AC33 LD C,A
AC34 CALL $B9EF Set up moving objects and check collision detection
AC37 CALL $AF5D Enter the room and play until we leave it
AC3A JR C,$ACB2 Jump forward if we left by losing a life
Move to another room
AC3C BIT 7,A Did we leave the room by walking out of it?
AC3E JP NZ,$AD56 Jump if not
AC41 LD HL,($A422) Get current room
AC44 LD H,$00 Set HL and DE to be offsets in the next rooms table
AC46 LD E,L
AC47 LD D,H
AC48 ADD HL,HL
AC49 ADD HL,HL
AC4A LD BC,($A46F) Add the base of the next rooms table
AC4E ADD HL,BC
AC4F LD C,A Add offset for the direction
AC50 LD B,$00
AC52 ADD HL,BC
AC53 LD A,($A422) Are we in the lift?
AC56 CP $2A
AC58 JR NZ,$AC65 Jump if we're not
AC5A LD A,($A43A) Were we previously in the Forgotten Room?
AC5D CP $2B
AC5F JR NZ,$AC73 Jump if we weren't
AC61 LD A,$0F
AC63 JR $AC73
AC65 LD ($A43A),A Set last visited room to this one
AC68 LD A,(HL) Get the appropriate next room entry
AC69 SRL E Divide by 4
AC6B SRL E
AC6D LD HL,$AA4A Point to the offset table
AC70 ADD HL,DE Add the offset
AC71 ADD HL,BC Add the direction
AC72 ADD A,(HL) Add this to the basic value in the next room table to give us the next room
AC73 LD ($A422),A Store next room
AC76 CP $30 Is this the final room?
AC78 JP Z,$AD2B Move forward if it is
AC7B BIT 0,C Was the room entered by jumping or falling?
AC7D JR NZ,$AC89 No, move on
AC7F LD A,($A406)
AC82 XOR $1E
AC84 LD ($A406),A
AC87 JR $ACA4
AC89 XOR A
AC8A BIT 1,C
AC8C JR NZ,$AC93
AC8E LD ($A403),A
AC91 LD A,$A0
AC93 LD HL,($A406)
AC96 XOR L
AC97 AND $E0
AC99 XOR L
AC9A LD L,A
AC9B LD A,H
AC9C AND $F8
AC9E XOR $08
ACA0 LD H,A
ACA1 LD ($A406),HL
ACA4 LD HL,$A45B
ACA7 RES 4,(HL)
ACA9 BIT 3,(HL)
ACAB JR Z,$ACAF
ACAD SET 4,(HL)
ACAF JP $ABF9 Jump back round to play the next room
Lost a life - flash the screen and restart the room
ACB2 LD A,($A42D)
ACB5 ADD A,$08
ACB7 LD C,A
ACB8 CALL $BF35 Invert the screen
ACBB LD IX,$A8C1 Point to "killed" sound data
ACBF LD L,(IX+$00)
ACC2 LD H,$00
ACC4 LD B,$0A
ACC6 PUSH BC
ACC7 CALL $BEF6 Play it
ACCA POP BC
ACCB AND A
ACCC LD HL,$AD51
ACCF PUSH HL Remember HL as the next call uses it
ACD0 CALL $B0DC Flash the screen
ACD3 POP HL Restore it
ACD4 INC IX
ACD6 LD A,($A42D)
ACD9 CP C
ACDA JR NZ,$ACBF
ACDC CALL $BF35 Invert the screen (back to normal)
ACDF LD A,($A42C)
ACE2 INC A
ACE3 LD ($A42C),A
ACE6 ADD A,$7F
ACE8 LD L,A
ACE9 LD H,$5A
ACEB LD A,($A45D)
ACEE LD (HL),A
ACEF LD HL,$A439 Get flags
ACF2 BIT 0,(HL) Has Ted entered the room safely?
ACF4 JR NZ,$AD05 Move forward if so
ACF6 BIT 1,(HL) Has Ted entered the room and died without hitting a safe spot?
ACF8 JR Z,$AD03 Move forward if so
ACFA LD A,$28 Pause for a bit
ACFC DJNZ $ACFC
ACFE DEC A
ACFF JR NZ,$ACFC
AD01 JR $ACB2 Back round to lose another life
AD03 SET 1,(HL) Ted died when entering the room without hitting a safe spot, set "infinite death" flag
AD05 LD HL,$A410 Copy flags from the last room into the current one
AD08 LD DE,$A403
AD0B LD BC,$000D
AD0E LDIR
AD10 LD HL,$A45B
AD13 BIT 3,(HL)
AD15 RES 3,(HL)
AD17 SET 4,(HL)
AD19 JR Z,$AD28
AD1B RES 4,(HL)
AD1D LD HL,($A463)
AD20 LD A,H
AD21 LD H,$00
AD23 LD DE,$7DC0
AD26 ADD HL,DE
AD27 LD (HL),A
AD28 JP $ABF9 Back round to main loop
AD2B LD A,($A45E) Have we completed all 21 tasks?
AD2E CP $15
AD30 JR NZ,$AD56 No, so jump forward to the "Game over" routine
AD32 LD HL,$7DC0 Point to the room flags table
AD35 XOR A Set A to 0 to check against room flags
AD36 LD B,$31 Iterate through all rooms
AD38 OR (HL) Test for any flags set - this will be reflected in A
AD39 INC HL Next room
AD3A DJNZ $AD38 Repeat until all rooms checked
AD3C RLA Was bit 8 set?
AD3D JR C,$AD56 Yes, a room wasn't completed properly, so jump to "Game over"
AD3F CALL $AE28 Ted has reached the last room with all tasks done - game won!
AD42 LD HL,$88BE
AD45 LD DE,$A813
AD48 LD BC,$010D
AD4B LD IX,$A825
AD4F JR $AD66
Run out of lives
AD51 LD A,$20
AD53 LD ($A42C),A
AD56 CALL $AE4E Set up movement data for the final sequence and put Ted in position
AD59 LD HL,$887D New screen address of Ted
AD5C LD DE,$A7BD Point DE to the "game over" automatic movement table
AD5F LD BC,$00AD Sound to play while Ted is in mid-air
AD62 LD IX,$A7FD
AD66 LD ($A406),HL Set new screen address
AD69 LD ($A404),DE Set new movement table
AD6D LD ($A40C),BC Set moving sound
AD71 LD ($A43D),IX
AD75 LD HL,$0000
AD78 LD ($A40A),HL
AD7B LD HL,$A47B
AD7E LD ($A408),HL
AD81 LD A,$FF
AD83 LD ($A40F),A
AD86 LD A,(IX-$01)
AD89 LD ($A43C),A
AD8C LD A,$30 Move straight to the final room
AD8E LD ($A422),A
AD91 LD HL,$A45B
AD94 SET 4,(HL)
AD96 CALL $AE77 Enter the final room
AD99 CALL $BECF
AD9C XOR A
AD9D LD ($A42F),A
ADA0 LD ($A440),A
ADA3 LD ($5C78),A Set FRAMES to 0
ADA6 LD ($A43F),A
ADA9 LD ($A403),A
ADAC LD HL,$A439 Get flags
ADAF SET 2,(HL) Turn on "automatic movement" mode
ADB1 CALL $AF5D Enter the room and run the final sequence
ADB4 LD HL,($7ED0)
ADB7 LD A,H
ADB8 OR L
ADB9 JR Z,$AD42
ADBB JP $AA81 Jump back to the title screen
Prev: AA49 Up: Map Next: ADBE