Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Поиск (http://zx-pk.ru/forumdisplay.php?f=78)
-   -   ПК Поиск - Эмуляция (http://zx-pk.ru/showthread.php?t=7491)

Tronix 17th December 2013 17:07

Quote:

Originally Posted by b2m (Post 653032)
А можно по шагам расписать, как работает этот код? Каким образом получается +7 для чисел, больших 9?

Честно - я его откуда-то скопипастил в лихих 90стых, поэтому не вникал. Но много где его юзал в своих програмульках, они работали нормально. Поэтому объяснить как это работает затрудняюсь, но это точно работает на реалах.

b2m 17th December 2013 17:10

Видимо, я не совсем понимаю, как работает aad

Tronix 17th December 2013 17:17

AAD : AL = AH*x + AL ;AH = 0
И все флаги от результата AX- (SF, ZF, PF, OF, CF, AF)

b2m 17th December 2013 17:21

Хорошо, флаги я забыл сделать, но AL=AH*x+AL именно так я и сделал. Разве что старший байт после умножения я отбросил, но ты пишешь AH=0...

---------- Post added at 17:21 ---------- Previous post was at 17:20 ----------

Есть такой вот тест, но он явно не пройдёт у меня :)

Tronix 17th December 2013 17:51

2 Attachment(s)
Ну я не знаю как так может быть. Вот в тесте печатает hex числа от 0 до FE.
Некоторые сорцы из эмулей:

Code:

                        case 0xD5: /*AAD*/
                        tempws=FETCH();
                        AL=(AH*tempws)+AL;
                        AH=0;
                        setznp16(AX);
                        cycles-=60;
                        break;

Code:

/* OP D5: AAD imm8 */
static
unsigned op_d5 (e8086_t *c)
{
        unsigned short s1, s2, d;
        unsigned short mul;

        mul = c->pq[1];

        s1 = e86_get_ah (c);
        s2 = e86_get_al (c);

        d = mul * s1 + s2;

        e86_set_ax (c, d & 0xff);
        e86_set_flg_szp_16 (c, d);
        e86_set_clk (c, 60);

        return (2);
}

Code:

                                        case 0xD5:        /* D5 AAD I0 */
                                                oper1 = getmem8 (segregs[regcs], ip);
                                                StepIP (1);
                                                regs.byteregs[regal] = (regs.byteregs[regah] * oper1 + regs.byteregs[regal]) & 255;
                                                regs.byteregs[regah] = 0;
                                                flag_szp16 (regs.byteregs[regah] * oper1 + regs.byteregs[regal]);
                                                sf = 0;
                                                break;


b2m 17th December 2013 18:20

Проблема оказалась в команде aaa, забыл ah обновить. Теперь пишет как и положено - 005D.
Обновил эмулятор.

Tronix 17th December 2013 18:25

1 Attachment(s)
Гуд, будем копать дальше :) На всякий случай собрал тест AAD, должен выводить 3FFF. DosBox кстати неправильно работает -)
Ваш эмуль тоже не проходит тест. PCem так же не проходит. На моем Поиске выдает 3FFF, как и положено.

Tronix 17th December 2013 19:35

Также не учитывается еще одна особенность 8088/86, а именно:
Code:

        push        sp                        ; save SP on stack to look at
        pop        bx                        ; get SP saved on stack
        cmp        bx,sp                        ; if 8086/8088, these values will differ
        jz        short @Not_8086        ; nope, must be other CPU type
ret
@Not_8086:

Уйдет на выполнение @Not_8086. Разница в том, что 86 в стек записывает уже отнятое значение сегмента стека SP-2, а 286 и дальше - нет:
Code:

; 8086/80186                80286+
; {                        {
;  SP          = SP - 2          TEMP        = SP
;  SS:SP = SP                  SP        = SP - 2
; }                          SS:SP = TEMP
;                        }

Из-за этого вполне может не выдавать Info о системе pctools, например...

Tronix 17th December 2013 22:08

1 Attachment(s)
Так же интересно, почему если в качестве биос подсунуть некий тест, эмуль вообще падает по ексепшену. Тест div.bin, там устанавливается вектор прерывания int 00h, далее в коде происходит деление на ноль. Должно сгенерироваться int 0, но где-то тут наверно происходит крах системы -) В то же время, подобный тест sub.bin отрабатывает без ошибок. Правда в нем нет никаких обработчиков прерываний. Файлы res_div.bin и res_sub.bin содержат эталонные значения, с которыми можно сравнить содержимое памяти начиная с 0000:0000. В случае sub.bin все верно, ну кроме старших бит во флагах, но это так и должно быть. А вот с div.bin непонятно, так как эмуль падает.

Tronix 17th December 2013 23:01

1 Attachment(s)
С умножением похоже нелады во флагах после операций. И это не только старшие биты. Запускать вместо BIOS, потом сравнить память с res_mul.bin Флаги это важно, возможно checkit из-за этого падает с math-error


All times are GMT +4. The time now is 04:56.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.