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.
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.
| juego | dónde | qué hace | a dónde va | qué hay ahí |
|---|---|---|---|---|
| Hyper Rally | 0x79C8 | ld (06957h),a | 0x6957 | ld a,(0e00ah) |
| Hyper Sports 3 | 0x4013 | ld (0412fh),hl | 0x412F | djnz L_413D |
| Hyper Sports 3 | 0x4040 | ld (0413bh),hl | 0x413B | jp espera_y_pasa — el operando |
| King's Valley | 0x4044 | ld (hl),a | 0x40E4 | djnz tarea_0_dibuja_o_avanza |
| King's Valley | 0x409C | ld (043c0h),de | 0x43C0 | jp nc,cierra_aviso_titulo — el operando |
| Knightmare | 0x4028 | ld (04112h),hl | 0x4112 | djnz L_4120 |
| Knightmare | 0x4055 | ld (0411eh),hl | 0x411E | jp L_4187 — el operando |
| Konami's Boxing | 0x470E | ld (04f84h),a | 0x4F84 | pop af |
| Konami's Ping Pong | 0x4013 | ld (040eeh),a | 0x40EE | djnz L_40FA |
| Konami's Ping Pong | 0x4052 | ld (040f8h),hl | 0x40F8 | jp L_4318 — el operando |
| Konami's Tennis | 0x7A31 | ld (0409ah),a | 0x409A | ret |
| Konami’s Soccer | 0x4028 | ld (0410ah),hl | 0x410A | djnz escena_presentacion_3 |
| Konami’s Soccer | 0x4056 | ld (04116h),hl | 0x4116 | jp espera_n_y_avanza_escena — el operando |
| Mopi Ranger | 0x406A | ld (04146h),a | 0x4146 | djnz comprueba_el_arranque |
| Mopi Ranger | 0x406F | ld (04147h),a | 0x4147 | djnz comprueba_el_arranque — el operando |
| Mopi Ranger | 0x40A5 | ld (044dfh),de | 0x44DF | jp L_45FF — el operando |
| Pippols | 0x4033 | ld (040c5h),hl | 0x40C5 | jp SIGUIENTE_ESTADO — el operando |
| The Goonies | 0x4022 | ld (0411ch),hl | 0x411C | djnz presentacion_anima |
| The Goonies | 0x4050 | ld (04129h),hl | 0x4129 | jp L_41C8 — el operando |
| Twin Bee | 0x4028 | ld (04195h),hl | 0x4195 | djnz L_41A3 |
| Twin Bee | 0x4055 | ld (041a1h),hl | 0x41A1 | jp empieza_la_escena_siguiente — el operando |
| Yie Ar Kung-Fu II | 0x4028 | ld (0410dh),hl | 0x410D | djnz L_411B |
| Yie Ar Kung-Fu II | 0x4056 | ld (04119h),hl | 0x4119 | jp L_41FB — el operando |
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.
| juego | dónde | qué hace | a dónde va | qué hay ahí |
|---|---|---|---|---|
| Antarctic Adventure | 0x4055 | ldir | 0x0000 | ROM 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.
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.
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.