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 до сих пор нету?

b2m 18th December 2013 20:13

Quote:

Originally Posted by Tronix (Post 653533)
То есть 8088 когда пытаются записать в конец сегмента слово, пишет один байт по смещению FFFF, а второй который не лезет - по смещению 0000.

Сделал так, всё равно пишет V20.

Tronix 18th December 2013 20:40

1 Attachment(s)
Ну, у меня тест из архива вообще детектит как 286 проц:

Tronix 18th December 2013 23:12

1 Attachment(s)
Вот этот тест детектит как 80188

b2m 19th December 2013 15:16

Quote:

Originally Posted by Tronix (Post 653631)
Вот этот тест детектит как 80188

Добавил баг 8086 (неверный возврат после прерывания команды rep с префиксом замены сегмента), теперь пишет как положено 8088. CheckIt по прежнему детектит как V20. Интересно, как он отличает V20 от 8088?

Tronix 19th December 2013 15:24

Quote:

Originally Posted by b2m (Post 653823)
Добавил баг 8086 (неверный возврат после прерывания команды rep с префиксом замены сегмента), теперь пишет как положено 8088. CheckIt по прежнему детектит как V20. Интересно, как он отличает V20 от 8088?

Баг какой-то не тот... cpuid1.com тестит 188 по по shl на число большее 32 (FF в данном случае). Если сдвигает - значит 86, если не сдвигает - значит 188.

b2m 19th December 2013 15:28

Добавил сброс флага Z после умножения, теперь детектится как 8088 :)

Tronix 19th December 2013 15:28

С _mhz я ошибся, он детектит как 188 тоже. И то же по этому же принципу. SHL и SHR 8088 может сдвигать на любое число в то время как 188+ только на "число mod 32"

b2m 19th December 2013 15:31

Quote:

Originally Posted by Tronix (Post 653824)
Баг какой-то не тот...

Без бага детектилось как V20, после того как я исправил команды сдвига. Качай новую версию. :)

---------- Post added at 15:31 ---------- Previous post was at 15:29 ----------

Но это всё мелочи. Надо разбираться с переполнением при запуске теста скорости...

Tronix 19th December 2013 17:32

Все, новая версия все ок. Единственное пожелание - все-таки сделать обработку DIV и IDIV нормальную, чтоб не валила эмуль при делении на ноль. А то не могу PC Doctor тест Interrupts запустить, валится. И да, нужно разбираться с переполнением.

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

---------- Post added at 15:43 ---------- Previous post was at 14:37 ----------

Еще вопрос - а как отлаживать программу во встроенном дебагере? Ну в смысле, как отловить момент запуска? А то я в ком строке набираю например SUPER.EXE, нажимаю Enter и открываю дебаг - а там уже прога завершилась. Может есть какая недокум фишка? Или встроить ее, например при записи в какой-нить порт открывать дебаг или при вызове int ffh или что то в этом духе? Чтоб можно было свои проги отлаживать. Или я чего-то не понимаю?

---------- Post added at 16:32 ---------- Previous post was at 15:43 ----------

И еще вопрос - почему эмулятор не работает с любыми другими FDD BIOS - выкидывает в монитор?

b2m 19th December 2013 18:13

Quote:

Originally Posted by Tronix (Post 653840)
Еще вопрос - а как отлаживать программу во встроенном дебагере? Ну в смысле, как отловить момент запуска?

Я делаю так:
- запустил программу, вышел из неё
- открыл отладчик, поиском нашёл начало (несколько байт в точке входа)
- поставил туда бряк, запустил эмуль дальше (F5) и снова запустил программу

С .com файлами проще, они грузятся и запускаются по одному и тому-же адресу. У меня, например, после загрузки голого ДОСа, точка входа всегда одинаковая 0EBB:0 (ну или 0EAB:100, хотя я использую абсолютное смещение 0xEBB0, привычнее набирать без двоеточия). Ставлю бряк туда сразу после запуска отладчика.

Quote:

Originally Posted by Tronix (Post 653840)
И еще вопрос - почему эмулятор не работает с любыми другими FDD BIOS - выкидывает в монитор?

Если другой BIOS рассчитан на другой контроллер - то понятно. А если на такой-же, то выкладывай свой BIOS, я поковыряю-потрассирую.

Tronix 19th December 2013 18:33

1 Attachment(s)
Quote:

Originally Posted by b2m (Post 653907)
Если другой BIOS рассчитан на другой контроллер - то понятно. А если на такой-же, то выкладывай свой BIOS, я поковыряю-потрассирую.

Ну ВГ93 она ж вроде и в африке ВГ93. Порты то не меняются, а как я понимаю, контроллер через них с вгшкой общается. Вот три разных BIOS от флоповых контролллеров, во всех случаях эмуль вываливается в монитор (F1 - работа с кассетой, F2 - работа с ПЗУ). Я понимаю, если бы вис или там с дискеты не грузился, но это странное поведение какое-то.

b2m 19th December 2013 20:14

Все три работают, вот только контрольная сумма у всех трёх 0EDh, а не ноль. Биос их даже не пытается запустить. Если подправить регистр al после суммирования - всё работает. Подозреваю, рассчитаны на другой биос, который иначе считает КС.

---------- Post added at 20:14 ---------- Previous post was at 19:46 ----------

А, я понял. Третий байт ПЗУ - длина (количество блоков по 512 байт), в этих ПЗУ указано 16 блоков, хотя реально лишь 4 блока. Если просуммировать 4 блока, то будет ноль. Я разместил ПЗУ подряд, а реально было видимо с дырками, заполненными байтом FF. Если дополнительно просуммировать 256*n байт FF, то КС не изменится.

Тогда вопрос - по каким адресам реально были размещены ПЗУ?

Tronix 19th December 2013 20:17

Контрольная сумма у всех трех = 00h. Считается сложением всех байт файла (последний байт тоже считается). Опкод OR AL,AL устанавливает флаги ZF?

Ща посмотрю на Поиске по каким адресам

Tronix 19th December 2013 20:46

2 Attachment(s)
E000:0 - FDD
E200:0 - HDD

Но я чото запутался, да, FDD репортует о 8кб, и типа если читать 8 кб из памяти - то FDD BIOS там несколько раз повторяется. Наверное такая дешифрация. У HDD все нормально, 2 Kb. На всякий случай снял дамп вот этой прогой: http://www.mess.org/_media/dumping/dumppc.zip - файл DUMP.BIN, а так же своей поделкой - файлы E000.rom и E200.rom

UPD: Заработал мой файл-командер. Пока с ним разбирался заметил, что: diet v1.44 (упаковщик EXE файлов) неправильно сжимает EXE - во первых результативный файл больше по размеру чем если его же сжимать на Поиске, во вторых такой файл конечно не запускается а виснет. И еще наблюдаю иногда глюки с неправильными аттрибутами символов в коммандере.

shattered 19th December 2013 22:56

Quote:

Originally Posted by Tronix (Post 653918)
Ну ВГ93 она ж вроде и в африке ВГ93. Порты то не меняются, а как я понимаю, контроллер через них с вгшкой общается. Вот три разных BIOS от флоповых контролллеров,

А чем они друг от друга отличаются?

Tronix 19th December 2013 23:04

Quote:

Originally Posted by shattered (Post 654032)
А чем они друг от друга отличаются?

А хз. :)

shattered 19th December 2013 23:11

А прошивка КЖД версии 1.7 есть? :)

Tronix 19th December 2013 23:12

Quote:

Originally Posted by shattered (Post 654041)
А прошивка КЖД версии 1.7 есть? :)

Ну вон же она, несколькими постами выше. E200h.rom

Tronix 22nd December 2013 13:59

Короче хотел воспроизвести ошибку, по которой падает Checkit в бенчмарке с
Code:

run-time error M6104: MATH
- floating point error: overflow

checkit, согласно http://thomas.fach-pedersen.net/compiler-copyrights.txt , скомпилен Microsoft C 5.1, о чем говорит строка с копирайтом в EXE:
Code:

MS Run-Time Library - Copyright (c) 1988, Microsoft Corp\x11
Установил MS C 5.1 (еле нашел), компилял какую-то писькомерку, перемножающую массив рандомных чисел несколько раз:
Code:

/*
 * ATFLOAT -- PC Tech Journal Floating-Point Performance Test
 *
 * Version 1.01
 * Last modified 11/04/86
 * Copyright (c) 1986, Ziff Communications Company
 * Program by: Paul Pierce, Ted Forgeron, Steven Armbrust
 *
 * Measures the time it takes to multiply two matrices of
 * double-precision floating-point numbers and compares it
 * to the time it takes an 8MHz PC/AT with an 80287 math
 * coprocessor to do the same.
 */

#include <stdio.h>
#include <time.h>

/* Number of iterations the test runs for. */
#define TRIALS 10

/* Dimension of the matrix */
#define SIZE 20

unsigned rand();

double drand()
{

        return (double)rand() / 32767;
}

double a[SIZE][SIZE];
double b[SIZE][SIZE];

main()
{
        int i;
        register j, k;
        int n;
        unsigned long start;
        unsigned long total;
        unsigned trials;
        double t;

        trials = TRIALS;

        /*
        * Fill matrix with random numbers.
        */

        for (i = 0; i < SIZE; i++)
                for (j = 0; j < SIZE; j++)
                        a[i][j] = drand();

        /*
        * Repeatedly multiply the matrices and
        * report the relative and absolute times.
        */

        start = time(NULL);
        printf("\nATFLOAT -- PC Tech Journal AT Floating-Point");
        printf(" Performance Test\n");
        printf("Version 1.01, Copyright (c) 1986 Ziff ");
        printf("Communications Co.\n");
        printf("\nThis test runs for %d iterations ...\n", trials);
        for (n = 1; n <= trials; n++) {
                printf("%d\r", n);
                for (i = 0; i < SIZE; i++) {
                        for (j = 0; j < SIZE; j++) {
                                t = 0;
                                for (k = 0; k < SIZE; k++)
                                        t += a[k][j] * a[i][k];
                                b[i][j] = t;
                        }
                }
        }
        total = time(NULL) - start;
        printf("\rElapsed time is %ld seconds.\n\n", total, trials);
        printf("Floating-point performance index relative\n");
        printf("to 8MHz IBM PC/AT with 80287 = %2.1f\n",
                94.0 / (float) total);

}

Значит у MS C 5.1 есть несколько вариантов как работать с вещественными:
Code:

/IFPa Produces floating-point calls and selects alternate math library
/IFPc Produces floating-point calls and selects emulator library
/IFPc87 Produces floating-point calls and selects 8087/80287/80387 library
/IFPi Produces in-line instructions and selects emulator library
/IFPi87 Produces in-line instructions and selects 8087/80287/80387 library.

Я пробовал компилить с /FPa, /FPc и соответственно с /FPi, который по дефолту. Все три варианта отрабатывают без ошибок :( Воспроизвести не смог.

Tronix 22nd December 2013 14:39

1 Attachment(s)
А не, как раз вариант с /FPi (дефолтный ключ) падает так:
Code:

run-time error M6101: MATH
- floating point error: invalid

Значит /FPi генерит прям в коде опкоды сопроцессора (fld, fmul и тд). Библиотека эмулятора смотрит - если есть сопроцессор, то оставляет все как есть, если нет - то эмулятор вроде устанавливается в NMI (int 02h) и когда происходит invalid opcode обрабатывает его. Самое интересное - исходники флоат пойнт эмулятора с этой ран тайм либы в архиве EMOEM.ASM
Code:

By default, IBM C/2 handles floating-point operations by generating
inline instructions (/FPi option). The emulator library is loaded, but if
a numeric coprocessor is present at run time, the coprocessor is
used instead of the emulator. This method of handling floating-point
operations works whether or not you have a coprocessor installed.


Так же в архиве ATFLOATI.EXE, ее листинг ATFLOAT.COD.

shattered 23rd December 2013 23:45

http://mame.dorando.at/svn/?rev=26689 -- Поиск-1 добавили в MESS.

Восстановил схему клавиатуры 91 года (отдельно не описывал, все в коде), насколько могу судить -- все работает. Родной HDC пока работать не будет, а XT-IDE я не проверял. Флоппи ведут себя странно -- можно загрузиться и нормально работать с A: до смены диска, после этого dos начинает скипать каждую вторую дорожку (в итоге каталог дискеты читается, но файлы уже нет)

В патч входят и другие вещи (ЕС-1847, скелет ПК-88 и клавиатуры Искры 1030) -- продолжение следует :)

shattered 24th December 2013 23:06

.... и вышел релиз MESS 0.152 с этим патчем. XT-IDE таки работает, но т.к. Поиск по-другому считает КС, нужно сначала стукнуть в бубен: "bpset fee68,ds==c800,{do ax=0200;go}" в отладчике перед стартом эмуляции). Итого:
http://img-fotki.yandex.ru/get/9836/...438c1f2_XL.png


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

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