ICE-FORTH:6502上用于创建NES盒式磁带的自托管Forth

2020-07-25 21:37:58

汇编代码(.s文件)被编译成初始盒式磁带bootstrap.bin。这是一个64KB的文件,包含启动时用于下一步的全部内存空间。在这个领域里,我们已经掌握了带集成汇编器的ForthInterpreter的基础知识。(这只占全部64个中的几个KB)。

6502.lua将bootstrap.bin加载到内存中,并使用一个到处都是RAM的虚拟盒式磁带在NES处理器上模拟运行解释器,模拟器有一个重要的附加IO端口,用于输入Forth代码和获取Forth输出。

FORTH环境的最小子集是在汇编中定义的,因此下一步是将bootstrap.f内容中的WESTREAM输入到正在运行的盒式磁带。这定义了基本FORH环境的其余部分。

其他Forth代码在流入的其他文件中定义,然后REPL打开供用户测试单词。这第四个代码被编译成将成为NES上的盒式磁带空间,并定义了NES程序。模拟在执行单词Freeze时结束。

冻结会将正在运行的解释器变成ROM。解析器中的NES RAM的内容被压缩并移动到盒式磁带空间中,以便在冻结完成后可以恢复,但第四个数据、返回和控制流堆栈被清空。第四个内部临时位置也被清空。写入压缩数据后,$8000-$FFFF的存储空间现在永久冻结。这段内存成为out.nes文件的PRG数据。

现在创建了NES ROM。解冻这个词是启动词。它将恢复机器的状态并返回,就像从冻结一词中返回一样。

使用ca65和ld65可执行文件的路径编辑Makefile,确保安装了luajit。

欢迎使用Forth!\汇编程序用法:oam-dma[十六进制精灵>;字节LDA.#4014 STA decimal];

在运行时,将指令及其参数追加到Chere的代码区域。例如,LDA的第四个定义如下所示:

在编译时,编译对[ASM](RUN_ASM)的调用,其中内联参数指示指令的操作码和参数字节数。[ASM]将处理指令的运行时语义。

其中包括一个用C++编写的简单仿真器。它是一个非常基本的仿真器,即使在基本操作中也可能有错误,并且并不是所有的指令都受支持。(例如,不支持BRK和中断)。像NES一样,它不包括。

$FF进入跟踪模式。在跟踪模式下,每条指令都记录有关于机器状态的信息。

401C美元的IO端口为REPL供电。仿真器逐行读取标准输入,在$401C上读取返回输入的下一个字节,如果没有,则阻塞。写入立即发送到标准输出。

当执行JMP 0时,仿真器干净地退出。退出时,仿真器写出几个文件:

Out.nes-生成的NES文件。这是退出时$8000-$FFFF处的内存内容。添加了16字节的INES报头。

Ops.out-仿真器自启动以来处理的内存写入和IO输入的日志。使用visual alize-ops.html,您可以看到Forth编译器工作的动画。它显示了一个256x256的网格,它将每个字节表示为一个正方形,以及从IO端口读取的每个字符。