Kategóriák
Maga az iparos. Történetek a múltból és a jelenből.

A fénykardom.

Egy 65C02 processzor és kódoló logika ami “feltörhetetlen” kerámia tokban várta, hogy összemérjem vele az erőmet.

Eredeti FunWorld kártya. Forrás: https://team-europe.blogspot.com/2017/03/

Ebben a posztban egy igazi intellektuális kihívást szeretnék ismertetni, utalnék arra, hogy sokan sokféleképpen állnak a problémákhoz. Vannak akik izomból és vannak akik ésszel csinálják.

Történt úgy 1996 körül, hogy egy kedves megrendelőm beállított a fenti képen szereplő játékkártyával, ha jól emlékszem Omega-Card pókerprogram volt benne, és azt a feladatot adta, hogy egy taiwani kártyában szeretné ugyanezt a programot futtatni.

Azt a bizonyos taiwani kártyát már jól ismertem, akkori munkahelyemen is volt szerencsém a bele írt “jugó – magic” programot javítgatni benne, de hogy mindenki ráismerjen itt látható a képe:

Szóval, annyi volt tudható első blikkre a kártyákról, hogy hasonlóak. Először is, a kártyában lévő statikus RAM tartalmát kellett biztonságba helyezni, mert bizony a próbálkozások során -ha a RAM elveszti a tartalmát (“elfelejt”) akkor korántsem biztos, hogy újra lehet indítani a programot. Láttunk már telefonszámos, kódos megoldást is, így reflexből a RAM tartalom mentéssel kezdődik mindig a mutatvány.

Ez úgy történik, hogy egy akkut a RAM tetejére forraszt az ember a táp és a föld közé, majd a RAM CE lábát az akku táppal egy 3K3 ellenállással összeköti. Ezután már kivehető a foglalatából és egy EPROM égetővel szépen kinyerhető belőle a tartalom.

Ezután az EPROM-ok kiolvasása következett, de a program EPROM-ból semmilyen értelmes tartalom nem jött ki, masszív kódoló logika őrizte a titkot.

Az eredeti kártyából a kínaiba a kódolt processzort és az EPROM-okat, valamint a szín generáló PROM-ot és a rendszer GAL-t átrakva a próbáltam elindítani a programot, talán jó volt a megérzésem és van valami köze a kártyáknak egymáshoz.

Nagy örömömre a program beindult, de mivel a STAT-RAM tartalmát nem másoltam át, hibára futott. De ez akkor lényegtelen volt, ezzel a kísérlettel meggyőződtem arról, hogy a titok pusztán egy kerámia tokban rejtőzik. Láttam már korábbi próbálkozásokat, egy haverom kiköszörülte a tokot, de érdemben közelebb nem jutott a megoldáshoz. A borítóképhez kapcsolódó linken egy európai hacker csapat pontatlan bejegyzése látható akik ugyan ki bírták csiszolni a chipet, de tévednek. A leírásban Z80-ként valószínűsítik az eszköz processzorát, a valóságban azonban egy 65C02 processzor a megoldás.

A kezdeti örömöm és lelkesedésem néhány próbálkozás után kezdett megtorpanni: A memória végén található RESET, NMI, IRQ vektorok helyét a kódolt memóriában még lehetett azonosítani logikai analizátorral a RESET megjelenése utáni memória olvasásból, de aztán semmi. A processzor és a memória közé iktatott kódoló logika cím és adatfüggő módon elkódolta a program memória tartalmát.

Emlékeztetőül, egy 65C02 processzor memória modellje valahogy úgy néz ki, hogy:

  • 0xFFFE,0xFFFF – INT vektor
  • 0xFFFC,0xFFFD – NMI vektor
  • 0xFFFA,0xFFFB – RESET vektor
  • 0x0200 – 0xFFF9 – memory
  • 0x0100- 0x01FF – STACK RAM
  • 0x0000- 0x00ff – ZERO page, special indexing modes

A program GAL- jának méregetéséből kiderült még a következő memória felosztás:

  • 0x0000-0x07FF- STAT RAM
  • 0x0c00-0x0c0f- IO1
  • 0x0d00-0x0d0f- IO2
  • 0x0e00-0x0e0f- CGA ctrl
  • 0x0f00-0x0f0f- Sound ctrl
  • 0x4000-0x7fff- Extra ROM
  • 0x8000-0xffff- Program ROM

A memória modellből látható, hogy a perifériák és a RAM memóriák 0x1000 cím alatt találhatóak. Ez szöget ütött a fejembe, és megvizsgáltam a korábban kimentett SRAM tartalmat. Ebben a legnagyobb meglepetésemre értelmes BCD kódolt számokat (könyvelés adatai) és néhány olvasható szöveget vettem észre.

Ez azért különösen jelentős, mert rávilágít a védelmi kódolás hibájára: az alsó 0x1000 ig terjedő címtartományban nincs kódolás! (Hiszen, ha kétirányú lenne (R/W) a kódolás akkor a RAM területre írás is el lenne “obfuskálva”, és az IO chipek elérése sem lenne egyszerű, hiszen a kétirányú kódolás esetén a regiszterek helye és értéke a kódoló logika miatt változna. Így ez az architektúra nem lehet kétirányú, csak az EPROM területeket érinti, és azt is csak kiolvasáskor. A RAM a kétirányú használat miatt nem lehet kódolt.) Ennyi közbevetés után adódik a kérdés rögtön:

Hogyan lehetne ide kódot juttatni be, és hogyan lehetne rávenni a processzort, hogy azt végre is hajtsa? Hiszen a reset vektor a kódolt területen van!

Azért a RAM területre, mert ez a processzor von Neumann architektúrájú, vagyis a teljes address space-ben elhelyezhető a végrehajtható kód, és mint előbb bemutattam, a SRAM terület és ebben lévő veremtár nem védett a kódoló logika által.

Persze, rögtön bevillant a C64 korszakból az ISEPIC típusú “rögtöninduló”, ami egy olyan fájl volt tipikusan, ami a veremtárba töltődött, az elején kóddal, a végén 0x01 bájtok sorozatával. Ezek a bájtok egyformák, hogy a veremmutató páros vagy páratlan volta (a 16 bites cím alsó és felső bájtjának helye nem ismert a betöltődéskor), az SP regiszter valahová a végére mutat. A töltő rutin végén az RTS utasítás a felülírt veremből veszi elő a visszatérési címet, így elindítja a stack elején a programkódot.

Ekkor megterveztem a “fénykardom”: A statikus RAM lábkiosztásával az alaplaphoz kapcsolódó, de EPROM-ot is tartalmazó memória bővítés, ami egy kapcsoló átbillentésével a veremtárat és az utána következő egy lapot – átkapcsolja EPROM területre. Az átkapcsolást a PEEL végzi, az átkapcsoló függvény a sok bement miatt a 22V10 GAL-ban lett megírva.

Így juttat kódot a nem kódolt memóriarészbe és így el is tudja indítani. Észre kell venni, hogy ilyenkor nincs STACK memóriánk, így szubrutint hívni nem tudunk. (Lehet, csak nincs visszatérési cím.)

Innen már karikacsapásként ment a dolog, egy Royal-Card programból kiollózott IO chip inicializálással indított “rögtöninduló” kiportoló programmal a memória kiolvasható és a számláló kimeneteken keresztül kiadható a külvilágba, mert a processzor saját kódját tudja olvasni a logikáján keresztül.

A gyártott PCB hátsó oldala.

A megrendelés szoros határideje miatt még zöldítés sem készült a nyomtatott áramköri lemezre. Amint megvolt a nyák, gyorsan összeraktam, felélesztettem, majd megírtam a programot.

A kód elején található adat a veremtárat írja felül, és beindítja a 0x0202 címtől kezdődő kiportoló programot.

Nem bírtam kivárni azt, hogy számítógéppel printer portra kötve az érkező adatokat azonmód rögzítsem, hanem a kártyát összeraktam és remegő ujjakkal bekapcsoltam.

A játék beindult, minden rendben volt. A memória átkapcsoló vezetékére kötött kapcsolót átbillentettem, majd a számlálók vidám ciripelése tudatta, sikerült túljárjak a védelem eszén.

Körülbelül 7 óra elteltével a fénykardom programja kiszippantotta a tudást és azt a hozzá kapcsolódó számítógép rögzítette. A kapott tartalmat EPROMBA égettem, majd az eredeti kártyában lévő kódolt processzort egy originális 65C02 processzorra cserélve a beégetett nyitott eprom azonnal hibátlanul elindult.

Röviden ennyi a fénykardom története, egy igazi élmény volt a küzdelem!

Komment, észrevétel jöhet!

Kategóriák
Maga az iparos. Történetek a múltból és a jelenből.

Az Igazság Szája beszél hozzád! Meg akarod ismerni a jövődet?

Közeledik a születésnapom, ilyenkor mindig pakolgatok a műhelyemben. Közben sokat gondolkodtam, milyen poszt legyen a következő, talán kajás – túlélős? Esetleg utazós? Nem tudtam, és nekiláttam a rendcsinálásnak. A műhely sarkában kezembe került egy doboz, tartalma egy jól záródó műanyag szatyorba csomagolva. Kinyitottam és belepillantottam, bár a szatyrot megismertem azonnal. Emlékek árasztottak el, és már rögtön tudtam, hogy miről fog szólni ez a poszt. A zacskó tartalmát a borítóképen láthatják az érdeklődők, emlékeimet pedig a következőkben olvashatják.

Ez ismét egy retrográd vezetett túra az emlékeimben. A megnevezett emberek valódiak. Egyesek élnek, mások már abban a játékteremben játszanak Cherry Bonus3-as játékon, ahol nem kell fizetni a kulcsolásért. A posztban szereplő technika valós és működik. Csak tanulási, ismeretterjesztő céllal ismertetem. Gyártói kódot nem teszek közzé, bár ha valaki figyelmesen olvassa a posztot rájön, irreleváns. Az eljárás működésére jelenleg semmi garancia sincs, a gyártó régen megváltoztatta a bootstrap kódot.

Amikor először olvastam a Star Wars könyveket, még nagyon fiatal voltam, de megragadt bennem egy gondolat: Minden Jedi lovag maga készíti a fénykardját, igazi mester szerszámokkal. A poszt borítóképén látható – ezzel a hasonlattal élve – egy csillagromboló és a fénykardom.

Az általam csak “csillagrombolónak” nevezett eszközt a mesteremtől kaptam, (V barátom, köszönet érte) és még néhány posztomnak biztos szereplője lesz. A fénykardom viszont magam készítettem, de ez egy másik történet.

Szóval, úgy 1995 táján, túl az elő komolyabb nehézségeken, a sors a pénznyerő automaták világába sodort. Ekkor ismerkedtem meg Tutuval a cigánnyal. Igazi szarházi volt a szó minden értelmében, de ezt csak később értettem meg. Akkor amikor megismertem, jó üzleti ajánlattal állt elő.

“Lenne itt egy meló – de alig van rá pénz!” mondta, és vigyorgott ostobán.

“Mi lenne az?” kérdeztem közömbösen.

Elővett egy cédulát és arról olvasta fel:

“MC68705 microcontroller kiolvasás”, mondta – a “c” betűket hangsúlyosan megnyomva, hogy műveltebbnek tűnjön gondolom -vagyis inkább olvasta a céduláról – , és ahogy ránéztem csodálkoztam, hogy ezt képes volt kimondani.

Azt mondtam neki, hogy találjon erre más madarat, mert én drága leszek neki erre. Elköszöntem tőle, majd beszéltem V barátommal, hogy mi fán terem ez és hallott-e már róla. Akkor már neki is volt egy olyan készüléke, amiben ennek a kontrollernek a 40 lábú változata rejtette a titkot, szóval pont mint egy érett mérges pattanás, a feladat kész volt a megoldásra. Elhatároztuk, hogy hagyjuk egy hétig főni a levében a cigányt, – úgyse talál erre mást mert ez kemény diónak tűnik – aztán jól megkérjük az árát.

Közben elkezdtünk ismerkedni a mi munkánk tárgyával.

mc68705 memory modell
mc68705 memory modell

V barátom eprom égetőjének programozási listáját végignéztük és ekkor esett le először az állunk, mibe is készültünk belevágni a fejszénket: Ezt a típust az akkor nagyon korszerűnek számító égető NEM ismerte! Ennek fele sem tréfa gondoltuk, de ha már belefogtunk nem adjuk fel az első puskalövés előtt a csatát.

Először megszereztük a programozásról szóló információt: ez egy különleges példány, a benne lévő bootstrap kód egy külső epromból magára másolja a tartalmat és így nem lehet kiolvasni, mert igazából semmit sem ad ki. Jó kezdet – gondoltam.

68705 programmer
68705 programmer schematic

Mesteremmel elhatároztuk, hogy az elején kezdjük: Először felpuhítjuk, aztán jöhet a filézés!

Megépítettük a programozó hardvert és elhatároztuk hogy kipiszkáljuk belőle ha lehet a bootloader kódját hátha előrébb leszünk vele.

A bootloader megszerzése.
A bootloader megszerzése. Ennek a programnak a beégetésével kaptuk meg a bootloadert.

A programot megírtuk, beégettük egy epromba és beprogramoztuk a kontrollerbe.

Ekkor került elő a “csillagromboló”. A portkártyát egy 286-os PC-be téve extra portokhoz jutottunk. Az első lépésben csak a mikrokontrollerből jövő adatokat gyűjtöttük és tároltuk el, hogy a bootloadert megszerezzük.

A bootloader kitöltése és megértése után nem sok lehetőséget láttunk a feltörésre: tényleg azt csinálta amit kell. Beégette a programot majd vissza ellenőrizte az eprom címbuszának pörgetésével és kész.

Másnap hívott a cigány, és elhatároztam, hogy belevágok, mert volt egy ötletünk V barátommal. (Igazából nem emlékszem, de szerintem egyszerre jutott eszünkbe a megoldás egy kis brainstorming közepette. Nem akarom elvenni senkitől sem a dicsőséget)

Akkori mértékkel mérve jókora munkadíjat kértünk a cigánytól, – hátha nem adja meg a megrendelője -de megadta, és a következő hétvégén már az asztalunkon volt a mikrokontroller, valamint egy üres példány, hogy abba égetve a tartalmat a megrendelőnek vissza tudjuk küldeni, hogy ellenőrizze. Anélkül, hogy ő maga ki tudná olvasni, legfeljebb plusz egy kontrollere lesz, előrébb nem jut vele.

Először is megértettük és megismertük a beégető algoritmust : A gyártó – Motorola – úgy tervezte a típus tárolóját, hogy ha ki van napoztatva akkor zérus bájtok olvashatóak ki belőle. És itt bökték el igazából a dolgot. Mint egy rendes epromnál is, ha ki van napoztatva az égetés során az 1-es értékű bitből lehet 0 értékűt programozni az égetéssel. A zérus értékű bitből pedig csak napoztatással lehet újra 1-es értékűt csinálni. Motoroláéknál ez éppen fordítva volt, és itt nyugszik a hiba gyökere is: vagyis ha egy bájtra zérus értéket akarok ráprogramozni, akkor az biztosan nem csinál kárt, mert ha a bit zérus volt akkor az is maradt, ha 1-es volt, akkor ott hibázott, de a tartalmat nem rontotta el.

Ezek után nekiálltunk és új programot készítettünk a “csillagrombolóba”. Átgondoltuk, hogy a program 1 MHz-es órajellel működik az égetés során, nosza, kicseréltük lassabra – az égetés lassabb lett, de gond nem keletkezett. A PC-re írt programot úgy kellett megírni, hogy semmilyen megszakítás ne vegyen el időt a pascal kód futásától. Erre szolgált az interrupt technika:

A programunk fő ciklusa.
A programunk fő ciklusa.

Az egész titok a 200 ms várakozás során bekövetkező első megszakításban történik.

Ahhoz, hogy megértsük, először a portkártyával kapcsolatos eljárásokat ismertetem:

A hívott eljárások és a kipörgető fügvény
A hívott eljárások és a kipörgető fügvény

Érdemes az utolsó függvényt megfigyelni: egy timeoutos várakozás egy bitre, és ha az visszajön akkor a visszaadott érték hamis lesz. Minden más esetben pedig igaz.

És akkor következzen a lényeg!

A titok nyitja, a kipörgető
A titok nyitja, a kipörgető

A send_data eljárás a portkártyán keresztül az eprom databitjeit helyettesítve nullákat küld a mikrokontrollernek, és a program vár egészen addig, amíg a VERIFY led (bit) nem billen, elkezdődik az ellenőrzés.

Mivel nulla biteket szimulál az epromból a portkártya így a benne lévő programot nem módosítja az ismételt égetés. Persze a tartalmat ezelőtt NEM napoztattuk ki, így a kiolvasni kívánt tartalmat a kis szerencsétlen MCU felül próbálta írni nullákkal, – ami nem okozott kárt. Hogy ez miért fontos, azt a vájt fülűek már tudják, de a többieknek elárulom:

Mert a programozás után jön az ellenőrzés!

Amint a mikrokontrollerből (PB.1 U1 pin 26) megjön a jel, – ezt figyeli a wait_pgm eljárás – kezdődik az ellenőrző ciklus! A portra az eprom nullás címe kerül (a pörgető számláló U3/10 láb) órajelét figyeli a wait_clk (az első a számláló reset miatt irreleváns) és teszteli a mikrokontrollert : ha nem jön a következő órajel a számláló továbbléptetéséhez az égetési hibát jelent, vagyis az ellenőrzésre elküldött bájt hibás volt. Lehet újrakezdeni az egészet!

Nos így lehet kipörgetni, kipróbálkozni a mikrokontroller tartalmát, ugyanis egy bájt legfeljebb 256 különféle értékű lehet, és ha szerencsénk van és jó értékkel próbálkozunk, akkor megjön a következő címet befetchelő órajel!

A szarvashiba a tervezők részéről itt lett elkövetve: csak belül meg kellett volna jegyezni hogy nem volt sikeres az ellenőrzés, és az eredményt csak a végén kiadni az egészről. Így gyakorlatilag lehetetlen lett volna visszajelzést kapni az egyedi próbálkozások sikeréről. De hát ez a lyuk benne volt, és a csillagromboló sem hibázta el, célbatalált.

Az igazsághoz hozzátartozik, hogy a program először hibás volt, egy bájtot még várt volna a kiolvasáshoz, így miután először jól lefutott, teljesen befagyott, reménytelenül resetelni kellett a PC-t. Bosszantó volt tudni, hogy ott a tartalom a befagyott PC-ben.

Ez azért volt különösen fájdalmas, mert 13 óra várakozást követelt egy pörgetés.

A program javítása és ismételt futtatása után előállt a hőn áhított tartalom. Beégettük még egy mikrokontrollerbe és átadtam a cigánynak.

Nemsokára fülig érő szájjal jött és hozta a megbeszélt összeget, mert nem volt más választása, nem tudott megkerülni minket.

Az égető készüléket elküldtük a megrendelőnek és igazából akkor tudtuk meg, hogy ez egy jósgép volt. Ki gondolta volna?!

Utólag megtudtam a cigány pont megszorozta kettővel a munkadíjunkat a megrendelő felé, de hát Ő már csak ilyen volt. Meg is érdemelte a sorsát, mert az ilyen fajta csak a bajt keresi egész életében.

Nagy élmény volt, és ezek után kértem és kaptam egy “csillagrombolót” a V mestertől. A fénykard készítése azonban egy másik, újabb történet! Kommentek, kérdések jöhetnek, holnap 51 éves leszek.

Kategóriák
Maga az iparos. Történetek a múltból és a jelenből.

Bepillantás a nyerőgép programozás rejtelmeibe.

Ez egy olyan poszt, melynek tartalmát a gyakorlati élet inspirálta. Szeretnék bepillantást nyújtani azoknak az embereknek, akiket valamilyen szinten megérintett ez a világ, hogy mivel is kerülnek szembe, amikor leülnek a nyerőgép elé. Viszonylag száraz, szakmai írás, melynek sorait a különféle játékprogramok megfejtése során szerzett információk támasztják alá. Éppen ezért ez a cikk számítástechnikai oldalról közelíti meg a témát. Szívesen venném pszichológus vagy más játékszenvedéllyel foglalkozó, humán oldalról közelítő szakember véleményét és kiegészítéseit.

A poszt célja ismeretterjesztés, és bepillantás a függőség világába egy másik nézőpontból. A közölt módszerek, algoritmusok bárki által szabadon implementálhatóak, azonban az eredményekért semmilyen felelősséget nem vállal a szerző.

Sokéves tapasztalat alapján néhány szakmai szempontba foglalva felsorolnám a nyerőgép programokkal kapcsolatos követelményeket, amik pályám során előfordultak.

  • Egyszerű játékterv
  • Egyértelmű ábrák, nyerő kombinációk
  • Gyors lefolyású legyen a játék.
  • Nagy nyeremény (főnyeremény) ígérete
  • Érdekes, izgalmas legyen a játék
  • Jövedelmező legyen a játék (legyen haszna a háznak)
  • Biztonságos legyen a játék megvalósítása.

Ebben a posztban leginkább a függőséget befolyásoló tényezőkkel szeretnék foglalkozni, amit leginkább a “játék érdekessége” pontba lehetne befoglalni. A téma tárgyalását közelítsük meg a bank (ház) oldaláról és induljunk ki onnan, hogy a játéknak profitot kell termelnie.

Ezt legegyszerűbben a játékterv alkalmas meghatározásával érhetjük el. Ilyen például a rulett játéknál a “0” mező szerepe. Másik lehetőség a szemléltetésre, hogy tekintsük az egyszerű dobókockás kockajátékot, mely ötszörös főnyereményt fizet, ha a játékos eltalálja előre az általa dobott számot.

Ebben az esetben annak a valószínűsége, hogy nyer 1/6 , mert hat szám közül egyforma eséllyel jöhet ki bármi, míg a nyereség ötszörös tét, így a ház haszna minden dobáson 1/6 tét.

A számítás visszafelé is működik, a biztos nyeréshez mindenképp mind a 6 számra kell fogadni (a dobókocka a hagyományos, hatoldalú) de csak egy szám nyer, és ez ötszörös tétet fizet.

Ez az egyszerű játékterv is elegendő a játékhoz, azonban ez a játék -gondolom nem árulok el nagy titkot – nem nagyon hozza lázba a játékosokat, mert előbb utóbb megunják. Másik részről, a játékterv átlátható, és eléggé mazochistának vagy függőnek kell lenni ahhoz, hogy ilyen játékba belekezdjen valaki.

És itt kezdődik a tudomány. Hogy mi az, amitől érdekessé, izgalmassá válik egy játékterv, és milyen eszközökkel lehet ezt az izgalmat felkelteni, fokozni, a játék sikerességének érdekében. És mivel lehet rávenni az embereket arra, hogy kifosszák magukat nagy valószínűséggel.

Induljunk el legegyszerűbb mechanikus félkarú rablóktól! Ezek az automaták nem csalnak – hiszen a szalagokra festett ábrák adott sorrendjét nem lehet befolyásolni, a tárcsák megállása egy mechanikus gép esetén véletlenszerűnek tekinthetjük.

A tárcsák vizsgálatát legegyszerűbben úgy lehet elvégezni, hogy sorra vesszük a lehetséges megállási pozíciókat és elvégezzük a játékterv szerinti kiértékelést. Az összes kifizetett nyereményt egységnyi tétre vonatkoztatva meg lehet határozni a játék visszafizetési arányát.

Ahhoz, hogy megértsük, miért sikeres az egyik félkarú és miért sikertelen a másik, amikor a visszafizetési arányuk hasonló, a tárcsákat további vizsgálatnak érdemes alávetni!

Vegyük észre, hogy két tényező azonnal adódik, amit érdemes megjegyezzünk:

  • A folyamatos nyerési élmény illúziója (pénzcsörgés)
  • A majdnem nyertem élmények gyakorisága.
  • A folytonos manuális ingerlés élménye (bedob – húz – bedob)

Nyilván a technika fejlődésével (és most itt ugorjunk a jelenbe a képernyőn folyó játékok világába) ezek a lehetőségek megváltoztak, kiszélesedtek.

Megmaradt a pénzcsörgés élménye, a manuális cselekvés gombnyomásra változott – és kiszélesedett például a duplázó játékoknál – két gomb közül kell választani. Ez nyilvánvaló de nézzük tovább a lehetőségeket!

A videós megvalósításában bár a szalagok kiosztását is lehetne változtatni képernyőnként, de ez az általam megismert programokban nem járt út. Tulajdonképpen a fejlesztés az eredeti és bevált szalagok leprogramozásával indultak. Az így kapott játék élménye nyilvánvalóan hasonlított a régi mechanikus játékhoz.

Az első lényeges eltérések a mechanikus implementációkhoz képest

  • A nem nyerő de izgalmas (majdnem nyerő) kombinációk gyakoriságának növekedése
  • Bónusz (ingyenes) játékok megjelenése
  • Bizonyos események, kombinációk gyakoriság eloszlásának eltérése a véletlenszerű (normális) eloszlástól.

Szóval akkor mit is csinálnak a mai nyerőgépek azért, hogy “belehulljanak” a játékosok a gépbe?

Elsőként említeném a játékosok által csak “nyerő széria” elnevezésű élménycsoportot. Ennek megvalósítása viszonylag egyszerű, több szalagkészlettel rendelkezik a program és alkalmasan megválasztott időnként (játékszám eltelte után ) vált a szalagok között. Így például érdekesebb sok apró nyeremény véletlenszerű kiadása után átvált a gép nagy nyereményekben gazdag de kis nyereményekben szegény szalagra. Mindkét szalag elméleti visszafizetési aránya ugyanaz lehet, azonban a változékonyság és a mégis érzékelhető szakaszosság új, függőséget gerjesztő élményt ad a játékosnak. Az ilyen ciklikusság továbbá adja a játékosok másik kedvenc élményét, amit “uralom, kiismertem a gépet” élménynek is neveznek.

Másik ilyen fogás, amivel a videó játék implementációk élnek, a nem nyerő de érdekes kombinációk gyakoriságának emelése. Ilyen lehet például az öt tárcsás gépen megfigyelhető gyakoriság eltérés a következő két kombináció közt:

A ténylegesen nyerő BBBBX (négy egyforma és valami) és a negyedik tárcsán lévő B figura egy pozícióval eltolt helyzete (alatta vagy felette) a várt kétszeres gyakoriság helyett 3-3.5 szeres gyakoriságot mutatott az elemzett esetben.

A harmadik ilyen trükk, a bónuszjátékok megjelenésével a játékosok mazochizmusát teszi próbára. Ha minden véletlen lenne, akkor két ingyenes bónuszjáték közt játszandó játékok számát vizsgálva annak normális eloszlásúnak kellene lennie valamilyen várható átlagos érték körül. A valóság azonban teljesen más.

Ez a bónuszjáték gyakoriság valahogy így néz ki a kísérletek alapján:

Bónuszjáték gyakoriság statisztika
A képen egy bónuszjátékot is adó nyerőgép bónuszjáték kiadási gyakorisága látható.

A vizsgálat módszertana az volt, hogy számoltam hány játékot kell játszani a következő bónuszjáték eléréséhez. Ezeket csoportokba helyeztem a bal szélső oszlopnak megfelelően, majd megszámoltam hány tagja van az egyes csoportoknak. Így készítettem gyakoriság sűrűségi hisztogramot.

Vegyük észre, hogy a két kísérletben két bónuszjáték közt a legrövidebb játékmennyiség 5 illetve 7 játék volt, a legtovább pedig a második kísérletben 711 játékot kellett várni! És a gyakoriság nem a véletlen műve, ezt semmiképp sem lehet normális eloszlásnak nevezni!

Szóval, ennyi után látható minden értelmes ember számára, hogy ez az ipar mennyire kifinomult eszközöket használ, és mennyire van belső gátlása, érzékenysége a felelős játékszervezésre, a játékszenvedéllyel megvert emberek megmentésére.

Elmondhatom, hogy a nyerőgép egy jól megkonstruált pszichológiai fegyver más pénzének legális elszedésére. A szerencsejáték ipar jelenlegi szabályzását tekintve mindenki beláthatja, hogy mindez a lehetőség kevés kivételezettek előtt állami segítséggel nyitva lévő piac. És az ilyen piaci szereplők mondvacsinált felelős játékszervezése csak humbug. (Mert a valóság egy a kaszinókban használatos játékprogramból készített statisztika szerinti.) Az ilyen mélységű vizsgálat (egyáltalán nem mély, csak nem nyilvánvaló) már messze túl van azon a határon, amivel ezek a piaci szereplők valaha is foglalkoztak, vagy egyáltalán megértenek.

Remélem izgalmas volt az írásom, különösen ajánlom mindenkinek akit valaha is megérintettek a félkarú rablók. Kommentek jöhetnek!

Kategóriák
Maga az iparos. Történetek a múltból és a jelenből.

Az első küzdelem

Az ember soha sem felejti el az elsőt. Így van ez mindennel, és mindenkivel. Történt egy szép napon úgy 1986 év elején ha jól emlékszem, hogy beleestem egy számítógép játékba és a zenéjébe. Nem kis utánajárásba került míg sikerült bakelit lemezen a YUGOTON kiadásban megszerezni a lemezt, és még az iskolai műhelyben használatos kék kabátom hátára is felrajzoltam a lemezborítóról és a játékból ismerős ábrát.

Szóval egy szép napon V. barátomhoz mentem számítógépezni és büszkén mutatta nekem ezt a programot eredeti műsoros kazetta kiadásban. A játék már korábban megvolt DD (Dinamic Duo) feltörésben, azonban volt egy játék – a repülős bombázós fali képből nyíló -, amit megérintve az a törés szénné fagyott.

Ekkor V barátommal elhatároztuk, hogy majd mi megmutatjuk, és kipróbáljuk a karmainkat ezen a kazettán.

Ez egy retró poszt, vezetett élménytúra az emlékeimben. Minden itt olvasható dolog 1986 környékén történt, amikor ilyesmire még semmilyen szabály sem vonatkozott. Jelen poszt célja az élmények megélése, szemléltetés és oktatás. Semmi egyéb. A tartalmakat képeket emulátorból mentetem ki, de minden helyen elmondom hogy annó hogy és miként jártam el. Az élmény szempontjából mindegy.

Szóval volt ez a műsoros kazetta, aminek betöltését elkezdve villant egyet, majd lefeketedett és zenélni kezdett, és már ment is a játék.

Az első nehézséget a “rögtöninduló” okozta. Ezt a szót “rögtöninduló” mi alkottuk V barátommal az olyan programokra, amik anélkül elindultak hogy bármit is csináltunk volna. Az ilyesminek a leküzdése a belépő egy ilyen feladatra. Annó két választásunk volt, vagy a COPY190 nevű programmal, ami más címre tölti be kazettáról a fájlt, mint ahova eredetileg töltődött, majd lemezre menti, vagy egy TR-DISKUS nevű program használata, ami kazetta bufferrel együtt mentette a programot két részben lemezre. Mi biztonság kedvéért ez utóbbit választottuk, így eljutottunk a lemezen tárolt és DISKDOCTOR programmal átírható loader kódjáig.

A kazetta buffer tartalma a fejléc beolvasása után
A kazetta buffer tartalma a fejléc beolvasása után

A képen látható az eredeti kezdőcím, és a kazetta buffer tartalma. A töltés 0x0316-tól tart a képernyő közepéig körülbelül, nem emlékszem meddig. Ez már tartalmazza a “rögtöninduló” vektorokat, ezért azt átírhatóvá kell tenni. Ez csak lemezen működik, ezért az átírás ott történt.

a tartalom beindulás előtt, betöltődés után.
A memória tartalma a “rögtöninduló” rutin indítására szolgáló vektorok kiemelve.

A “rögtöninduló” kipukkasztása után alapos vizsgálatnak vetettük alá a bootloader kódját, azonban a töltőprogramon kívül semmit sem találtunk: minden a következőkben betöltött programokra mutatott, azok pedig még a kazettán csücsültek.

Azonban azonnal szemet szúrt egy utasítás:

A program elindítása a bootloaderben
Minden titok kútforrása, a betöltött program indítócíme.

Ezután ide olyan megállító kódot írtunk, aminek a futását jól látunk a képernyőn és itt megállíthatjuk a programot.

A boot folyamat vége
Ez állítja meg a programot a resethez.

Ezt a jelenben emulátorból így végeztem el, akkor a rendelkezésre álló néhány bájt helyre DISKDOCTOR programmal írtuk be.

Figyeljük meg a bootloader program elindulását, lemásolja először magát 0x0200-ra, majd a következő blokkot egy bájttal eltolva tölti le. Ez azért érdekes, mert első blikkre azt gondolná az ember, hogy csak a lapcím változik, így az abszolút címzésű JMP utasítás saját magára 0x03f5 lenne. Ez persze hibára fut.

az ellenállás utolsó próbálkozása…

Szerencsére akkor is rájöttem, rájöttünk erre és alkalmasan átírva elindítottuk a program betöltését lemezről. Ez telerondította a képernyőt, majd indításra várt. Akkor is, most is ügyelve a képernyő mozdítatlanságára el-sys-eltük a programot. Kép lefeketedik, majd indul a töltés és a zene.

Az átírt loader indítása.

Eközben már azon gondolkodtunk, hogy hogyan fogjuk kipiszkálni a memóriából a még be nem indult programot. De erre V barátomnak már megvolt a módszere : az EPYX Fastload klón kártyájának monitorával a veremtárba (0x0100) a ROM memóriákat lelövő kódot írtunk (x01:=0x34) majd lemásoltuk az illető 16k-s szeletet 0x4000 re. a másolás után reset, majd a terület kimentése. Így négy betöltésből megvolt a teljes program memória.

közel a program indítás
A felesleges feliratok színmemóriás elfedése után a feliratok helyeit is feltölti a loader!

A memóriákat visszatöltve és elindítva a program elindult ! HEURÉKA, azonban az első meglepetés itt ért minket: a program egész életében csak a loader állítja be a videó szeletet és a színmemóriát, így a sprite animáció helyett csak kuszaság mozgása látszódott. Az azonban már nagy örömre adott okot, hogy a színmemóriában látszódott a képváltások háttere.

Nosza lementettük a színmemóriát és az IO beállításokat, és összetömörítettük a programot 0x0400-tól 0xffff-ig. Az utolsó bájtok is fontosak voltak, mert ezek vektorálták a megszakító rendszert.

Egy feljavított TMC (The Mercenary Cracker) tömörítőt használtunk, de a széttömörítés előtt még visszaállítottuk a színmemóriát és az IO beállításoktat. A széttömörítés idejére 0xd011 regisztert letiltottuk, így a feltört program szépen indult be. (a TMC crunchert azért kellett feljavítani, mert csak 208 blokkig bírt tömöríteni nekünk azonban ez kevés volt)

És mi ebből a tanulság?

Soha sem értettem meg, hogy ha már ilyen jó bootloadert írt a csávó aki ezt elkövette, akkor miért nem:

  • töltötte felül a 0-ás, 0x0200, 0x0300 lapokat, vagyis saját magát például úgy, hogy memória átfordulással (0xffff után átfordul, körbetölti a memóriát, egy ilyen játékot láttam annó nem is bírtunk hozzányúlni , ez volt a “The Young Ones”, de ez már egy másik történet.)
  • miért nem törölte a veremtárat, hogy oda ne lehessen kódot írni.
  • egyáltalán, miért jött vissza szubrutinból ide elindulni, azaz, miért nem később betöltődő turbóval beolvashatatlanná tett kódból indult el?

De mint minden ilyesmi bőven elavult az ISEPIC és társai megjelenésével. Maradt az élmény.

FGTH - the starting picture
Minden kész! játék a memóriában, közvetlenül elindulás előtt. Ugró cím 0x60aa

Igazából olyan katartikus élmény volt látni a beinduló programot, barátommal megélni ezt a munkát, néha bosszankodva egy szalagos LOAD ERROR miatt, hogy mind a mai napig megmaradt bennem az élmény. Meghatározó része lett az életemnek, semmi nem adott akkora lökést, boldogságot mint a reccsenő jég szava. És jég azért volt bőven ezen a programon hát még az ezután következőkön!

Ja és a sikerélmény! A Dinamic Duó elkúrta, nekünk meg sikerült!

Kategóriák
Egyebek, gépház, házirend stb. Maga az iparos. Történetek a múltból és a jelenből. Munkával kapcsolatos észrevételek, kérések, kérdések, egyelőre egy halomba, minden ami idefér Utazás, szabadidő és mindenféle érdekes dolog. Véleményem a világ dolgairól

Helló Világ!

Annak írok, aki itt jár. Ha tetszik ha nem, ennek a honlapnak a gazdája én vagyok. Nekem kell felelősséget viselni a törvények szerint.


Szabályok:
Az egészséges, építő, jobbító kritikát szívesen fogadom.


A kérdésekre, kérésekre, szívesen válaszolok, de ez a saját munkám terhére nem mehet.


Aki türelmetlen vagy zaklat, kitiltom.


Aki tiszteletlen azt kitiltom.

A számomra elfogadhatatlan, üzleti és/vagy magánérdekeimet sértő hozzászólásokat törlöm.

Ha valaki linkel engem, viszonossági alapon én is linkelem őt. Ez természetes, kedvenceimet a kedvencek menüben találhatják.


Ennyi.