Jet Set Willy
Home -> Jet Set Willy 128 -> JSW technical information -> Jet Set Willy ST Room Format


Jet-Set Willy ST Room Format

Version 1.0: 18 December 2005

by John Elliott

Disclaimer: I do not guarantee this information to be correct. This is my best guess at what is going on inside JSW ST, after wandering around inside it with a disassembler.

Atari JSW is a very close replica of Spectrum JSW, coded in C based on a disassembled version of the original JSW48. It is distributed as a .PRG file, the contents of which are:

Offset in file Load address, hex Load address, decimal Details
0x0000-- PRG file header. Format seems to be similar to CP/M-86 CMD; perhaps the same as CP/M-68k CMD.
60 1A 	-- Magic?
00 00 63 A2   -- Code len?
00 00 68 86   -- Data len?
00 00 06 62   -- BSS len?
00 00 00 ...
0x001C 0x0000 0 Atari code segment. This contains some constants which a game editor would need to change, including the count of items.
0x63BE 0x63A2 25506 Atari data segment starts here.
0x640D 0x63F1 25585 "Items collected 000 Time 00:00 m" message, followed by various strings of digits.
0x643F 0x6423 25635 "GameOver"
0x64EC 0x64D0 25808 "Press ENTER to start" message / scrolling message. For some reason, this is broken up into segments of irregular length in reverse order; each section is terminated by a zero byte. An editor program changing the message would have to break it up into portions of the exact same size when storing, because the game code makes separate references to each section.
0x6626 0x660A 26122 Unknown.
0x669A 0x667E 26238 In-game music.
0x66DA 0x66BE 26302 Title screen music.
0x673E 0x6722 26402 Unknown, but contains the following messages:
"Please enter room number: __ "
"jetset: Sorry - must use a colour monitor\n"
"jetset: malloc failure!\n"
"lisa ambrose"
0x6854 0x6838 26680 Spectrum font; there seems to be a transcription error in the } character.
0x6B54 0x6B38 27448 Conveyor animation table
0x6B64 0x6B48 27464 The stripe patterns for the title screen.
0x6B84 0x6B68 27496 The items table: 83 entries. Unlike in Spectrum JSW, the two halves of the table are interleaved; first byte gives item position low 8 bits, second gives room number and item position high bit.
0x6C2A 0x6C0E 27662 Rope movement table
0x6D2A 0x6D0E 27918 Guardian table, in standard JSW format.
0x712A 0x710E 28942 Title screen.
0x732A 0x730E 29454 Rooms 0-61.
0xB12A 0xB10E 45326 Blank; probably corresponds to rooms 62 and 63.
0xB32A 0xB30E 45838 Sprites. The mapping to Spectrum sprite pages is hardcoded in the guardian drawing code:
  • Spectrum range 9C40-9DFF => sprites 0-13
  • Spectrum range A600-A680 => sprites 14-17
  • Spectrum range AB00-B300 => sprites 18-81
  • Spectrum range B400 et seq.=> sprites 82 et seq.
There are only 178 sprites (exactly enough to implement the original JSW) whereas the Spectrum JSW48 engine has enough spare space to go up to 240.
0xC96A 0xC94E 51534 6 long words giving sprite addresses for special sprites:
  • The foot
  • The barrel
  • Maria
  • Willy
  • The toilet
  • The flying pig
0xC982 0xC966 51558 Unknown. Possibly we're getting into the C runtime library by this stage.
0xCB3C 0xCB20 52000 This is definitely in the C runtime; it's the array of character characteristics used by <ctype.h> functions.

In order to lift the limits on the number of sprites and/or items, so that arbitrary JSW48 games could be converted to ST format, it would be necessary to make the data segment bigger. Not being familiar with the Atari PRG format, I don't know if this is possible without major patching of the existing code.


John Elliott