【问题标题】:6502 lightweight compression algorithms6502轻量级压缩算法
【发布时间】: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


【解决方案1】:

如果是您最担心的 Forth 源代码,您可以将字符集限制为 Chuck Moore 为 colorForth 选择的 48 个字符,并使用 his Shannon coding scheme,这样平均每个字符 5.2 位。他还声称 colorForth 源代码的大小只有目标代码的两倍左右。顺便说一句,arrayForth 中的字符集似乎略有不同(请参阅pg. 47 of the User's Manual - 不同的数字顺序、撇号而不是冒号等)。

当然,使用香农编码与彩色单词无关。如果您想一路存储 预解析 单词,就像在 colorForth 中一样,您可以使用 his scheme here

他没有提供太多细节,但对于 etherForth,他放弃了香农编码和 went with a simple 6-bit encoding 使用相同的字符集,11xxxx 还表示他用于颜色和标记的 16 位标签,包括 F18 指令和一些汇编原语(begin、end、then、for)。这确实是一个非常酷的方案(尤其是在 18 位 F18 上,每个字有 3 个空间)。非常简单且非常紧凑。

总之,有一些想法。不是对您的压缩问题的直接回答,而是一些以良好压缩形式存储 Forth 源代码的方法。玩得开心!

【讨论】:

  • 目标是一个标准的 Forth,专为 Commodore PET 硬件设计,尽可能利用 PETSCII 字符集和内置 ROM 中的任何例程。它将在具有 1.0、升级或 4.0 BASIC ROM 的 PET 上运行,并且可以选择将目标编译到(在工厂 PET 中未使用)$9000-$AFFF 地址空间
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2012-10-30
  • 2017-09-06
  • 2023-03-12
  • 2013-05-04
相关资源
最近更新 更多