No Mapping Flat Code

Game State

TransBot maintains a master "game state" variable in the low 4 bits of the byte at $c003. The valid values are:

ValueState
0Value immediately changed to 1
1Title Screen
2Demo
3Secret Command
4Gameplay
5The End

For some states, bit 6 of the same byte is used to distinguish a change of state (bit 6 reset) from a continuation of the current state (bit 6 set).

Graphics Compression

TransBot and Astro Flash use the "Phantasy Star" RLE compression format for tiles and name table data. While this method usually involves deinterleaving tile data into four blocks, TransBot achieves a better compression ratio for the sprite tiles by using only two.

The decompression routine is located at an offset of $295a in the TransBot ROM ($28f7 in Astro Flash). It takes the address of the compressed data in the IX register and the number of data blocks to decompress & interleave in E. The decompressed data is always written to RAM, starting at address $d000 - data is only copied to VRAM after decompression is complete.

The TransBot and Astro Flash ROMs contain the following data in RLE format:

DataTransBot
Address Range [1]
Astro Flash
Address Range
Deinterleaved
Data Blocks
Compressed
Size (bytes)
Decompressed
Size (bytes)
Compression
Ratio
TransBot Logo Tiles$3f89 - $4343N/A4955166457.4%
TransBot Logo Name Table [2]$4344 - $438bN/A27213652.9%
Astro Flash Logo TilesN/A$3f26 - $45eb41734265665.3%
Astro Flash Logo Name TableN/A$45ec - $4655210619654.1%
Sega Mark III LogoN/A$4656 - $4746424130080.3%
Level Name Tables [3]$4480 - $4990$4747 - $4c5721297240054.0%
Background Tiles 1$4991 - $514f$4c58 - $541641983307264.6%
Background Tiles 2$5150 - $592f$5417 - $5bf642016307265.6%
Sprite Tiles 1$5930 - $648e$5bf7 - $675522911307294.8%
Sprite Tiles 2$648f - $6e87$6756 - $714e22553256099.7%
Sprite Tiles 3$6e88 - $7728$714f - $79ef22209256086.3%

In total, TransBot uses this format to compress 18536 bytes into 13996, an overall compression ratio of 75.5%. Astro Flash achieves a similar ratio of 75.7%, compressing 19888 bytes into 15050.

Master System Logo Screen

Astro Flash shows a "Sega Mark III" logo screen before its title screen. As shipped, TransBot does not show a logo screen, but the code for one is still present - it has simply been bypassed with a jump.

TransBot contains unusual data for the logo screen: instead of the common "Sega Mark III", the text "MASTER SYSTEM" is present. This text is exactly the same as that used in the M404 Prototype BIOS, and can also be found within a few other ROMs.

Patching the ROM to prevent the code being bypassed (ROM[$0275] = 00) causes the screen to be shown:

The text is stored as uncompressed 1bpp data in the ROM, at offset $43f0. The associated name table data is stored immediately before the tile data, at offset $438c.

Displaying the logo is simply a matter of copying both sets of data from the ROM to VRAM. This is actually simpler than the method used by Astro Flash to display its logo screen, since its "Sega Mark III" data (both name table entries and tiles) must be decompressed before use.

Palettes

TransBot and Astro Flash use a single palette for all gameplay, both overground and underground. The only places where different palettes are used are the "Sega Mark III"/"MASTER SYSTEM" logo screen and the title screens.

Main Palette

The 32 bytes of data defining the main TransBot / Astro Flash palette begin at offset $0003 in both ROMs. The colours in the main palette are:

Index$00$01$02$03$04$05$06$07$08$09$0a$0b$0c$0d$0e$0f
Value$00$15$1a$1f$2f$2a$25$35$3a$3f$13$17$12$22$32$00
Index$10$11$12$13$14$15$16$17$18$19$1a$1b$1c$1d$1e$1f
Value$00$3f$3a$35$2f$2a$25$0b$03$02$0e$0c$08$3e$38$00

Other Palettes

These are the other palettes used by TransBot / Astro Flash. Palette entries beyond those shown are not explicitly set by the code and thus retain their values from the main palette:

Logo Screen

Index$00$01
Value$00$0f

TransBot Title Screen

Index$00$01$02$03$04$05$06$07$08$09$0a$0b$0c$0d$0e$0f$10
Value$30$3f$2f$1b$17$13$3e$10$3f$3f$3f$3f$3f$3f$3f$3f$30

Astro Flash Title Screen

Index$00$01$02$03$04$05$06$07
Value$00$3f$2f$0f$0b$07$03$02

The logo screen palette data exists in the TransBot ROM at an offset of $26a7 and in the Astro Flash ROM at $263c. The TransBot / Astro Flash title screen palette data can be found at offsets of $030c and $02f2 respectively.

Note that although the TransBot title screen does not use the sprite palette, its first entry (palette index $10) is written. This is done to set the backdrop colour, which is displayed in the overscan area and when the display is blanked.

Movement

The high-performance CA-214 astro-plane can fly a speed of up to 170 pixels per second (relative to the screen). That is: while a direction is held on the controller, the CA-214 sprite will move a distance of 2 pixels in that direction per frame. Holding a diagonal direction will cause the sprite to move 2 pixels horizontally and 2 pixels vertically each frame.

The overground backdrop and underground scroll at a rate of 1 pixel per frame. A parallax effect is created on the overground level by scrolling the ground by 2 pixels each frame. The change in scroll values is triggered by a line interrupt.

Demo

If no buttons are pressed on the title screen, a demo of the underground level will begin. The CA-214's movements during the demo are driven by simulated input - the data for this is in "TransBot" format and is located at $7aba-$7cd4 in the TransBot ROM. The same data exists at $7d81-$7f9b in the Astro Flash ROM - in both cases a pointer to the data can be found at offset $0088.

Enemy Generation

During play, the game repeatedly loops through one of two enemy pointer tables: $7729-$7868 for the overground level and $7869-$78c8 for underground. When it is time to generate the next wave of enemies, the current pointer is followed - it points to a description of a group of enemies. All of these descriptions are within the address range $78c9-$7ab9. The format of each description is as follows:

  1. %00---nnn tt tt tt... n possibly different enemies, types follow
  2. %01mmm--- ss m identical enemies, type ss
  3. %10mmmnnn ss tt tt tt... m identical enemies, type ss, then n possibly different enemies, types follow
  4. %11---nnn tt n identical enemies, type tt [4]

The pointed-to description is processed to generate the types of a maximum of 7 enemies - these are stored in RAM at $c17a-c180. The types are later used to index into a jump table at $2fd0-$3073 - specific code can thus be executed for each enemy type.

Secret Command

The status of commands 1-4 on the Secret Command screen is stored in bits 0-3 of the RAM byte at address $c012. The byte is copied to $c100 when play starts - this copy of the command status is then read repeatedly during the game.

ROM Map

This table summarises the contents of the TransBot (Size: 32KB; CRC32: 4bc42857) and Astro Flash (Size: 32KB; CRC32: c795182d) ROMs:

TransBot
Address Range
Astro Flash
Address Range
Contents
$0000 - $0002$0000 - $0002Code: jp $008a
$0003 - $0022$0003 - $0022Main Palette
$0023 - $0037$0023 - $0037Unused
$0038 - $003a$0038 - $003aCode: jp Instruction
$003b - $004e$003b - $004eInitial Data for VDP Registers 0-9
$004f - $0065$004f - $0065Unused
$0066 - $0084$0066 - $0084Code: Pause Handler
$0085 - $0089$0085 - $0089Initialisers for Demo Variables (At $0088 is a pointer to the simulated input data)
$008a - $030b$008a - $02f1Unknown
$030c - $031c$02f2 - $02f9Title Screen Palette
$031d - $26a6$02fa - $263bUnknown
$26a7 - $26a8$263c - $263dLogo Screen Palette
$26a9 - $34d4$263e - $3471Unknown
$34d5 - $34d8$3472 - $3475PSG Silencing Data
$34d9 - $356a$3476 - $3507PSG Tone Table
$356b - $3f88$3508 - $3f25Unknown Data
$3f89 - $4343N/ATransBot Logo Tiles
$4344 - $438bN/ATransBot Logo Name Table
N/A$3f26 - $45ebAstro Flash Logo Tiles
N/A$45ec - $4655Astro Flash Logo Name Table
$438c - $43efN/AMaster System Logo Name Table
$43f0 - $447fN/AMaster System Logo Tiles
N/A$4656 - $4746Sega Mark III Logo
$4480 - $4990$4747 - $4c57Level Name Tables
$4991 - $514f$4c58 - $5416Background Tiles 1
$5150 - $592f$5417 - $5bf6Background Tiles 2
$5930 - $648e$5bf7 - $6755Sprite Tiles 1
$648f - $6e87$6756 - $714eSprite Tiles 2
$6e88 - $7728$714f - $79efSprite Tiles 3
$7729 - $7868$79f0 - $7b2fOverground Enemy Pointer Table
$7869 - $78c8$7b30 - $7b8fUnderground Enemy Pointer Table
$78c9 - $7ab9$7b90 - $7d80Enemy Group Descriptions
$7aba - $7cd4$7d81 - $7f9bDemo Simulated Input Data
$7cd5 - $7fef$7f9c - $7ff7Unused [5]
$7ff0 - $7fffN/AROM Header (Product Code: 4004; Version: 0; Region: SMS Export; ROM Size: 32KB)
N/A$7ff8 - $7ffbName: "NTKK"
N/A$7ffc - $7fffPartial ROM Header (Product Code: 503; Version: 0; Region: SMS Japan; ROM Size: 32KB)

Jump Tables

Within areas marked "Unknown" in the ROM map, the following jump tables exist:

TransBot
Address Range
Astro Flash
Address Range
Number of
Entries
TransBot
Jump Instruction
Address
Astro Flash
Jump Instruction
Address
Indexed By
$0268 - $0273$024e - $02596$0267$024dGame State
$0514 - $051f$04f0 - $04fb6$1b29$1abeUnknown
$0d55 - $0d60$0cf8 - $0d036$1b29$1abeUnknown
$111e - $1125$10b3 - $10ba4$1b29$1abeUnknown
$12c5 - $12c8$125a - $125d2$1b29$1abeUnknown
$1a48 - $1a4b$19dd - $19e02$1b29$1abeUnknown
$1b42 - $1b45$1ad7 - $1ada2$1b29$1abeUnknown
$1b86 - $1b89$1b1b - $1b1e2$1b29$1abeUnknown
$1bd9 - $1bdc$1b6e - $1b712$1b29$1abeUnknown
$1c6c - $1c6f$1c01 - $1c042$1b29$1abeUnknown
$1d9b - $1d9e$1d30 - $1d332$1b29$1abeUnknown
$1db0 - $1db3$1d45 - $1d482$1b29$1abeUnknown
$1e00 - $1e05$1d95 - $1d9a3$1b29$1abeUnknown
$1f0c - $1f13$1ea1 - $1ea84$1b29$1abeUnknown
$201a - $201f$1faf - $1fb43$1b29$1abeUnknown
$206e - $2071$2003 - $20062$1b29$1abeUnknown
$20c8 - $20cf$205d - $20644$1b29$1abeUnknown
$2133 - $2136$20c8 - $20cb2$1b29$1abeUnknown
$21a1 - $21a4$2136 - $21392$1b29$1abeUnknown
$21db - $21de$2170 - $21732$1b29$1abeUnknown
$2247 - $224a$21dc - $21df2$1b29$1abeUnknown
$2356 - $235f$22eb - $22f45$1b29$1abeUnknown
$26b7 - $26be$264c - $26534$1b29$1abeUnknown
$2fd0 - $3073$2f6d - $301082$0154$013aEnemy Type
$3108 - $3135$30a5 - $30d223$30d9$3076Sound Track Number
$33b3 - $33d0$3350 - $336d15$33ae$334bSound Coordination Flag

TransBot Prototype

The TransBot prototype is missing several pieces of code which were added for the final version:

  1. After Elgramzon is destroyed, several variables are set in order to ensure that no sprites are displayed for a short time (by setting the first Y coordinate in the sprite attribute table to $d0). This has the side effect that the CA-214 reverts to weapon A, although the status bar continues to show the previous weapon.
  2. If the player fails to survive the very first wave of enemies, the production game repeats the first wave rather than advancing to the second.
  3. The final ROM has a ret instruction at the end of the function which handles the game state changing to "Demo".

These are the only differences between the prototype and the production version.

Astro Flash does not contain any of these pieces of code.


  1. ^ All address ranges on this page are inclusive.
  2. ^ The compressed TransBot logo name table has no terminating zero. The decompression routine thus processes data up to $43a4, generating 2412 extra bytes.
  3. ^ Composed of 384 entries for the overground backdrop, 640 entries for the ground and 176 entries for underground.
  4. ^ The difference, if any, between the effects of formats 2 and 4 is unknown.
  5. ^ TransBot fills this area with $ff bytes, while Astro Flash contains garbage data.

Researched by Paul Baker




Return to top
0.3s