当存在更高级别的语言时,为什么旧​​游戏会在汇编中编程?

时间:2011-02-05 02:15:51

标签: assembly

我注意到大多数(如果不是全部)Nes / Atari等游戏都是在汇编中编码的,但当时存在C,COBOL和FORTRAN,我认为这样可以更容易编码吗?那么他们为什么选择这些可用的高级语言进行汇编呢?

8 个答案:

答案 0 :(得分:27)

那些游戏有8位CPU芯片和微观记忆,比如2kB。这个答案将占用RAM的一半以上。

编译代码是不可能的。即使在具有“大”存储器的8位CPU上,如“64K”(哇!)编译代码也难以使用;在16位微处理器出现之前,它并不常见。

此外,唯一可能有用的语言是C,它尚未占领世界。那时8位微处理器的C编译器很少。

但是C不会有那么大的帮助。那些游戏中有非常便宜的黑客,几乎需要特定时间的指令循环......例如,精灵的Y坐标可能取决于WHEN(在视频扫描中)其控制寄存器被写入。 (发抖...)

现在, 是一个很好的解释字节码语言,可能是在那个时候或者稍后一点:UCSD Pascal在UCSD P-System上运行。虽然我不是Pascal的忠实粉丝,但对于那些早期的处理器来说,它远远领先于其他所有产品。但它不适合游戏,也不适合游戏玩法。

答案 1 :(得分:4)

性能,性能,性能。游戏一直都是为了充分利用硬件。即使是今天最好的C,COBOL或FORTRAN编译器也无法与熟练的汇编代码竞争。

正如DigitalRoss所指出的那样,存在严重的内存限制,并且汇编是唯一允许进行细粒度控制的工具。

同样的事情今天适用,尽管旧的汇编程序或多或少被C ++取代。尽管存在Python等编程语言(非常容易使用),但对于要求最苛刻的应用程序,低级编程语言仍然是首选。

答案 2 :(得分:3)

  

“让代码更容易编码”

没关系。

高性能,最少的内存使用至关重要。

易于编码无关紧要。

请记住,早期游戏在非常非常慢的处理器上有微观的内存,没有实际的设备。东西 - 实质上 - 直接连接到CPU芯片。

答案 3 :(得分:3)

我认为有更大比例的程序员都知道汇编程序,并且不会考虑汇编程序中的编程。甚至进入IBM-PC和AT时代的人们从来没有真正编程过任何东西,但汇编程序仍然存在,并且很容易围绕C和Pascal程序员编程。

Pascal和C很棒(对于台式电脑而言)一旦他们站稳脚跟并且你买得起编译器,你很高兴能用一些新语言进行编程并且从未听说过优化器,你只是假设高级别语言与每个编译器以相同的方式转换为机器代码。您仍然可以轻松地将您的程序安装在5.25“软盘上。并且有足够的640K备用。

我认为我们需要带回或进行更多4K编程竞赛。为GBA或NDS编写游戏但二进制,数据,代码,一切都不能大于4K。或者重新发明小行星,岩石,船,坏人,导弹的游戏玩法,不要担心视频像素,因为,首先它不是,第二个由第二个处理器(井硬件状态机)处理,只需生成矢量绘图命令。现在有免费的6502 C编译器,以及基于p代码的pascal编译器,它可以很容易地在6502上运行输出,看看你是否可以在1.5mhz或其他任何时候获得实时帧速率运行。并适应舞会。我认为练习会回答你的问题。或者......只需创建一个运行时p代码解释器,看看是否适合。 (standardpascal.org,寻找p5编译器)。

少数Kbytes就像一千行或更少的代码。程序并没有那么多,汇编程序也不难,当然也不是6502或其他类似的系统。你没有缓存和mmus,虚拟化和多核,至少不是我们今天的头痛。您可以自由选择所需的任何寄存器,每个子程序都可以使用自己的自定义调用约定,您不会丢弃大量的指令来处理寄存器或堆栈或内存,这样您就可以以标准方式调用函数。你只有一个中断并用它来定时轮询/管理硬件(视频更新,按钮和其他用户输入的均匀定时轮询,甚至在游戏正在播放时轮询四分之一槽检测器)。

小行星看起来大约有3000行汇编程序。随着编译器的效率现在或者然后我会说你需要在大约500行的C代码中编写整个游戏来击败它,pascal使用p代码我将给你100行代码,好的200(不是p - 代码但针对目标进行了优化我将为您提供比C更多的行。

Atari VCS(a.k.a 2600)甚至没有内存用于视频的帧缓冲。该程序必须及时生成像素并执行所有游戏任务。当然,不是很多像素,而是考虑编程任务以及rom的有限大小和速度。对于类似的东西,你开始考虑每个像素有多少指令,我们正在谈论一个小数字。高级编译代码将以拟合和喷射的方式运行,并且不会足够平滑以保证时序。

如果你有机会拆卸一些非常有教育意义的旧游戏,那么指令序列往往非常优雅。优化的编译高级代码有很酷的技巧,但它不一样。

据推测,更好的语言和编译器不会自动使您更好,更快,更高效或更可靠。就像一辆花哨的汽车不能让人成为更好的驾驶员。

答案 4 :(得分:2)

当时的编译器不如我们现在的编译器好。因此,许多人无论是对还是错,都认为他们可以优化编译器。

答案 5 :(得分:1)

在他们开发的时候,更高级别的语言不可用或者在他们必须运行的平台上表现不佳。

答案 6 :(得分:1)

记忆和速度一直是游戏的关键。我的姐夫有一个远远超过我运行我的虚拟服务器的PC的系统,以及桌面。他抱怨游戏刷新率。汇编代码可以提供优化旧编译器不一定可用的代码的能力。现代优化编译器可以进行优化,使得生成的代码比手动编码更快。

旧游戏严重依赖CPU速度进行计时。它们在运行速度快几倍的现代CPU上运行是致命的。延迟方法之一是运行一个循环,该循环将计数器递增或递减一定次数。 (这些可能会被编译器优化掉。)

答案 7 :(得分:1)

尽管有限的内存和有限的速度绝对是Atari 2600游戏的一个问题,但高级语言的主要问题是缺乏对时间的控制。几乎涉及时序的系统的每个方面都必须由软件处理,包括通常你期望硬件为你做的垂直消隐等事情。

您在扫描线中对位置,颜色或数据所做的更改越多,时间就越重要。在某些情况下,您必须在行开始后对寄存器执行特定数量的CPU周期。如果您提前1个CPU周期或晚1个CPU周期,则结果将不正确。

使用高级语言,这种计时精度是不切实际的。