Speccy - наш выбор!

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

b2m 18th December 2013 12:27

Quote:

Originally Posted by Tronix (Post 653176)
Так же интересно, почему если в качестве биос подсунуть некий тест, эмуль вообще падает по ексепшену.

Нашёл таки :) Это не баг, это фича :)
Арифметические команды выполняются 1-в-1, т.е. деление так и будет выполнено ассемблеровской командой div. Вот только ексепшен я пока не отлавливаю. Об этом я знаю. Будет сделано, когда-нибудь.

Quote:

Originally Posted by Tronix (Post 653189)
С умножением похоже нелады во флагах после операций. И это не только старшие биты.

Странно. Учитывая, что умножение тоже выполняется командой mul. Я конечно проверю ещё сохранение флагов после ассемблерных вставок, но кто его знает, может есть разница в 16ти и 32х битных режимах.

Titus 18th December 2013 14:41

Quote:

Originally Posted by b2m (Post 653354)
Нашёл таки :) Это не баг, это фича :)
Арифметические команды выполняются 1-в-1, т.е. деление так и будет выполнено ассемблеровской командой div. Вот только ексепшен я пока не отлавливаю. Об этом я знаю. Будет сделано, когда-нибудь.

Твой эмуль написан не на си?

b2m 18th December 2013 16:55

Quote:

Originally Posted by Titus (Post 653397)
Твой эмуль написан не на си?

На 99,9% на си. Просто в данном случае я решил использовать ассемблерные вставки для арифметики, чтобы не заморачиваться с тем, как каждая команда выполняется, какие флаги устанавливает. Процессор-то тот же, что и эмулируемый :)

Titus 18th December 2013 17:09

Quote:

Originally Posted by b2m (Post 653487)
На 99,9% на си. Просто в данном случае я решил использовать ассемблерные вставки для арифметики, чтобы не заморачиваться с тем, как каждая команда выполняется, какие флаги устанавливает. Процессор-то тот же, что и эмулируемый :)

Как-то контрпродуктивно)
Я понимаю, вставлять асм для ускорения, но для аутентичности, причем сомнительной...

Tronix 18th December 2013 17:20

Quote:

Originally Posted by b2m (Post 653487)
Просто в данном случае я решил использовать ассемблерные вставки для арифметики, чтобы не заморачиваться с тем, как каждая команда выполняется, какие флаги устанавливает.

Если вы хотите предсказуемого поведения, боюсь заморочиться все-таки придется.

b2m 18th December 2013 17:36

Обновил эмуль. Исправил push sp и aad.

Quote:

Originally Posted by Tronix (Post 652631)
Смысл в том, что биты 12-15 регистра флагов на 8088 хрен поменяешь, они всегда аппаратно в единице.

Я вот одного не пойму - в конце дампа res_mul.bin сохранён регистр флагов, и там старшие 4 бита нулевые. А сам говорил, что они должны быть 1. Откуда дамп?

Tronix 18th December 2013 17:54

Дамп походу с 80188, поэтому в этих дампах старшие биты нулевые. Вот здесь я тесты выцепил: http://orbides.1gb.ru/80186_tests.zip Ну только перекомпилял FASM'ом под 8Kb и в div вставил STI в начале на всякий случай. На самом деле хз, насколько они правильные и откуда (под чем) снимались дампы. Возможно даже не под реальным процом а в эмуляторе. Поэтому доверять им тоже надо 50/50

Оригинальный тред со ссылкой на тесты: http://forum.osdev.org/viewtopic.php...6a485&start=15

---------- Post added at 16:54 ---------- Previous post was at 16:47 ----------

Quote:

Originally Posted by b2m (Post 653517)
Обновил эмуль. Исправил push sp и aad.

Пошел PCTOOLS с Info о системе. Пишет что установлен 80188 CPU :) Раньше был затык в месте определения проца. Изменилось поведение CheckIT - теперь на Benchmark не вылетает с math error, а висит :)

b2m 18th December 2013 18:00

Quote:

Originally Posted by Tronix (Post 653520)
Пошел PCTOOLS с Info о системе. Пишет что установлен 80188 CPU :)

Круто :) Подозреваю, из-за неправильного количества тактов команд mul/div. Времянки пока не соответствуют действительности.

Tronix 18th December 2013 18:24

Quote:

Originally Posted by b2m (Post 653530)
Круто :) Подозреваю, из-за неправильного количества тактов команд mul/div. Времянки пока не соответствуют действительности.

Ненене. Такты тут 99.99999% ни при чем. Вот в чем может быть дело:
Code:

;-----------------------------------------------------------------------------
; If this test passes, then we need some other means to differentiate between
; 8088/8088 and 80186/80188.  This method I will use comes from "80186/188,
; 80C186/C188 Hardware Reference Manual" from Intel, PN# 270788, page
; A-2:        "When a word write is performed at offset FFFFh in a segment, the
; 8086 will write one byte at offset FFFFh, and the other at offset 0, while
; an 80186 family processor will write one byte at offset FFFFh, and the
; other at offset 10000h (one byte beyond the end of the segment).
;-----------------------------------------------------------------------------
; Before we can blast a value out to FFFFh, we must save anything there, so
; we don't crash anybody else's data.
;-----------------------------------------------------------------------------
        mov        bx,ds:[0ffffh]                ; get original data
        mov        word ptr ds:[0ffffh],0aaaah        ; write signature at test location
        cmp        byte ptr ds:[0],0aah        ; 8086?
        mov        ds:[0ffffh],bx
        je        short @Test_V20
        inc        ah
        jmp        short CPU_8086_Exit

То есть 8088 когда пытаются записать в конец сегмента слово, пишет один байт по смещению FFFF, а второй который не лезет - по смещению 0000. 186 и 286 - пишут один байт по смещению FFFF, а второй байт уже в другой сегмент по смещению 0.

---------- Post added at 17:13 ---------- Previous post was at 17:07 ----------

Еще почему CheckIT пишет NEC V20 - может из-за того, что в 8088 после mul всегда устанавливается ZF, даже если результат не ноль, а в V20 флаги устанавливаются в зависимости от результата.

Code:

;-----------------------------------------------------------------------------
; The V20 and 8086 differ with respect to the handling of FLAGS during a MUL
; instruction.        The 8086 always sets ZF=0 (NZ).  The V20 sets ZF according to
; the result.
;-----------------------------------------------------------------------------
@Test_V20:
        push        ax                        ; save results
        xor        al,al                        ; force ZF
        mov        al,40h                        ; multiplicand
        mul        al                        ; V20 doesn't affect ZF
        pop        ax                        ; restore results
        jnz        short CPU_8086_Exit        ; Intel?
        or        ah,10h                        ; Set V20 flag
        jmp        short CPU_8086_Exit        ; go split

И еще насколько помню, что-то там было с SHL, SHR - в 8088 может сдвигать только на несколько бит вправо влево, тогда как V20 и 188 - хоть на 255 в CL. Может найду код, покажу.

---------- Post added at 17:24 ---------- Previous post was at 17:13 ----------

Наоборот походу, 8086 может сдвигать на сколько хош туда сюда, 186 - ограничено. Кодес:
Code:

          mov  cx,0121h                ; If CH can be shifted by 21h,
          shl  ch,cl                  ; then it's an 8086, because
          jz  short p1_8086          ; a 186+ limits shift counts.


Titus 18th December 2013 18:26

А что, подробной доки на 8086 до сих пор нету?


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

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