/ / POKE in ZX Spectrum - zxspectrum

ZXスペクトルのPOKE - zxspectrum

私は古いZX Spectrum 48kで遊んでいて、どのくらい正確に入ることができるのだろうと思っています POKEコード.

あなたはテープでゲームをロードします - そして、何とかPOKEステートメントの中のプログラムタイプから何となく脱出してプログラムをもう一度起動しますか?

私はこれについて多くの検索をしましたが、これがどのように行われたかを正確に見つけることができなかったので、これに関するどんなリードも大いに評価されました。

回答:

回答№1は2

ほとんどのスペクトラムプログラムは、2ステップのプロセスを使用してゲームを開始します。

  1. 小さなBASICプログラムをロードして実行する
  2. その小さなBASICプログラムは、より長いマシンコードをロードし、その後、マシンコードのエントリポイント(例えば、 RANDOMIZE USR 28455)。

これらの手順の間に停止することができれば、 POKE (生命の数を増やすために...)、次にマシンコードを RANDOMIZE USR 28455あなたは何とか正しいアドレスを見つけたと仮定しています。

マシン・プログラムが実行されると、通常、それを停止してBASICインタープリターに戻る方法はありません。マシンプログラムが何らかの明示的(または偶然)の方法を提供していない限り。


回答№2については2

まず、PEEKと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

ほとんどのプログラムはローダーと呼ばれる小さなBASICプログラムをロードしました。それは次のようなものでした:

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

意味は直感的でなければなりません: アセンブラプログラム(ゲーム自体)がロードされている間(ライン30)、そして最後にゲームを開始するとき(ライン40)にユーザを楽しませるためにスクリーンプレゼンテーション(ライン20)をロードする。

ライン40については、 usr 40000 トリックを行う式で、位置を40000に設定します。命令 Randomize によって使用されたランダムシードを初期化します rndそれが実際には戻ってこないと思った。

だから、最初の試みは次のようになります:

  1. 「ブレーク」(Ctrl + Cとほぼ同等)を押し、 listプログラムがロードされてもまだ実行されていなければ、行35にポークを入れる。

  2. 入力する代わりに load "" ゲームを起動するには、次のように入力します。 merge "" (これは、メモリ内の基本プログラムとテープ内の基本プログラムとを組み合わせるために使用された)。ローダーを実行する前にプロセスが停止します。これは、ローダーが poke ブレークを無効にした命令。

これらの方法の問題点は、最初にローダーのインナーを隠そうとする試みは、(PAPER 0:INK 0命令やそれを10行目に含めるなどして、すべてを一時的に見えなくするなど)単純ではありませんでしたが、まもなく、実際には、 REM 指示。

次のステップでは、基本ローダの後にロードされたアセンブリコード、ダンプアドレスとコードの長さを確定し、独自のローダを作成します。 poke あなたが望む指示。 多くの雑誌はこの種のローダーを配布しました。ローダーは元のローダーの前にロードされることを意図していました(ローダーは元の基本ローダーをバイパスして特定のブロックを探しました)。

そこで、開発者はヘッダーのないテープのアセンブリブロック、およびローダーの保護が必要です。または、ローダをROMに置き換え、異なる速度で、ヘッダー情報なしでローダを代入するアセンブリプログラムをロードするローダを含む。または、プレゼンテーションスクリーンとゲームのコードを含むヘッドレスブロックをロードするローダを含む。

そして、 マルチフェース-1 登場しました。読書 Multiface-1マニュアル あなたはmultifaceのソフトウェアを呼び出す方法を見ることができます(周辺ハードウェアのROMに含まれる)赤いボタン(NMI(マスクされた割り込みではない)を引き起こす)を押すと、その時点でメモリを保存できるメニューが表示されました(保存されたコードは保護されません、パスを開いてポークを使用して独自のローダを作成する)、または検査する(PEEK)現在の値をメモリ内の特定のアドレスに格納し、 POKE直接的に(例えば、あなたがそのルーチンの始まりを見つけることができる、例えば、あなたの人生を1つに減らす)ことができます。

POKEの命令は通常、種類が多かった(これは単純化されている): POKE addr, 0 または POKE addr, 201。数字 アドレ 利用可能な生活の数を減少させるルーチンの始まりであったか、または敵との衝突を検出した。

コード0はアセンブリNOP(操作なし)命令です。 NOPの間、CPUは何もしません。

コード201またはC9は、アセンブリ RET (リターン)命令は、サブルーチンを返すことを意味します。 BASICでは、次のようなサブルーチンを呼び出します。 GOSUB その終わりからの復帰 RETURN。 asssemblyでは、同じペアはCALL / RETです。

あなたが201を持っていたなら、それは事実上、サブルーチン(あなたの人生に1を引くと言う)が以下のようになることを意味します:

9950 let lives = lives - 1
9960 return

変換された:

9950 return
9960 return

値が0の場合、同じルーチンが次のように変換されました。

9950
9960 return

回答№3の場合は1

私はずっと前から思い出しているように.... スペクトラム・ゲームがロードされると、最初は小さなローダー・プログラムでロードされ、実行され、テープは継続し、プログラムの大部分がロードされます。ローダー・プログラムの最後のコマンドは、ロードされ、ゲーム。したがって、私が覚えているように、ローダープログラムがロードされるとテープを一時停止し、コード行が自動的に最後のポークを発行しないようにしてから、続けます。その後、一度バルクがロードされると、コマンドラインからポークを発行し、オリジナルのポークを実行してゲームを開始します。ローダープログラムは最初の赤と青の線の後に読み込まれ、続いて画面上に非常に短い黄色と青の線が表示されます(この時点で見つかったプログラムの名前が表示されます)。テープを停止し、Breakを押してから、リストをクリックしてコードを表示します。最高の運と素晴らしい質問!


回答№4の場合は1

ZX Spectrum雑誌で印刷されたPOKEコード通常、プラグインハードウェアデバイス(Multifaceなど)が必要です。ゲームがロードされたら、Multifaceボタンを押してゲームを停止し、POKEを入力してゲームに戻ります。

特別なデバイスがなければ、あなたは一緒に遊ぶ必要があります他の答えで説明されているように、ローダープログラム。最初の小さなローダープログラムをロードしてから、コードにBREAKをロードする必要があります。あなたが運が良ければ、コードはゲームの残りの部分を読み込んで単純な処理を行い、RANDOMIZE USR呼び出しを使って実際のマシンコードゲームを実行します。ゲームはロードされていますが、ゲームが開始される前です。

しかし、多くのゲームでは、カスタムローダーコードが含まれています。これは、REM文で小さなBASICプログラムに埋め込まれたマシンコードで記述されることがよくあります。マシンコードはゲームをロードして実行し、BASICコードに決して制御を戻さないため、POKEを入力する機会はありません。あなたが十分に専念しているならば、機械コードを変更して、BASICに戻してPOUCを離れさせるか、機械語の呼び出しによってPOKEを実行するかのどちらかを試みることができます。これは非常に難しいです。なぜなら、私が正しく覚えていれば、エディターはREMステートメントで印刷できない文字を含む行をスクランブルしていたからです。 RoyBotのようなソフトウェアツールがあり、メモリ内のコードを修正するのに役立ちます。

一部のゲーム開発者は、実行中に実際にコードを上書きするローダーコードを実装するなど、ゲームのハッキングを防ぐために本当に狂ったことをしました


関連する質問


コメント(0)

コメントを追加