5
8位虚拟机
背景 我喜欢旧的8位6502芯片。在6502机器代码中解决PPCG方面的一些挑战甚至很有趣。但是,一些应该很简单的事情(例如,读入数据或输出到stdout)在机器代码中不必要地麻烦。因此,我想到一个粗略的想法:发明我自己的8位虚拟机,该虚拟机受6502的启发,但修改后的设计使其更能应对挑战。开始实施某些东西时,我意识到如果将VM的设计减少到最低限度,这本身就是一个不错的挑战:) 任务 实现符合以下规范的8位虚拟机。这是code-golf,因此以最少的字节数实现。 输入值 您的实现应采用以下输入: 一个无符号字节pc,它是初始程序计数器(0基于VM的内存开始执行的内存中的地址) 具有最大256条目长度的字节列表,这是虚拟机的RAM(及其初始内容) 您可以采用任何合理的格式输入此信息。 输出量 字节列表,这是VM终止后RAM的最终内容(请参阅下文)。您可以假设您只得到导致最终终止的输入。允许使用任何明智的格式。 虚拟CPU 虚拟CPU具有 一个8位程序计数器 一个8位累加器寄存器称为A和 一个称为的8位索引寄存器X。 有三个状态标志: Z -在执行某些操作后置零标志 0 N -在某些操作导致负数之后设置负标志(现在将结果的第7位设置为1) C -进位标志由加法设置,并移位结果的“缺失”位 在开始的标志被全部清零,程序计数器设置为给定值和内容A,并X是不确定的。 8位值代表 范围内的无符号整数[0..255] 有符号整数(2的补码),范围为[-128..127] 取决于上下文。如果某个操作上溢或下溢,则该值会回绕(如果加法,进位标志也会受到影响)。 终止 虚拟机在以下时间终止 一HLT到达指令 访问了不存在的内存地址 程序计数器在内存外部运行(请注意,即使VM被提供了完整的256字节内存,它也不会回绕) 地址模式 隐式 -指令没有参数,隐含操作数 立即数-操作数是指令之后的字节 相对 -(仅用于分支)指令后的字节被签名(2的补码),并确定执行分支后要添加到程序计数器的偏移量。0是以下指令的位置 绝对 -指令后的字节是操作数的地址 索引 -指令加号X(寄存器)之后的字节是操作数的地址 使用说明 每条指令都由一个操作码(一个字节)组成,在寻址模式下是即时,相对,绝对和索引第二个参数字节。当虚拟CPU执行一条指令时,它会相应地(由1或2)递增程序计数器。 此处显示的所有操作码均为十六进制。 LDA -将操作数加载到 A …