java - 如何检查为 8085 模拟器设置的标志
问题描述
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 来检查我的迷你代码片段并检查哪些标志被打开,这是我到达下一个问题的地方:
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));
我尝试使用此逻辑来查看它是否适用于所有数学运算,显然这并不能可靠地检查是否应设置进位或辅助进位标志。请帮助我弄清楚如何可靠地检查操作是否导致设置或取消设置进位标志和辅助进位标志。
解决方案
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 中是无符号的,因此它可以与上面的逻辑一起使用以获得所需的结果。
推荐阅读
- python - 在 Python 中更新作为字典中值的列表
- python-3.x - 从 sqlite db 中删除行仍然没有删除值并且大小越来越大
- python - 非常非常低的验证准确度和非常高的训练准确度 python
- html - 如何在禁用的链接上获得“不允许”光标
- php - PayPal IPN POST 结果为 0 PHP Laravel
- mysql - 如何用多字符分隔符缩写字符串行?
- sql-server - 嗨,我是sql初学者。我在(UDF)函数标量中有问题
- c++ - C++ - 只有在逗号本身之后打印另一个输出时,有没有办法打印出逗号?
- python - 如何在 Windows 上将 Python 3.8 切换到 Python 3.6 作为默认值?
- python - 是否可以(在 pygame 1.9.6 / python 3.8.6 中)通过方法移动角色?