/ / POKE in ZX Spektrum - zxspectrum

POKE in ZX Spektrum - zxspectrum

Ich spiele mit einem alten ZX Spectrum 48k und ich frage mich, wie genau es möglich ist einzutreten POKE-Codes.

Sie laden ein Spiel mit einem Band - dann brechen Sie irgendwie den Programmtyp in den POKE-Anweisungen auf und starten das Programm erneut?

Ich habe viel gesucht, aber ich konnte nicht genau herausfinden, wie das gemacht wird.

Antworten:

2 für die Antwort № 1

Die meisten Spectrum-Programme verwenden einen zweistufigen Prozess, um ein Spiel zu starten:

  1. Laden und starten Sie ein kleines BASIC-Programm
  2. Dieses kleine BASIC-Programm lädt dann viel längeren Maschinencode und springt dann zum Eintrittspunkt des Maschinencodes (z. RANDOMIZE USR 28455).

Wenn Sie es schaffen, zwischen diesen Schritten zu stoppen, können Sie POKE herum (um die Anzahl der Leben zu erhöhen, ...) und dann den Maschinencode mit starten RANDOMIZE USR 28455, vorausgesetzt, du hast irgendwie die richtige Adresse gefunden.

Sobald ein Maschinenprogramm läuft, gibt es normalerweise keine Möglichkeit, es zu stoppen und zum BASIC-Interpreter zurückzukehren. Es sei denn, das Maschinenprogramm bietet einen expliziten (oder unbeabsichtigten) Weg, dies zu tun.


2 für die Antwort № 2

Vor allem die Bedeutung von PEEK und POKE:

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

Die meisten Programme haben ein kleines BASIC-Programm namens Loader geladen. Es war so etwas wie:

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

Die Bedeutung sollte einfach sein: lade eine Bildschirmpräsentation (Zeile 20), um den Benutzer während des Ladens des Assemblerprogramms (das Spiel selbst) zu unterhalten (Zeile 30) und schließlich das Spiel zu starten (Zeile 40).

Über die Linie 40, usr 40000 ist der Ausdruck, der den Trick ausführt und die Assembly an Position 40000 aufruft. Die Anweisung Randomize initialisiert einfach den von rnd, dachte, dass es nie zurückkehren wird.

Also, die ersten Versuche wären:

  1. Drücken Sie "Pause" (mehr oder weniger gleichwertig mit Strg + C), geben Sie ein listund setze die Stöße in Zeile 35, d. h. sobald das Programm geladen wurde, aber noch nicht ausgeführt wurde.

  2. Anstatt zu tippen load "" Um das Spiel zu starten, tippe merge "" (Dies wurde verwendet, um das Grundprogramm im Speicher mit dem im Band zu kombinieren). Der Prozess wird beendet, bevor der Loader ausgeführt wird. Dies ist nützlich, wenn der Loader einen enthält poke Anweisung, die deaktiviert BREAK.

Das Problem mit diesen Methoden war das zuerstDie Versuche, die Loader-Inners zu verstecken, waren naiv (wie zB eine Anweisung PAPER 0: INK 0 oder etwas ähnliches in Zeile 10, was alles vorübergehend unsichtbar machte), aber bald würden sie sehr viel komplexer werden, bis zu dem Punkt eigentlich ein Assembler-Programm enthalten in REM Anleitung.

Der nächste Schritt war die Analyse der Header derEnglisch: www.doc-o-matic.com/webhelp/CO_Formular.html Der nach dem Grundlader geladene Assembly - Code, schließen Sie die Dump - Adresse und die Länge des Codes ab und erstellen Sie Ihren eigenen Loader, in den Sie den poke Anweisungen, die Sie wollten. Viele Magazine verteilten diese Art von Ladegeräten, die vor dem Original geladen werden sollten (der Lader suchte nach bestimmten Blöcken, wobei der ursprüngliche Grundlader umgangen wurde).

Also haben sich die Entwickler dafür entschieden, dieZusammenbau Blöcke in Band ohne die Header, sowie den Lader zu schützen. Oder mit einem Loader, der nur ein Assembly-Programm lädt, das den Loader im ROM ersetzt, mit verschiedenen Geschwindigkeiten, ohne Header-Informationen usw. Oder mit einem Loader, der einen Headless-Block inklusive Präsentationsbildschirm und Code für das Spiel lädt.

Und dann spezielle Hardware wie die Multiface-1 erschienen. Das lesen Multiface-1 Handbuch Sie können sehen, wie Multiface-Software aufgerufen wird(im ROM der peripheren Hardware enthalten) durch Drücken einer roten Taste (die eine NMI (nicht maskierte Unterbrechung) provoziert hat, wurde ein Menü angezeigt, das es ermöglicht, den Speicher zu diesem Zeitpunkt zu speichern (und der gespeicherte Code wäre ohne jeglichen Schutz) Öffnen des Pfades, um Ihren eigenen Loader mit Pokes zu erstellen) oder sogarPEEK) Aktuelle Werte an bestimmten Adressen im Speicher eingeben und eingeben POKE"s direkt (mit dem Sie den Anfang dieser Routinen finden könnten, zum Beispiel, die Ihre Leben in einem verringern).

Die Anweisungen des POKE waren normalerweise von der Art (dies ist eine Vereinfachung): POKE addr, 0 oder POKE addr, 201. Die Nummer Adr war der Beginn einer Routine, die die Anzahl der verfügbaren Leben verringerte oder den Zusammenstoß mit einem Feind aufdeckte.

Der Code 0 ist die Assembly-NOP-Operation (keine Operation). Während eines NOP führt die CPU nichts aus.

Der Code 201 oder C9 ist die Baugruppe RET (Rückgabe) Anweisung, was bedeutet, für ein Unterprogramm zurückzukehren. In BASIC würden Sie ein Unterprogramm mit aufrufen GOSUB und von seinem Ende mit zurückkehren RETURN. In der Assemblierung ist das gleiche Paar CALL / RET.

Wenn Sie ein 201 hätten, dann würde es effektiv bedeuten, dass eine Subroutine (sagen wir, Subtrahieren eins zu Ihrem Leben) wie:

9950 let lives = lives - 1
9960 return

wurde umgewandelt in:

9950 return
9960 return

Wenn Sie einen 0-Wert hatten, wurde die gleiche Routine wie folgt umgewandelt:

9950
9960 return

1 für die Antwort № 3

Wie ich mich vor langer Zeit erinnere .... Wenn ein Spectrum-Spiel geladen wird, lädt es zunächst in ein kleines Loader-Programm und führt das aus, das Band fährt fort und der Großteil des Programms wird geladen. Der letzte Befehl im Ladeprogramm gibt dann einen Poke-Befehl aus, der alles lädt und startet das Spiel. Also, wie ich mich erinnere, müssen Sie das Band anhalten, sobald das Ladeprogramm geladen ist, und die Codezeile anhalten, um den letzten Poke automatisch auszugeben, und dann fortfahren. Sobald die Masse geladen ist, geben Sie Ihren Poke von der Befehlszeile aus und dann den ursprünglichen Poke, um das Spiel zu starten. Das Ladeprogramm wird nach dem ersten Satz von roten und blauen Zeilen geladen, gefolgt von den sehr kurzen gelben und blauen Zeilen auf dem Bildschirm (wie ich mich erinnere, druckt der Name des Programms, das an diesem Punkt gefunden wurde). Stoppen Sie das Band, drücken Sie auf Pause und dann auf Liste, um den Code anzuzeigen. Viel Glück und gute Frage!


1 für die Antwort № 4

Die POKE-Codes werden in ZX Spectrum-Magazinen gedrucktnormalerweise erwartet, dass Sie ein Plug-in-Hardware-Gerät (z. B. Multiface) haben. Sobald das Spiel geladen ist, können Sie die Multiface-Taste drücken, um das Spiel anzuhalten, die POKEs einzugeben und dann zum Spiel zurückzukehren.

Ohne ein spezielles Gerät müssen Sie mitspielendie Loader-Programme, wie von den anderen Antworten beschrieben. Sie müssen das ursprüngliche kleine Ladeprogramm laden und dann in den Code BREAK. Wenn Sie Glück haben, wird der Code etwas Einfaches machen mit dem Laden in den Rest des Spiels und dann das eigentliche Maschinencode Spiel mit dem RANDOMIZE USR Aufruf ausführen. In diesem Fall können Sie das Loader BASIC Programm ändern, um die POKES nach dem zu tun Das Spiel wurde geladen, aber bevor das Spiel gestartet wird.

Aber viele Spiele machen das schwer, weil sie das tunFügen Sie benutzerdefinierten Ladecode hinzu. Dies wird oft in Maschinencode geschrieben, der in REM-Anweisungen in das kleine BASIC-Programm eingebettet ist. Der Maschinencode lädt das Spiel und führt es aus, und da sie niemals die Kontrolle über den BASIC-Code zurückgeben, gibt es keine Möglichkeit, die POKEs einzugeben. Wenn Sie genug dediziert sind, könnten Sie versuchen, den Maschinencode so zu ändern, dass entweder die Kontrolle wieder an BASIC zurückgegeben wird, damit Sie POKE wegwerfen können, oder die POKEs über Maschinencodeaufrufe ausführen. Das ist ziemlich schwierig, denn wenn ich mich recht erinnere, hat der Editor Zeilen mit nicht druckbaren Zeichen in den REM-Anweisungen verschlüsselt. Es gab Software-Tools wie RoyBot, die Ihnen beim Modifizieren von Code im Speicher helfen konnten.

Einige Spieleentwickler haben wirklich verrückte Sachen gemacht, um das Hacken von Spielen zu verhindern, wie das Implementieren von Loader-Code, der seinen eigenen Code während der Ausführung überschrieb


Verwandte Fragen


Kommentare (0)

Einen Kommentar hinzufügen