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 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. Но тут?


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

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