assembly - 6502轻量级压缩算法

标签 assembly compression forth 6502

我正在 Commodore PET 上的双盒式磁带录音机上实现虚拟内存(为了好玩),用于我正在编写的 Forth。到目前为止我所拥有的是http://github.com/chitselb/pettil如果你有兴趣。

我计划使用 PET 的原生 192 字节盒式磁带数据文件格式。哦,是的,只有 32K RAM 可以满足一切。我在该语言中嵌入了 Woz 优秀且非常节省内存的 Sweet-16 解释器。

Forth block (通常)为 1024 字节。为 block ID 添加两个字节将可用虚拟地址空间限制为 64 兆,远远超过磁带所能容纳的大小。将有一个“播放”卡座(设备 1)和一个“记录”卡座(设备 2),并且 FLUSH 将涉及将整个虚拟内存从一个驱动器复制到另一个驱动器。风车为什么要倾斜?因为在过去,大多数 PET 用户都拥有盒式磁带,包括自备磁带。

大部分数据将是 Forth 代码的屏幕,在此实现中将是 1000 字节的文本和 24 字节的换行表,因为我也在利用 PET ROM 屏幕编辑器。我正在寻找的是任何能够(可能)击败简单运行长度编码的建议,但没有像 Lempel-Ziv 这样复杂的东西那样的 CPU 和内存开销。除“忘记它”之外的所有建议均表示赞赏。

最佳答案

如果您最担心的是 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 源代码的一些方法。玩得开心!

关于assembly - 6502轻量级压缩算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18788388/

相关文章:

c - 段错误 - 调试程序集 gdb

c# - 用 RAR 压缩文件

symfony - Assetic Symfony2 less+compress 过滤器

c++ - 读取和霍夫曼压缩 4 字节二进制字符串 STD C++ Linux 环境

forth - 在 Mac 上编译 Gforth 时出现问题

forth - 在 Forth 中打印函数的定义

c - 表示已知大小变量的表达式结果的最少位数?

linux - 在汇编程序中编写 linux 内核模块时的内存访问

c - EggHunter 找不到蛋,导致无限循环

arrays - Forth 中的多字节存储和获取 - 如何实现?