在ZX Spectrum中查看

时间:2016-06-04 08:44:44

标签: zxspectrum

我正在使用旧的ZX Spectrum 48k,我想知道如何输入POKE codes

您使用磁带加载游戏 - 然后以某种方式突破POKE语句中的程序类型并再次开始运行程序?

我已经对此进行了大量搜索,但未能确切地知道这是如何完成的,因此我们将非常感谢任何有关这方面的信息。

5 个答案:

答案 0 :(得分:3)

首先,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

大多数程序都加载了一个名为loader的小型BASIC程序。它类似于:

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

意思应该是直截了当的:加载屏幕演示(第20行)以保持用户在装配程序(游戏本身)加载(第30行)时受理,最后启动游戏(第40行)。

关于第40行,usr 40000是执行技巧的表达式,在40000位置调用程序集。指令Randomize只是初始化rnd使用的随机种子,认为它实际上是永远不会回来。

所以,第一次尝试将是:

  1. 按“break”(或多或少等同于Ctrl + C),输入list,然后将戳放在第35行,即程序加载后但尚未执行爱好。

  2. 不是键入load ""才能启动游戏,而是键入merge ""(这用于将内存中的基本程序与磁带中的基本程序相结合)。该过程将在执行加载程序之前停止。当加载程序包含禁用BREAK的poke指令时,这非常有用。

  3. 这些方法的问题在于,首先隐藏装载器内部的尝试是天真的(例如包括PAPER 0:INK 0指令或第10行的类似内容,使一切暂时不可见),但很快他们会变得更加复杂,直到实际成为REM指令中包含的汇编程序。

    下一步是分析在基本加载器之后加载的汇编代码的标题,结束转储地址和代码长度,并创建自己的加载器,在其中可以包含poke指令通缉。许多杂志分发了这种装载机,这些装载机的目的是在原装载机之前装载(装载机寻找特定的块,绕过原来的基本装载机)。

    然后开发人员决定将组装块包含在没有标题的磁带中,以及保护加载器。或者包括一个加载器,它只是加载一个汇编程序,用ROM替换加载器,使用不同的速度,没有头信息等。或者包括一个加载无头块的加载器,包括演示屏幕和游戏代码。

    然后出现了诸如Multiface-1之类的特殊硬件。阅读Multiface-1 manual,您可以看到如何通过按红色按钮(激活NMI(未屏蔽中断))来调用多面软件(包含在外围硬件的ROM中),显示一个菜单,允许您将内存保存在point(并且保存的代码没有任何保护,因此打开了使用pokes创建自己的加载器的路径),甚至检查(PEEK)内存中特定地址的当前值并输入POKE是直接的(例如,你可以找到这些例程的开头,这会减少你的生活)。

    POKE的说明通常是那种(这是一种简化):POKE addr, 0POKE addr, 201。数字 addr 是例行程序开始减少可用生命的数量,或检测与敌人的冲突。

    代码0是程序集NOP(无操作)指令。在NOP期间,CPU什么都不做。

    代码201或C9是汇编RET(返回)指令,表示返回子程序。在BASIC中,您将使用GOSUB调用子例程,并使用RETURN从其末尾返回。在asssembly中,同一对是CALL / RET。

    如果你有一个201,那么它实际上意味着一个子程序(比如减去你生活中的一个),例如:

    9950 let lives = lives - 1
    9960 return
    

    转变为:

    9950 return
    9960 return
    

    如果您的值为0,则将相同的例程转换为:

    9950
    9960 return
    

答案 1 :(得分:2)

大多数Spectrum程序使用两个步骤来开始游戏:

  1. 加载并运行一个小型BASIC程序
  2. 然后,小型BASIC程序会加载更长的机器代码,然后跳转到机器代码的入口点(例如RANDOMIZE USR 28455)。
  3. 如果您可以设法在这些步骤之间停止,您可以POKE左右(增加生命数量......)然后使用RANDOMIZE USR 28455启动机器代码,假设您以某种方式找到出正确的地址。

    一旦机器程序运行,通常无法停止它并返回BASIC解释器。除非机器程序提供了一些明确(或无意)的方法。

答案 2 :(得分:1)

我记得很久以前......当Spectrum游戏加载时,它最初加载到一个小的加载程序中,然后运行,磁带继续并加载大部分程序。最后一个命令然后在加载程序中发出一个poke命令,调用所有加载的东西并启动游戏。所以,正如我记得的那样,你必须在加载程序加载后暂停磁带,并停止代码行自动发出最终戳,然后继续。然后,一旦批量加载,你从命令行发出你的戳,然后原始的戳开始游戏。加载程序将在第一组红色和蓝色线后加载,然后在屏幕上显示非常短的黄色和蓝色线(我记得它打印了此时找到的程序的名称)。停止磁带,按Break,然后按List查看代码。祝你好运,这是一个很好的问题!

答案 3 :(得分:1)

ZX Spectrum杂志中打印的POKE代码通常希望您拥有插件硬件设备(例如Multiface)。加载游戏后,您可以按“多面”按钮暂停游戏,输入POKE,然后返回游戏。

如果没有特殊设备,您需要使用加载程序,如其他答案所述。您需要加载初始的小型加载程序,然后将BREAK加载到代码中。如果你很幸运,代码将在游戏的其余部分加载,然后使用RANDOMIZE USR调用执行实际的机器代码游戏。在这种情况下,您可以修改加载程序BASIC程序,以便在游戏加载后但游戏开始之前执行POKES。

然而,许多游戏都很难,因为它们包含自定义加载程序代码。这通常用嵌入到REM语句中的小BASIC程序中的机器代码编写。机器代码将加载游戏并执行它,并且因为它们永远不会将控制权返回给BASIC代码,所以没有机会输入POKE。如果你足够专注,你可以尝试修改机器代码,将控制权返还给BASIC,这样你就可以退出,或者通过机器代码调用来执行POKE。这很难,因为如果我没记错的话,编辑器过去常常在REM语句中对包含不可打印字符的行进行加扰。有像RoyBot这样的软件工具可以帮助你修改内存中的代码。

一些游戏开发者确实做了很多疯狂的事情来防止游戏黑客攻击,例如实现在执行时实际覆盖自己代码的加载程序代码

答案 4 :(得分:0)

作为找到正确 poke 的解决方法,在加载和 BREAK 程序后,您可以搜索如下命令:

const [data, setData] =useState({BIo:""});

    firebase.Firestore().collection("contractors").doc(id).get().then((doc) => {
        if (doc.exists) {
            console.log("Document data:", doc.data());  
              setData(doc.data());


return(<div>  {data.bio} </div>)

在开始时有 3 条生命的游戏中。此命令的十六进制代码为:

LD A,3

搜索此数据并将 03 更改为 255,例如(255 是最大允许值)。然后测试一下。