跳转到内容

Signetics 2650 & 2636 编程/BCD 算术

0% developed
来自维基教科书,开放的书籍,为开放的世界

二进制编码的十进制

[编辑 | 编辑源代码]

微处理器以二进制格式表示数字并执行算术运算的自然方式。人类更喜欢十进制记数法,因此当计算机想要与我们交流时,它必须将一种格式转换为另一种格式。另一种选择是强制计算机对二进制编码的十进制进行运算,其中每个十进制数字(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   

参考文献

[编辑 | 编辑源代码]


华夏公益教科书