【问题标题】:How to check for flags being set for 8085 simulator如何检查为 8085 模拟器设置的标志
【发布时间】:2019-02-19 16:48:07
【问题描述】:
    byte x = 0x0c;
    byte y = 0x05;

    System.out.println((x&0xf) + (y&0xf)); // if > 15 then af on
    System.out.println((b&0xf) - (c&0xf));  
    System.out.println((int)(b&0xff) + (c&0xff)); // if > 255 then cf on    
    System.out.println(((int)(b&0xff) + (c&0xff)) & 0b10000000); // if 128 sign flag set
    System.out.println((int)(b&0xff) - (c&0xff)); // if less than 0 then cf set
    System.out.println(((int)(b&0xff) - (c&0xff)) & 0b10000000); //if 128 then sign flag set

我正在构建一个 8085 模拟器,并且在算术和逻辑指令下,我试图找到一种可靠的方法来检查何时设置或取消设置 5 个标志。

在这 5 个标志中,符号标志、零标志和奇偶标志很容易检查,但是进位和辅助进位标志变得复杂。我的接近检查进位标志和辅助进位标志的方法贴在上面似乎不太可靠。

欢迎任何更好/更清洁/更优化的解决方案。我也一直在使用 www.sim8085.com 来检查我的迷你代码 sn-ps 并检查哪些标志被打开,这是我到达下一个问题的地方:

    mvi a, ffh
    mvi b, cch
    sub b
    hlt

当我运行这段代码时,辅助标志被设置。据我所知,只有从低半字节到高半字节有进位,辅助标志才会被设置。因此,我无法理解其背后的逻辑。

还想知道是否所有标志都仅受累加器更改或其他影响?

编辑:

        byte b = 0x2f;
        byte c = 0x2c;

        byte d = (byte) ((byte) (b&0xf) + (c&0xf)); 
        byte e = (byte) ((byte) (b&0xf) + ((~c)&0xf) + 1); 

        int x = (int) ((b&0xff) + (c&0xff));
        int y = (int) ((int) (b&0xff) + ((~c)&0xff) + 1); 

        System.out.println(y);
        System.out.println((d>0xf) + "\t" + (e>0xf));
        System.out.println((x>0xff) + "\t" + (y>0xff));

我尝试使用此逻辑来查看它是否适用于所有数学运算,显然这并不能可靠地检查是否应设置进位或辅助进位标志。请帮我弄清楚如何可靠地检查操作是否导致进位标志和辅助进位标志被设置或取消。

【问题讨论】:

  • 设置:或位值sr |= BIT; 复位:与位值取反:sr &= ~BIT;
  • 我的意思是如何执行检查是否设置或取消设置进位标志,与辅助进位标志相同
  • 那么,进位标志在哪个位?
  • 第 0 位为进位,第 4 位为辅助进位
  • 那么如何只测试第 0 位的位置呢? (提示:看看我上面贴的两个方程。)

标签: java 8085


【解决方案1】:
        byte b = (byte) 0x1c;
        byte c = (byte) 0xff;

        char a = (char) (Byte.toUnsignedInt(b) + Byte.toUnsignedInt(c));
        char d = (char) (Byte.toUnsignedInt(b) - Byte.toUnsignedInt(c));

        System.out.println(Integer.toHexString(a));
        System.out.println(Integer.toHexString(d));

        if(a > 0xff) {
            System.out.println("Add Carry");
        }

        if(d > 0xff) {
            System.out.println("Sub Carry");
        }

        if((Byte.toUnsignedInt(b) & 0xf) + (Byte.toUnsignedInt(c) & 0xf) > 0xf) {
            System.out.println("Add Aux Carry");
        }

        if((Byte.toUnsignedInt(b) & 0xf) + (Byte.toUnsignedInt((byte) ~c) & 0xf) + 1 > 0xf) {
            System.out.println("Sub Aux Carry");
        }

我做了一些进一步的检查,发现 char 数据类型在 java 中是无符号的,因此它可以与上述逻辑一起使用以获得所需的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2018-12-03
    • 2011-10-20
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多