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 14th December 2013 12:43

Что за "дамп ПЗУ палитры" такой? Дайте хоть посмотреть на это, а то я не вдупляю о чем вообще речь идет. В текстовом режиме палитра не меняется, да. Меняется только в 320x200. b2m - вы читали сообщение http://zx-pk.ru/showpost.php?p=648201&postcount=108 ? Что по поводу полноэкранного режима?

b2m 14th December 2013 13:14

Quote:

Originally Posted by Tronix (Post 651956)
Что за "дамп ПЗУ палитры" такой?

Имеется ввиду микросхема РТ4 (на схеме обозначена D50). Дамп есть в архиве PoiskComp.zip (первая страница этой темы, 8-ое сообщение).

Выглядит так:
Code:

00000000:  00 01 02 03 01 01 02 03 │ 02 01 02 03 03 01 02 03
00000010:  04 01 02 03 05 01 02 03 │ 06 01 02 03 07 01 02 03
00000020:  00 00 07 02 01 01 02 03 │ 02 02 01 01 03 03 04 01
00000030:  04 04 01 02 05 05 06 03 │ 04 04 07 01 07 07 00 01
00000040:  00 05 06 07 01 05 06 07 │ 02 05 06 07 03 05 06 07
00000050:  04 05 06 07 05 05 06 07 │ 06 05 06 07 07 05 06 07
00000060:  00 00 03 03 01 01 03 02 │ 02 02 05 01 03 03 05 04
00000070:  04 04 05 03 05 05 04 02 │ 04 04 03 01 07 07 01 04
00000080:  08 09 0A 0B 09 09 0A 0B │ 0A 09 0A 0B 0B 09 0A 0B
00000090:  0C 09 0A 0B 0D 09 0A 0B │ 0E 09 0A 0B 0F 09 0A 0B
000000A0:  08 08 0F 0A 09 09 0A 0B │ 0A 0A 09 09 0B 0B 0C 09
000000B0:  0C 0C 09 0A 0D 0D 0E 0B │ 0C 0C 0F 09 0F 0F 08 09
000000C0:  08 0D 0E 0F 09 0D 0E 0F │ 0A 0D 0E 0F 0B 0D 0E 0F
000000D0:  0C 0D 0E 0F 0D 0D 0E 0F │ 0E 0D 0E 0F 0F 0D 0E 0F
000000E0:  08 08 0B 0B 09 09 0B 0A │ 0A 0A 0D 09 0B 0B 0D 0C
000000F0:  0C 0C 0D 0B 0D 0D 0C 0A │ 0C 0C 0B 09 0F 0F 09 0C

Quote:

Originally Posted by Tronix (Post 651956)
В текстовом режиме палитра не меняется, да.

Теоретически, это зависит от прошивки указанной выше РТ4.

Quote:

Originally Posted by Tronix (Post 651956)
Что по поводу полноэкранного режима?

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

Попробуй добавить в конфиг строчки:
main.fullscreen=1280x1024x16
main.fullscreen.scale.x=2
main.fullscreen.scale.y=2

---------- Post added at 13:13 ---------- Previous post was at 13:10 ----------

Предварительно уточни в настройках видеокарты, поддерживается ли 1280х1024 16-цветов. Если нет, выбери другой режим. 1-в-1 (т.е. без масштабирования) это 640х400, но вряд-ли у тебя такой режим есть.

---------- Post added at 13:14 ---------- Previous post was at 13:13 ----------

Если режим не поддерживается, то он опять будет подобран автоматически и изменений ты не заметишь.

shattered 14th December 2013 13:26

Quote:

Originally Posted by b2m (Post 651948)
Я номеров не знаю, сэмулирован контроллер винчестера ATA.

В942 -- это MFM контроллер (он же "НЖМД - Адаптер 2470053").

А прошивку АTA BIOS взяли от Поиска или еще какую-то?

Quote:

Originally Posted by b2m (Post 651948)
4 цвета не имеют смысла. Цвет фона в обоих случаях (основной цвет точек и альтернативный) должен быть одинаковый. По крайней мере даже в имеющемся "неправильном" ПЗУ палитры это учтено. Вызывает сомнения тот факт, что в эксперименте на реальном Поиске бит выбора палитры никак не влиял на результат (фото test и test2).

Я имею в виду графику 320x200 и недокументировнную палитру 3, которая выставляется битом 2 ("черно-белый режим") порта 3D8.

b2m 14th December 2013 14:05

Quote:

Originally Posted by shattered (Post 651970)
А прошивку АTA BIOS взяли от Поиска или еще какую-то?

Прошивку брал из того-же архива. Выдаёт вначале:

Hard Disk BIOS "POISK" Version 1.1
Copyright (C) S.Kovalenko, 1990

Quote:

Originally Posted by shattered (Post 651970)
Я имею в виду графику 320x200 и недокументировнную палитру 3, которая выставляется битом 2 ("черно-белый режим") порта 3D8.

У Поиска 1 нет порта 3D8h, обращение к нему вызовет NMI. Единственный порт, который не вызывает NMI - это 3DAh, он транслируется в порт 62h. Подробности в прошивке РТ5 (D12, на схеме выглядит похоже на D17, но выше есть логика с таким индексом, а тут рядом D11).

---------- Post added at 14:03 ---------- Previous post was at 13:46 ----------

Кстати, если будешь разбираться с РТ5, там на схеме ошибка вроде. Бит адреса пронумерованы подряд 20...28, а судя по содержимому РТ5 должно быть 20..23,25..29.

---------- Post added at 14:05 ---------- Previous post was at 14:03 ----------

Из чего должно следовать, что порты дублируются: 2x=3x, 4x=5x, 6x=7x, 3Cx=3Dx

shattered 14th December 2013 14:07

Это b_hd_v11.rf2 с SHA1 57faa56b320abf801fedbed578cf97d253e5b777 ?

b2m 14th December 2013 14:11

SHA не считал, имя файла - да, такое.

shattered 14th December 2013 14:25

Крайне занятно. Разве это не прошивка от MFM контроллера? Как она работает с ATA?

b2m 14th December 2013 14:35

MFM там, или нет, это уже контроллер разбираться будет. А общение с контроллером идёт в 8-ми битном режиме ATA PIO Mode, используются те-же 8 портов, плюс порт данных декодируется в ещё одной области памяти, чтобы rep movsb можно было использовать.

shattered 14th December 2013 15:38

В942 не использует порты совсем, насколько я понимаю из схемы, только память (сегмент D000).

b2m 14th December 2013 15:59

Quote:

Originally Posted by shattered (Post 652015)
В942 не использует порты совсем, насколько я понимаю из схемы, только память (сегмент D000).

Так точно. Использовать порты внешние модули, я полагаю, не могли. Иначе зачем было делать не по стандарту (порты 1F0-1F7 для первого контроллера).
А где можно взять схемы всех внешних модулей?

shattered 14th December 2013 18:48

Схему В942 -- в соседней теме, http://zx.pk.ru/attachment.php?attac...8&d=1345582603

Но вопрос остается -- как прошивка от В942 у вас вообще работает? :)

---------- Post added at 17:48 ---------- Previous post was at 16:49 ----------

Оказалось, что эмуляция WD2010 в MESS пока не работает, поэтому пока В942 подключить не удастся. Оставляю пока для раздумий трассировку общения BIOS v1.4 с контроллером (все адреса в сегменте D000, читается всегда 0). Полагаю, что по адресам 08xx находится собственно ВГ7:
Code:

  1.154857: hdc                    R $0000 == $00
  1.154857: hdc                    R $0001 == $00
  1.154869: hdc                    R $0200 == $00
  1.154869: hdc                    R $0201 == $00
  1.154881: hdc                    R $0400 == $00
  1.154881: hdc                    R $0401 == $00
  1.154893: hdc                    R $0600 == $00
  1.154893: hdc                    R $0601 == $00
  1.154905: hdc                    R $0800 == $00
  1.154905: hdc                    R $0801 == $00
  1.154917: hdc                    R $0a00 == $00
  1.154917: hdc                    R $0a01 == $00
  1.154929: hdc                    R $0c00 == $00
  1.154929: hdc                    R $0c01 == $00
  1.154941: hdc                    R $0e00 == $00
  1.154941: hdc                    R $0e01 == $00
  1.231944: hdc                    W $0c00 <- $00
  1.231948: hdc                    W $0c00 <- $20
  1.231956: hdc                    R $0c00 == $00
  1.232003: hdc                    W $0801 <- $ff
  1.232159: hdc                    W $0c00 <- $08
  1.232162: hdc                    W $0c00 <- $28
  1.232207: hdc                    W $0806 <- $20
  1.232235: hdc                    W $0807 <- $16
  1.232253: hdc                    R $0c00 == $00


b2m 14th December 2013 19:13

Quote:

Originally Posted by shattered (Post 652047)
Но вопрос остается -- как прошивка от В942 у вас вообще работает? :)

Ну, она сначала не хотела работать, но потом я её сильно попросил, и она заработала :)

shattered 14th December 2013 19:28

Это как? :)

А другие карты эмулируете (джойстик, мышь, локальную сеть)?

b2m 15th December 2013 13:53

Нет пока.

Tronix 15th December 2013 14:12

Quote:

Originally Posted by b2m (Post 651961)
Пока не знаю. Можно попробовать прописать в конфиге определённый графический режим для полноэкранного режима. Подозреваю, что автоматический подбор режима выбрал один из 8-битных режимов, а палитра по каким-то причинам не задалась. В 16-ти, 24-х и 32-битных режимах палитра не используется и цвета должны быть нормальные.

Попробуй добавить в конфиг строчки:
main.fullscreen=1280x1024x16
main.fullscreen.scale.x=2
main.fullscreen.scale.y=2

Не помогло. Нативное разрешение у меня 1280x1024x32, пробовал и его и 16 бит и 800x600 - ноль изменений.

b2m 15th December 2013 14:25

Для 32-битных режимов нельзя делать scale.x (эмулятор может генерировать максимум 32 бита на точку). Странно, что не получилось с 16-битным режимом. Вобщем, пока не знаю, чем помочь.

Tronix 16th December 2013 13:00

1 Attachment(s)
b2m - а регистр флагов нормально обрабатываете? И вместе с ним, флаг trap, который должен переводить проц в режим пошагового исполнения команд (int 01).

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

На всякий случай тест для раздумий насчет trap в архиве.
UPD: На реальном Поиске соответственно должен выдавать: "Intel 8088 '81 or later, or Intel 80C88"

b2m 16th December 2013 17:42

1 Attachment(s)
Проблему с trap-ом решил, но checkit по прежнему вылетает :(

Tronix 16th December 2013 17:58

Ну, не видя сорцов мне трудно что либо сказать. Может по секрету (под NDA) все-таки покажите код эмуляции x86? И где бы новую версию с исправленным trap качнуть, попробую еще методом тыка поковырять...

b2m 16th December 2013 19:09

Quote:

Originally Posted by Tronix (Post 652599)
И где бы новую версию с исправленным trap качнуть, попробую еще методом тыка поковырять...

Я обновил архив с эмулятором на своём сайте.

---------- Post added at 18:23 ---------- Previous post was at 18:18 ----------

CheckIt вылетает, начиная тестировать какие-то "системные компоненты" на втором из 12 шагов. Видимо, не находит какого-то обязательного устройства. Знать бы, чего он тестирует, а то по шагам трассировать программу, написанную на ЯВУ довольно муторно, и мало чего понятно, чего она делает.

---------- Post added at 19:09 ---------- Previous post was at 18:23 ----------

Tronix, у меня какая-то неправильная версия CheckIt, она использует 32-битные команды (с префиксами 66h,67h). А какая версия использовалась на Поиске? И где её скачать?

Tronix 16th December 2013 19:24

1 Attachment(s)
Quote:

Originally Posted by b2m (Post 652605)
Tronix, у меня какая-то неправильная версия CheckIt, она использует 32-битные команды (с префиксами 66h,67h). А какая версия использовалась на Поиске? И где её скачать?

Ну у меня обычная CheckIT 4.10 работает на поиске без проблем. Вот тут брал: http://old-dos.ru/dl.php?id=619 То, что оно пытается юзать 386 команды - нормально вполне, там детектится 386 и выше проц. Скорее всего на этом все и вылетает. Нужно обрабатывать invalid opcode

---------- Post added at 18:24 ---------- Previous post was at 18:16 ----------

Вот стандартная тащемто детектилка проца тех времен:
Code:

;      8086 CPU check
;      Bits 12-15 are always set on the 8086 processor
;
check_8086:
        push cs
        pop ds
        push cs
        pop es
        pushf                          ;save FLAGS
        pop    bx                      ;store FLAGS in BX
        mov    ax, 0fffh              ;clear bits 12-15
        and    ax, bx                  ;  in FLAGS
        push    ax                      ;store new FLAGS calue on stack
        popf                            ;replace current FLAGS value
        pushf                          ;set new flags
        pop    ax                      ;store new flags in AX
        and    ax, 0f000h              ;if bits 12-15 are set, then CPU
        cmp    ax, 0f000h              ;  is an 8086/8088
        mov    cpu_type, 0            ; save the CPU type
        je    end_get_cpuid_
        jmp    short check_80286
end_get_cpuid_:jmp end_get_cpuid

;
;      Intel 286 CPU check
;      Bits 12-15 are always clear on the Intel processor.
;
check_80286:
.286

Смысл в том, что биты 12-15 регистра флагов на 8088 хрен поменяешь, они всегда аппаратно в единице. У вас в эмуле этот код отрабатывает и прыгает на проверку 286 и далее.

b2m 16th December 2013 20:27

Quote:

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

Да, теперь CheckIt доходит до меню. Спасибо.

Tronix 17th December 2013 15:06

1 Attachment(s)
Quote:

Originally Posted by b2m (Post 652681)
Да, теперь CheckIt доходит до меню. Спасибо.

Но радоваться рано.. Пускаю тест, для проверки ADD/ INC опкодов и состояний флага после их исполнения. Выполняются они и потом сверяются с шаблонными значениями из массива.

Но тут вылезает какая-то другая бага, он (эмулятор) мне пишет: error at 53 generated 5750 etalon: 5700 . Фишка в том, что по этому смещению (53h) в эталонном массиве нули, да и тест не должен ничего по этому смещению писать, там тоже должны быть нули (я затираю в начале сегмент ES 16Kb нулями).

Проверка между эталоном и сгенереным масивом идет командой REP CMPSB. error at берется из 159-CX, когда находит первый несовпавший байт. Соответственно generated есть ES:[DI-1], etalon DS:[SI-1]. Вообщем чето где-то тут не так работает как надо.

res_add.bin - это эталонный массив в бинарном виде, удобно в hex смотреть.

b2m 17th December 2013 16:29

Quote:

Originally Posted by Tronix (Post 652990)
я затираю в начале сегмент ES 16Kb нулями

Тут, что-ли?
Code:

xor di,di                        ; clean 16Kb ES:DI with zeros
mov cx,200H
xor ax,ax
rep stosw

Тут только 1Кб.

Tronix 17th December 2013 16:32

Quote:

Originally Posted by b2m (Post 653018)
Тут, что-ли?

Тут, да, попутал параграфы и килобайты, но даже это не важно. Главное затереть 160 байт, так как размер эталонного массива - 160 байт. Поэтому путаница здесь есть, но к ошибке приводить она не должна. Пускай будем очишать 1 килобайт, этого достаточно вполне.

b2m 17th December 2013 16:39

Вот с чем сравнивается:
Code:

00000000:  FF FF 00 00 FE FF FF FF 02 00 03 00 00 80 FF 7F
00000010:  AD B2 F5 93 45 F2 00 FF FE 03 80 7F 03 80 7F 80
00000020:  00 A6 2C FF FF 01 00 FF FF FF FF 02 00 04 00 00
00000030:  80 FF 7F F9 FB 61 BF 46 7F 01 FF FF 04 80 7F 04
00000040:  80 7F 80 00 B9 8D 00 00 00 80 13 74 80 00 B6 00
00000050:  00 00 00 00 00 00 00 00 00 00 00 00 83 F0 57 F0
00000060:  93 F8 03 F0 97 F8 57 F0 87 F0 03 F8 92 F8 02 F0
00000070:  97 F0 13 F0 03 F0 83 F0 86 F0 07 F8 96 F8 02 F0
00000080:  97 F0 13 F0 03 F8 03 F8 92 F8 06 F0 93 F0 57 F0
00000090:  82 F0 86 F0 83 F0 07 F8 96 F8 06 F0 93 F0 57 F0

Отличие в старших битах 12-15. У меня тут еденицы, если это флаги, то вроде так и должно быть?

Tronix 17th December 2013 16:47

со смещения 00 по смещение 4E - результаты работы ADD, INC. Потом несколько нулей (не используемых), далее со смещения 5C по 9F - флаги после результатов работы.

Но все это вообще не важно пока, потому как в эмуле пишется бред - error at 53 - то есть он нашел различие по смещению 53. Как так - я хз, в эталонном массиве там нули, в генеррируемом тоже должны быть нули, ибо 1 кб очищаем и более туда (по смещению 53) никто ничо не пишет в процессе.

Предполагаю, что REP CMPSB неправильно возвращает CX (который у меня и используется для вывода смещения по которому произошло несовпадение), либо что то еще.

b2m 17th December 2013 16:50

По завершению repe cmpsb di=005e, cx=0042, это правильно?

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

Вывод байта работает неверно.
al=0D -> aaa -> al=03 cy=1 -> aad 11 -> al=33
Где косяк?

Tronix 17th December 2013 16:58

Quote:

Originally Posted by b2m (Post 653023)
По завершению repe cmpsb di=005e, cx=0042, это правильно?

Ну это значит нашлись отличия по смещению 5Dh. (159-42h) По крайней мере уже не бред.
[COLOR="Silver"]
Quote:

Originally Posted by b2m (Post 653023)
Вывод байта работает неверно.
al=0D -> aaa -> al=03 cy=1 -> aad 11 -> al=33
Где косяк?

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

b2m 17th December 2013 17:06

Quote:

Originally Posted by Tronix (Post 653027)
все работало на реале.

А можно по шагам расписать, как работает этот код? Каким образом получается +7 для чисел, больших 9?

---------- Post added at 17:06 ---------- Previous post was at 17:04 ----------

Я бы понял, как это работает, если бы вместо aad 11h стояло adc al,30h. Но тут?

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.