Address Length Description
9692 1
Game Options
The options chosen on the game selection menu (see HandlerGameMenu).
Bit(s) Meaning
0 Set for a 2 player game, reset for a 1 player game
1-2 The controls (see below)
Bits 1-2 Controls
00 Keyboard
01 Kempston Joystick
02 Cursor Joystick
03 Interface II Joystick
9693 2
Game Timer
A 16-bit counter which is incremented by UpdateCounters each time every actor has been processed.
9695 1
Random Number
An 8-bit pseudo-random seed. It is updated each time an actor handler is run (MainLoop_RunHandler) and once per pass of the actor table (UpdateCounters).
9696 1
Last Frame
The value of FRAMES the last time MainLoop_NextActor saw a new frame.
9697 1
Frame Updated
Has the frame been updated? This is set by FrameUpdate and cleared by NextActor once the player's actor has been processed.
Value Updated?
00 Not updated
01 Updated
9698 3
1UP Score
The score of player 1, held as three bytes with two BCD digits in each. The most significant byte is first.
969B 3
2UP Score
The score of player 2, held as three bytes with two BCD digits in each. The most significant byte is first.
969E 1
Active Player
Which player is currently active.
Value Player
00 1UP
FF 2UP
969F 1
Previous Sprite Id
The sprite ID of the actor that StoreEntity last saved. GetSpriteA uses it to find the sprite that has to be erased, together with the saved position and room.
96A0 1
Previous X Position
The X position of the actor that StoreEntity last saved.
96A1 1
Previous Y Position
The Y position of the actor that StoreEntity last saved.
96A2 1
Previous Room
The room of the actor that StoreEntity last saved.
96A3 1
Old Sprite Row Count
The number of rows of the old sprite that DisplayEntity has still to draw. It is set up by PrepDraw23, and is zero when there is no old sprite to erase (see DrawEntity).
96A4 1
New Sprite Row Count
The number of rows of the new sprite that DisplayEntity has still to draw. It is set up by PrepDraw2, and is zero when there is no new sprite to draw (see RemoveEntity).
96A5 1
New Sprite Height
The height in pixels of the new sprite. It is set up by PrepDraw2 and used by ColourEntity.
96A6 1
New Sprite Width
The number of character cells that each row of the new sprite covers. It is one more than the width of the sprite in bytes when the sprite does not start on a character boundary. It is set up by PrepDraw2 and used by ColourEntity.
96A8 1
Current menu item colour attribute
The attribute of the line of the game selection menu that is being printed (see GameMenu and MenuWriteText).
96A9 2
Saved Actor Pointer
The address of the actor being processed when a new frame started. See FrameUpdate and NextActor.
96AB 1
Moved Actor Room
The room of the actor that MoveActor last moved, saved before it moves so that the room it was in is known if it changes room (see SaveOrchid).
96AC 1
Player Controls
The controls being pressed by the player, as read by HandlerControls (after the magenta orchid has reversed them). There is a bit for each of left (bit 0), right (bit 1), up (bit 2), down (bit 3) and fire (bit 4).
96AD 1
Actor Width
The width in pixels of the actor that is being moved. Each actor handler sets it before moving the actor with MoveActor and CalculateNewPosition, so that the actor can be kept on the screen.
96AE 1
Actor Old X Position
The X position of the actor before it moved, saved by SlideActorPastObjects when it stops the actor moving through the objects in the room.
96AF 1
Actor Old Y Position
The Y position of the actor before it moved, saved by SlideActorPastObjects when it stops the actor moving through the objects in the room.
96B0 1
Orchid Effect Timer
The time left of the effect of an orchid on the player, or zero if there is no effect. It is set by TestOrchidTouched (to C0) and HandlerYellowOrchid (to 60), and is counted down by HandlerOrchidTimer every other frame. When it reaches zero the player goes back to the normal colour. While it is below 2F the player flashes between the colour of the orchid and white.
96B1 1
Nastie Spawn Delay
A delay between nasties appearing. It is counted down by SpawnNastie each time every actor has been processed, and a new nastie can only start when it is zero. It is set to 10 at the start of a turn (see StartTurn) and when the player has died (see HandlePlayerDeath).
96B2 1
Attribute Set Flag
If this is not zero then DrawRoom_Process uses the second set of attributes of a graphic, if it has one, and resets this to zero. ShowAmulet sets it to draw the pieces of the amulet that have been collected in full colour.
96B3 1
Footstep Counter
Incremented by PlayFootstepSound each time a player moves. It times the sound of the footsteps.
96B4 1
Flame Spawn Delay
A delay before a flame can start. It is counted down by SpawnFlame while the flame record at ImmortalData_SpareFlame is empty. It is set to 80 at the start of a turn, when the player has died and when the player moves to another room, and to 10 when a flame has been blown up (see BlowUpFlame).
96B5 1
Game Delay Timer
At the beginning of each player turn there is a delay to allow the player to be ready for play.
Value Game Mode
80 1UP
FF 2UP
The larger delay for a 2UP game is useful for swapping players controls.
96B6 1
Percentage Hundreds
The hundreds digit of the percentage of the jungle that has been explored, which is worked out by PrintRoomsVisited.
96B7 1
Previous Game Options
The game selection menu uses this to remember the options that it last saw (see HallOfFameCheck), so that the countdown to the hall of fame is restarted when the options change.
It is also used by PrintRoomsVisited to hold the tens and units digits of the percentage of the jungle that has been explored.
96B8 2
Hall Of Fame Timer
Counter for game selection screen, which tells the routine when to flip to display the Hall Of Fame (see HandlerHallOfFame).
96BA 1
Hall Of Fame Updated Flag
Set to 01 when a score has been entered into the hall of fame, and cleared by NewHighScore. GameOver_ControllerRestart shows the hall of fame at the end of the game if it is set.
96BB 1
High Score Position
Used when calculating the players position in the high score table. It is the number of places that the score beat (see NewHighScore_Enter).
96BC 1
Active Player: Unknown
Purpose not yet known. It is cleared by InitialisePlayer and swapped with InactivePlayer_Unknown by ChangePlayer when the players change, but it is never read.
96BD 1
Active Player Lives
The number of lives of the active player.
96BE 1
Active Player: Nastie Limit
The maximum number of nasties that can be in the room of the player at once, which is set by InitialisePlayer.
96BF 32
Visited Rooms
A bitmap of the rooms which the active player has visited, with a bit for each of the 0100 rooms (see VisitRoom).
96DF 1
Inactive Player: Unknown
The stored copy of ActivePlayer_Unknown for the player who is not playing.
96E0 1
Inactive Player Lives
The stored copy of ActivePlayer_Lives for the player who is not playing. A one player game leaves player 2 with no lives.
96E1 1
Inactive Player: Nastie Limit
The stored copy of ActivePlayer_NastieLimit for the player who is not playing.
96E2 32
Inactive Player: Visited Rooms
The stored copy of VisitedRooms for the player who is not playing.
9702 144
Immortal Data
The table of actors, which runs from here to StoredActorTable. Every actor is held in a 0C byte record, and MainLoop handles each record in turn, using the sprite ID to choose the handler (see JumpTable).
A record is made up of:
Byte Contents
00 Sprite ID (zero for an empty record)
01 Room
02 Hit direction or counter
03 X position
04 Y position
05 Colour
06 X velocity, in sixteenths of a pixel
07 Y velocity, in sixteenths of a pixel
08-0B Used in different ways by different actors
The first 0C records are the player and the actors which are always present, which are set up from InitialActors. They are followed by the nasties (NastieData), the orchid (OrchidData), the objects (ObjectData) and the pieces of the amulet (AmuletData).
9792 72
Nastie Data
The records of the six nasties. A nastie is started in an empty record by StartNastie.
97DA 12
Orchid Data
The record of the orchid in the room the player is in. It is set up by LoadOrchid when the player enters a room and stored again by SaveOrchid when the player leaves.
97E6 24
Object Data
The records of the two objects in the room the player is in, which are set up by SetUpRoomObjects.
97FE 48
Amulet Data
The records of the four pieces of the amulet, which are set up by PlaceAmuletPieces when a game starts. A record has a sprite ID of zero once the piece has been collected.
982E 300
Stored Actor Table
The stored copy of the actor table at ImmortalData for the player who is not playing. The two are swapped by ChangePlayer when the players change.
B304 42
High Scores
Each high score slot uses 3-bytes for the score with the players initials.
Most other Ultimate games only hold the high score.
F000 4096
Shift Table
The lookup table which is used to shift the pixels of a sprite, so it can be drawn at any pixel position. It is built by BuildShiftTable when a game is started and is used by the sprite drawing code (see PrepDraw23).
There are eight pairs of pages, one pair for each of the eight pixel offsets. In each pair the entry for a byte value holds that byte shifted left by the offset, as a 16-bit number: the low byte is in the page FF - (02 * offset) and the high byte is in the page below it.