la serie/

The copy protections

A cartridge writing inside its own space is doing nothing at all: ROM takes no writes, so that instruction looks like dead code. It is not. A pirated cartridge is a copy loaded into RAM, and there the write does land and leaves the game broken somewhere it never returns from.

Whose finding this is

The pattern was identified by Manuel Pazos (@ManuelPazosMSX) in his disassembly of King's Valley (RC-727), where he named the two routines ReadKeys_AC and VRAM_writeAC. What is here is that same pattern, looked for across the 40 cartridges in the series.

13 of the 40 write inside their own space, and all 13 are Konami. The family always repeats the same two, in the same two start-up routines: one puts a pop hl and a ret over a djnz in the presentation chain, the other leaves a zero in the operand of a jp, which in memory turns it into jp 00000h —a dead reset—. That the target is always a djnz or the operand of a jump, and never a gap in the data, is what rules out stray writes.

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

The ones aimed at the BIOS ROM

Page 0 of an MSX is ROM too, so a write there does not land either. But going to the BIOS does not make a write a protection: one turns up, and it is explained.

gamewherewhat it doeswhere it landswhat is there
Antarctic Adventure0x4055ldir0x0000BIOS ROM

Antarctic Adventure. It is the start-up guard: it copies jp 0000h over the BIOS entry point. A fourth build of the game proves it is a protection: identical save for two bytes, exactly the ones that send that same copy to DESPACHA, inside the cartridge itself.

The ones checked that carry none

Of Konami's, 20 cartridges write neither to their own space nor to the 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.

And none of the 6 cartridges that are not Konami's carries any of this (3D Golf Simulation, Bomber Man, Hole in One, Hole in One Professional, Casio World Open, Pitfall!). That is the control: if the sweep swallowed coincidences, they would show up there too.

The two MegaROMs, Nemesis / Gradius (KONAMI), F-1 Spirit — The Way to Formula 1 (SCC), are checked differently: their listing goes bank by bank, so their own space is the whole window, 0x4000–0xBFFF, minus the registers of their mapper, worked out from their own writes. Everything they write there is a bank switch.

What this does NOT say

What actually happens when a copy runs in RAM is not measured: that would mean loading a copy and playing it, and no binary is distributed here. What is claimed is what the listing says: where the write is, where it points and what instruction sits at the target.

Nor are these all of them: the sweep sees writes to a fixed address, and those going through HL or DE loaded just before. One computing its target on the fly would slip past.