java - 用Java模拟ADC指令

标签 java bcd

我正在尝试用 Java 创建 MOS6502 的 ADC 指令。更具体地说,ADC 十进制指令,它使用 BCD 整数表示而不是 2 的补码表示。该指令被修改为仅涉及添加 8 位数字,而不是像普通指令那样添加 16 位数字。

下面的代码可以成功添加 1+1,但在尝试将 49 (73) 美元和 1 加在一起时输出 0,我不确定为什么会发生这种情况。

在这些测试中,进位位始终设置为 0。

private int adcDecimal(int a, int op)
    {
        System.out.println("[CPU] ADC-Decimal: " + a + " + " + op + " + " + getCarryBit());

        int tmp;
        int result;

        tmp = (a & 0x0f) + (op & 0x0f) + getCarryBit();
        if((tmp & 0xff) > 9) 
            tmp += 6;

        result = (tmp & 0x0f);
        result &= 0xff;

        setCarryFlag(tmp > 7);
        setZeroFlag(result == 0);
        setOverflowFlag(false);

        negativeFlag = (result & 0x80) != 0;

        System.out.println("[CPU] ADC-Decimal result: " + result);

        return result;
    }

最佳答案

代码:

public class MOS6502 {

    boolean negativeFlag;

    private int getCarryBit() { return 0; }
    private void setCarryFlag( boolean flag ) {}
    private void setZeroFlag( boolean flag ) {}
    private void setOverflowFlag( boolean flag ) {}

    private int adcDecimal( int a, int b ) {
        System.out.printf("[CPU] ADC-Decimal: %04X + %04X + %d",
            a, b, getCarryBit());
        int tmp =
            10*(( a & 0xf0 ) >> 4 ) +
                ( a & 0x0f ) +
            10*(( b & 0xf0 ) >> 4 ) +
                ( b & 0x0f ) +
            getCarryBit();
        setCarryFlag( tmp > 0x99 );
        int result = 0;
        int digit = 0;
        while( tmp > 0 ) {
            result |= (tmp % 10) << (4*digit++);
            tmp /= 10;
        }
        setZeroFlag( result == 0 );
        setOverflowFlag( false );
        negativeFlag = (result & 0x80) != 0;
        System.out.printf(", result: %04X\n", result);
        return result;
    }

    public static void main(String[] args) throws Exception {
        MOS6502 mos6502 = new MOS6502();
        mos6502.adcDecimal(    1,    1 );
        mos6502.adcDecimal(    1,    4 );
        mos6502.adcDecimal(    8,    5 );
        mos6502.adcDecimal( 0x48, 0x49 );
    }
}

输出:

$ javac MOS6502.java ; java MOS6502
[CPU] ADC-Decimal: 0001 + 0001 + 0, result: 0002
[CPU] ADC-Decimal: 0001 + 0004 + 0, result: 0005
[CPU] ADC-Decimal: 0008 + 0005 + 0, result: 0013
[CPU] ADC-Decimal: 0048 + 0049 + 0, result: 0097

关于java - 用Java模拟ADC指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49101181/

相关文章:

java - 如果匹配 II、III、IV、V、VI、VII、VIII、ESQ、JR、SR,则删除后缀中的最后一个单词

java - Vaadin:垂直表

c++ - 如何将 QBytearray BCD 转换为十进制 QString 表示形式?

python - 将金额 (int) 转换为 BCD

java - 如何在 Linux 中为我的 Java 项目创建 Windows 安装程序?

java - 将工资数组中的值相乘

java - Java 中的伪一流函数?

c - 十六进制到压缩 BCD 的转换?

bcd - self 补码(Excess 3,84-2-1,2 * 421)