Jet Set Willy: Routine at 35245

| Routines

35245: Main loop (1)

Used by the routines at 35090 and 35591.
35245 | CALL 35211 | Draw the remaining lives
35248 | LD HL,24064 | Copy the contents of the attribute buffer at 24064 (the attributes for the empty room) into the attribute buffer at 23552
35251 | LD DE,23552
35254 | LD BC,512
35257 | LDIR
35259 | LD HL,28672 | Copy the contents of the screen buffer at 28672 (the tiles for the empty room) into the screen buffer at 24576
35262 | LD DE,24576
35265 | LD BC,4096
35268 | LDIR
35270 | CALL 37056 | Move the rope and guardians in the current room
35273 | LD A,(34271) | Pick up the game mode indicator from 34271
35276 | CP 3 | Is Willy's head down the toilet?
35278 | CALL NZ,36307 | If not, move Willy
35281 | LD A,(34255) | Pick up Willy's y-coordinate from 34255
35284 | CP 225 | Has Willy just moved up a ramp or a rope past the top of the screen?
35286 | CALL NC,38064 | If so, move Willy into the room above
35289 | LD A,(34271) | Pick up the game mode indicator from 34271
35292 | CP 3 | Is Willy's head down the toilet?
35294 | CALL NZ,38344 | If not, check and set the attribute bytes for Willy's sprite in the buffer at 23552, and draw Willy to the screen buffer at 24576
35297 | LD A,(34271) | Pick up the game mode indicator from 34271
35300 | CP 2 | Is Willy on his way to the toilet?
35302 | CALL Z,38276 | If so, check whether he's reached it yet
35305 | CALL 38196 | Deal with special rooms (Master Bedroom, The Bathroom)
35308 | CALL 37310 | Draw the rope, arrows and guardians in the current room
35311 | CALL 38137 | Move the conveyor in the current room (if there is one)
35314 | CALL 37841 | Draw the items in the current room (if there are any) and collect any that Willy is touching
This entry point is used by the routine at 37046.
35317 | LD HL,24576 | Copy the contents of the screen buffer at 24576 to the display file
35320 | LD DE,16384
35323 | LD BC,4096
35326 | LDIR
35328 | LD A,(34271) | Pick up the game mode indicator from 34271
35331 | AND 2 | Now A=1 if Willy is running to the toilet or already has his head down it, 0 otherwise
35333 | RRCA
35334 | LD HL,34258 | Set Willy's animation frame at 34258 to 1 or 3 if Willy is running to the toilet or already has his head down it; this has the effect of moving Willy at twice his normal speed as he makes his way to the toilet (using animation frames 2 and 0)
35337 | OR (HL)
35338 | LD (HL),A
35339 | LD A,(34253) | Pick up the screen flash counter (unused and always 0) from 34253
35342 | OR A | Is it zero?
35343 | JR Z,35366 | Jump if so (this jump is always made)
The next section of code is never executed.
35345 | DEC A | Decrement the screen flash counter at 34253
35346 | LD (34253),A
35349 | RLCA | Move bits 0-2 into bits 3-5 and clear all the other bits
35350 | RLCA
35351 | RLCA
35352 | AND 56
35354 | LD HL,23552 | Set every attribute byte in the buffer at 23552 to this value
35357 | LD DE,23553
35360 | LD BC,511
35363 | LD (HL),A
35364 | LDIR
Normal service resumes here.
35366 | LD HL,23552 | Copy the contents of the attribute buffer at 23552 to the attribute file
35369 | LD DE,22528
35372 | LD BC,512
35375 | LDIR
35377 | LD IX,34175 | Print the current time (see 34175) at (19,25)
35381 | LD DE,20601
35384 | LD C,6
35386 | CALL 38528
35389 | LD IX,34172 | Print the number of items collected (see 34172) at (19,16)
35393 | LD DE,20592
35396 | LD C,3
35398 | CALL 38528
35401 | LD A,(34251) | Increment the minute counter at 34251
35404 | INC A
35405 | LD (34251),A
35408 | JR NZ,35499 | Jump unless the minute counter has ticked over to 0
A minute of game time has passed. Update the game clock accordingly.
35410 | LD IX,34175 | Point IX at the current time at 34175
35414 | INC (IX+4) | Increment the units digit of the minute
35417 | LD A,(IX+4) | Pick up the new units digit
35420 | CP 58 | Was it '9' before?
35422 | JR NZ,35499 | Jump if not
35424 | LD (IX+4),48 | Set the units digit of the minute to '0'
35428 | INC (IX+3) | Increment the tens digit of the minute
35431 | LD A,(IX+3) | Pick up the new tens digit
35434 | CP 54 | Was it '5' before?
35436 | JR NZ,35499 | Jump if not
35438 | LD (IX+3),48 | Set the tens digit of the minute to '0'
35442 | LD A,(IX+0) | Pick up the tens digit of the hour
35445 | CP 49 | Is it currently '1'?
35447 | JR NZ,35481 | Jump if not
35449 | INC (IX+1) | Increment the units digit of the hour
35452 | LD A,(IX+1) | Pick up the new units digit
35455 | CP 51 | Was it '2' before?
35457 | JR NZ,35499 | Jump if not
35459 | LD A,(IX+5) | Pick up the 'a' or 'p' of 'am/pm'
35462 | CP 112 | Is it 'p'?
35464 | JP Z,34762 | If so, quit the game (it's 1am)
35467 | LD (IX+0),32 | Set the tens digit of the hour to ' ' (space)
35471 | LD (IX+1),49 | Set the units digit of the hour to '1'
35475 | LD (IX+5),112 | Change the 'a' of 'am' to 'p'
35479 | JR 35499 |
35481 | INC (IX+1) | Increment the units digit of the hour
35484 | LD A,(IX+1) | Pick up the new units digit
35487 | CP 58 | Was it '9' before?
35489 | JR NZ,35499 | Jump if not
35491 | LD (IX+1),48 | Set the units digit of the hour to '0'
35495 | LD (IX+0),49 | Set the tens digit of the hour to '1'
Now check whether any non-movement keys are being pressed.
35499 | LD BC,65278 | Read keys SHIFT-Z-X-C-V
35502 | IN A,(C)
35504 | LD E,A | Save the result in E
35505 | LD B,127 | Read keys B-N-M-SS-SPACE
35507 | IN A,(C)
35509 | OR E | Combine the results
35510 | AND 1 | Are SHIFT and SPACE being pressed?
35512 | JP Z,34762 | If so, quit the game
35515 | LD A,(34272) | Increment the inactivity timer at 34272
35518 | INC A
35519 | LD (34272),A
35522 | JR Z,35537 | Jump if the inactivity timer is now 0 (no keys have been pressed for a while)
35524 | LD B,253 | Read keys A-S-D-F-G
35526 | IN A,(C)
35528 | AND 31 | Are any of these keys being pressed?
35530 | CP 31
35532 | JR Z,35607 | Jump if not
35534 | LD DE,0 | Prepare the delay counters in D and E for the pause loop that follows
The following loop pauses the game until any key except A, S, D, F or G is pressed.
35537 | LD B,2 | Read every half-row of keys except A-S-D-F-G
35539 | IN A,(C)
35541 | AND 31 | Are any of these keys being pressed?
35543 | CP 31
35545 | JR NZ,35591 | If so, resume the game
35547 | INC E | Increment the delay counter in E
35548 | JR NZ,35537 | Jump back unless it's zero
35550 | INC D | Increment the delay counter in D
35551 | JR NZ,35537 | Jump back unless it's zero
35553 | LD A,(34275) | Pick up the WRITETYPER key counter from 34275
35556 | CP 10 | Has WRITETYPER been keyed in yet?
35558 | CALL NZ,35563 | If not, cycle the INK and PAPER colours
35561 | JR 35537 | Jump back to the beginning of the pause loop