重新尝试BASIC 6502 N字节整数加法?

时间:2014-02-20 21:39:40

标签: byte simulator addition basic 6502

我最初(寻求帮助)并在6502 pet模拟器中编写了一个BASIC程序,它添加了两个n字节整数。但是,我的反馈是它只是添加了两个16位整数(不添加n字节整数)。

任何人都可以通过查看我的代码帮助我理解这些反馈,并指出我正确的方向来制作一个增加两个n字节整数的程序吗?

感谢您的合作!

文档: 使用绝对索引寻址添加两个n字节整数。加数从内存位置开始,价格为0600美元,0700美元,答案为0800美元。整数的字节长度为$ 0600(¢ - > 256)

Machine Code:

18  a2  00  ac  00  06  bd  00
07  7d  00  08  9d  00  09  e8
00  88  00      d0

操作码,文档,变量:

A1 = $0600
B1 = $0700
B2 = $0800
Z1 = $0900

[START] = $0500

            CLC                 18             // loads x with 0
            LDX                 A2  00     // loads length on Y                     
            LDY         A1      AC  00  06     // load first operand                    
loop:       LDA         B1, x   BD  00  07     // adds second operand       
            ADC         B2, x   7D  00  08     // store result  
            STA         Z1, x   9D  00  09     // go to next byte       
            INX                 E8  00     // count how many are left       
            DEY                 88  00         // do more if needed         
            BNE    loop         D0

1 个答案:

答案 0 :(得分:3)

在我看来,您的代码就像您声称的那样 - 以小端字节顺序添加两个N字节操作数。我依稀记得我错过的青年时期6502的各种寻址方式,而且代码似乎很好。 X用于从两个数字索引当前字节,Y是以字节为单位的操作数长度的计数器,并循环遍历这些字节,存储在地址0x0700和0x0800,并将结果写入地址0x0900。

而不是将Commodore 64从阁楼中取出并试用,我使用了online virtual 6502 simulator。在这个站点上,我们可以设置内存地址并加载字节值。它们甚至链接到一个页面来组装操作码。因此,将内存位置0x0600设置为“04”,将0x0700和0x0800设置为“04 03 02 01”,我们应该看到此代码添加这两个32位值(0x01020304 + 0x01020304 == 0x02040608)。

单击PC寄存器并将其设置为0x0500逐步执行代码,然后单步执行,我们发现您的机器代码中存在错误。在编译为E8的INX之后,我们达到了一个假的0x00值(BRK)终止。下面更正的代码运行完成,通过读取内存0x0900可以看到预期的值。

0000        CLC             18
0001        LDX #$00        A2 00
0003        LDY $0600       AC 00 06
0006 LOOP:  LDA $0700,X     BD 00 07
0009        ADC $0800,X     7D 00 08
000C        STA $0900,X     9D 00 09
000F        INX             E8
0010        DEY             88
0011        BNE LOOP:       D0 F3

内存转储:

:0900  08 06 04 02 00 00 00 00
:0908  00 00 00 00 00 00 00 00