/ / POKE a ZX Spectrum - zxspectrumban

POKE a ZX Spectrum - zxspectrumban

Egy régi ZX Spectrum 48k-vel játszom, és kíváncsi vagyok, hogy pontosan hogyan lehet belépni POKE kódok.

Töltsön be egy játékot egy szalaggal - akkor valahogy kitörjön a program típusáról a POKE utasításaiban és újra elindítja a programot?

Nagyon sok kutatást végeztem ezen a téren, de nem tudtam pontosan megtalálni, hogy ez hogyan történt, így minden irányt nagyra értékelnének.

válaszok:

2 a válasz № 1

A legtöbb Spectrum program két lépcsős folyamatot használ a játék elindításához:

  1. Töltse be és futtasson egy kis BASIC programot
  2. Ez a kis BASIC program sokkal hosszabb gépi kódot tölt be, majd a gép kódjának belépési pontjára ugrik (pl. RANDOMIZE USR 28455).

Ha sikerül megállnia a lépések között, akkor POKE körül (az életek számának növelése érdekében ...), majd indítsa el a gép kódját RANDOMIZE USR 28455, feltételezve, hogy valahogy megtalálta a helyes címet.

Ha egy gépi program fut, általában nincs módja megállítani és visszatérni a BASIC tolmácshoz. Hacsak a gépprogram nem tartalmaz kifejezett (vagy véletlen) módot erre.


2 a válasz № 2

Először is a PEEK és a POKE jelentése:

10 let x = PEEK 40000: REM returns (reads) the value (0-255) in position 40000
20 POKE 40000, 201: REM writes the 201 value in position 40000

A legtöbb program betöltött egy kis BASIC programot, amelyet betöltőnek neveznek. Olyan volt ez, mint:

10 cls
20 print "Loading AWESOME GAME!!!"
20 load "" screen$
30 load "" code 40000
40 randomize usr 40000

A jelentésnek egyértelműnek kell lennie: Töltsön be egy képernyő-bemutatót (20. sor), hogy a felhasználó szórakoztasson, miközben az összeszerelő program (a játék maga) betöltődik (30. sor), és végül elindítja a játékot (40. sor).

A 40-es vonalról, usr 40000 az a kifejezés, ami a trükket hívja, 40000-as pozícióban Randomize csak inicializálja a használt véletlenszerű magot rnd, úgy gondolta, hogy valójában soha nem tér vissza.

Tehát az első próbálkozások:

  1. Nyomja meg a "szünet" (többé-kevésbé egyenértékű a Ctrl + C-vel), írja be list, és tegye a pokes a 35. sorba, vagyis a program betöltése után, de még nem hajtották végre.

  2. A gépelés helyett load "" a játék elindításához írja be merge "" (ezt a memóriában lévő alapvető program és a szalagon lévő kombinálták). A folyamat leáll, mielőtt végrehajtaná a betöltőt. Ez akkor hasznos, ha a betöltő a következőket tartalmazza: a poke utasítást letiltva BREAK.

A probléma ezekkel a módszerekkel volt, hogy előszöra betöltõi fedõk elrejtésére tett kísérletek naivak voltak (például PAPER 0: INK 0 utasítást vagy valami ilyesmit a 10. sorban, ami átmenetileg láthatatlan volt), de hamarosan sokkal összetettebbé válnak, egészen addig, amíg valójában egy összeszerelő program REM utasítás.

A következő lépés az elemek fejlécének elemzése voltaz alapbetöltő után betöltött kódot, zárja le a dump címet és a kód hosszát, és hozzon létre egy saját betöltőt, amelybe a poke utasításokat. Sok magazin elosztotta az ilyen típusú rakodókat, amelyeket az eredeti betöltése előtt kellett betölteni (a betöltő konkrét blokkokra keresett, megkerülve az eredeti alap rakodót).

Tehát a fejlesztők úgy döntöttek, hogy bevonják aösszeszerelő blokkok szalagon a fejlécek nélkül, valamint a betöltő védelme. Vagy olyan betöltővel is, amely csak betölt egy összeszerelő programot, amely a betöltőt ROM-ban helyettesíti, különböző sebességgel, fejléc információ nélkül stb., Vagy olyan betöltővel, amely fej nélküli blokkot tölt be, beleértve a prezentációs képernyőt és a játék kódját.

Aztán különleges hardvert, például a Multiface-1 megjelent. Olvasva a Multiface-1 kézikönyv láthatja, hogyan hívja fel a multifunkciós szoftvereket(amely a perifériás hardver ROM-ban található) piros gomb megnyomásával (ami NMI-t okozott (nem maszkolt megszakítással), egy menü jelenik meg, amely lehetővé teszi a memória tárolását ezen a ponton (és a mentett kód mentes minden védelemtől , így megnyitva az elérési utat a saját betöltő létrehozásához pokes), vagy akár megvizsgálja (PEEK) az aktuális értékeket a memóriában lévő egyes címeken és írja be POKEközvetlenül (amellyel megtalálhatjuk például azoknak a rutinoknak a kezdetét, amelyek egy életben csökkentik az életedet).

A POKE utasításai általában ilyenek voltak (ez egyszerűsítés): POKE addr, 0 vagy POKE addr, 201. A szám addr volt egy olyan rutin kezdete, amely csökkentette a rendelkezésre álló életek számát, vagy felfedezte az ellenséggel való összecsapást.

A 0 kód az NOP (nem művelet) utasítás. NOP alatt a CPU nem tesz semmit.

A 201 vagy C9 kód az összeszerelés RET (return) utasítást, ami azt jelenti, hogy visszatér egy alprogramhoz. A BASIC-ban egy szubrutint hívsz GOSUB és visszaér a végén RETURN. Az összeszerelés során ugyanaz a pár a CALL / RET.

Ha 201-es voltál, akkor tényleg azt jelentené, hogy egy szubrutin (mondd el, hogy kivonsz egyet az életedbe), például:

9950 let lives = lives - 1
9960 return

átalakult:

9950 return
9960 return

Ha volt 0 értéked, ugyanaz a rutin átalakult:

9950
9960 return

1 a 3. válasz esetén

Mint régen emlékszem .... Amikor egy Spectrum játék betöltődik, először betöltődik egy kis betöltő programba, és futtatja azt, a szalag folytatódik, és a program nagy része be van töltve. A betöltőprogram utolsó parancsja kiadja a poke parancsot, amely mindent betöltött és elindít a játék. Szóval, emlékszem, meg kell szüneteltetnie a szalagot, miután a betöltőprogram betöltötte, és megállítja a kód sorát, hogy automatikusan kiadja a végső pókert, majd folytatja. Ezután ha az ömlesztett betöltődik, akkor a pókert a parancssorból adja ki, majd az eredeti pókert, hogy elindítsa a játékot. A betöltõprogram a piros és kék vonalak elsõ sorozata után kerül betöltésre, majd a nagyon rövid sárga és kék vonalak a képernyõn kerülnek (ahogyan emlékszem, hogy kinyomtatja az itt talált program nevét). Állítsa le a kazettát, nyomja meg a Break gombot, majd a Lista gombot a kód megtekintéséhez. A szerencsét és a nagyszerű kérdést!


1 a 4. válasz esetén

A ZX Spectrum magazinokban nyomtatott POKE kódokáltalában egy plug-in hardvereszközt (például többfelhasználós eszközt) vár. A játék betöltése után megnyomhatja a Multiface gombot a játék megállításához, adja meg a POKE-ket, majd térjen vissza a játékhoz.

Speciális eszköz nélkül játszani kella betöltõprogramokat, ahogy a többi válasz is leírja. Be kell töltenie a kezdeti kis betöltő programot, majd BREAK a kódot. Ha szerencsénk van, akkor a kód valami egyszerűen elvégezhető a játék többi részében való betöltéssel, majd végrehajtja a tényleges gépi kódot a RANDOMIZE USR hívással, ebben az esetben módosíthatja a betöltő BASIC programot a POKES végrehajtása után. a játék betöltött, de a játék elindítása előtt.

Azonban sok játék teszi ezt keményen, mert őkmagában foglalja az egyéni betöltőkódot is. Ezt gyakran a kis BASIC programba beágyazott gépi kód tartalmazza REM utasításokban. A gép kódja betölti a játékot és végrehajtja azt, és mivel soha nem adják vissza a vezérlést a BASIC kódnak, nincs lehetőség a POKE-k beírására. Ha eléggé dedikált, megpróbálhatja megváltoztatni a gép kódját, vagy visszaküldi a vezérlőt a BASIC-ba, így el lehet távolítani a POKE-t, vagy pedig végrehajthatja a POKE-ket gépi kód hívásokkal. Ez meglehetősen nehéz, mert ha helyesen eszembe jut, a szerkesztő használta a REM utasításokban a nem nyomtatható karaktereket tartalmazó sorokat. Volt olyan szoftvereszközök, mint például a RoyBot, amelyek segíthetnek a kód módosításában a memóriában.

Néhány játékfejlesztő tényleg őrült dolgokat tett meg a játék hackelésének megakadályozására, például olyan betöltőkódok végrehajtására, amelyek ténylegesen felülírták saját kódját, miközben végrehajtásra kerültek


Kapcsolódó kérdések


Hozzászólások (0)

Hozzászólni