Magnetit 2002

Raster

Téměř po deseti letech jsem se konečně odhodlal vyrobit upravenou verzi mé původní logické hry Magnetit. Narozdíl od originální verze je v Magnetitu 2002 možné hrát jednotlivé místnosti v libovolném pořadí, dále jsem nahradil asi 6 místností novými. Ovládání zůstává téměř stejné, pouze na úvodní obrazovce je přidána zmíněná volba čísla místnosti tlačítky SELECT a OPTION, START spouští hru. Nemusíte již tedy pracně opisovat nějaká hesla, ale rovnou si vyberete příslušný level a hrajete.
Přeji příjemnou zábavu...

Ze zákulisí:

Nedá mi to nezmínit se o tom, jak záludné bylo tyto úpravy provádět. Jak již jsem řekl, hra je stará téměř 10 let. Naštěstí jsem našel sešit s poznámkami, který mi prozradil, jak jsem měl data rozmístěná po paměti. Ovšem i tak to byl dost horor, protože jsem tehdy dělal v Magnetitu naschvál různá zabezpečení proti případným záškodníkům, kteří by chtěli hru upravit. Program si například na počátku počítal kontrolní součet celého paměťového prostoru hry a když nesouhlasil, RESET a zdar. Ale tohle odstranit byla celkem legrace.

Daleko větší záhul pro mozkové buňky následoval při hledání paměťového místa, kam si hra uchovává číslo právě řešené místnosti - to je potřeba vědět kvůli jeho počátečnímu nastavení, aby se dalo začínat od libovolné místnosti. Vzpomněl jsem si, že jsem to tehdy velmi "kamufloval" různými triky, jako např.

  1. V paměti není číslo místnosti nikde nikde uloženo přímo, ale je tam hodnota změnená XOR funkcí s nějakou konstantou. => Nedá se najít v paměti.
  2. K paměťovému místu s číslem místnosti (které je navíc pozměněno), se nikdy nepřistupuje přímo, ale indexovaně, a to pokaždé jinak. => Nelze najít instrukci která by přímo četla či zapisovala na hledanou adresu.
  3. Na některých místech v kódu byly vloženy kamuflovací odskoky, samopřepisovací kód a falešné podprogramy.

Vypadalo to, že s tím nehnu. Pak jsem zvolil jinou metodu a místo abych hledal léčky v kódu, hledal jsem kazetu v šuplíku. Kazetu s původním zdrojákem v MACu65 se mi najít podařilo, a tak jsem mohl s úžasem v očích sledovat spousty záludných metod.

Jen pár příkladů:

Místo prostého

 lda mistnost

se použije

 ldx #123
 lda mistnost-123,x

Jindy se použije

 jsr blafak
 ldx #99
 na1 lda mistnost-197,x

a v podprogramu "blafak" najdete mezi hromadou jiných instrukcích ty podstatné, které dělají

 pla ;návr.adresa
 pla ;návr.adresa
 ldx #197
 jmp na1

Případně jiný způsob

 
 ldx kons1
 stx na1+1
 na1 ldy #0
 lda mistnost-37,y
 ldx #0
 stx na1+1

kde na adrese "kons1" se nachází hodnota 37, což znamená, že program si upraví ldy #0 na ldy #37, načte data a ihned poté změní instrukci zpět na ldy #0.

Když takhle vidíte zdroják, je to samozřejmě krásně přehledné, ale nezapomeňte, že při disassembleraci nic takového nespatříte. Takže sláva budiž provolána starým kazetám, ze kterých se mi i po spoustě let podařilo přečíst zdrojáky a díky tomu vytvořit Magnetit 2002. :-)