la serie/

Las protecciones anticopia

Un cartucho que escribe dentro de su propio espacio no está haciendo nada: la ROM no admite escritura, así que esa instrucción parece código muerto. No lo es. Un cartucho pirateado es una copia cargada en RAM, y ahí la escritura sí cuela y deja el juego tocado en un sitio del que no se vuelve.

De quién es el hallazgo

El patrón lo identificó Manuel Pazos (@ManuelPazosMSX) en su desensamblado de King's Valley (RC-727), donde llamó a las dos rutinas ReadKeys_AC y VRAM_writeAC. Lo que hay aquí es ese mismo patrón, buscado en los 40 cartuchos de la serie.

13 de los 40 escriben en su propio espacio, y los 13 son de Konami. La familia repite siempre las mismas dos, en las mismas dos rutinas del arranque: una deja un pop hl y un ret encima de un djnz de la cadena de presentación, y la otra deja un cero en el operando de un jp, que en memoria lo convierte en jp 00000h —un reinicio en seco—. Que el destino sea siempre un djnz o el operando de un salto, y nunca un hueco de datos, es lo que descarta que sean escrituras sueltas.

juegodóndequé hacea dónde vaqué hay ahí
Hyper Rally0x79C8ld (06957h),a0x6957ld a,(0e00ah)
Hyper Sports 30x4013ld (0412fh),hl0x412Fdjnz L_413D
Hyper Sports 30x4040ld (0413bh),hl0x413Bjp espera_y_pasa — el operando
King's Valley0x4044ld (hl),a0x40E4djnz tarea_0_dibuja_o_avanza
King's Valley0x409Cld (043c0h),de0x43C0jp nc,cierra_aviso_titulo — el operando
Knightmare0x4028ld (04112h),hl0x4112djnz L_4120
Knightmare0x4055ld (0411eh),hl0x411Ejp L_4187 — el operando
Konami's Boxing0x470Eld (04f84h),a0x4F84pop af
Konami's Ping Pong0x4013ld (040eeh),a0x40EEdjnz L_40FA
Konami's Ping Pong0x4052ld (040f8h),hl0x40F8jp L_4318 — el operando
Konami's Tennis0x7A31ld (0409ah),a0x409Aret
Konami’s Soccer0x4028ld (0410ah),hl0x410Adjnz escena_presentacion_3
Konami’s Soccer0x4056ld (04116h),hl0x4116jp espera_n_y_avanza_escena — el operando
Mopi Ranger0x406Ald (04146h),a0x4146djnz comprueba_el_arranque
Mopi Ranger0x406Fld (04147h),a0x4147djnz comprueba_el_arranque — el operando
Mopi Ranger0x40A5ld (044dfh),de0x44DFjp L_45FF — el operando
Pippols0x4033ld (040c5h),hl0x40C5jp SIGUIENTE_ESTADO — el operando
The Goonies0x4022ld (0411ch),hl0x411Cdjnz presentacion_anima
The Goonies0x4050ld (04129h),hl0x4129jp L_41C8 — el operando
Twin Bee0x4028ld (04195h),hl0x4195djnz L_41A3
Twin Bee0x4055ld (041a1h),hl0x41A1jp empieza_la_escena_siguiente — el operando
Yie Ar Kung-Fu II0x4028ld (0410dh),hl0x410Ddjnz L_411B
Yie Ar Kung-Fu II0x4056ld (04119h),hl0x4119jp L_41FB — el operando

Las que van a la ROM de la BIOS

La página 0 de un MSX también es ROM, así que una escritura ahí tampoco llega. Pero ir a la BIOS no convierte una escritura en protección: aparece una, y está explicada.

juegodóndequé hacea dónde vaqué hay ahí
Antarctic Adventure0x4055ldir0x0000ROM de la BIOS

Antarctic Adventure. Es el guardián del arranque: copia jp 0000h encima de la entrada de la BIOS. Que es una protección lo demuestra una cuarta compilación del juego, idéntica salvo en dos bytes: justo los que mandan esa misma copia a DESPACHA, dentro del propio cartucho.

Los que se miraron y no llevan ninguna

De Konami, 20 cartuchos no escriben ni en su espacio ni en la BIOS: Athletic Land, Cabbage Patch Kids, F-1 Spirit — The Way to Formula 1, Frogger, Hyper Olympic 1, Hyper Olympic 2, Hyper Sports 1, Hyper Sports 2, Konami's Baseball, Konami's Golf, Konami’s Billiards, Konami’s Game Master, Konami’s Mahjong Dojo, Monkey Academy, Nemesis / Gradius, Road Fighter, Sky Jaguar, Super Cobra, Time Pilot, Yie Ar Kung-Fu.

Y ninguno de los 6 cartuchos que no son de Konami lleva nada de esto (3D Golf Simulation, Bomber Man, Hole in One, Hole in One Professional, Casio World Open, Pitfall!). Es el control: si el rastreador se tragara coincidencias, saldrían también ahí.

Las dos MegaROM, Nemesis / Gradius (KONAMI), F-1 Spirit — The Way to Formula 1 (SCC), se miran distinto: su listado va por bancos, así que el espacio propio es la ventana entera, 0x4000–0xBFFF, descontando los registros de su mapper, que se deducen de sus propias escrituras. Todo lo que escriben ahí es cambiar de banco.

Lo que esto NO dice

Qué pasa de verdad al correr una copia en RAM no está medido: eso pediría cargar una copia y jugarla, y aquí no se distribuye ningún binario. Lo que se afirma es lo que se lee del listado: dónde está la escritura, a dónde apunta y qué instrucción hay en el destino.

Tampoco están todas: el rastreador ve las escrituras a una dirección fija y las que pasan por HL o DE cargados justo antes. Una que calculase el destino sobre la marcha se le escaparía.