The clock-updating code at 35410 doesn't switch from 'am' to 'pm' until 1pm (instead of 12 noon), and also doesn't switch from 'pm' to 'am' at midnight.
The sticky bed
After collecting all the items, if Willy jumps onto the bed in Master Bedroom (which is a conveyor moving right) instead of walking up to the foot of it, he will stop moving and the 'P' (right) key becomes unresponsive. This happens because the code at 36619 flips bit 0 of E - which has already been reset because Willy is on a conveyor moving right - to 1, thus preventing the conveyor from moving Willy, and also effectively disabling the 'P' key.
To see this, use POKE 41983,255 to make the tap in The Bathroom the only item that needs to be collected to complete the game, make your way to the bedroom, and jump onto the bed.
However, all is not lost. Willy can be moved off the bed by using one of the other 'right' keys: 'I', 'Y', 'R', 'W', '7' or '8'.
The self-collecting item
The item in Swimming Pool is automatically collected as soon as Willy enters the room; this is because the room's background tile has white INK, and the routine at 37841 collects any item that is drawn on a cell with white INK. There are no other rooms whose background tile has white INK.
To change the INK of the room's background tile from white to cyan, enabling Willy to collect the item himself:
which moves the item to The Hall (where it is still invisible, but now reachable).
The inaccessible items
The items in Conservatory Roof can only be collected by entering the room from the ledge on the lower left in Under the Roof, but that ledge is unreachable.
In a room with a non-black background, a guardian defined with BRIGHT INK is drawn with a 'halo': a BRIGHT sprite background that contrasts with the non-BRIGHT room background. There are four guardians affected by this phenomenon:
The following POKEs modify the section of code at 37334 so that a guardian is drawn in non-BRIGHT INK and PAPER when the room background is not black, thus preventing any halo:
POKE 37371,40
POKE 37372,2
POKE 37373,203
POKE 37374,177
POKE 37375,177
POKE 37376,205
POKE 37377,201
POKE 37378,147
POKE 37379,79
From top to bottom
In a room that contains a rope and has no exit to the room above, Willy can jump while at the highest point on the rope (when it's at the leftmost or rightmost extent of its swing) through the top of the room and reappear on the floor of the same room. The only rooms where this can happen are On the Roof and The Beach.
To prevent Willy from climbing high enough up the rope to be able to jump through the top of the room:
The number 15 here determines the highest segment of rope that Willy can reach (originally 12, three segments higher up). At segment 15, Willy's y-coordinate never goes below 25 while he's on the rope, and is adjusted down to 24 (see 36782) when he jumps off, which is too far from the top the room (the maximum height Willy can jump is 20 pixels). At segment 14, Willy's y-coordinate never goes below 23 while he's on the rope, but is adjusted down to 16 when he jumps off, which is close enough to the top of the room to be able to jump through it.
The code at 37601 adjusts Willy's location depending on where he's hanging on to the rope. Specifically, his pixel y-coordinate is set to Y-8, where Y is the pixel y-coordinate of the segment of rope whose index matches the value of the rope status indicator at 34262.
Long distance nasties
If Willy falls through the bottom of a room and there is a nasty at the top of the room in a direct line above him, he will die before he reaches the room below.
The only room affected by this bug is Under the Roof. Use the following POKE to start the game in that room and see what happens when Willy steps off the ledge:
POKE 34795,42
The problem lies in the section of code at 38392, which sets the attribute bytes for the cells occupied by and below Willy's sprite. If Willy is below the level of the floor, HL (which holds the address of the cell in the attribute buffer at 23552) is eventually incremented so that it points to the cell in the ceiling above Willy in the attribute buffer at 24064. Then the routine at 38430 is called to actually set the attribute byte for the cell, detects the nasty there, and kills Willy.
POKE 38452,208
POKE 38453,253
POKE 64976,203
POKE 64977,76
POKE 64978,202
POKE 64979,182
POKE 64980,144
Don't mind your head
The code at 36828 onwards that moves Willy left does not check for a wall tile at head height, which means Willy can move right to left through a wall tile at that position. To see this, add a wall tile at head height in The Bathroom and guide Willy through it:
POKE 57708,32
However, the code at 36942 onwards that moves Willy right does check for a wall tile at head height (at 37031), so Willy (correctly) cannot move left to right through a wall tile at that position.
Stuck in the wall
If Willy enters The Wine Cellar from the ledge in The Forgotten Abbey, he must keep moving left until he clears all the wall tiles, otherwise he can become trapped inside them by the conveyor below trying to move him to the right.
To get on the conveyor, stand facing left at the top of the ramp in The Forgotten Abbey (see the first image below) and jump left towards the exit - Willy will land on the ledge (second image). Then walk left into The Wine Cellar.
Willy can get also stuck in the wall tiles that make up the elephant's head in Dr Jones will never believe this. Start at the location shown in the first image below, and then walk left.
Getting stuck in these places is possible because Willy can walk right to left through wall tiles at head height, but not left to right (see Don't mind your head).
The blank conveyor
The conveyor tile in Conservatory Roof is completely blank and its attribute byte is 255 - a solid, bright white block - which is characteristic of unused tiles elsewhere. However, the conveyor tile is used in this room, and it doesn't look good:
Corrupted conveyors
The conveyors in West of Kitchen, The Nightmare Room, The Wine Cellar and Tool Shed don't look quite as they should. The reason for this is a bug in the code at 36177: if a graphic data byte of the background, floor, wall, nasty or ramp tile in a room matches the attribute byte of the conveyor tile to be drawn, the CPIR instruction exits early, leaving HL pointing at the wrong location.
Here are some 'before' and 'after' pictures showing what the conveyors actually look like and what they look like when drawn properly.
You might be thinking that the fix given above for the corrupted conveyors bug does not do much for the appearance of the conveyor in The Nightmare Room. Perhaps that's because the real problem with this conveyor is that its attribute byte and graphic data - which should occupy addresses 56781-56789 - appear to have been shifted by one byte back to 56780-56788 (overwriting the eighth graphic byte of the ramp tile). If they are shifted along to the right spot, the conveyor takes on a much more reasonable appearance:
Before
After
Invalid grid location
If the LSB of the system variable FRAMES is 142 when the game starts, the routine at 34499 will ask for the code at the grid location 'D>', which doesn't exist on the code sheet.
Should you ever need it, the code for 'D>' is 1444.
The Spectrum will hang when trying to resume the game after being paused if an Interface 1 is connected. This happens because the C register holds 0 instead of 254 when the keyboard is read by the IN A,(C) instruction at 35620.
Perhaps the most famous of all the bugs in Jet Set Willy, the Attic bug is responsible for certain rooms becoming impossible to navigate after Willy has visited The Attic, thus making it impossible to complete the game.
The root cause of the bug is a misplaced arrow, defined by the entity specification at 59900. The second byte of the entity specification is an index into the table of screen buffer addresses at 33280, and determines the arrow's y-coordinate; the index should be an even number, but the value of the second byte is 213, which means the arrow-drawing routine at 37310 looks up the word at 33493 and finds 41066, way outside the actual screen buffer at 24576-28671. As a result, the misplaced arrow is 'drawn' at the following addresses:
40810-40841: unused (set to 65, with no effect on the game)