JSW64 Room Formats

Notes

The Variants

Format Block types Guardians per room Rooms Free bytes in room record
V 8 13 128 64
W 13 * 8 128 0
X 8 13 (75) 64 606
Y 13 * 8 (63) 64 512
Z 256 ** 8 (31) 64 256
[ 16 4 (63) 64 512

Free bytes in a room are available to the designer. They can be used for custom graphics or patch vector code; or for additional guardians (this is the meaning of the figures in brackets in the 'guardians per room' table).

[*] Formats W, Y and [ use a 4-bit room map, so they can all specify 16 block types. But W and X don't have enough memory to store patterns and attributes for all 16.

[**] Although this format supports 256 block types, only 13 of them are 'real'. All the others just behave like differently- coloured water.

Cell types

In Manic Miner, JSW48 and JSW128, the meaning of cells is fixed - the first cell is air, the second is water, and so on. In JSW64, this is controlled by the game itself. In the V and X variants, the cell types are set up by room; so one room could have three types of 'fire' cell and no conveyors, while another could have one fire, and two conveyors (one going each way). In the other four variants, the cell type is set up globally.

Cell types are:

0
Air
1
Water
2
Earth
3
Fire
4
Ramp \
5
Ramp /
6
Conveyor <<
7
Conveyor >>
8
Crumbling floor
9
Trampoline
10-15
reserved.

Bytes 00-B5

Variants V and X

00-68    Up to 13 guardian instances for the room, terminated with 0FFh.
69-6D    Behaviour of the 8 cell types. 
		First byte low nibble  = behaviour of first cell
		First byte high nibble = behaviour of second cell
		2nd   byte low nibble  = behaviour of third cell
		etc.
6E-B5    Attributes and bitmap for 8 cell types

Cell types are:

0
Air
1
Water
2
Earth
3
Fire
4
Ramp \
5
Ramp /
6
Conveyor <<
7
Conveyor >>
8
Crumbling floor
9
Trampoline
10-15
Reserved

Variants W, Y and Z

00-40    Up to 8 guardian instances for the room, terminated with 0FFh.
41-B5    Attributes and bitmap for 13 cell types

Variant [

00-20    Up to 4 guardian instances for the room, terminated with 0FFh.
21-25    Reserved.
26-B5    Attributes and bitmap for 16 cell types

Bytes B6-FF (all variants)

B6-D5    The room name, ASCII.
D6       Conveyor animation, and the Final Barrier flags.
	 Bits 5,6,7: Source of bottom half of room image
	 Bits 2,3,4: Source of top half of room image
		0: No image (normal room)
		1: Title screen, top half
		2: Title screen, bottom half
		3: Screen buffer 1 (bank 7 at E2FFh)
		4: Screen buffer 2 (bank 7 at EBFFh)
		5,6,7: Reserved.
	 Bits 0,1: Conveyor direction. If set to 2 or 3, then all conveyors 
         	in the room become deactivated or sticky respectively.
D7-D8    Conveyor animation position
D9       Conveyor animation length
DA-DB    Address of the guardian instance table used by this room. 
         Normally 8000h, but if a larger guardian instance table is needed
         it will be the address of that table, either in the room record or
         elsewhere in memory. The original guardian table will then be
         available for your own purposes.
DC       Solar Power beam entry point. Low 5 bits are X-coordinate; high 3
         bits are Y-coordinate (solar power must start in the top 8 lines). 
DD       Attribute of the solar beam. If this is zero, the room has no solar
         power. Note that unlike in Manic Miner, the solar beam does not 
         require a green background. If you want a harmless solar beam, you'll
         have to set the room not to limit air supply.
DE       Bits 0-2: Border
         Bits 3-5: Willy's colour
         Bit    6: Rigor Mortis. If set, guardians are stationary until all
                  objects in the room have been collected.
         Bit    7: Superjump.
DF       Air supply, major value. See Andrew Broad's Manic Miner room format
         for full details of this field.
E0       Air supply, minor value. Must be a multiple of 4, or 0xFF if the 
         room does not have a limited air supply.
E1       Item bitmap
E9-EC    Exits
ED       Willy's sprite page. If less than 80h, uses the standard Willy.
EE-EF    The address of the 16x16 graphic to use for the portal. Set to 0 if
         this room does not have a portal.
F0-F1    Position of portal attribute (based at 5C00h).
F2-F3    Position of portal bitmap (based at 6000h). 
F4       Portal attribute. If it is flashing the portal can be entered 
         even if there are still items to be collected.
F5       Portal destination room number.
F6-F7    Portal destination: Position of Willy attributes (based at 5C00h). 
F8       Portal destination: Willy's new Y-coordinate (based at 6000h).
F9-FA   'Portal' patch vector
FB-FC   'Room setup' patch vector
FD-FE   'Main loop' patch vector    
FF       Room flags:
         Bit 0 set if, when Willy dies, he loses the items he collected in
	 the current room.
	 Bit 1 set if escalators go down rather than up.
	 Bit 2 set to make all ramps in the room into escalators.
	 Bit 3 set if Willy can fall any height without losing a life.
         Bits 4,5,6 reserved.
         Bit 7 set if this is a 'bonus' room (collecting an item gives an 
         extra life).

Bytes 100h onwards

Variant V

    100-13F    Unused. Available to designer for portal graphic or patch
               vector(s).
    140-1FF    Room layout, 3 bits per cell.

Variant W

    100-1FF    Room layout, 4 bits per cell.

Variant X

    100-33F    Unused. Available to designer for portal graphic, patch
               vector(s), sprites, guardians, or all of the above.
    340-3FF    Room layout, 3 bits per cell.

Variant Y

    100-2FF    Unused. Available to designer for portal graphic, patch
               vector(s), sprites, guardians, or all of the above.
    300-3FF    Room layout, 4 bits per cell.

Variant Z

    100-1FF    Unused. Available to designer for portal graphic, patch
               vector(s), sprites or guardians.
    200-3FF    Room layout, 8 bits per cell. Unknown attributes take
               the 'water' graphic.

Variant [

    100-2FF    Unused. Available to designer for portal graphic, patch
               vector(s), sprites, guardians or all of the above.
    300-3FF    Room layout, 4 bits per cell.

Cell Types Table (formats W, Y, Z)

In these formats, the meaning of each cell is determined globally rather than by room. There is a 16-byte table at F4FFh in bank 7. Each byte defines the meaning of a cell (so byte 0 refers to the first cell in the room definition, byte 1 to the second, and so on).

Cell types are:

0
Air
1
Water
2
Earth
3
Fire
4
Ramp \
5
Ramp /
6
Conveyor <<
7
Conveyor >>
8
Crumbling floor
9
Trampoline
10-15
Reserved

After these 16 bytes are the attributes and bitmaps for the three "global" cells -- the ones which are the same in every room.

Cell Types Table (formats [)

The cell type table is at F519h and is 16 bytes long. There are no global cell definitions.

Guardian definitions

The guardians in JSW64 are based on the JSW128 guardians, but with a few added features. A guardian definition is 8 bytes long; I refer to them as GB0-GB7.

The low 4 bits of GB0 give the guardian type. This is one of:

0 - Blank
1 - Horizontal
2 - Vertical
3 - Rope
4 - Arrow
5 - Diagonal 1
6 - Diagonal 2
7 - Vertical, colour-cycling
8 - Extended guardian. Top 4 bits give subtype:
	08: Skylab.  Behaves like a vertical guardian, except that at the end 
	   of its travel it 'crashes' and then reappears 8 columns to the 
	   right (wrapping, of course). Other bytes as vertical guardian, 
	   except that byte 7 is 'crash' position and byte 6 is 'restart' 
	   position. So for an upward skylab, byte 7 must be less than byte 6.

	18: Angry Eugene. Other bytes as vertical guardian, except that 
	   byte 1 is colour; high bits must be zero. An Angry Eugene goes to 
	   the end of his travel and stops dead.

	28: Angry Eugene (colour-cycling based on air supply)

	38: Angry Eugene (colour-cycling using JSW64 method).

	88: Trigger.
		Byte 0: 88h
		Bytes 1-2: Address of a flag. When this flag becomes zero,
			bytes 3-7 are applied to the next guardian in the 
			table; and byte 0 of this guardian is cleared so it 
			doesn't happen again.
		Byte 3: New byte 0 of next guardian.
		Bytes 4-7: New bytes 4-7 of next guardian. 
	98: Switch.
		Byte 0: 98h.
		Byte 1: Ink.
		Byte 2: X-coordinate and frame. The top half of the guardian 
			sprite will be the 'off' switch and the bottom half 
			will be the 'on' switch.
		Byte 3: Y-coordinate.
		Byte 4: State. 1=Off 0=On.
		Byte 5: Sprite page. 
		Byte 6: If it's off and Willy hits it, change state to this.
		Byte 7: If it's on and Willy hits it, change state to this.

	A8: Opening wall.
		Byte 0: A8h.
		Bytes 1-2: Address of flag (same as for the Trigger).
		Byte 3: Number of vertical lines this will remove.
		Byte 4: State. Initialised by JSWED to 1. It will become 0 
			when all lines are removed.
		Byte 5: Number of lines removed so far. Initialised by JSWED 
			to 0.
		Byte 6: X-coordinate of wall to open.
		Byte 7: Y-coordinate of wall to open.

	B8: Stopper. Guardians after this one don't move or get drawn.	
	C8: Stopper. Guardians after this one don't move but do get drawn.	

9 - Horizontal, colour-cycling
A - Vertical
B - Reserved
C - Reserved
D - Diagonal 1, colour-cycling
E - Diagonal 2, colour-cycling

Diagonal 1 and 2 are similar; the difference is that if all the other bytes are the same, one goes down when moving left, and the other goes down when moving right.

Horizontals and Diagonals

These guardian types behave like the standard JSW48 horizontal guardian. Diagonal ones use GB4 as their vertical speed.

The top 3 bits of GB7 have these meanings:

Ropes

Set bit 6 of GB0 to have a stationary rope. The Adjacent Ropes patch is in place, so a rope can be followed by other guardians and it won't corrupt them.

Arrows

GB1 is the ink colour to use for the arrow. Bits 3-7 of this byte will also be ORed to the screen, so it's best to leave them as 0.

GB3 is the bitmap for the middle line of the arrow.

Patch Vectors

There are three patch vectors in the room data. In order, these are:

Portal Vector

This is called when Willy enters a portal. The Patch Vector Jumpblock (below) provides two possible implementations of this; or you could write your own.

Note that when you return from the Portal vector, the game will assume you have moved to a new room and set things up accordingly. If you want Willy to stay in the same room, return with

    POP BC
    RET

rather than just RET.

Room Setup Vector

This is called when Willy enters a new room, after the room attributes and bitmap patterns have been generated. This can be used to put custom graphics in a room (like the Final Barrier does in Manic Miner). The default implementation is just to return.

Main Loop vector

This is called in the main game loop, just after the screen has been drawn and just before Willy moves. It corresponds to the patch vector in 'Geoff Mode' JSW.

Patch Vector Jumpblock

The following entry points are provided as helper functions for patches that you write. More may be added later.

The jumpblock is at a fixed location, and this will stay fixed in future JSW64 versions.

869F    RET 

For rooms without patches, the Room Setup and Main Loop patch vectors should be set to this address.

86A0    JP  portal_with_fx_and_air

This is the default portal patch vector. It takes Willy to the location specified in the room's portal settings. The portal special effect occurs (as in Manic Miner); and if the room has a limited air supply, it will be run down to zero with a whining noise (again, as in Manic Miner).

86A3    JP  portal_with_fx  

As above, but does not do the 'air-running-down' thing.

86A6    JP  portal_without_fx

As above, but with no special effects at all (like the JSW128 teleporter).

86A9    JP  ptl_fx

This performs the portal special effect only.

86AC    JP  airend

This performs the air-running-down-to-zero effect.

86AF    JP  fx_and_air

This performs the portal effect followed by the air-running-down-to-zero effect.

86B2    RST 0

The last entry in the jump block is always RST 0. If more entries are added, they will go at 86AFh and the RST 0 will move to the new end of the jump block.

Music jumpblock

The following entry points are provided as helper functions for patches that might want to amend the game music system.

The jumpblock is at a fixed location, and this will stay fixed in future JSW64 versions. It may also appear in a later version of JSW128.

FEC0    JP      tuneoff

This will stop the in-game tune playing. Returns NZ if the tune was not playing, Z if it was.

FEC3    JP      tuneon

This will set the tune going. Note that the tune pointers at 0FE8Eh must have been set to point to the start of the selected tune.

FEC6    JP      newtune

Change the in-game tune. Enter with HL pointing to the 6-byte header of the new in-game tune. If no tune is playing, nothing obvious happens; if a tune is playing, it is stopped and the new tune starts.

FEC9    DEFS    6

A copy of the 6-byte header of the last tune selected with NEWTUNE. This is the tune that will be played when the current in-game tune comes to an end (used to make the tune into a continous loop).

Bugs and Possible Future Enhancements


John Elliott 30 April 2005