a8.fandal.cz

News

Games

Demos

Fandal's stuff

Emulators

Links

Contact

RSS


Fandalův Atari blog

Dvojitý agent (30/11/2013)

Uplynulo již mnoho refreshů od doby, co jsem si na tomto místě naposledy honil svoje nehorázně přebujelé ego s povídáním o crackování softwaru pro osmibitová Atari. Dnes to napravím ve velkém stylu neb moje drzost opět překročila další hranici a já se hodlám pustit dokonce do technických detailů. Pevně věřím, že všichni dva čtenáři tohoto blogu mou snahu patřičně ocení a spolu se mnou si to pořádně užijou.

Nejprve něco o tom, co mne přivedlo na myšlenku zde opět moudře promlouvat na moje oblíbené téma. Na konci září jsem na eBay za laciný peníz zakoupil hru Stickybear Numbers, jejíž plně funkční verzi jaksi nebylo možné na netu nikde nalézt, a prakticky obratem ruky jsem na svojí sajtě vyvěsil její 100% chodící crack. To jste jistě zaznamenali, gamesku jste si stáhli a s radostí čtyřletého dítěte jste si jí "zapařili". :)

Ochrana výše zmiňované hry proti kopírování spočívala v použití metody velmi prapodivně se chovajícího sektoru, pro kterou jsem kdysi navrhoval označení "dvojitý agent". To se ovšem vůbec neuchytilo a většina věcí znalých Ataristů při diskuzích na téma "copy protection" dál používá původní pojmenování zavedená už někdy v 80. letech. Zkostnatělí konzervativci!

Z hlediska programátora má dvojitý agent tu zvláštní vlastnost, že při prvním čtení vrátí jiných 128 bajtů než při čtení následném. To dává celou řadu více či méně komplikovaných možností, jak soft zabezpečit proti nenechavým prackám počítačových pirátů, toho moru moderní společnosti.

Naštěstí pro mne na to autor v případě Stickybear Numbers šel vysloveně primitivně, jenom si čtení inkriminovaného sektoru zavolal dvakrát za sebou, poprvé takříkajíc naprázdno, a šup s tím rovnou do paměti. Čili žádné vzájemné XORování obou výsledků nebo jiné podobné hnusárny, které rozlousknout je již poměrně výzva a které mi svého času daly pořádně zabrat u her řady Tink Tonk od firmy Mindscape.

Že je něco takového, jako číst dvakrát ten samý sektor pokaždé s jiným výsledkem, vůbec možné, mne hned při prvním setkání s touto zákeřností nemálo překvapilo. Nicméně neřešil jsem, jak je to celé dělané, bral jsem to prostě jako fakt, po jehož podstatě se nemá smysl pídit. Aneb netrap se věcmi, kterým nerozumíš, to je můj oblíbený přístup.

Zcela jiného názoru byl však náš velký Bob!k/C.P.U., kterého daná problematika patrně zaujala natolik, že na webu pátral až vypátral, co se za tím skrývá. Pak mi o tom snad i něco povídal, jenomže mně to (jako obvykle) šlo jedním uchem dovnitř a druhým zase ven. V podstatě mi zbyla v makovici jenom ta informace, že někde se nechá o dvojitém agentovi něco bližšího zjistit.

Znovu jsem si na Bob!kovu předem marnou snahu natlouct mi cosi do palice vzpomněl až při crackování Stickybear Numbers. A dostal jsem přímo ďábelský nápad. Dohledám si popis dvojitého agenta a pochopím ho! Že se ovšem jednalo o naprosto ničím nepodložený optimismus, to jsem zjistil velmi záhy.

Předně. Informace o pokročilých technikách ochrany ataráckých disket jsou na internetu bohužel často kusé a plné mně nesrozumitelných terminusů technikusů. Čím více jsem snažil zjistit, co je vlastně co a jak to má fungovat, tím více jsem byl zmatený. Nemohu si pomoct, ale zdá se mi, že jednotlivé prameny si vzájemně více či méně protiřečí a celkově jsem nabyl dojmu, že každý autor příslušného pokecu hovoří o něčem trošičku jiném.

Všude se to hemží samými "phantom" a "fuzzy" sektory, přičemž některé zdroje dávají mezi tyto dva pojmy rovnítko, zatímco například Steven Tucker, autor APE a formátu PRO, je naopak přísně rozlišuje. Naneštěstí bez toho, aby současně blbcům jako já naprosto polopatisticky vysvětlil, jaký mezi tím má být rozdíl. Proč mi tohle lidi safra děláte?

Fuzzy bit/bajt se na médiu údajně nechá při zapisování vytvořit za pomoci speciálních hardwarových vyfikundací, např. změnou rychlosti otáčení diskety. Hezky česky by se asi řeklo nestabilní bit či bajt. Když se pak taková potvůrka čte, výsledkem jsou různé hodnoty, prý v závislosti na tom, kde se hlava mechaniky nacházela před čtením inkriminovaného místa.

To by odpovídalo příznakům, jakými se dvojitý agent projevuje. Ale s čím mám tedy tu čest? S fuzzy sektorem nebo s phantomem? Kdosi zpětnou analýzou PRO formátu zjistil, že phantom sektorů může být na sebe navázáno až šest (!) a mně se nechce věřit, že by jeden nestabilní zápis na disketě měl při čtení za následek takové množství pseudonáhodných možností. Takže ve skutečnosti je můj dvojitý agent fuzzy sektorem a phantom je něco jiného?

Myslím, že ani jedno z toho. Podle všeho je dvojitý agent prachobyčejným "double sectorem". Neboli dva sektory na stejné stopě mají stejné ID a jsou proti sobě fyzicky na opačných stranách diskety. Disketovka pak při požadavku na přečtení sektoru s příslušným ID vybere jeden z nich, opět snad podle toho, co se četlo předtím.

Musím se přiznat, jak moc mne těší, že jsem před dvěma lety při návrhu českého označení pro "double sector" vybral právě spojení "dvojitý agent". Nejenom, že poměrně přesně vystihuje podstatu věci, ale navíc je velmi vtipné. Smějeme se, jedna - dvě - tři, teď!

Tedy za předpokladu, že tu neplácám naprosté nesmysly, což je dnes pravděpodobnější než kdy jindy. Pokud jsem něco pomotal, překroutil nebo zcela špatně pochopil, neváhejte a napište mi prosím. Já tu následně provedu patřičnou sebekritiku a vše uvedu na pravou míru.

Sportu zdar a světu mír!

RAM 320XE (07/10/2013)

Včera po poledni jsem se kvůli nabitému programu posledních dnů konečně dostal k několikrát odloženému testování dlouho očekávaného HW udělátka RAM 320XE a nedá mi to, abych se o první dojmy ještě zatepla veřejně nepodělil. Tak tedy: je to totální bomba!!

Pro ty, kteří snad netuší, vo co tady gou, připomenu, že RAM 320XE (stejně jako její předchůdce RAM 320XL) je externí plug & play paměť pro osmibitová Atari z dílny Ctirada Feřtra, známého v komunitě též pod přezdívkou Ctirad. Jak už sám název napovídá, verze 320XE je určena pro stroje řady XE, které disponují expansion portem (ECI).

Modul RAM 320XE se do Atárka zasouvá současně do ECI a cartridge portů, díky čemuž drží skutečně festovně. To se velmi hodí při vkládání cartů do slotu, který je na kartici vyveden. Skvělé je, že tento slot směřuje nahoru (jako u XL mašinek), takže konečně odpadá ono šílené šťourání se kdesi na zadní straně počítače, kde je lautr prd vidět a kam se vlastně nedá ani pořádně dostat.

RAM 320XE

Bez úprav na základní desce nabízí RAM 320XE ve třech módech rozšířenou paměť až na 64+256 kB. Pokud si na motherboardu proškrábnete jisté spoje, vytřískáte ze Ctiradova zázraku ve čtvrtém dostupném režimu až 64+512 kB. Jednotlivé módy se volí dvojicí přepínačů, třetí z nich pak slouží k úplnému odstavení interní paměti Atari, která je poté kompletně přemapována do paměti karty.

Osobně jsem cca dvě hodiny intenzivně testoval pouze režimy nevyžadující zásah do počítače, kteréžto jsou:

  • externí paměť vypnutá,
  • externí paměť 64+64 kB (130XE standard),
  • externí paměť 64+256 kB (Rambo standard).

Vše fungovalo zcela bez problémů jak na PAL strojích, tak i na mojí NTSC 130XE, jejíž vlastnictví mi patrně umožnilo stát se betatesterem předsériového modulu s magickým číslem 0001. Všechny spuštěné softy se chovaly korektně a moje utilitka pro detekci XMS pokaždé vracela správná čísla bank. Žádné potíže jsem také nepozoroval při testování fukčnosti cartů Visicopy III a S/XEGS RAMcartu by C.P.U. s naflashovanou hrou Commando.

RAM 320XE

Nadchla mne i taková drobnost, jako je podpora nezávislého přístupu Anticu do rozšířené paměti v módu 130XE, což jsem samozřejmě neopomenul promptně vyzkoušet. Ono se to sice prakticky nepoužívá (maximálně tak, když si člověk chce zahrát TL Cars), ale svědčí to o Ctiradově chvályhodné snaze vymakat zařízení opravdu k dokonalosti.

Zkrátka a dobře, RAM 320XE je vynikající dílo pověstných zlatých českých ručiček. Vysloveně snadné použití, bytelná a perfektně sedící plastová krabička, naprosto bezproblémový chod a hromady jednoduše nastavitelných režimů. Co víc si člověk může přát? Komfortnější způsob, jak si ve svém ikséčku rozšířit paměť, prostě neexistuje!

Pokud o koupi RAM 320XE uvažujete, vězte, že cena kartice byla pro našince stanovena na 1000 Kč. Není to sice úplně málo, ale za svoje penízky dostanete vskutku špičkový produkt. Myslím, že není třeba dvakrát nad ničím přemýšlet. Objednávejte ještě dnes! :)

Když je šestnáct málo (01/09/2013)

Je tomu už nějaký ten pátek, co jsem na tomto místě uvolnil pro veřejnost dvě svoje atárkovské PC utilitky. BAS2XEX slouží k vytváření spustitelných binarů (XEXů) z BASICovských souborů, BD pak dokáže přetvořit v samostatně fungující hru levely CAV a INT vytvořené v Boulderdash Construction Kitu.

Je tu však zádrhel. Oba tyto prográmky jsem spáchal ve dvacet let starém Borland Pascalu 7.0, jelikož je to vlastně jediný programovací jazyk, který na PC relativně na úrovni zvládám. Pakliže je to někomu divné, rád bych znovu připomenul, že se jako programátor neživím a nikdy nebudu. Moje schopnost cosi na Atari plodit v assembleru 6502 je pouze náhodný přírodní jev.

Ale zpět k tématu. Možná na to někdo z vás narazil, možné ne, nicméně faktem je, že BAS2XEX a BD vám nebudou fungovat v šedesáti čtyřbitových Windows. Z kompileru Borland Pascalu totiž leze jenom a pouze šestnáctibitový kód, který si bez DOSBoxu prostě nepustíte. Dosud mi to nevadilo, nedávno mi ovšem v práci nainstalovali 64-bitové Windows 7 a já začal mít problém.

No a jelikož problémy jsou od toho, aby se čas od času řešily, stáhnul jsem si o víkendu z internetu Free Pascal a jediným stisknutím tlačítka F9 jsem obě moje utility překompiloval do dvaatřicetibitové podoby. Pro zájemce, 32-bitová verze BAS2XEX je ke stažení zde, BD naleznete zde.

A ještě něco. Všimnul jsem si, že někteří uživatelé neumí pořádně používat BAS2XEX. Respektive netuší, že výsledný binár může mít i jinou zaváděcí adresu než defaultních $0700. BAS2XEX přitom tuto adresu používá vysloveně z historických důvodů, neb v bývalé ČSSR se v Turbu nahrávaly BASICovské soubory právě odtud. Stačí se jenom v mém archívu podívat na ty hromady věcí převedených z pásek.

Ano, vím, $0700 je adresa s kolty proklatě nízko a DOSy či různé gameloadery s ní mohou mít docela zásadní problém, já ovšem primárně používám APEloader + SIO2PC a žádné takové starosti neznám. Stejně jako ti, kdož preferují QMEG, SDrive nebo emulátory. Přesto jsem při tvorbě BAS2XEX myslel na všechno a záleží jenom na uživateli, jakou load adresu si zvolí.

Vše se děje pomocí druhého parametru v příkazové řádce. Za název BASICovského souboru prostě připište v hexadecimálním vyjádření adresu paměti, od které má výsledný binár začínat a je to. Například příkaz "BAS2XEX GAME.BAS 2000" vytvoří ze souboru "GAME.BAS" spustitelnou binárku "GAME.XEX" se zaváděcí adresou $2000. Jak prosté.

Více informací získáte spuštěním BAS2XEX bez parametrů. Ve dvaatřicetibitové edici jsem tento help zcela přepsal a podstatně rozšířil, protože uznávám, že v původní verzi byl velmi stručný a navíc poněkud matoucí. Nyní snad bude vše výrazně srozumitelnější a pochopitelnější.

Restart šokem (22/08/2013)

Já asi nejsem normální. Vlastně ne, já určitě nejsem normální. Ale já to vím již dlouho, takže jsem v klidu.

Před časem jsem tento blog definitivně zrušil, protože jsem se po šesti letech jeho matlání postupně dostal do stavu, kdy se mi zvedal žaludek už při pouhém pomyšlení, že bych ze sebe měl vydupat další výblitek. A teď sám sebe pozoruju, jak klapu tenhle beznadějný text!

Asi mi není pomoci. Místo, abych uposlechl jasných varování vyšších sil, které mne před třemi týdny během pouhých čtyřech dnů dvakrát velmi důrazně vyzvaly k ukončení nekalých ataristických rejdů na mojí sajtě, tak tu už zase začínám bláznit. Neuvěřitelné.

Pravděpodobně jste si všimli, že atari.fandal.cz bylo od pátku 2. srpna mimo provoz. Zapříčinily to dva emaily od Atari, Inc.™, kterými naše kdysi oblíbená firma vytáhla do boje proti nelegálnímu používání svého jména v doméně třetího řádu mojí osobou. Plus že nelegálně šířím software podléhající jejich copyrightu.

No a jelikož jsem v té chvíli byl již poměrně slušně nasrán faktem, že mi během úterní večerní bouřky doma od blesku vyhořela veškerá elektronika (PC, ADSL modem, AP, LCD, satelitní přijímač a tiskárna), zareagoval jsem způsobem, který zřejmě ani Atari, Inc.™ neočekávala: na místě jsem zrušil doménu atari.fandal.cz, email fandal@fandal.cz a kompletně jsem promazal FTP.

Mimochodem. Jedna z posledních věcí, kterou jsem předtím v ono nešťastné úterý stačil na svém PC udělat, bylo uploadnout na server fixnutou verzi Aliena 8. A v pátek jsem četl maily a chystal aktualizaci, ke které jsem se už nedostal, na stařičkém noteboku přes bráchův mobil, ze kterého jsem si v nouzi udělal AP. To aby byl sled událostí pochopitelný i Viktorovi.

Ale zpět k mojí páteční hysterické reakci, pro mne tolik netypické. ;) Dokonale odříznut od internetu jsem měl poté celý víkend více než dostatek času přemýšlet, co dál. A pořád mi z toho vycházelo, že je opravdu na čase s tím vším konečně seknout. Nechat atari.fandal.cz historií, když si to i samo Atari, Inc.™ přeje, a mít jednou provždy svatý klid.

Toto rozpoložení mi vydrželo skoro dva týdny, jelikož provozování archívu mi vůbec nescházelo a já jsem zpočátku taky nikomu nescházel. Jenže Ataristi, to je zvěř. Pár politováníhodných individuí se různě po internetu začalo postupně vyptávat, cože se to stalo, co bude dál, proč jsem takovej vůl, atp. A moje víra v lepší zítřky se začala pomaloučku drolit.

Nakonec to byl kolega Bob!k, šedá eminence české A8 scény, kdo mne definitivně přesvědčil, abych sajtu oživil. Vytasil se s docela logickou hypotézou, proč si Atari, Inc.™ kdesi v US vzpomnělo zrovna na můj webík a navíc se osobně angažoval s laděním PHP skriptů na nové doméně. Dokonce šel tak daleko, že mne minulý týden zcela nevybíravými způsoby donutil zapnout si mobil a povídat si s ním na téma další existence archívu, dokud se mi v mém špičkovém Samsungu GT-E1081T nevybila baterka.

Následkem toho všeho bylo zprovoznění sajty na nové adrese a8.fandal.cz, kterou údajně vymyslel Krupkaj, ale nikdo mu to nevěří. Jenže Ataristi, to je zvěř. Několik z nich sice projevilo mizerně hranou radost, že jsem to nezabalil, další ovšem hned začali sborově skuhrat na téma Fandalův úžasný blog, který jim prý pořád schází.

Já přitom nikdy pořádně nepochopil, proč by doprdele někdo ty moje cancy chtěl číst. Ono je to, zdá se, vůbec s tím mým blogem nějaké velké nedorozumění. Já to nepíšu, aby vy jste měli co číst. Vy jste mi ukradení. Já to píšu, protože mě čas od času baví hezky k sobě skládat slova a přitom si beztrestně utahovat ze všech, co mi zrovna přijdou pod ruku.

Avšak reakce přihlížejících je úplně jiná, než by jeden čekal. Místo, aby se urazili, taky mne začali všude pomlouvat nebo mi rovnou někde v tmavém stínadelském průjezdu dali pěkně po vontsku do držky, oni sem dál chodí a ještě si při tom na celé kolo mlaskaji. Nechápu. Respektive mi z toho všeho plyne jediný závěr.

To né já, ale vy tu nejste normální!!

TLC (23/02/2013)

Znáte takový ty chlápky, co pořád řešej nějaký zapeklitý problémy a pak se divěj, že co si sami neudělaj to nemaj? Tak to jsem já. Snažím se být lepším Ataristou. Jmenuji se Fandal.

Mám takovej seznam a na něm hromádku věcí, kterým bych se jednou rád na Atari věnoval. Jako číslo jedna je tam například napsat skvělou kooperativní střílečku pro dva hráče, o něco dál je pak udělat hru v hiresu a hned vedle je naprogramovat gamesku naopak v nějakém GTIA módu.

Škrtat položky v tomto seznamu se mi daří tu s větším, tu s menším úspěchem, ale já to dělám rád, protože ten pocit maximálního uspokojení po každé vítězné akci rozhodně stojí za to. No a jak to zatím vypadá, měl bych se letos cítit opravdu dobře. V kalendáři nemáme ještě ani konec února a ToDo list se mi zkrátil rovnou o dva body.

Před pár týdny jsem totiž začal dělat na zbrusu nové hře pro letošní Flop a aniž to byl původní záměr, jaksi nějak samovolně z toho vykrystalizovala věc vyvedená v nejjemnější grafice. Do toho, jak jste dnes možná zjistili, se mi povedlo fixnout gamesu TL Cars, aby fungovala též na reálném železe. Asi tušíte, že i toto jsem měl v plánu již dávno a teď jsem se k tomu konečně dostal.

TL Cars neboli také ve zkratce TLC vypustil v roce 2010 Tomasz Lewandowski aka Levi/Samar a je to dle mého názoru velice vyvedená produkce. Podobných her se závodními autíčky je na A8 jako šafránu a takto hezky zpracovaných ještě míň. Za pozornost stojí hlavně grafika, kde autor úspěšně použil chytrý trik se dvěma ob mikrořádek se prolínajícíma vrstvama.

Potom už ani moc nevadí, že hra pro svůj běh vyžaduje minimálně 130XE, tj. mašinku s rozšířenou pamětí. Podstatně víc zamrzí, že TLC mělo zcela zásadní problém běžet na real HW. Osobně se mi podařilo hru vůbec nabootovat tak v jednom z deseti pokusů a i pak se program choval podivně. Hlavní menu jsem nikdy ani nezahlédnul, rovnou se pouštělo vlastní kroužení po tracku 1 a po dojetí okruhu se vše dokola opakovalo.

Tomu všemu je nyní konec. Už žádné pouštění TLC pouze pod emulátorem, ve kterém podle všeho Levi svou hru vyvíjel aniž by ho trápil nějaký svět skutečných Atárek. Váš velký Fandal do toho ve čtvrtek a v pátek mocně zabušil a připravil pro vás opravenou verzi TL Cars, kterou by nyní mělo zvládnou každé Atárko s rozšířením paměti kompatibilním s továrním standardem 130XE.

Ano, ano. Levi se z nějakého důvodu rozhodl v TLC využít výrobcem deklarovanou vlastnost Atari 130XE, a to že do přídavné paměti mohou procesory 6502 a Antic přistupovat nezávisle na sobě. Průšvih je, že tato vymoženost se v praxi využívá jenom velmi velmi zřídka. Už proto, že údajně nefunguje ve sto procentech případů ani na nemodifikovaných originálních stotřicítkách, které se dělaly v různých dobách v různých továrnách.

Čili pokud vlastníte origoš 130XE, máte hodně vysokou šanci, že si nyní TLC zahrajete. Pokud vlastníte stroj s paměťovým rozšířením na 256 a více kilobajtů, budete naopak dost možná v problémech. Neboť pouze některá řešení přídavné paměti se snaží kompatibilitu se 130XE zachovat, jiná si ony dva bity v registru $D301 použité pro access control v klídku převzala komplet pro svoje účely.

V každém případě já už s TLC dál nic dělat nebudu. To aby bylo jasno. Prosím nevolejte, nepište, nezvoňte u dveří. Můj úkol byl stávající build rozchodit na skutečném 130XE, a to se povedlo. Žádnou speciální verzi pro rozšířená Atárka bez nezávislého přístupu Anticu do XMS dávat dohromady nebudu. To je věc autora. Stejně jako fakt, že jeho hra nemá ráda NTSC.

Nyní zpět k tématu. Co vlastně způsobovalo, že Leviho výtvor nešlapal korektně na real HW? Odpověď je prostá: jeden jediný bajt! Najít tuto mršku byla docela sranda, hlavně proto, že TLC šlo bez sebemenších zádrhelů pustit ve všech emulátorech, co znám. Zlovolnou bugu jsem nakonec vypátral analýzou kódu a záznamu běhu programu v emu, protože úplně naslepo jsem přece jenom nebloudil.

Z chování programu při bootování bylo zřejmé, že kritická chyba nastává pokaždé na stejném místě a projevy zahryznutí se Atárka mi byly dobře známé z mých programátorských eskapád. Aneb jakmile jednou člověk vidí, co se děje při nekontrolovatelném přepisování prostoru $D000 a výš (I/O adresy zákaznických čipů), nedostane tento zážitek jen tak z hlavy ven. :)

Zkrátka a dobře. Po dlouhém pokusničení, zrovna když CD placička Annihilatoru s názvem "Remains" dospěla v přehrávači k titulní a nejlepší skladbě celého alba "Human Remains", jsem na to přišel. Levi měl špatně jeden vstupní parametr depakovací rutiny, následkem čehož se data pro dekomprimaci četla z paměti o něco déle než měla. A to zrovinka v nešťastném prostoru těsně pod $D000.

No a hádejte, co se stane, když se pokusíte rozbalit nesmysly? Depakovací rutina bude úplně zmatená, nezastaví se v místě, kde se to čekalo, a vesele začne brát data pro dekomprimaci ze zmiňovaných I/O adres. Načež rozbaluje tak dlouho, až začne zapisovat tam, kam nemá. Což na opravdickém Atari znamenalo ve většině případů neodvratnou smrt. Proč vše jakž takž pracovalo pod emulátorem mi není úplně jasné, vím pouze, že depakování se zastavilo pokaždé po přečtení adresy $D137, což bylo za pět minut dvanáct. Reálné Atárko pravděpodobně pokračovalo dál...

Opravou volání dekomprimační rutiny ovšem moje práce na TLC neskončila. Ještě jsem musel fixnout kouskem vlastního kódu toplist při výběru z menu a především po skončení závodu, jelikož autor školácky opomněl jednu základní vlastnost reálných joysticků, které se nikdy nechovají jako klávesnice PC v emulátoru, tj. ze stavu 1 (nestisknuto) nepřejdou rovnou do stavu 0 (stisknuto).

U skutečných ovladačů vždy dojde k nějakému přechodovému jevu, neboli na $D01X se objeví zjednodušeně něco jako 111111100011100101000000. S tím je prostě třeba počítat. Typicky se to řeší určitou prodlevou po detekci stisku/puštění tlačítka. Já například dávám všude pauzu tři snímky, a to i při čtení kláves, kde se člověk s tímto fenoménem taktéž setkává. Ty tři frejmy se mimochodem čeká také v OS rutinách handleru klávesnice.

Mňo. Když to shrnu, řekl bych, že se mi jednou zase něco docela povedlo. To by lépe a s větší grácií zřejmě nezvládl ani můj oblíbený herec Bruce Willis, hlavní hrdina výborného filmu "Zemři tvrdý" ("Die Hard").

Se mnou přichází zákon! (29/01/2013)

V posledních týdnech jsem se na moje poměry docela intenzivně věnoval programování, rozumí se samozřejmě programování v assembleru na malém Atárku, a při této příležitosti jsem se opětovně střetával s jevy, které tuto činnost provázejí. A když jsem nad tím tak přemýšlel, uvědomil jsem si, že jisté situace zažívám při kódování ve strojáku znovu a zas, co jenom moje paměť sahá. Což mne přivedlo na jednoduše geniální myšlenku - jinak se to říct nedá - zformulovat empiricky nabyté zkušenosti do souboru zákonů a pravidel, který jsem neskromně nazval:

Fandalovy zákony programování v assembleru na osmibitovém Atari

Zákon první
Když se program totálně zhroutí jednou za tři kompilace, ještě se to snese. Problém je, že průměrně jsou třeba tři kompilace na to, aby jednou dělal alespoň něco.

Zákon druhý
Ať děláš co děláš, tvůj program stejně začne přemazávat paměť v místech, kam by teoreticky nikdy zapisovat neměl.

Zákon třetí
Ze všeho nejhůř se ladí přerušení. Obzvláště ta, u kterých člověk na konci zapomene vrátit registry na původní hodnoty.

Poučka o nedotknutelnosti kódu
V již odladěné části kódu nikdy neopravuj na první pohled zcela špatně napsané či úplně zbytečné konstrukce, neboť právě ty jsou ve skutečnosti správně a navíc jsou kritické pro chod celého programu.

Základní programátorský paradox
Nic člověka nepřekvapí tak, jako kód pracující bezchybně na první pokus.

Zákon neodvratné nesrozumitelnosti
Bez ohledu na množství komentářů a vhodně zvolená jména proměnných, konstant a návěští je každý zdrojový kód pro autora po šesti měsících naprosto nesrozumitelný.

Věta Flopova
Sebepečlivější testování z programu nikdy neodstraní všechny chyby. Minimálně jedna buga se vždy vynoří až po jeho oficiálním vypuštění v magazínu Flop.

Zákon pana Breakpointa
Breakpointy jsou při ladění naprosto fantastická věc. Kromě situací, kdy nadělají ještě více zmatků než užitku, což se stává ve čtyřech z pěti případů.

Podmínkový teorém
Délka kódu za instrukcí podmíněného skoku pokaždé narůstá tak dlouho, až nakonec nevyhnutelně překročí hranici 128 bajtů a programátor si musí vypomoci instrukcí nepodmíněného skoku JMP.

Důsledek podmínkového teorému
Jakmile člověk jednou použije pomocnou instrukci JMP, vzápětí se mu nevědomky podaří kód za podmíněným skokem zoptimalizovat na délku menší než 128 bajtů, nyní nadbytečný JMP ale z programu neodstraní nikdy.

Anticův zákon zlomu
Pokud musíš v paměti změnit umístění screen memory nebo display listu, vyjde nová lokace naprosto neomylně do zlomu čtyřikilobajtové, respektive jednokilobajtové hranice a obraz se sesype.

Hanácký postulát
Chceš-li svůj program donekonečna předělávat, pošli každou RC verzi na testování do Atari klubu Prostějov.

Pravidlo kritického momentu
Během realizace každého projektu programátor minimálně jednou dospěje do stádia, kdy zcela vážně zvažuje, zda-li by nebylo nejlepší všechno smazat a začít opět od začátku.

Fandalova definice programování
Programovat ve strojáku znamená znovu a znovu s úžasem sledovat, jak zdánlivě nepatrné a neškodné úpravy stávajícího kódu mají ty nejnepředvídatelnější a nejkatastrofičtější následky.

Univerzální existencialistický princip
I kdyby ses třeba posral, tvou práci stejně nikdo neocení. Natož aby jí někdo pochválil.

Mouse Trap (08/01/2013)

Tři týdny hodně intenzivního kódování a mám to v kapse aneb to jsem si zase jednou krásně naběhnul! Bylo to tuším loni cestou z nebo na PLatariádu (či snad šlo o Atariádu? - kdo se v tom má safra vyznat?), co jsem Poisonovi slíbil, že mu udělám level editor pro jeho oblíbenou hru Mouse Trap. Po veskrze pozitivních zkušenostech s podobným udělátkem pro Deflektora jsem se bláhově domníval, že lze s úspěchem vstoupit dvakrát do stejné řeky, jenže to jsem ani zdaleka netušil, do čeho se to vlastně pouštím.

Úkol vypadal na první pohled snadno. Mouse Trap má podobně jako Deflektor levely na jednu obrazovku, očividně poskládané z nějakých opakujících se statických a pohyblivých prvků. Ovšem zatímco Deflektor nebo notoricky známý Robbo mají jednotlivá kola hezky přístupná v paměti, respektive je člověk rovnou okem vidí v samotném bináru hry, Mouse Trap tak přívětivý není. To jsem ke svému značnému zklamání zjistil velmi záhy, a proto jsem taky editůrek nedal dohromady ještě vloni během jednoho víkendu, jak jsem si původně naivně maloval.

Nicméně slib je slib a kdo jednou byl Jiskrou a prošel i Pionýrem, nemůže jinak než přísahu dodržet. Začátkem prosince jsem tedy začal jednat. Nejprve jsem Mouse Trap prohnal disassemblerem a pak jsem nesmírně pracně zjišťoval, jak to tam vlastně autor Brian Jobling dělá. No ano, ten slavný Brian Jobling, zodpovědný (mimo jiné) za úžasné gamesky Draconus a Zybex. Jinými slovy žádná máčka, nýbrž kodér par excellence.

Myslím, že není nutné, abych tu podrobně popisoval, jak jsem se postupně propracovával vnitřnostmi Mouse Trapu a jak jsem do svého level editoru přidával všechny potřebné funkce. Bude docela dobře stačit, když telegraficky uvedu zjištěné skutečnosti a z demonstračních důvodů rozeberu (místy bit po bitu) data pro jedno kolo, to aby si přišli na své také fajnšmekři. A třeba i pan Poison konečně pochopí, co s tím bylo za práci a zkusí mi za můj výtvor poděkovat, což mimochodem doposud neráčil učinit. :)

Vše, co jste chtěli vědět o hře Mouse Trap, ale báli jste se zeptat:

  • každý level se skládá ze dvou nezávislých vrstev, vrstvy statických a vrstvy dynamických elementů,
  • statické elementy lze vybírat z deseti různých setů po šestnácti elementech, které však vzájemně nelze kombinovat,
  • statické elementy jsou dvojí velikosti, jednak čtvercové (8x16 pixelů v grafice 15) nebo obdélníkové (8x32 pixelů), přičemž oba tyto typy se mohou vzájemně překrývat,
  • dynamické elementy jsou pro všechny levely stejné a celkem jich je na výběr třicet dva,
  • levely jsou v paměti uloženy pomocí jednoduché komprese, díky které zabírá všech 22 kol pouze 1,7 kB,
  • v bináru hry je uloženo poměrně dost statických i dynamických elementů, které nejsou v žádném levelu použité.

level03

level 03

Následuje podrobná analýza dat pro třetí level, který jsem vybral pro jeho malý počet dynamických elementů. Nejdřív hexa zápis (v paměti od $25CB):

$28 $12 $30 $41 $02 $06 $DF $04 $6E $55 $24 $30 $90 $80 $C8 $5A
$69 $36 $47 $04 $6E $55 $24 $2B $A0 $99 $00 $99 $20 $0F $8A $2D
$D1 $A0 $0F $D1 $00 $22 $01 $13 $02 $21 $10 $0F $8C $C0 $0F $F0
$00 $D1 $12 $22 $20 $12 $22 $02 $D1 $80 $02 $71 $10 $0F $25 $10
$D2 $AA $10.

Nyní, pěkně bajt po bajtíku, co je přesně co:

  • $28 = grafický set pro daný level (sety mají čísla $00, $14, $28, $3C, $50, $64, $78, $8C, $A0 a $B4),
  • $12 = dolní čtyři bity barva 709, horní čtyři bity barva 712 (vybírá se z palety osmi předem daných barev),
  • $30 = dolní čtyři bity barva 710, horní čtyři bity barva 708,
  • $41 = dolní čtyři bity startovací x-ová pozice myši, horní čtyři bity startovací y-ová pozice myši (je použit raster statických elementů [čili 16 sloupců a 12 řádků] a v x-ové ose se počítá pouze na liché pozice),
  • $02 = počet dynamických elementů (počítáno od nuly, čili tři),
  • $06 = startovací x-ová pozice prvního dynamického elementu (souřadnice dynamických elementů jsou počítány po pixelech podle běžné zvyklosti BASICovské grafiky s nulou v levém horním rohu, nicméně liché pozice v x-ové ose jsou ignorovány a zobrazují se pouze sudé),
  • $DF = startovací y-ová pozice prvního dynamického elementu,
  • $04 = nižší limit pohybu prvního dynamického elementu,
  • $6E = vyšší limit pohybu prvního dynamického elementu,
  • $55 = šestý a sedmý bit určují rychlost pohybu elementu, bity čtyři a pět určují velikost přírůstku v dané ose pohybu a konečně spodní čtyři bity se násobí čtyřmi a jsou spolu s šestým bitem dalšího bajtu použity k definici typu předmětu (rychlosti jsou tedy čtyři z bitových kombinací [00], [01], [10], [11] a nám zde vychází rychlost 01, neboť $55 = %01010101; přírůstek je 1 pixel a spodní čtyři bity po vynásobení dávají průběžný výsledek $14),
  • $24 = spodních pět bitů je použito k definici parametrů pohybu, již zmiňovaný šestý bit k dodefinování typu předmětu a nejvyšší bit není použit (nultý bit určuje pohyb v x-ové [0] nebo v y-ové ose [1]; první a druhý bit definují typ pohybu aneb [00] znamená pohyb tam a zpět od limitu k limitu, [01] znamená pohyb od nižšího k vyšší limitu a [10] znamená pohyb od vyššího k nižšímu limitu, zatímco kombinace [11] je ignorována a je vyhodnocena stejně jako [01]; třetí bit definuje, zda jde o přátelský [1] či nepřátelský [0] element - přátelské elementy jsou pouze lano, kus sýra a plošinka; čtvrtý bit určuje, zda se element při typu pohybu tam a zpět na "obrátce" změní na element otočený o 180 stupňů - [0] pro všechny elementy s výjimkou hada, nohou a hlavy draka; pátý bit definuje pohyblivý [1] či nepohyblivý element [0]; v našem případě tedy suma sumárum vychází z bitové kombinace %00100100 dynamický předmět typu $14 neboli pohybující se zabíjecí ruka plazící se v x-ové ose od nižšího limitu $04 k vyššímu limitu $6E),
  • $30,$90,$80,$C8,$5A,$69 = data pro druhý dynamický element, tentokrát se jedná o plošinku pohybující se v y-ové ose,
  • $36,$47,$04,$6E,$55,$24 = data pro třetí dynamický element, což je opět vraždící ruka v horní polovině obrazovky,
  • $2B = počet bajtů pro definici statické vrstvy levelu,
  • $A0 = dolní čtyři bity první element, v tomto případě prázdno, po kterém následuje v horních čtyřech bitech počet mezer (počítáno od nuly neboli jedenáct kousků),
  • $99 = dolní čtyři bity element číslo $09 (mizející obláček), horní čtyři bity další element $09,
  • $00 = dolní čtyři bity prázdno, z horních čtyřech bitů pouze jedno,
  • $99 = opět dva obláčkové za sebou (elementy $00 až $07 jsou čtvercové, elementy $08 až $0F obdélníkové),
  • $20 = tři mezery,
  • $0F = dolní čtyři bity element $0F, což je flaška dobrého pití, horní čtyři bity mezera,
  • $8A = dolní čtyři bity definují počet mezer z předchozího bajtu (jedenáct), horní čtyři bity obdélníkový element $08 (krápník), který se nahoře i dole překrývá s jinými elementy, ale je to tak chytře nakreslené, že to není vidět,
  • $2D, $D1, $A0, $0F, $D1, $00, $22, $01, $13, $02, $21, $10, $0F, $8C, $C0, $0F, $F0, $00, $D1, $12, $22, $20, $12, $22, $02, $D1, $80, $02, $71, $10, $0F, $25, $10, $D2, $AA, $10 (to už je jasný, ne?).

Pro úplnost bych měl ještě asi dodat, že lze stvořit i dynamické elementy pohyblivé ve dvou osách. To se dělá tak, že jeden a ten samý element je definován dvakrát za sebou, jednou s pohybem v y-ové ose a poté s pohybem v x-ové ose, načež se tyto pohyby jednoduše skládají do jednoho. A ještě dvě poznámečky: dynamických předmětů může být v jednom levelu maximálně sedm a hodně zajímavé na nich je to, že v y-ové ose mohou nahoře zcela opustit obrazovku, neboť první viditelný řádek v jejich souřadnicovém systému má číslo 35.

Závěrem bych rád zdůraznil, že tento zápisek je nutno chápat nejenom jako moje tradiční nehorázné chlubení se, jakej že jsem to chlapák, kabrňák, borec, machr, king, jednička, dvojka, trojka, čtyřka, pětka, atd., ale mým úmyslem bylo též na Poisona veřejně naprášit, že má v ruce nástroj na vytvoření zbrusu nových levelů do hry Mouse Trap. Protože jak to na něj jednou prasklo, neměla by od něj Atari komunita dle mého soudu očekávat nic menšího, než že do Flopu #56 připraví bombu jménem Mouse Trap II.

A máš to, Poisone!!

| 2019 | 2018 | 2016 | 2015 | 2014 | 2013 | 2012 | 2011 | 2010 | 2009 | 2008 | 2007 |

Global Stats:

4964 games
3628 demos


(complete ZIP)

Search:
Top dowloads:

Games:
Cubico 12187
Lemmings 11017
Mind Blast 10085
HexxagonXE 9827
Astro Road 9570
FreeCellXE 9531
Another World 7875
0 Grad Nord 7494
Jaskiniowiec 6748
Janosik 6423

Demos:
Who Lost the Wallet? 10371
Sturbon Intro 10178
A Tribute to Quorthon 9041
404 Error 7150
1k Party 6574
Numen 6515
8k-Detro 6143
10 Jahre AMC 6065
500 Proc Intro 5986
3D Homer 5953

 


  a8.fandal.cz by Dharma, Fanatic and Fandal, 2004