【发布时间】:2013-09-13 14:05:36
【问题描述】:
我正在 Commodore PET 上的双盒式磁带机上实现虚拟内存(为了好玩),用于我正在编写的 Forth。如果您有兴趣,我目前的地址是http://github.com/chitselb/pettil。
我打算使用 PET 的原生 192 字节磁带数据文件格式。哦,是的,一切只有 32K 的 RAM。我在语言中嵌入了 Woz 出色且非常节省内存的 Sweet-16 解释器。
一个 Forth 块(通常)是 1024 字节。为块 ID 添加两个字节将可用虚拟地址空间限制为 64 兆,远远超过磁带上的容量。将有一个“播放”卡座(设备 1)和一个“记录”卡座(设备 2),并且 FLUSH 将涉及将整个虚拟内存从一个驱动器复制到另一个驱动器。为什么要向风车倾斜?因为在过去,盒式磁带是大多数 PET 所有者拥有的,包括在内。
大部分数据将是 Forth 代码的屏幕,在这个实现中它将是 1000 字节的文本和一个 24 字节的换行表,因为我也在利用 PET ROM 屏幕编辑器。我正在寻找的是对任何会(可能)为此目的击败简单运行长度编码的建议,但没有像 Lempel-Ziv 这样复杂的东西的 CPU 和内存开销。除了“忘记它”之外的所有建议都表示赞赏。
【问题讨论】:
-
你可以看看Huffman coding。
-
我使用code.google.com/p/lzfx,仅用于解压缩,我认为您仍然会用完大部分/全部 32K,因此它可能不够轻巧。但如果你看的是概念而不是实现,它是经过一些优化的运行长度。如果该字符串是最近遇到的,而不是一堆 a 的一个字节、b 的一个字节、c 的一个字节,那么它是一条从地址 current-X 复制 N 个字节的指令。
-
stackoverflow 上有一个关于轻量级嵌入式压缩的问答。还有其他好看的建议。
-
@dwelch:你的意思是this one?
-
如果您有许多重复序列的字符串,您可以使用编码词进行字典查找。如果它确实由各种常见的字符串序列组成,那么它实现起来很简单,速度很快,并且可以很好地适用于各种类型的文本。这个想法是查看数据并了解冗余的位置并利用它。 Lempel-Ziv 是“重”的,因为它被设计为在各种数据的一般情况下运行良好。在这种情况下,您可以利用一种非常特殊的数据。
标签: assembly compression forth 6502