什么是未使用的内存地址?

What is an unused memory address?

阅读这篇文章 HTML page on Commodore 64 memory allocations 因为我对旧计算机硬件感兴趣,所以我偶然发现 table 中的一个单元格声称内存地址未被使用。这到底意味着什么?这是否意味着如果您想在该地址中放置一些东西,您可以放置​​任何您想要的东西?困惑,并希望得到所有答案。谢谢。

内存映射通常应指定哪些程序使用此内存。如果他们说 "unused",这意味着这些指定的程序不使用这个地址。在这里你可以看得更清楚:https://www.c64-wiki.com/wiki/Zeropage:

Those zeropage addresses are useful and important in programming the C64 - so useful that the internal KERNAL and BASIC system ROMs make use of most of them, leaving only a handful that are completely "safe" for machine language programmers to use for their own purposes, without risking a system crash.

因此,内存映射仅对 KERNAL 和 BASIC 有效。

其他程序(包括您的程序)可以毫无风险地访问未使用的地址。如果加载了其他程序,则必须找出它们访问了哪些地址。您也可以访问其他地址 - 即使它们被其他程序使用 - 如果您确切地知道会发生什么,那么...

LT;DR

它指的是 BASIC 或 KERNAL 例程不使用的工作 ram 地址,可免费用于通用编程。

详细说明:

您所引用的页面是一个非常好的资源,但如果您不熟悉系统本身,它会过于详细。我建议在深入了解这些细节之前了解一般的内存布局。

下面是取自COMPUTE! magazine issue 32

的一般内存映射

c64 内存映射是高度可配置的。您可以看到 I/O 和 ROM 区域位于 RAM 区域之上。在 C64 体系结构中,ROM 区域下面总是隐藏着 RAM。您可以关闭不需要到达下方 RAM 的 ROM 区域,并在需要时切换回 ROM(或 I/O)。您也可以将屏幕 ram 移动到您想要的任何位置。

只有 $0000-$0400 之间的区域,称为工作内存,是固定的,因为操作系统(BASIC 解释器和 KERNAL 例程)使用该区域。如果你想在没有奇怪的副作用的情况下使用工作内存中的内存,你必须关闭 BASIC 或 KERNAL ROM。

例如:如果您关闭 BASIC rom,您可以安全地使用从 $2 到 $90 的零页地址

虽然有聪明的解决方案。与实用工具一样,假设您不会使用数据集,驻留在数据集缓冲区($033C-$03FB)或使用屏幕内存作为临时缓冲区并有效地用乱码填满屏幕。

我还必须提醒一下,内存的第一页(从 $0000 到 $00FF)对于 6502 系列的 CPUS 是极其重要的。该区域称为零页。在零页工作的指令在内存中占用的字节少一个,执行速度快一个周期。此外,间接索引和间接索引内存模式仅在零页中可用。

如果您需要保留默认内存配置并且仍然需要一些零页变量,您需要在零页中找到未使用的地址。这是在详细内存映射中称为 'Unused' 的主要原因。

另请注意:用户编写的 ML 程序通常放在 $C000-$D000 中,BASIC 解释器不会触及并调用为 'Free Ram'

BASIC 和 KERNAL 使用大部分零页(地址 [=13=]00[=14=]FF),几乎没有留给您用于您自己的程序。未使用的地址是 [=15=]02[=16=]FB[=17=]FE

零页在 6502 和相关 CPU 上是特殊的。考虑指令:

LDA 34

这会将地址 34 的内容加载到累加器(寄存器之一)。对于零页地址,该指令有一个更快的版本:

LDA 

到目前为止,没什么大不了的,但是有两种间接寻址模式需要零页。例如:

LDA ($FB),y

读取$FB$FC的内容,把它们当作一个little-endian的16位地址,把Y寄存器的值加到这个16-位地址,然后从该地址加载累加器。请注意,这使用零页中的两个相邻字节。这使得靠近零页末尾的四个未使用字节比 </code>.</p> 处的一个未使用字节更有用。 <p>如果您刚刚起步,可以只用四个字节的零页。稍后,您可能会考虑保存和恢复 BASIC 使用的部分零页。如果您从程序中调用任何 KERNAL 例程,您将希望避免使用 KERNAL 使用的部分。</p> <p>如果您使用 BASIC 编程,none 这一点非常重要。您可能只会使用 <code>PEEKPOKE 来控制视频、音频和 I/O。您可以使用 BASIC 变量和数组来存储程序的数据。