Technical articleArtículo técnico

Refpack CompressionCompresión Refpack

How Frank Barchard's RefPack compression uses 10FBh streams, literal runs, and LZ-style back-references in Electronic Arts Mega Drive games.Cómo la compresión RefPack de Frank Barchard usa flujos 10FBh, secuencias literales y referencias LZ en juegos de Electronic Arts para Mega Drive.

UpdatedActualizado

July 23, 202623 de julio de 2026

DifficultyDificultad

AdvancedAvanzado

Reading timeTiempo de lectura

10 min read10 min de lectura

What RefPack isQué es RefPack

RefPack is a compression algorithm created by Frank Barchard for Electronic Arts toolchains. In Mega Drive reverse engineering, it is commonly tracked through the FB-suffixed 10FBh method marker, but the marker is only the entry point: the block still has to be parsed as a RefPack stream.RefPack es un algoritmo de compresión creado por Frank Barchard para toolchains de Electronic Arts. En ingeniería inversa de Mega Drive, suele identificarse por el marcador de método 10FBh con sufijo FB, pero el marcador solo es el punto de entrada: el bloque todavía debe analizarse como un flujo RefPack.

The method is LZ-style compression. Instead of describing every byte as a new literal, the stream can copy data from bytes that have already been emitted. That makes it useful for graphics, maps, tables, and other assets with repeated local patterns.El método es una compresión de estilo LZ. En vez de describir cada byte como un nuevo literal, el flujo puede copiar datos desde bytes que ya se han emitido. Eso lo hace útil para gráficos, mapas, tablas y otros recursos con patrones locales repetidos.

10FBh method markerMarcador de método 10FBh

In a Mega Drive ROM or hex view, the RefPack marker normally appears as the bytes 10 FB. The full method value matters: do not decode 10FBh with a BPE or Huffman path just because those methods also use the FB suffix.En una ROM de Mega Drive o en una vista hexadecimal, el marcador de RefPack normalmente aparece como los bytes 10 FB. El valor completo del método importa: no decodifiques 10FBh con una ruta BPE o Huffman solo porque esos métodos también usen el sufijo FB.

Hex marker
10 FB  ....  command stream / literals / copy commands  ....
^^^^^
method marker seen in the stream as bytes 10 FB
Marcador hexadecimal
10 FB  ....  flujo de comandos / literales / comandos de copia  ....
^^^^^
marcador de método visto en el flujo como bytes 10 FB
IDMethodMétodoReverse engineering noteNota de ingeniería inversa
10FBhRefPackLZ-style literal and back-reference stream. Follow command bits, copy distances, and output length validation.Flujo de literales y referencias hacia atrás de estilo LZ. Sigue bits de comando, distancias de copia y validación de longitud de salida.

Integrated game decoderEl decodificador integrado en el juego

Many Electronic Arts games include a generic Motorola 68000 decompression routine. The routine reads the XX FB header, stores the method byte in D3, checks that the second byte is FB, masks the low flag bit, and then compares D3 against known decoder IDs.Muchos juegos de Electronic Arts incluyen una rutina genérica de descompresión escrita en Motorola 68000. La rutina lee la cabecera XX FB, guarda el byte de método en D3, comprueba que el segundo byte sea FB, enmascara el bit bajo usado como flag y después compara D3 contra identificadores de decodificador conocidos.

68000 dispatcher
move.b  (a0)+,d3
cmpi.b  #$FB,(a0)+
bne     error_or_exit

btst    #0,d3
beq     continue_decode
addq.w  #3,a0

continue_decode:
andi.b  #$FE,d3
Despachador 68000
move.b  (a0)+,d3
cmpi.b  #$FB,(a0)+
bne     error_o_salida

btst    #0,d3
beq     continuar
addq.w  #3,a0

continuar:
andi.b  #$FE,d3

For RefPack, the normalized method is 10 FB. If the low bit is set, as in 11 FB, the dispatcher treats it as 10 FB after skipping the additional three-byte header extension.Para RefPack, el método normalizado es 10 FB. Si el bit bajo está activado, como en 11 FB, el despachador lo trata como 10 FB después de saltar la extensión adicional de tres bytes de cabecera.

Method signatures
10 FB  -> RefPack
30 FB  -> EA Huffman
32 FB  -> EA Huffman
34 FB  -> EA Huffman
46 FB  -> EA BPE
6E FB  -> uncompressed data, ASCII 'n'
72 FB  -> differential coding, ASCII 'r'
7A FB  -> RLE, ASCII 'z'
Firmas de método
10 FB  -> RefPack
30 FB  -> EA Huffman
32 FB  -> EA Huffman
34 FB  -> EA Huffman
46 FB  -> EA BPE
6E FB  -> datos sin comprimir, ASCII 'n'
72 FB  -> codificación diferencial, ASCII 'r'
7A FB  -> RLE, ASCII 'z'

Compressed file structureEstructura del archivo comprimido

The RefPack stream normally sits inside a resource container entry. The entry begins with a total size for the complete record, stores a resource name with the high bit set so the loader can locate it, and then provides the packed file data including the 10 FB header.El flujo RefPack normalmente se encuentra dentro de una entrada de contenedor de recursos. La entrada empieza con un tamaño total para todo el registro, guarda un nombre de recurso con el bit alto activado para que el loader pueda localizarlo y después proporciona los datos empaquetados, incluyendo la cabecera 10 FB.

Resource layout
Resource container entry

- Total entry size
  Covers the complete packed file record, including loader metadata,
  the name field, the compression header, and the compressed payload.

- Resource name
  Stored with its high bit set so the game loader can find this entry
  in the resource table or package.

- Packed file data
  The byte range handed to the decompression dispatcher.

  Compression header
  - Method signature: XX FB
  - Decompressed size: expected output length
  - Method payload: data interpreted by the selected decoder
Estructura del recurso
Entrada del contenedor de recursos

- Tamaño total de la entrada
  Cubre el registro empaquetado completo, incluyendo metadatos del loader,
  el campo de nombre, la cabecera de compresión y el payload comprimido.

- Nombre del recurso
  Guardado con el bit alto activado para que el loader pueda encontrar esta
  entrada en la tabla o paquete de recursos.

- Datos del archivo empaquetado
  Rango de bytes entregado al despachador de descompresión.

  Cabecera de compresión
  - Firma de método: XX FB
  - Tamaño descomprimido: longitud de salida esperada
  - Payload del método: datos interpretados por el decodificador seleccionado

For RefPack, the method payload is made of command bytes, literal runs, and LZ-style references to data that has already been emitted. The decompressed size is the output length that the loader expects after those commands have finished.En RefPack, el payload del método está formado por bytes de comando, secuencias literales y referencias de estilo LZ a datos que ya se han emitido. El tamaño descomprimido es la longitud de salida que espera el loader cuando terminan esos comandos.

LZ-style modelModelo de estilo LZ

A RefPack decoder alternates between literal runs and copy commands. Literals are copied directly to the output. Copy commands describe a length and a backward distance, then duplicate bytes that are already in the output buffer. The exact command layout is what the target game's decompression routine confirms.Un decodificador RefPack alterna entre secuencias literales y comandos de copia. Los literales se copian directamente a la salida. Los comandos de copia describen una longitud y una distancia hacia atrás, y duplican bytes que ya están en el buffer de salida. El layout exacto de comandos lo confirma la rutina de descompresión del juego concreto.

Confirmed Sega Mega Drive gamesJuegos de Sega Mega Drive confirmados

The following Sega Genesis / Sega Mega Drive titles are confirmed by 68KRevival research as using RefPack compression. The list can be expanded as more Electronic Arts games are checked.Los siguientes títulos de Sega Genesis / Sega Mega Drive están confirmados por la investigación de 68KRevival como usuarios de compresión RefPack. La lista puede ampliarse a medida que se comprueben más juegos de Electronic Arts.

GameJuegoPlatformPlataformaStatusEstado
Coach K College BasketballSega Genesis / Mega DriveConfirmedConfirmado
FIFA International SoccerSega Genesis / Mega DriveConfirmedConfirmado
FIFA Soccer 95Sega Genesis / Mega DriveConfirmedConfirmado
FIFA Soccer 96Sega Genesis / Mega DriveConfirmedConfirmado
FIFA Soccer 97Sega Genesis / Mega DriveConfirmedConfirmado
FIFA Soccer 98Sega Genesis / Mega DriveConfirmedConfirmado
NBA Live 95Sega Genesis / Mega DriveConfirmedConfirmado
NBA Live 96Sega Genesis / Mega DriveConfirmedConfirmado
NBA Live 97Sega Genesis / Mega DriveConfirmedConfirmado
NBA Live 98Sega Genesis / Mega DriveConfirmedConfirmado
Skitchin'Sega Genesis / Mega DriveConfirmedConfirmado
Triple Play 96Sega Genesis / Mega DriveConfirmedConfirmado
Triple Play: Gold EditionSega Genesis / Mega DriveConfirmedConfirmado

Reverse engineering workflowFlujo de ingeniería inversa

  1. Search for 10 FB and record every candidate offset.Busca 10 FB y registra cada offset candidato.
  2. Trace references from pointer tables, loaders, or decompression dispatch code to confirm real block starts.Rastrea referencias desde tablas de punteros, loaders o código del despachador de descompresión para confirmar inicios reales de bloque.
  3. Identify the compressed block boundary and expected decompressed length before trusting a decode.Identifica el límite del bloque comprimido y la longitud descomprimida esperada antes de confiar en una decodificación.
  4. Decode one known asset and compare it with the consumer format: tiles, tilemaps, menu graphics, tables, or other data.Decodifica un recurso conocido y compáralo con el formato que lo consume: tiles, tilemaps, gráficos de menú, tablas u otros datos.
  5. When recompressing, verify whether the new block still fits in place or whether the asset must be relocated and repointed.Al recomprimir, verifica si el nuevo bloque todavía cabe en su sitio o si el recurso debe reubicarse y repuntearse.

Common pitfallsErrores habituales

  • Treating every FB marker as RefPack instead of checking the full method value.Tratar cada marcador FB como RefPack en vez de comprobar el valor completo del método.
  • Decoding from the marker offset when the actual command stream starts after a wrapper, size field, or asset-table entry.Decodificar desde el offset del marcador cuando el flujo real de comandos empieza después de un envoltorio, un campo de tamaño o una entrada de tabla de recursos.
  • Assuming a plausible image means the stream ended at the correct byte. Always verify length and the next referenced block.Asumir que una imagen plausible significa que el flujo terminó en el byte correcto. Verifica siempre la longitud y el siguiente bloque referenciado.