我正在Commodore PET上的双盒式磁带卡座上实现虚拟内存(为了好玩),用于我正在编写的Forth。 到目前为止,如果您有兴趣,我 http://github.com/chitselb/pettil
。我打算使用 PET 的原生 192 字节盒式磁带数据文件格式。 哦,是的,所有内容只有 32K 的 RAM。 我在语言中嵌入了 Woz 优秀且非常节省内存的 Sweet-16 解释器。
第四个块(通常)为 1024 字节。 为块 ID 添加两个字节可将可用虚拟地址空间限制为 64 meg,远远超过磁带所能容纳的空间。 将有一个"播放"卡座(设备 1)和一个"记录"卡座(设备 2),FLUSH 将涉及将整个虚拟内存从一个驱动器复制到另一个驱动器。 为什么要在风车上倾斜? 因为在过去,盒式磁带是大多数宠物主人拥有的,包括自己。
大部分数据将是 Forth 代码的屏幕,在此实现中将是 1000 字节的文本和一个 24 字节换行表,因为我也在利用 PET ROM 屏幕编辑器。 我正在寻找的是任何可以(可能)为此目的击败简单运行长度编码的建议,但没有像 Lempel-Ziv 这样复杂的东西的 CPU 和内存开销。 除了"忘记它"之外的所有建议,我们都会受到赞赏。
如果你最担心的是Forth源代码,你可以将字符集限制为Chuck Moore为colorForth选择的48个字符,并使用他的香农编码方案,平均每个字符5.2位。他还声称colorForth源代码的大小只有目标代码的两倍左右。顺便说一下,似乎 arrayForth 中的字符集略有不同(参见用户手册第 47 页 - 数字、撇号而不是冒号等的不同顺序)。
当然,使用香农编码与彩色单词不一定有关。如果你想一路走下去,像colorForth一样存储预先解析的单词,你可以在这里使用他的方案。
他没有给出很多细节,但对于etherForth,他放弃了香农编码,对同一字符集进行了简单的6位编码,其中11xxxx还表示了一个16位标签,他将其用于颜色和标记,包括F18指令和一些汇编器原语(开始,结束,然后,为)。这确实是一个非常酷的方案(尤其是在 18 位 F18 上,每个字可容纳 3 个)。非常简单且非常紧凑。
无论如何,有一些想法。不是对压缩问题的直接回答,而是以压缩良好的形式存储 Forth 源代码的一些方法。玩得愉快!