Как проверить, установлены ли флаги для симулятора 8085 - PullRequest
0 голосов
/ 19 февраля 2019
    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));

Я попытался использовать эту логику, чтобы увидеть, работает ли она для всех математических операций, по-видимому, это также не позволяет надежно проверить, должен ли быть установлен флаг переноса или вспомогательный перенос.Пожалуйста, помогите мне выяснить, как надежно проверить, приводит ли операция к установлению или снятию флага переноса и флага вспомогательного переноса.

1 Ответ

0 голосов
/ 28 февраля 2019
        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, и, следовательно, его можно использовать с приведенной выше логикой для получения требуемых результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...