Signetics 2650 & 2636 编程/BCD 算术
微处理器以二进制格式表示数字并执行算术运算的自然方式。人类更喜欢十进制记数法,因此当计算机想要与我们交流时,它必须将一种格式转换为另一种格式。另一种选择是强制计算机对二进制编码的十进制进行运算,其中每个十进制数字(0-9)由 4 位表示。可以用这四位表示的其他六个数 A16 - F16 毫无意义,这使得二进制运算比纯粹的二进制格式更复杂。例如,如果我们在二进制中进行 8 + 4 的加法,结果是 C16,在 BCD 中是毫无意义的。为了得到正确的结果,我们必须加上六,得到 1216。‘1’被进位到下一个最重要的数字。
这些视频游戏机中 BCD 的主要用途是显示得分,这是一个通常只增量的数字,因此我们在此的讨论将局限于 BCD 数字的加法。如果您的游戏需要减法、带符号整数运算或除法,下面参考文献中列出的应用备忘录将提供帮助。
2650 微处理器具有两个有助于 BCD 算术的功能。除了记录第 7 位进位的进位标志 (C) 之外,还有一个数位间标志 (IDC),它记录第 3 位的进位。还有一个特殊的指令,十进制调整寄存器 DAR,它在算术运算后检查这些标志,并对高半字节(第 4-7 位)和低半字节(第 0-3 位)进行适当的调整。在最高半字节的情况下,如果 C 为 0,则加上 1010;对于最低半字节,如果 IDC 为 0,则加上 1010。
下面列出的程序将一个 8 位数加到一个 16 位数,这将可能满足这些控制台中大部分得分处理需求。得分的 MSB 保存在 1F50 中,得分的 LSB 保存在 1F51 中。不要忘记得分寄存器 1FC8 和 1FC9 是只写寄存器,因此无法从它们中检索当前得分,必须将其保存在其他地方。
WinArcadia 调试器可用于逐步执行此程序以了解其工作原理。增量值和初始 16 位值需要使用内存编辑器设置。
0000 1F0004 : 0003 17 : 0004 7620 : 0006 7708 : 0008 7501 : 000A 0C1F51 : 000D 0D1F50 : 0010 0F1F52 : 0013 8466 : 0015 8566 : 0017 7501 : 0019 83 : 001A 94 : 001B 8500 : 001D 95 : 001E CC1F51 : 0021 CD1F50 : 0024 1B60 : : : : : : : : |
bcta,un start ; reset vector retc,un ; interrupt vector start: ppsu intinhibit ;inhibit interrupts loop: ppsl withcarry cpsl carry loda,r0 lsbA ; get the score loda,r1 msbA loda,r3 inc ; get the increment addi,r0 H'66' addi,r1 H'66' cpsl H'01' ; clear carry addz r3 ; perform BCD addition, scoreX = scoreX + r3 dar,r0 addi,r1 H'00' dar,r1 stra,r0 lsbA ; save result stra,r1 msbA bctr,un loop msbA equ $1F50 lsbA equ $1F51 inc equ $1F52 carry equ $01 withcarry equ $08 intinhibit equ $20 |