UXN是8位虚拟堆栈计算机

2021-02-25 14:52:47

该项目的目标是创建一个能够托管各种工具和游戏的便携式虚拟机。它的设计最多应具有6502的复杂性,并且其汇编语言应易于阅读,并允许创建鼠标和键盘驱动的应用程序。 Uxn项目的分发应该类似于为控制台模拟器下载rom。

薄层是" Uxn仿真器"应该是该项目中唯一需要移植的部分,以使该设备可在任何新平台上使用。因此,Uxn的设计必须注重可移植性,以便它欢迎任何人尝试构建自己的实现。当前的仿真器是仅依靠SDL2的400线C89。

虽然目的是分发汇编的二进制文件,但要尊重工具生态系统的原理,但汇编源应与rom一起打包。与仿真器类似,汇编器的实现应极其简化,以免妨碍重新实现。 C89汇编器也是400行,没有依赖性。

状态寄存器的分布如下,它与寄存器选择器共享相同的字节。 BRK指令使用停止标志来停止cpu,short标志用于16个操作,当一条指令需要非零堆栈值进行操作时,将设置cond标志,而当操作员需要操作符时,将设置符号标志应该使用带符号的整数。

T C S H | | | + ----停止0x01 | | + ------短0x02 | + --------符号0x04 + ----------导线0x08

存储器末尾的地址用于将各种入口点保留在程序中。复位向量运行一次,每帧运行一次帧向量,并且在发生错误时运行一次错误向量。

CPU可以隧穿128个子例程,并通过返回堆栈找到返回的路径,跳转到子例程的操作码是JSR,从子例程返回的操作码是RTS。工作堆栈上的项目可以通过WSR临时发送到返回堆栈,并通过RSW返回。 Uxn会自动保留从一个堆栈移动到另一个堆栈的项目计数,如果尝试返回或转移到所有已返回的项目之前跳转到子例程,程序将停止。

有32个操作码,每个操作码占用一个字节的5位,其余3位用于选择堆栈中值的寻址模式。

指向存储器中地址的操作码一次从堆栈中拉出16位,并且表示为[a b],其中a和b字节组合成一个短字节。例如,[0xAB 0xCD]指向存储器地址0xABCD。

(hello world):dev / w fff9(常量写入端口)| 0100 @RESET#00 = dev / w(将dev / write设置为控制台),text1,print-label JSR(打印至控制台)BRK @ print-label(文本)@cliloop DUP2 LDR IOW(向控制台写入指针值)#0001 ADD2(增量字符串指针)DUP2 LDR#00 NEQ,cliloop ROT JMP吗? POP2(而* ptr!= 0转到循环)POP2 RTS @ text1 [Hello World]< 1 .00(将文本添加到内存,返回1个字节,添加空字节)| c000 @FRAME | d000 @ERROR | FFF0 [f3f0 [f30b f30a](调色板)| FFFA.RESET.FRAME.ERROR

每个操作为1字节(8位)。为了区分数字运算和运算,LIT操作码将文字模式切换为1个评估长度,而16位模式LIT2操作码将文字模式切换为2帧长度。

通过使用SHORT2模式,可以一次以16位(2字节)使用操作。

每个操作都有可能使用COND有条件地进行操作吗?模式,在下面的分支示例中,如果第一个值大于第二个值,则将值0xff添加到堆栈中,否则将添加0xee。

ROT用于将GTH的结果带到堆栈的顶部,有条件的JMP之后使用POP2除去堆栈上剩余的标签@那里的地址。

#06#05 GTH,有ROT JMP吗? POP2 @ here(小于或等于)#ee BRK @ there(大于或等于)#ff BRK 最多有256个设备可供两个I / 0运算符IOR(读取)和IOW(写入)访问,这些I / 0运算符用于与设备(例如屏幕,鼠标,键盘等)进行接口连接。 在设备中,必须在存储器中分配输入端口(fff8)和输出端口(fff9)字节。 屏幕一次支持4种颜色,这些颜色在特殊地址fff0-fff5中定义。 通过发送内存地址,位置和颜色字节,Uxn的sprite设备可以更轻松地将字符和图标绘制到屏幕上。 Sprite设备的颜色字节定义了要绘制的图层,要绘制的数据类型以及要使用的颜色。