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.
10 FB .... command stream / literals / copy commands ....
^^^^^
method marker seen in the stream as bytes 10 FB10 FB .... flujo de comandos / literales / comandos de copia ....
^^^^^
marcador de método visto en el flujo como bytes 10 FB| ID | MethodMétodo | Reverse engineering noteNota de ingeniería inversa |
|---|---|---|
| 10FBh | RefPack | LZ-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.
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,d3move.b (a0)+,d3
cmpi.b #$FB,(a0)+
bne error_o_salida
btst #0,d3
beq continuar
addq.w #3,a0
continuar:
andi.b #$FE,d3For 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.
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'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 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 decoderEntrada 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 seleccionadoFor 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.
| GameJuego | PlatformPlataforma | StatusEstado |
|---|---|---|
| Coach K College Basketball | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| FIFA International Soccer | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| FIFA Soccer 95 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| FIFA Soccer 96 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| FIFA Soccer 97 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| FIFA Soccer 98 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| NBA Live 95 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| NBA Live 96 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| NBA Live 97 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| NBA Live 98 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| Skitchin' | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| Triple Play 96 | Sega Genesis / Mega Drive | ConfirmedConfirmado |
| Triple Play: Gold Edition | Sega Genesis / Mega Drive | ConfirmedConfirmado |
Reverse engineering workflowFlujo de ingeniería inversa
- Search for 10 FB and record every candidate offset.Busca 10 FB y registra cada offset candidato.
- 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.
- 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.
- 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.
- 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.