The SuperGame Format

From 8BitDev.org - Atari 7800 Development Wiki
Revision as of 19:08, 3 January 2026 by MSaarna (talk | contribs)
Jump to: navigation, search

SuperGame Format

General Info

The SuperGame cart mapper was created by GCC/Atari, and is still in use by modern homebrewers. The actual feature specification of SuperGame is a bit loose. The following is a quote from Eckhard Stolberg's ATARI 7800 BANKSWITCHING GUIDE.

 [...]there are several different types of Atari's SuperGame
 bankswitching. It basically consists of 8 16KB banks (0-7)
 that can be mapped in at $8000-$bfff. Bank 7 always is fixed
 at $c000-$ffff. To map in a chosen bank into $8000-$bfff you
 write it's bank number (0-7) to any address between $8000-bfff.
 The contend of $4000-$7fff differs between different variations
 of this type:
 
 Some games have nothing connected in this area and return only
 random data.
 
 Some games have bank 6 fixed at this area.
 
 Some games have 16K of extra ROM there. Those games are 144K
 in size and are marked as 78S9 in the list.
 
 Some games have either 8K of RAM at $6000-$7fff or 16K of
 RAM at $4000-$7fff.
 Some games have a POKEY chip mapped in at this area. It
 has 16 addresses that get repeated all the way between $4000
 and $7fff.
 Some games only have 4 ROM banks at $8000-$bfff (0-3). Banks
 4-7 either return the same data as banks 0-3 or completely
 random data. PAL Karateka is a special case. It only uses
 banks 4-7. Banks 0-3 are random data and bank 6 is also fixed
 at $4000-$7fff.

When you generate rom files via assembly, any extra hardware features at $4000 can be flagged via the A78 header, with the exception of having an extra 16K bank of rom placed there - for that you need to add an extra bank at the start of your rom with it's ORG being $4000, in addition to A78 header flagging.

A basic 7800 SuperGame Skeleton

  ; basic 128k supergame skeleton, with no rom@4000.
  ; banks 1-7 live at $8000-BFFF in 6502 address space
  ; bank 8 lives at $C000-FFFF in 6502 address space
  
  ORG       $8000
  RORG      $8000
 
  ; bank 1 code goes here ($8000-$BFFF)
 
  ORG       $C000
  RORG      $8000

  ; bank 2 code goes here ($8000-$BFFF)
  
  ORG      $10000
  RORG     $8000
  
  ; bank 3 code goes here ($8000-$BFFF)
  
  ORG      $14000
  RORG     $8000
  
  ; bank 4 code goes here ($8000-$BFFF)
  
  ORG      $18000
  RORG     $8000
  
  ; bank 5 code goes here ($8000-$BFFF)
  
  ORG      $1C000
  RORG     $8000
  
  ; bank 6 code goes here ($8000-$BFFF)
  
  ORG      $20000
  RORG     $8000
  
  ; bank 7 code goes here ($8000-$BFFF)
  
  ORG      $24000
  RORG     $C000
  
  ; bank 8 code goes here ($C000-$FFFF)
  
  ORG      $27FF8
  RORG     $FFF8
  ; 7800 bytes and 6502 vectors go here
  .byte.b  $FF     ; region verification. $FF=all regions
  .byte.b  $F7     ; high nibble: encryption check from $N000 to $FF7F.
  .word.w  NMI
  .word.w  START
  .word.w  IRQ