因为我对旧的计算机硬件感兴趣,所以阅读这个关于 Commodore 64 内存分配的 HTML 页面时,我偶然发现了表中的一个单元格,它声称内存地址未使用。这究竟意味着什么?这是否意味着如果你想在那个地址里放一些东西,你可以放任何你想要的东西?很困惑,并会感谢所有答案。谢谢。
3 回答
内存映射通常应该指定哪些程序使用该内存。如果他们说“未使用”,这意味着这些指定的程序不使用这个地址。在这里您可以更好地看到它:https://www.c64-wiki.com/wiki/Zeropage:
这些零页地址在 C64 编程中非常有用和重要 - 非常有用,以至于内部 KERNAL 和 BASIC 系统 ROM 使用了其中的大部分,只留下少数完全“安全”的机器语言程序员可用于他们自己的目的,而不冒系统崩溃的风险。
所以,内存映射只对 KERNAL 和 BASIC 有效。
其他程序(包括您的程序)可以无风险地访问未使用的地址。如果加载了其他程序,您必须找出它们访问了哪些地址。您也可以访问其他地址 - 即使它们被其他程序使用 - 如果您确切知道会发生什么...
BASIC 和 KERNAL 使用大部分零页($0000
通过的地址$00FF
),几乎没有留给您自己的程序使用。未使用的地址是$0002
和$00FB
through $00FE
。
零页在 6502 和相关 CPU 上是特殊的。考虑以下指令:
LDA $1234
这将使用 address 的内容加载累加器(寄存器之一)$1234
。对于零页地址,此指令有一个更快的版本:
LDA $02
到目前为止,没什么大不了的,但是有两种间接寻址模式需要零页。例如:
LDA ($FB),y
读取 and 的内容$FB
,$FC
将它们视为little-endian 16 位地址,将Y
寄存器的值加到该 16 位地址,然后从该地址加载累加器。请注意,这使用零页中的两个相邻字节。这使得接近零页末尾的四个未使用字节比位于 的一个未使用字节更有用$02
。
如果您刚刚开始,您可以只使用四个字节的零页。稍后,您可能会考虑保存和恢复 BASIC 使用的一部分零页。如果您从程序中调用任何 KERNAL 例程,您将希望避免 KERNAL 使用的部分。
如果你用 BASIC 编程,这些都不重要。您可能只会使用PEEK
andPOKE
来控制视频、音频和 I/O。您可以使用 BASIC 变量和数组来存储程序的数据。
LT;博士。
它指的是 BASIC 或 KERNAL 例程不使用的工作 ram 地址,可免费用于通用编程用途。
长解释:
您所指的页面是一个非常好的资源,但如果您不熟悉系统本身,它就太详细了。我建议在深入了解此类细节之前了解一般内存布局。
下面是从COMPUTE 获取的一般内存映射!杂志第 32 期
c64 内存映射是高度可配置的。您可以看到位于 RAM 区域顶部的 I/O 和 ROM 区域。在 C64 架构中,ROM 区域下方总是隐藏着 RAM。您可以关闭不需要到达下方 RAM 的 ROM 区域,并在需要时切换回 ROM(或 I/O)。您还可以将屏幕内存移动到您想要的任何地方。
只有 $0000-$0400 之间的区域,称为工作 ram,是固定的,因为该区域由操作系统(BASIC 解释器和 KERNAL 例程)使用。如果你想在工作内存中使用内存而不产生奇怪的副作用,你必须关闭 BASIC 或 KERNAL ROM。
eg:如果你关闭BASIC rom,你可以安全地使用2美元到90美元的零页地址
虽然有聪明的解决方案。像实用工具一样,假设您不会使用数据集,驻留在数据集缓冲区($033C-$03FB)或使用屏幕内存作为临时缓冲区并有效地用乱码填充屏幕。
我还必须提醒一下,内存的第一页(从 $0000 到 $00FF)对于 6502 系列 CPUS 来说非常重要。该区域称为零页。在零页上工作的指令在内存中占用更少的字节,并且执行速度更快一个周期。此外,索引间接和间接索引内存模式仅在零页中可用。
如果您需要保持默认内存配置并且仍然需要一些零页变量,则需要在零页中找到未使用的地址。这是在详细的内存映射中被称为“未使用”的主要原因。
另请注意:用户编写的 ML 程序通常放置在 $C000-$D000 中,BASIC 解释器不会触及,称为“Free Ram”