Просмотр полной версии : [Поиск 1] Эмуляция
KingArthur
07.04.2008, 20:07
Может быть кто нибудь знает существует ли Эмулятор ПК "ПОИСК" ?
Еще проблема:
Хочу перевести COM файлы в WAV формат. Есть прога для "поиска" которая переводит COM в касетный формат BIN и запускаеться без проблем на РК. Только не знаю что тут дальше делать (Скорее всего тут без дисковода проблему не решить)
http://sovietpc.narod.ru/
здесь единственный эмулятор поиска, но подойдёт не последняя версия, читай историю на сайте.
а ктонибудь разобрался как запускать этот поиск на эмуле?
а то я накачал софта с http://poisk-pc.narod.ru и http://www.poisk-computer.net.ru/
а как всё это загружать в эмуляторе не понимаю.
может объясните?
shattered
24.06.2012, 03:36
В MESS есть "skeleton drivers" poisk1 и poisk2. В первом нет картинки; во втором есть, проходит тест памяти, но далее ничего. Попробую починить.
В техническом описании http://web.archive.org/web/20070108082522/http://www.poisk-computer.net.ru/txt/poiskto.txt не хватает приложения 4 с прошивками -- оно у кого-то есть?
У меня есть. В природе есть два "Поиска-1", и они несколько разные. Впрочем, прошивки у меня есть от обоих. Техописание, к сожалению, только от первого (это я его и выкладывал на poisk-computer.net.ru).
shattered
24.06.2012, 18:39
К какому варианту Поиска-1 относится это ТО?
Есть ли схема клавиатуры?
ТО относится к первому варианту, 1988 года. Схемы клавиатуры нет, но в принципе, могу прозвонить - если мне напомнить через полторы недели, т.к. сейчас я далеко от них :)
shattered, а аттаче всё, что сохранилось оттуда на винте у автора комплекса http://soviet-pc.narod.ru/
С этой странички есть всё:
http://web.archive.org/web/20070106103857/http://www.poisk-computer.net.ru/misc.htm
Со странички:
http://web.archive.org/web/20070106103841/http://www.poisk-computer.net.ru/soft.htm
точно есть последний пункт ("Различные утилиты для "ПОИСКа-1").
Остальные если и были, то где-нибудь в архивах на DVD давно, вместе с SovietPC.
MS-DOS 3.30 вроде был, но он там обычный, насколько я помню.
Также был "Проверка ОЗУ "ПОИСК-1" и "Игра попкорн, адаптированная под ПОИСК-1" (на него антивирусы ругались на какой-то досовский вирус внутри, поэтому полгода назад удалил с винта - надоело терпеть :).
Остальных не помню, качал или нет.
KingArthur, ZEman, а у Вас что-то по "Поиску" с этого сайта сохранилось?
В MESS есть "skeleton drivers" poisk1 и poisk2. В первом нет картинки; во втором есть, проходит тест памяти, но далее ничего. Попробую починить.
Ха! Опередил меня. Я только сегодня начал ковырять mess. "skeleton" для первого Поиска там левый совсем - 16 битная шина и всё такое.
Не знаешь, по каким адресам там сидит ВВ51 (которая на плате расширения)? Update. Нашёл: http://web.archive.org/web/20070108082753/http://www.poisk-computer.net.ru/txt/intrfto.dos.txt
ЗЫ. А что, с MC1502 закончил уже? Или это - твой однониковец? Как раз брал MC1502 за основу для Поиска. Только там ВГ93 на других адресах сидит.
shattered
26.06.2012, 01:02
Не закончил, застрял на эмуляции клавиатуры (почти работает) и флоппи (полная засада). Подробнее в ветке http://zx.pk.ru/showthread.php?t=13908
Пока сделал отдельное описание машины poisk1 -- чуть позже приложу патч.
Не закончил, застрял на эмуляции клавиатуры (почти работает) и флоппи (полная засада). Подробнее в ветке http://zx.pk.ru/showthread.php?t=13908
Пока сделал отдельное описание машины poisk1 -- чуть позже приложу патч.
В ходе диалога с создателем SovietPC выяснилось, что в Поиске-1 очень разумный БИОС. Можно не париться с эмуляцией клавиатуры через nmi, а просто подключить стандартую XTшную. Хоть это и неспортивно. ;-)
Может, и в МС1502 также?
А жаль, что у тебя пока нет флоппи. Надеялся спереть для Поиска. Хотя, тут вроде, проще: регистры 0xc0-0xc3 похоже подходят от стандартного из mess. А для половины битов 0xc4, если повезёт, хватит просто регистра.
shattered
26.06.2012, 01:53
Не похоже, что клавиатура работает через NMI, скорее через IRQ6 и порты ВВ55. В МС1502 все хитрее, там отдельная схема сама вызывает IRQ1 при нажатии любой кнопки.
Флоппи должно быть проще, в МС1502 просто извращение сделано с остановкой процессора.
Не похоже, что клавиатура работает через NMI, скорее через IRQ6 и порты ВВ55. В МС1502 все хитрее, там отдельная схема сама вызывает IRQ1 при нажатии любой кнопки.
Да, это я перепутал, извиняюсь. Аппаратно вызывается IRQ6, которое потом программно дергает INT9 (IRQ1). Смысл в том, что можно IRQ6 не дёргать, а писать сразу правильный код в ВВ55 и дёргать IRQ1.
В ходе диалога с создателем SovietPC выяснилось, что в Поиске-1 очень разумный БИОС. Можно не париться с эмуляцией клавиатуры через nmi, а просто подключить стандартую XTшную. Хоть это и неспортивно. ;-)
Он там ни разу не разумный, он эээ... компромиссный, что ли. В плане клавиатуры, так как многий софт не лезет к ней через прерывания, а просто читает коды из порта 60h, разработчики Поиска были вынуждены для совместимости с IBM PC оставить этот порт. Поэтому BIOS Поиска включает два блока, первый по таймеру гоняет опрос кнопок клавиатуры и записывает результат в порт 60h, второй работает с попавшим туда кодом аналогично IBM PC.
Естественно, стандартную клаву ХТ к Поиску не подключишь. Нужно и в BIOS убрать код поддержки встроенной клавы, и аппаратно реализовать сдвиговый регистр для чтения скан-кодов с доступом к нему через порт 60h.
Естественно, стандартную клаву ХТ к Поиску не подключишь. Нужно и в BIOS убрать код поддержки встроенной клавы, и аппаратно реализовать сдвиговый регистр для чтения скан-кодов с доступом к нему через порт 60h.
Насчёт регистра - согласен. А зачем из БИОСа код убирать? Если внутренняя клавиатура не подключена, он ни как не мешает (кроме внесения дополнительных тормозов).
Насчёт регистра - согласен. А зачем из БИОСа код убирать? Если внутренняя клавиатура не подключена, он ни как не мешает (кроме внесения дополнительных тормозов).
Я сильно подозреваю (хотя уже и не помню наверняка, надо код смотреть), что он будет очищать клавиатурный регистр. Ну и тормоза :) Хотя, тут надо с видеоадаптера и пресловутого NMI начинать.
shattered
26.06.2012, 20:39
Предлагаю все же закопать стюардессу и эмулировать то, что есть :-)
Предлагаю все же закопать стюардессу и эмулировать то, что есть :-)
Да я не против. :-) Просто, когда уже что-то маленько работает, легче видеть регрессии.
А как в MESS сабмитятся патчи? Что-то в упор не вижу списка рассылки для этого. Неужели напрямую хозяевам слать? В купе со странной лицензией это как-то не делает проект привлекательным для сторонних разработчиков.
shattered
26.06.2012, 21:16
Я засылаю их почтой Micko, но можно, наверно, и на форум постить.
Я засылаю их почтой Micko, но можно, наверно, и на форум постить.
На тему Поиска уже что-нибудь заслал? А то неохота сизифовым трудом заниматься.
shattered
27.06.2012, 00:10
Пока нет. Сегодня выложу сюда то, что успел сделать.
Пока нет. Сегодня выложу сюда то, что успел сделать.
А ты с какой версией работаешь?
Если что, адаптировал твои патчи к r15507. Кумулятивный патч прилагается.
Твой патч 1 - примерно такой же как то, что я лепил, а вот патч 2 меня потерял:
mc6845_device *mc6845 = screen.machine().device<mc6845_device>(CGA_MC6845_NAME);
В Поиск-1 же нет MC6845. Но в качестве незакопанной стюардессы, возможно в MESS соединить poisk1_ppi8255_interface_2 с MC6845?
shattered
28.06.2012, 02:27
0.145 -- в HEAD поломалась клавиатура мс1502 и я пока продолжаю пилить старую версию.
6845 нет, это просто затычка, чтобы собралось и запустилось. что делать дальше, пока не знаю.
Сдаётся мне, знакогенератор неправильно подключен.
Тупо включив по reset режим 40x25, я получаю вот такую вот ржаку.
shattered
29.06.2012, 09:20
Занятно :-)
Наверно, можно описать новый chipset в pc_cga.c
Я сильно подозреваю (хотя уже и не помню наверняка, надо код смотреть), что он будет очищать клавиатурный регистр. Ну и тормоза :) Хотя, тут надо с видеоадаптера и пресловутого NMI начинать.
Подключил обычную клавиатуру в эмуляторе. Таки ты прав - чтобы подключить к настоящему Поиску нужно модифицировать БИОС. Но засада не в irq6 (его можно от таймера просто отрезать), а в том что
60й порт вв55 программируется не на ввод, а на вывод. :-)
shattered
11.02.2013, 22:15
alt-x, что-нибудь удалось сделать?
Господа, а никто не может на реале показать цифры из CheckIt 4.1 (http://old-dos.ru/files/file_617.html) CPU Benchmark и Video Benchmark относительно IBM XT?
Вроде по памяти вспоминается что-то около 0.6 попугаев по CPU, по видео вообще не помню. Нужно для подгонки эмулятора pcem (http://www.tommowalker.co.uk/pcem.html) к максимально похожим на ПК Поиск скоростным условиям.
Хочется поиграться с программированием CGA спрайтовой (и не только) графики, при этом чтоб без тормозов на реале... Заранее благодарен, если кто-то прогонит тесты.
К сожалению, у самого возможность потестить на реале появится не раньше мая, с открытием дачного сезона (на даче он у меня).
shattered
17.03.2013, 15:17
(переношу из http://zx.pk.ru/showthread.php?t=13908)
alt-x куда-то пропал, поэтому я снова взялся за эмуляцию poisk1 в MESS, сначала -- за видео.
Схемы [1][2] и ТО [3] не стыкуются -- в ТО сказано, что номера ВВ55 на схеме -- D41, D42, на схеме [1] это D44, D45, а на [2] -- одна D72.
Особенно сильно доставляет то, как назначены адреса на шине портам ВВ55 -- порт 60h -- это порт A второй (а не первой) ВВ55, и наоборот, но порты B, C и управляющий назначены нормально (61h, 62h, 63h для первой и 69h,6Ah, 6Bh для второй). (Вторая -- это D41, а первая -- D42.)
[1] http://web.archive.org/web/20070106104303/http://www.poisk-computer.net.ru/arch/poisk_sc.7z
[2] http://web.archive.org/web/20070106104303/http://www.poisk-computer.net.ru/arch/poisk_1.jpg http://web.archive.org/web/20070106104303/http://www.poisk-computer.net.ru/arch/poisk_2.jpg
[3] http://web.archive.org/web/20070108082522/http://www.poisk-computer.net.ru/txt/poiskto.txt
shattered
17.03.2013, 19:15
Оказалось, что и исходники BIOS [1] не вполне стыкуются с имеющимся дампом [2] :v2_dizzy_facepalm:
[1] PoiskComp/bios_p.7z
[2] PoiskComp/p1_rom.7z/rompoisk/POISKROM/POISK.BIN
.
Схемы [1][2] и ТО [3] не стыкуются -- в ТО сказано, что номера ВВ55 на схеме -- D41, D42, на схеме [1] это D44, D45, а на [2] -- одна D72.
И не будут. ТО заводское по древнему бета-релизу, схема 1 - модель 1988 года, схема 2 - модель 1991 года. BIOS у обеих моделей отличается, естественно.
На второй схеме клавиатурная ВВ55 тоже присутствует, ты ее просто не увидел. Это DD31
shattered
17.03.2013, 21:10
ok, а от чего тогда исходники?
---------- Post added at 21:10 ---------- Previous post was at 21:04 ----------
... и наудачу -- более свежие ТО есть? :-)
ok, а от чего тогда исходники?
Исходники - от BIOS 1988 года. Может, местами будут отличаться от дампа, благо "завод непрерывно работает над усовершенствованием конструкции изделия" (с)
shattered
17.03.2013, 22:19
Кстати, исходников 2 набора и второй, видимо, от П-2 -- PoiskComp/bios2poi.7z
Какие м/с на схеме соответствуют описанным в ТО?
4.5.4. Контроллер ЭЛТ (микросхемы D47, D50, D51, D54, D57, D10.4 и D12.1)
Господа, а можно посмотреть как вы обрабатываете 68h и 6Ah порты? Откуда можно качнуть скелеты poisk1, poisk2 для mess? У меня щаз лично ваще mess.org не открывается...
Качнул отсюда http://www.progettosnaps.net/mess/links.html исходники mess 0.148 и вообще там не увидел обработки вышеуказанных портов... Странно....
shattered
24.03.2013, 15:48
А там их и нет, это у меня локально все живет. Текущее состояние -- https://gist.github.com/shattered/5231577 (картинки нет, NMI не вызываются -- похоже, что BIOS отключает их, когда сам рисует текст)
Из-за фокуса с перетасовкой портов придется отказаться от AM_DEVREADWRITE и сделать 'trampoline' -- функции, которые будут обращаться к нужному экземпляру i8255_device
Я вот пытаюсь прикрутить по образу и подобию со старого эмулятора SovietPC, там в директории конфигурации скрипт описывающий Poisk-1. В нем такие строки:
//Port values
dim p6Ah as byte=0x00, p68h as byte=0x80
//CGA emulation
property PORT_68(Value as byte)
p68h=Value
//CGA mode value
b=8 : if (Value and 0x80)<>0 then b=b or 1 //resolution
if (Value and 0x40)=0 then b=b or 2 //graph mode
if (p6Ah and 0x40)<>0 then b=b or 4 //disable color
if (Value and 0x80)<>0 then b=b or 0x10 //resolution //??? - such was in SovietPC
CGA.MODE_PORT=b
//CGA color value
b=0 : if (Value and 1)<>0 then b=b or 4 //Red
if (Value and 2)<>0 then b=b or 2 //Green
if (Value and 4)<>0 then b=b or 1 //Blue
if (Value and 0x10)<>0 then b=b or 0x20 //palette index
if (Value and 0x20)<>0 then b=b or 0x10 //intensity
CGA.COLOR_PORT=b
end
function PORT_68 as byte : result=p68h : end
property PORT_6A(Value as byte) : p6Ah=Value : PORT_68=p68h : end
function PORT_6A as byte : result=p6Ah : end
pc.WritePort(0x68)=PORT_68 : pc.ReadPort(0x68)=PORT_68
pc.WritePort(0x6A)=PORT_6A : pc.ReadPort(0x6A)=PORT_6A
Я пишу на сях следующее примерно (прошу прощения за *****код, танцор играет как умеет):
void poisk_out(uint16_t addr, uint8_t val)
{
uint8_t b;
switch (addr)
{
case 0x68:
p68h = val;
b = 8;
if (!(val & 0x80)) b = b | 1;
if (val & 0x40) b = b | 2;
if (!(p6Ah & 0x40)) b = b | 4;
if (!(val & 0x80)) b = b | 0x10;
//cga_out(0x3D8,b);
cgamode=b;
b = 0;
if (!(val & 1)) b = b | 4;
if (!(val & 2)) b = b | 2;
if (!(val & 4)) b = b | 1;
if (!(val & 0x10)) b = b | 0x20;
if (!(val & 0x20)) b = b | 0x10;
//cga_out(0x3D9,b);
cgacol=b;
pclog("POISK 68h cgamode: %02X cgacol: %02X\n",cgamode,cgacol);
return;
case 0x6A:
p6Ah = val;
val = p68h;
b = 8;
if (!(val & 0x80)) b = b | 1;
if (val & 0x40) b = b | 2;
if (!(p6Ah & 0x40)) b = b | 4;
if (!(val & 0x80)) b = b | 0x10;
//cga_out(0x3D8,b);
cgamode=b;
b = 0;
if (!(val & 1)) b = b | 4;
if (!(val & 2)) b = b | 2;
if (!(val & 4)) b = b | 1;
if (!(val & 0x10)) b = b | 0x20;
if (!(val & 0x20)) b = b | 0x10;
//cga_out(0x3D9,b);
cgacol=b;
return;
}
}
uint8_t poisk_in(uint16_t addr)
{
switch (addr)
{
case 0x68:
return p68h;
case 0x6A:
return p6Ah;
}
return 0xFF;
}
Но чего-то мне кажется, что автор SovietPC где-то ошибся маленько, так как не правильно биты выставляются хотя бы у режима.. Буду разбираться
shattered
25.03.2013, 22:31
А что не так?
А что не так?
Много всего не так. Вы хотя-бы скажите, я в си коде ничего не путаю в условиях? Вроде ж по умолчанию там if (a % 255) bla-bla это то же с что я сравниваю результат с нулем, верно? Привык к асму и паскалю етить его в кочерыжку ( Завтра просплюсь с этой адской водки и проведу ряд экспериментов, думаю ситуация прояснится немного..
Вроде ж по умолчанию там if (a % 255) bla-bla это то же с что я сравниваю результат с нулем, верно? Привык к асму и паскалю етить его в кочерыжку
Пиши если тебе понятнее так. Компилятор все равно подставляет != 0
if(a%255 != 0)
shattered
29.03.2013, 00:33
Много всего не так. Вы хотя-бы скажите, я в си коде ничего не путаю в условиях?
Да, случилась путаница -- должно быть ровно наоборот :-)
"if (что-то)" будет верно, если "что-то" не равно нулю.
shattered
29.03.2013, 20:46
Немного о SovietPC
Есть три сайта
http://sovietpc.narod.ru/ -- 4 странички и архив с эмулятором затертой версии (1688576 06-04-2007 21:07 SovietPC.exe). Ссылки ведут на...
http://soviet-pc.narod.ru/ -- здесь какая-то жизнь и свежие релизы (март 2013)
http://wayback.archive.org/web/20080120105707/http://sovietpc.old-games.ru/ -- блог 2007 года
Это да, но сорцов то нет ((
shattered
31.03.2013, 10:56
Можно пригласить автора сюда и поговорить :-)
Очень скоро понадобится схема клавиатуры. Хотя ее можно восстановить по исходникам BIOS...
NMI не вызываются -- похоже, что BIOS отключает их, когда сам рисует текст
Не выключает, а просто не дёргает. Поиск-1 - редкий пример машины, на которой вывод текста через BIOS - гораздо быстрее, чем запись в видеопамять/порты.
---------- Post added at 00:16 ---------- Previous post was at 00:14 ----------
Оказалось, что и исходники BIOS [1] не вполне стыкуются с имеющимся дампом [2] :v2_dizzy_facepalm:
[1] PoiskComp/bios_p.7z
[2] PoiskComp/p1_rom.7z/rompoisk/POISKROM/POISK.BIN
В mess несоколько дампов. Самый старый более-менее подходит.
До кучи, прошивка БИОС из моего Поиска, материнка - Ревизия Б.
shattered
11.05.2013, 01:31
Ревизия Б -- это какой год?
shattered
12.05.2013, 01:39
work in progress: научился хоть как-то показывать картинку. Клавиатуры еще нет, симулировал ее в отладчике.
http://img-fotki.yandex.ru/get/5631/264743.2/0_926bd_995bd5d1_XL.png (http://fotki.yandex.ru/users/shattered/view/599741/)
---------- Post added at 01:39 ---------- Previous post was at 01:33 ----------
До кучи, прошивка БИОС из моего Поиска, материнка - Ревизия Б.
Это есть в MESS под именем 'v91'.
shattered
17.05.2013, 01:26
Нужно нечто под DOS, что бы выдавало скан-коды, поступающие с клавиатуры -- раз схемы нет, можно "прокликать" всю матрицу и посмотреть, как на это реагирует BIOS.
вот жеж... полгода назад писал такую лабу под дос :) По прерываниям выводит скан-коды клавиш... Ща найти уже не могу, видимо осталось на съёмном винте :(
work in progress: научился хоть как-то показывать картинку. Клавиатуры еще нет, симулировал ее в отладчике.
Это уже с видеоадаптером Поиска? Крут!
shattered
21.05.2013, 23:12
Да, с ним
На чем он собран, пока не разобрался.[COLOR="Silver"]
---------- Post added at 23:12 ---------- Previous post was at 22:37 ----------
А вот и косяк в документации? Код делает следующее:
PORT_3D9:
XCHG AL,AH ;Сохранить первоначальные данные
IN AL,SCR_MODE ;ввести байт текущего режима
AND AX,37C8H ;Маска D7,D6 и D3
;Выбор D4,D5 и D2..D0
OR AL,AH ;Составить новый байт
OUT SCR_MODE,AL ;Задать новый режим экрана
JMP AX_NMI
Если сравнить это с описанием CGA, то видно, что биты 5-4.2-0 порта 3D9H транслируются 1:1 в порт 68H. 5 -- это выбор палитры, 4 - "intense colors in graphics". poiskto.txt описывает их ровно наоборот. Назначение бит 2-0 тоже другое -- в оригинале R, G, B, в ТО -- B, G, R.
shattered
22.05.2013, 23:08
Некоторый прогресс
http://img-fotki.yandex.ru/get/9154/264743.2/0_95827_d5f784d6_XL.png (http://fotki.yandex.ru/users/shattered/view/612391/)
«poisk1 WIP: p1_t_ram.rf4 (http://fotki.yandex.ru/users/shattered/view/612391/)»
http://img-fotki.yandex.ru/get/9228/264743.2/0_95828_4f865d65_XL.png (http://fotki.yandex.ru/users/shattered/view/612392/)
«poisk1 WIP: p1_t_i_o.rf4 (http://fotki.yandex.ru/users/shattered/view/612392/)»
shattered
14.09.2013, 21:45
Кстати -- что такое ПБИС?
Вероятно, "периферийные БИС". Чё он там тестирует после процессора? Таймер и контроллер прерываний, кажется.
shattered
14.09.2013, 22:41
На этом месте тест зависает. Любопытно узнать, что должно быть дальше...
На этом месте тест зависает. Любопытно узнать, что должно быть дальше...
А что по этому поводу говорит дизассемблер теста?
Врот им ногу дизасмить эти макросы. Я на тесте памяти голову сломал, а этот даже смотреть не хочу (((
shattered
15.09.2013, 11:43
Тяжела и неказиста жизнь советского артиста (c) Для начала сделать бы клавиатуру и видео...
shattered
17.09.2013, 09:13
Описание матрицы нашлось в исходниках BIOS -- TBL_KBDP.ASM и SCANINT2.ASM, опрос делается по таймеру (канал 1 заведен на IRQ6). Разумеется, у Поиска-91 матрица немного другая.
http://img-fotki.yandex.ru/get/9150/264743.2/0_9cbce_9428e358_XL.png (http://fotki.yandex.ru/users/shattered/view/641998/)
shattered
18.09.2013, 09:51
В комментарии к исходникам упоминается нечто по имени ИНТЕК. Что это?
; -- таблица клавиш для ИНТЕК ( по новому ГОСТу )
; бит 7 - признак необходимости инвертирования SHIFT
;----------------------------------------------------------------------------
; ------------нет спецсимволов--- SHIFT1 ----SHIFT2-----позиция в матрице--
; ИНТЕК ПОИСК
LN_KEY1 DB 80H+09H, 04H, 80H+29H ; 1/12 1 4/7
На досуге ковырялся с PCem (http://www.tommowalker.co.uk/pcem.html)... Хочется все-таки сделать эмулятор с соблюдением тактов 8088, чтоб по скорости было максимально похоже на Поиск. Ну и чтоб работал "честно", то есть рисовал все символы программно, как это делает реал.
Пытался впилить в него обработку NMI. BTW, обработки NMI практически ни у кого нет, ни у fake86, ни у PCE. Вообще, хорошо если TRAP (int 1) обрабатывают, некоторые и на него забивают. Ввел несколько переменных и флагов:
// POISK variables
uint16_t p28h; // port 28 value
uint8_t nmi_enabled; // NMI enabled ?
uint8_t nmi_int_now=0; // force NMI
uint8_t in_nmi=0; // in NMI?
uint8_t p6Ah,p68h; // port 6Ah and port 68h
Дальше vid_cga.c. Откуда-то скопипастил такую процедуру установки графического режима в CGA через порты. В качестве аргумента (mode) - 0x1E это по идее 640x400, 0x2E - это 320x200.
static int mode_graph[] = {0x38, 0x28, 0x2D, 0x0A, 0x7F, 0x06,
0x64, 0x70, 2, 1, 6, 7,0, 0, 0, 0};
void set_poisk_mode(uint8_t mode)
#define MODE_REG 0x3d8
#define VID_DISABLE 0
#define ADDRESS_REG 0x3d4
#define REGISTER_PORT 0x3d5
{
int loop_count = 0;
cga_out(MODE_REG,VID_DISABLE); /*disable video signal */
for( ; loop_count < 0x0e; ++loop_count) {
cga_out( ADDRESS_REG, loop_count ); /* set up CRT register */
cga_out( REGISTER_PORT, mode_graph[loop_count]); /* write to reg */
}
cga_out( MODE_REG, mode); /* switch in mode now */;
}
Процедура обработки порта 68. Смотрит, не сменился ли режим, если сменился - устанавливает новый. Также устанавливает флаг разрешения или запрещения NMI.
void poisk_out(uint16_t addr, uint8_t val)
{
uint8_t b;
uint8_t tmp_b;
switch (addr)
{
case 0x68:
p68h = val;
b = 0x2e; //320x200
if (val & 0x80) b = 0x1e; //hires
if (poisk_mode != b)
{
poisk_mode = b;
set_poisk_mode(b);
pclog("POISK set mode %02X: \n",b);
}
if (!(val & 8))
{
nmi_enabled = 1;
pclog("[poisk] NMI enable\n");
}
else
{
nmi_enabled = 0;
pclog("[poisk] NMI disable\n");
}
pclog("POISK 68h value: %02X cgamode: %02X cgacol: %02X\n",val,tmp_b,b);
return;
case 0x6A:
p6Ah = val;
val = p68h;
// TO DO:
return;
}
}
uint8_t poisk_in(uint16_t addr)
{
switch (addr)
{
case 0x68:
return p68h;
case 0x6A:
return p6Ah;
}
return 0xFF;
}
При возникновении NMI в порт 28 должно находится смещение, куда произошла запись:
uint16_t p28h_in(uint16_t addr)
{
switch (addr)
{
case 0x28:
{
pclog("[poisk] IN 0x28h = %04X\n",(p28h) & 0xFF);
return ((p28h) & 0xFF);
}
case 0x29:
{
pclog("[poisk] IN 0x29h = %04X\n",(p28h>>8) & 0xFF);
return ((p28h>>8) & 0xFF);
}
}
}
Дальше, установил новые хендлеры для портов:
io_sethandler(0x0068, 0x0002, poisk_in, NULL, NULL, poisk_out, NULL, NULL);
io_sethandler(0x006A, 0x0002, poisk_in, NULL, NULL, poisk_out, NULL, NULL);
io_sethandler(0x0028, 0x0002, p28h_in, NULL, NULL, NULL, NULL, NULL);
Если что-то пишет в видео-память, проверить разрешены ли NMI, если разрешены - запомнить смещение куда произошла запись (для обработки 28 порта) и установить флаг вызова NMI.
void cga_write(uint32_t addr, uint8_t val)
{
// pclog("CGA_WRITE %04X %02X\n", addr, val);
vram[addr&0x3FFF]=val;
charbuffer[ ((int)(((dispontime - vidtime) * 2) / CGACONST)) & 0xfc] = val;
charbuffer[(((int)(((dispontime - vidtime) * 2) / CGACONST)) & 0xfc) | 1] = val;
cycles -= 4;
p28h = addr&0x3FFF;
if (nmi_enabled == 1)
{
flags&=~I_FLAG;
nmi_int_now = 1;
}
}
Дальше в x86.c обработку NMI сделал по аналогии обработки IRQ с PIC, вставил такой текст:
if (nmi_int_now && !in_nmi && !ssegs && !noint) // NMI interrupt
{
pclog("NMI INT NOW\n");
//if (ssegs) ss=oldss;
// if (inhlt) pc++;
writememw(ss,((SP-2)&0xFFFF),flags|0xF000);
writememw(ss,((SP-4)&0xFFFF),CS);
writememw(ss,((SP-6)&0xFFFF),pc);
SP-=6;
addr=2<<2;
flags&=~I_FLAG;
flags&=~T_FLAG;
pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2));
FETCHCLEAR();
inint=1;
nmi_int_now=0;
in_nmi=1;
cycles-=72;
}
Пока результата никакого.
На досуге ковырялся с PCem (http://www.tommowalker.co.uk/pcem.html)... Хочется все-таки сделать эмулятор с соблюдением тактов 8088, чтоб по скорости было максимально похоже на Поиск. Ну и чтоб работал "честно", то есть рисовал все символы программно, как это делает реал.
Наверно, ближе всего к железу MESS (с патчами от shattered, см. выше). Правда, не знаю, умеет ли MESS всякие V20. Но, на крайняк, можно подсунуть 286 и посмотреть, что получится.
Tronix, огромное Вам спасибо за habrapost (http://habrahabr.ru/post/199044/)!
shattered
12.11.2013, 23:12
Предлагаю не распылять усилия и пилить таки MESS, в нем заметно больше готовых запчастей.
Пока что безуспешно борюсь с эмуляцией клавиатуры -- алфавитные клавиши работают нормально, но прочие посылают весьма странные сканкоды.
Кто-нибудь помнит, как выглядел 4-тый нортон на Поиске? С цветами не совсем понятно. У меня в эмуляторе получилось вот так:
Sonic_Blast
24.11.2013, 13:23
Привет!
Вместо Зелёного берюзовый!!!
Да, если смотреть на палитру 1 в графическом режиме это цвет cyan (0x01), или light cyan
Да, если смотреть на палитру 1 в графическом режиме это цвет cyan (0x01), или light cyan
Это текстовый режим, палитра номер ноль, судя по дампу ПЗУ используются цвета 0,7,2. Даже с учётом того, что биты адреса палитры и биты RGB в другом порядке всё равно останется 0,7,2, т.к. эти трёхбитовые числа симметричные.
Это текстовый режим, палитра номер ноль, судя по дампу ПЗУ используются цвета 0,7,2. Даже с учётом того, что биты адреса палитры и биты RGB в другом порядке всё равно останется 0,7,2, т.к. эти трёхбитовые числа симметричные.
У Поиска нет текстового режима. И видимый 80x25 это есть графический 640x200 1bpp. Как получается еще один цвет, кроме белого, я если честно не очень понял. Вот что пишет ТО по этому поводу:
В графическом режиме 640 х 200 точек отображение произво-
дится в формате 1 бит на точку. Каждая точка может иметь два
цвета из 16 возможных.
В символьном режиме 80 символов х 25 строк отображение
производится также в формате 1 бит на точку, но каждый байт
содержит неиспользуемый для формирования знака бит D7, кото-
рый может нести информацию о цвете символа.
4.5.8. В конце каждого элементарного цикла регенерации
оперативной памяти происходит загрузка содержимого видеопа-
мяти в сдвиговые регистры, выполненные на элементах D72 и
D77. Загрузка данных осуществляется выходным сигналом "S/L"
контроллера ОЗУ (потенциал низкого уровня). Текущий адрес
определяется содержимым основного счетчика (микросхемы D23,
- 37 -
D24 и D25), состоянием выходного сигнала триггера D12.1:9 и
состоянием сигнала управления порта 68Н (бит 6).
Данные в сдвиговые регистры загружаются так, как показано
в таблице 4.12.
Т а б л и ц а 4.12
-----------T-------------------------------
¦ Р а з р я д
+---T---T---T---T---T---T---T---
¦ 7¦ 6 ¦ 5 ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦ 0
+---+---+---+---+---+---+---+---
¦ Четный банк ¦Нечетный банк
-----------+---T---T---T---+---T---T---T---
регистр 1 ¦D7L¦D5L¦D3L¦D1L¦D7H¦D5H¦D3H¦D1H
-----------+---+---+---+---+---+---+---+---
регистр 2 ¦D6L¦D4L¦D2L¦D0L¦D6H¦D4H¦D2H¦D0Н
Четные биты видеопамяти загружаются в один регистр, не-
четные - в другой.
Выходные сигналы сдвиговых регистров D72 и D77 поступают
на мультиплексор данных (микросхема D48). Сюда же поступает
сигнал с выхода схемы управления цветом, выполненненной на
элементах D4.2, D46 и D4.3. Данная схема позволяет по-
чить в символьном режиме 80 символов х 25 строк и дополни-
тельно цвет символа, в отличие от графического 640х200 то-
чек.
Короче какая-то магия с портами 0x6A, 0x6B и каким-то 7-мым битом где-то.
Вот что пишет ТО по этому поводу
Думаешь, я ТО не читал, прежде чем делать эмуляцию? И схему не смотрел? :)
Про бит D7 проще из схемы узнать - это как бы альтернативный цвет засвеченных точек (из остальных семи). Я так понял, первая точка будет всегда незасвеченная, отсюда и полоски на инверсных символах. В принципе, при определённых настройках портов она может и не обнуляться, но тогда появятся вертикальные линии у символов с альтернативным цветом. Можно поиграться портами в отладчике.
Кто-нибудь помнит, как выглядел 4-тый нортон на Поиске? С цветами не совсем понятно. У меня в эмуляторе получилось вот так:
мне тоже помнится что должен быть голубой,
блин, давно это было
Вообще, круто! Скорость очень похожа на настоящую. Только что-то checkit v3 не запускается в эмуле. И цвет все-таки надо поправить.
И цвет все-таки надо поправить.
А мне всё-таки кажется, что я сделал правильно. Нортон вообще не устанавливает регистр палитры, он остался такой, какой был при установке режима, т.е. палитра номер ноль. Более того, в конфигурации Нортона установлен ч/б режим, т.е. реально использованы цвета 0,7,15, чёрный, серый и белый. А биос Поиска в псевдотектовом режиме 80х25 преобразовывает их в цвет фона, нормальный цвет и альтернативный цвет. А в палитре номер ноль это как раз чёрный, серый и зелёный (точнее, основная палитра с нулевым цветом фона).
Ну зачем спорить, если уже много человек сказало, что не было в текстовом режиме зеленого. Было только 3 цвета - черный, белый и бирюзовый. При переключении на русский цвет фона менялся на синий, остальные цвета оставались как есть.
Возможно была другая прошивка ПЗУ палитры. Другого объяснения у меня нет.
А что по поводу checkit? Вообще, побольше бы деталей.. Вижу, что x86 в виде отдельного плагина. С нуля писалось или где-то позаимствовано? Исходников нам не видать конечно?
А что по поводу checkit? Вообще, побольше бы деталей..
Не смотрел ещё.
Вижу, что x86 в виде отдельного плагина. С нуля писалось или где-то позаимствовано? Исходников нам не видать конечно?
Писал с нуля, поэтому не уверен в 100% точности эмуляции процессора. Исходников не будет. :) Я уже где-то писал, что единственный заимствованный код в эмуляторе - процессор Z80, потому что мне до сих пор лень писать свою реализацию. Даже несмотря на неприлично большой размер имеющейся z80.dll
shattered
26.11.2013, 01:40
А расскажите, как подключили КНГМД (В504). Я так понимаю, что он использует порты C0, C4-C7?
А расскажите, как подключили КНГМД (В504). Я так понимаю, что он использует порты C0, C4-C7?
C0-C3 - порты ВГ93
С4 порт выбора дисковода и стороны (запись) и состояние drq irq (чтение)
С6 порт запуска моторов дисководов и их состояния
Последний не реализовывал, при чтении возвращает FF, типа всегда крутятся.
shattered
26.11.2013, 20:49
А можно еще раскладку по битам? :smile:
Отбой, вспомнил про исходник прошивки В504
shattered
26.11.2013, 23:58
Делаю эмуляцию видео и флоппи в MESS -- промежуточный результат
http://img-fotki.yandex.ru/get/9825/264743.2/0_9f8cf_7d2de098_XL.png (http://fotki.yandex.ru/users/shattered/view/653519/)
Для сравнения -- этот же диск в mc1502:
http://img-fotki.yandex.ru/get/9504/264743.2/0_9d52b_44a6cc1f_XL.png (http://fotki.yandex.ru/users/shattered/view/644395/)
Наверное это и есть тот бит (полоска), отвечающий за дополнительный цвет в 640x200x1bpp. Если я правильно понимаю, его в зависимости от аттрибута символа выставляет или не выставляет рендер символа в BIOS, когда рисует в видео-память. А где взять MESS в текущем состоянии?
shattered
27.11.2013, 09:22
Ну да, это D7H/D7L. А когда он выставляется или не выставляется -- пока не разобрался, нужно смотреть исходник BIOS
Текущее состояние пока взять негде, оно слишком ужасно :-) и работает только с пинка (сейчас загружается только OTS, остальные ОС уводят машину в ступор).
сейчас загружается только OTS
А где можно скачать? Гуглить по словам "поиск" и OTS не получается, слишком уж неконкретные слова...
shattered
27.11.2013, 21:24
Вот оно (дамп сделал dk_spb, за что ему почет и уважение). Все прочие варианты, что есть в интернетах, кривые -- в них не хватает 81-й дорожки, на которой собственно и записана OTS.
Спасибо. А как это в простой посекторный образ перегнать? Чей вообще это формат?
shattered
28.11.2013, 00:47
ХЗ, но MESS его понимает :)
Попробую слить вместе этот образ и те, что есть в интернетах -- говорят, у них чуть другое содержимое
---------- Post added 28.11.2013 at 00:47 ---------- Previous post was 27.11.2013 at 23:46 ----------
Кстати, стал дальше проходить "тест 4" (p1_t_i_o.rf4 в MESS) -- раньше затыкался на ПБИС. Что означают цифры?
http://img-fotki.yandex.ru/get/9508/264743.2/0_9f8cd_afd2d990_XL.png (http://fotki.yandex.ru/users/shattered/view/653517/)
Спасибо. А как это в простой посекторный образ перегнать? Чей вообще это формат?
ВОт тут ImageDisk http://www.classiccmp.org/dunfield/img/index.htm
Лучшая диско-копировалка что я видел, правда управление не очень удобное...
Кто-нибудь помнит, как выглядел 4-тый нортон на Поиске? С цветами не совсем понятно. У меня в эмуляторе получилось вот так:
На всякий случай сфоткал как мог реальный нортон и волков на телике. На моем мониторе Электроника ВЦ 302 цвета были точно такими же (ну плюс/минус).
На всякий случай сфоткал как мог реальный нортон и волков на телике.
Спасибо. Альтернативный цвет букв я поменяю, но тогда появляется вопрос: а какие цвета при другом цвете фона (остальные 15 комбинаций)? Потому как из ПЗУ палитры я никак не могу вычислить циан для этого режима. Получается, то соответствие цветов, которое я получил путём анализа схемы и ПЗУ палитры - неверное (хотя для 4-х цветных режимов вроде бы всё верно).
Делаю эмуляцию видео и флоппи в MESS -- промежуточный результат
http://img-fotki.yandex.ru/get/9825/264743.2/0_9f8cf_7d2de098_XL.png (http://fotki.yandex.ru/users/shattered/view/653519/)
Для сравнения -- этот же диск в mc1502:
http://img-fotki.yandex.ru/get/9504/264743.2/0_9d52b_44a6cc1f_XL.png (http://fotki.yandex.ru/users/shattered/view/644395/)
В том образе диска, который выше, загрузчик включает режим номер 2, а это ч/б 80х25. А у тебя цветной. Сам загрузчик подправил, или у тебя он другой?
Tronix, а можешь сфоткать, что выдаст программа из аттача?
Tronix, а можешь сфоткать, что выдаст программа из аттача?
Сфоткать то сфоткал, но только прога похоже очень часто меняет фон, поэтому получается мерцание. Записал еще паршивенькое видео до кучи: https://www.youtube.com/watch?v=p7GWXkon8Dk
Мдя, производительность в эмуляторе гораздо больше реала. Я уменьшил задержку в два раза, если не затруднит - сфоткай ещё (вторую палитру тоже). Ясно одно - цвет букв действительно не зависит от цвета фона. Странно это. Всё таки я склоняюсь к тому, что ПЗУ палитры у меня неправильное какое-то.
Посмотрел видео покадрово - видимо надо ещё в два раза задержку уменьшить.
Мдя, производительность в эмуляторе гораздо больше реала. Я уменьшил задержку в два раза, если не затруднит - сфоткай ещё (вторую палитру тоже). Ясно одно - цвет букв действительно не зависит от цвета фона. Странно это. Всё таки я склоняюсь к тому, что ПЗУ палитры у меня неправильное какое-то.
Первая картинка от test.com, вторая - от test2.com. Визуально глазами на телеке работают одинаково (различий нет).
shattered
28.11.2013, 20:45
В том образе диска, который выше, загрузчик включает режим номер 2, а это ч/б 80х25. А у тебя цветной. Сам загрузчик подправил, или у тебя он другой?
Загрузчик не исправлял. Подозреваю, что он проверяет, на чем работает, или читает порт конфигурации CGA.
Первая картинка от test.com, вторая - от test2.com. Визуально глазами на телеке работают одинаково (различий нет).
А картинки статичные были, или моргали, как и в прошлый раз?
---------- Post added at 23:39 ---------- Previous post was at 23:36 ----------
Загрузчик не исправлял. Подозреваю, что он проверяет, на чем работает, или читает порт конфигурации CGA.
Нет там никаких проверок. Запрещает прерывания, загружает регистры стека, разрешает прерывания, и вот потом делает mov ax,2 int 10h. Если перед вызовом прерывания в отладчике в ax поместить 3, то будет в цвете.
shattered
28.11.2013, 22:43
Тогда это, видимо, косяк эмуляции 80x25 чб режима в MESS :)
А картинки статичные были, или моргали, как и в прошлый раз?[COLOR="Silver"]
Моргали, как и в прошлый раз, но немного по другому.
Вот новый вариант. Стрелками вверх-вниз можно изменять задержку. Надо добиться, чтобы на экране было 16 полос и не моргало (если моргает - стрелку вверх). Стрелка влево включает первую палитру, вправо - вторую.
shattered
28.11.2013, 23:53
Нет там никаких проверок. Запрещает прерывания, загружает регистры стека, разрешает прерывания, и вот потом делает mov ax,2 int 10h. Если перед вызовом прерывания в отладчике в ax поместить 3, то будет в цвете.
Как я понял, черно-белым mode 2 бывает только на композитном мониторе. "Подключить" его к МС1502 в MESS можно, но почему-то отдельных функций рисования текста в чб режиме нет, поэтому видим цвет. Как ведет себя настоящая МС1502 в таком случае -- загадка.
Вот новый вариант. Стрелками вверх-вниз можно изменять задержку. Надо добиться, чтобы на экране было 16 полос и не моргало (если моргает - стрелку вверх). Стрелка влево включает первую палитру, вправо - вторую.
Я попробую, но увы уже не сегодня, через пару дней наверное только. Вообще, можно так глубоко не заморачиваться имхо. Главное чтоб работал цвет фона, и соответственно цвет символов и фона. Все равно больше 3 цветов в текстовом режиме не получить.
shattered
29.11.2013, 22:11
В том образе диска, который выше, загрузчик включает режим номер 2, а это ч/б 80х25. А у тебя цветной. Сам загрузчик подправил, или у тебя он другой?
Оказалось, что это так себя ведет BIOS 89 года. Он, кстати, не умеет рисовать инвертированные символы.
shattered
30.11.2013, 02:56
Что-то получается. Незабвенный The Immortal Player:
http://img-fotki.yandex.ru/get/9301/264743.3/0_9fa80_146e09dc_XL.png (http://fotki.yandex.ru/users/shattered/view/653952/)
Для сравнения он же в МС1502:
http://img-fotki.yandex.ru/get/5009/264743.3/0_9fa81_992e8257_XL.png (http://fotki.yandex.ru/users/shattered/view/653953/)
b2m, вижу поменялся цвет на нормальный в эмуляторе от 29 ноября. В полноэкранном режиме у меня неправильные цвета - вместо белого какой-то темно желтый, вместо cyan - темно красный. Так же с клавиатурой не все гладко - иногда проскакивают символы, как будто клавиша нажата и удерживается, хотя клавишу нажали и отпустили сразу. Печатаю checkit, у меня печатается chhecckit
shattered
01.12.2013, 15:36
Мне особенно интересно, как подключена клавиатура -- исходные тексты только запутывают ситуацию.
У меня пока работают только алфавитные клавиши и курсор...
DATAsoft
01.12.2013, 18:02
Вот новый вариант. Стрелками вверх-вниз можно изменять задержку. Надо добиться, чтобы на экране было 16 полос и не моргало (если моргает - стрелку вверх). Стрелка влево включает первую палитру, вправо - вторую.
Запустил эту прогу. Не смог добиться стрелками вверх и вниз чтобы картинка стала статичной.
shattered
11.12.2013, 03:11
Правильно ли я понимаю, что в режимах 640x200 (что графическом, что текстовом) основной цвет всегда один и тот же (серый)? ТО крайне невнятно на этот счет высказывается.
Этим управляют старшие биты порта 6Ah. Если включено разрешение цвета (обычно при этом выключают разрешение битов D7H,D7L), то наличие бита D7H/D7L будет означать включение альтернативного цвета точек в данной группе. Tronix выкладывал фото NC, там видно, что альтернативный цвет - яркий циан, а основной - белый.
shattered
11.12.2013, 20:21
Это понятно, но в обычном CGA в режиме 640x200 можно выбирать цвет точек (порт 3D9).
Мне кажется, тут нельзя говорить о полной совместимости с CGA.
shattered
12.12.2013, 21:08
Вот и хочется знать, насколько в этом случае Поиск совместим с. Пока считаю, что выбрать цвет точек в обычном монохромном графическом режиме нельзя.
Пока считаю, что выбрать цвет точек в обычном монохромном графическом режиме нельзя.
Глядя на имеющийся дамп ПЗУ палитры, мне показалось, что цвета зависят от цвета фона. Но эксперимент на реальном Поиске показал, что они не зависят от цвета фона (см. вертикальные полосы в моём тесте). В ПЗУ палитры можно зашить что угодно, возможно были разные варианты.
Вот и хочется знать, насколько в этом случае Поиск совместим с. Пока считаю, что выбрать цвет точек в обычном монохромном графическом режиме нельзя.
Насколько я помню, было можно. По крайней мере, в оригинальном электронмашевском Паскале процедура HiResColor() чего-то делала.
Сколько цветов было в палитре, сказать не могу, т.к. это было двадцать лет назад, и у меня был черно-белый монитор. Но как минимум, был белый, было нечто, на ч/б выглядевшее серым, и был черный.
shattered
13.12.2013, 20:45
Глядя на имеющийся дамп ПЗУ палитры, мне показалось, что цвета зависят от цвета фона. Но эксперимент на реальном Поиске показал, что они не зависят от цвета фона (см. вертикальные полосы в моём тесте). В ПЗУ палитры можно зашить что угодно, возможно были разные варианты.
А "третья" палитра (черный - красный - циан - белый) возможна?
shattered
14.12.2013, 02:12
Кто-нибудь помнит, как выглядел 4-тый нортон на Поиске? С цветами не совсем понятно. У меня в эмуляторе получилось вот так:
Там на картинках виден диск C: -- это сэмулирован В942?
это сэмулирован В942?
Я номеров не знаю, сэмулирован контроллер винчестера ATA.
---------- Post added at 12:18 ---------- Previous post was at 12:16 ----------
А "третья" палитра (черный - красный - циан - белый) возможна?
4 цвета не имеют смысла. Цвет фона в обоих случаях (основной цвет точек и альтернативный) должен быть одинаковый. По крайней мере даже в имеющемся "неправильном" ПЗУ палитры это учтено. Вызывает сомнения тот факт, что в эксперименте на реальном Поиске бит выбора палитры никак не влиял на результат (фото test и test2).
Что за "дамп ПЗУ палитры" такой? Дайте хоть посмотреть на это, а то я не вдупляю о чем вообще речь идет. В текстовом режиме палитра не меняется, да. Меняется только в 320x200. b2m - вы читали сообщение http://zx-pk.ru/showpost.php?p=648201&postcount=108 ? Что по поводу полноэкранного режима?
Что за "дамп ПЗУ палитры" такой?
Имеется ввиду микросхема РТ4 (на схеме обозначена D50). Дамп есть в архиве PoiskComp.zip (первая страница этой темы, 8-ое сообщение).
Выглядит так:
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
В текстовом режиме палитра не меняется, да.
Теоретически, это зависит от прошивки указанной выше РТ4.
Что по поводу полноэкранного режима?
Пока не знаю. Можно попробовать прописать в конфиге определённый графический режим для полноэкранного режима. Подозреваю, что автоматический подбор режима выбрал один из 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
14.12.2013, 12:26
Я номеров не знаю, сэмулирован контроллер винчестера ATA.
В942 -- это MFM контроллер (он же "НЖМД - Адаптер 2470053").
А прошивку АTA BIOS взяли от Поиска или еще какую-то?
4 цвета не имеют смысла. Цвет фона в обоих случаях (основной цвет точек и альтернативный) должен быть одинаковый. По крайней мере даже в имеющемся "неправильном" ПЗУ палитры это учтено. Вызывает сомнения тот факт, что в эксперименте на реальном Поиске бит выбора палитры никак не влиял на результат (фото test и test2).
Я имею в виду графику 320x200 и недокументировнную палитру 3, которая выставляется битом 2 ("черно-белый режим") порта 3D8.
А прошивку АTA BIOS взяли от Поиска или еще какую-то?
Прошивку брал из того-же архива. Выдаёт вначале:
Hard Disk BIOS "POISK" Version 1.1
Copyright (C) S.Kovalenko, 1990
Я имею в виду графику 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
14.12.2013, 13:07
Это b_hd_v11.rf2 с SHA1 57faa56b320abf801fedbed578cf97d253e5b777 ?
SHA не считал, имя файла - да, такое.
shattered
14.12.2013, 13:25
Крайне занятно. Разве это не прошивка от MFM контроллера? Как она работает с ATA?
MFM там, или нет, это уже контроллер разбираться будет. А общение с контроллером идёт в 8-ми битном режиме ATA PIO Mode, используются те-же 8 портов, плюс порт данных декодируется в ещё одной области памяти, чтобы rep movsb можно было использовать.
shattered
14.12.2013, 14:38
В942 не использует порты совсем, насколько я понимаю из схемы, только память (сегмент D000).
В942 не использует порты совсем, насколько я понимаю из схемы, только память (сегмент D000).
Так точно. Использовать порты внешние модули, я полагаю, не могли. Иначе зачем было делать не по стандарту (порты 1F0-1F7 для первого контроллера).
А где можно взять схемы всех внешних модулей?
shattered
14.12.2013, 17:48
Схему В942 -- в соседней теме, http://zx.pk.ru/attachment.php?attachmentid=36998&d=1345582603
Но вопрос остается -- как прошивка от В942 у вас вообще работает? :)
---------- Post added at 17:48 ---------- Previous post was at 16:49 ----------
Оказалось, что эмуляция WD2010 в MESS пока не работает, поэтому пока В942 подключить не удастся. Оставляю пока для раздумий трассировку общения BIOS v1.4 с контроллером (все адреса в сегменте D000, читается всегда 0). Полагаю, что по адресам 08xx находится собственно ВГ7:
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
Но вопрос остается -- как прошивка от В942 у вас вообще работает? :)
Ну, она сначала не хотела работать, но потом я её сильно попросил, и она заработала :)
shattered
14.12.2013, 18:28
Это как? :)
А другие карты эмулируете (джойстик, мышь, локальную сеть)?
Пока не знаю. Можно попробовать прописать в конфиге определённый графический режим для полноэкранного режима. Подозреваю, что автоматический подбор режима выбрал один из 8-битных режимов, а палитра по каким-то причинам не задалась. В 16-ти, 24-х и 32-битных режимах палитра не используется и цвета должны быть нормальные.
Попробуй добавить в конфиг строчки:
main.fullscreen=1280x1024x16
main.fullscreen.scale.x=2
main.fullscreen.scale.y=2
Не помогло. Нативное разрешение у меня 1280x1024x32, пробовал и его и 16 бит и 800x600 - ноль изменений.
Для 32-битных режимов нельзя делать scale.x (эмулятор может генерировать максимум 32 бита на точку). Странно, что не получилось с 16-битным режимом. Вобщем, пока не знаю, чем помочь.
b2m - а регистр флагов нормально обрабатываете? И вместе с ним, флаг trap, который должен переводить проц в режим пошагового исполнения команд (int 01).
Просто все великолепно в эмуле, кроме того, что ни checkit, ни pctools с информацией о системе, ни даже мой файл-коммандер упакованный diet не запускаются.
На всякий случай тест для раздумий насчет trap в архиве.
UPD: На реальном Поиске соответственно должен выдавать: "Intel 8088 '81 or later, or Intel 80C88"
Проблему с trap-ом решил, но checkit по прежнему вылетает :(
Ну, не видя сорцов мне трудно что либо сказать. Может по секрету (под NDA) все-таки покажите код эмуляции x86? И где бы новую версию с исправленным trap качнуть, попробую еще методом тыка поковырять...
И где бы новую версию с исправленным 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, у меня какая-то неправильная версия CheckIt, она использует 32-битные команды (с префиксами 66h,67h). А какая версия использовалась на Поиске? И где её скачать?
Ну у меня обычная CheckIT 4.10 работает на поиске без проблем. Вот тут брал: http://old-dos.ru/dl.php?id=619 (http://old-dos.ru/dl.php?id=619) То, что оно пытается юзать 386 команды - нормально вполне, там детектится 386 и выше проц. Скорее всего на этом все и вылетает. Нужно обрабатывать invalid opcode
---------- Post added at 18:24 ---------- Previous post was at 18:16 ----------
Вот стандартная тащемто детектилка проца тех времен:
; 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 и далее.
Смысл в том, что биты 12-15 регистра флагов на 8088 хрен поменяешь, они всегда аппаратно в единице.
Да, теперь CheckIt доходит до меню. Спасибо.
Да, теперь 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 смотреть.
я затираю в начале сегмент ES 16Kb нулями
Тут, что-ли?
xor di,di ; clean 16Kb ES:DI with zeros
mov cx,200H
xor ax,ax
rep stosw
Тут только 1Кб.
Тут, что-ли?
Тут, да, попутал параграфы и килобайты, но даже это не важно. Главное затереть 160 байт, так как размер эталонного массива - 160 байт. Поэтому путаница здесь есть, но к ошибке приводить она не должна. Пускай будем очишать 1 килобайт, этого достаточно вполне.
Вот с чем сравнивается:
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. У меня тут еденицы, если это флаги, то вроде так и должно быть?
со смещения 00 по смещение 4E - результаты работы ADD, INC. Потом несколько нулей (не используемых), далее со смещения 5C по 9F - флаги после результатов работы.
Но все это вообще не важно пока, потому как в эмуле пишется бред - error at 53 - то есть он нашел различие по смещению 53. Как так - я хз, в эталонном массиве там нули, в генеррируемом тоже должны быть нули, ибо 1 кб очищаем и более туда (по смещению 53) никто ничо не пишет в процессе.
Предполагаю, что REP CMPSB неправильно возвращает CX (который у меня и используется для вывода смещения по которому произошло несовпадение), либо что то еще.
По завершению 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
Где косяк?
По завершению repe cmpsb di=005e, cx=0042, это правильно?
Ну это значит нашлись отличия по смещению 5Dh. (159-42h) По крайней мере уже не бред.
[COLOR="Silver"]
Вывод байта работает неверно.
al=0D -> aaa -> al=03 cy=1 -> aad 11 -> al=33
Где косяк?
Ну вам виднее должно быть где косяк, я то сорцов не вижу. Очевидно, что в обработке этих опкодов. По крайней мере этот код byte2hex и word2hex я постоянно в детстве юзал - все работало на реале.
все работало на реале.
А можно по шагам расписать, как работает этот код? Каким образом получается +7 для чисел, больших 9?
---------- Post added at 17:06 ---------- Previous post was at 17:04 ----------
Я бы понял, как это работает, если бы вместо aad 11h стояло adc al,30h. Но тут?
А можно по шагам расписать, как работает этот код? Каким образом получается +7 для чисел, больших 9?
Честно - я его откуда-то скопипастил в лихих 90стых, поэтому не вникал. Но много где его юзал в своих програмульках, они работали нормально. Поэтому объяснить как это работает затрудняюсь, но это точно работает на реалах.
Видимо, я не совсем понимаю, как работает aad
AAD : AL = AH*x + AL ;AH = 0
И все флаги от результата AX- (SF, ZF, PF, OF, CF, AF)
Хорошо, флаги я забыл сделать, но AL=AH*x+AL именно так я и сделал. Разве что старший байт после умножения я отбросил, но ты пишешь AH=0...
---------- Post added at 17:21 ---------- Previous post was at 17:20 ----------
Есть такой вот тест (http://www.rcollins.org/ftp/source/aad/aad.asm), но он явно не пройдёт у меня :)
Ну я не знаю как так может быть. Вот в тесте печатает hex числа от 0 до FE.
Некоторые сорцы из эмулей:
case 0xD5: /*AAD*/
tempws=FETCH();
AL=(AH*tempws)+AL;
AH=0;
setznp16(AX);
cycles-=60;
break;
/* 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);
}
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;
Проблема оказалась в команде aaa, забыл ah обновить. Теперь пишет как и положено - 005D.
Обновил эмулятор.
Гуд, будем копать дальше :) На всякий случай собрал тест AAD, должен выводить 3FFF. DosBox кстати неправильно работает -)
Ваш эмуль тоже не проходит тест. PCem так же не проходит. На моем Поиске выдает 3FFF, как и положено.
Также не учитывается еще одна особенность 8088/86, а именно:
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 и дальше - нет:
; 8086/80186 80286+
; { {
; SP = SP - 2 TEMP = SP
; SS:SP = SP SP = SP - 2
; } SS:SP = TEMP
; }
Из-за этого вполне может не выдавать Info о системе pctools, например...
Так же интересно, почему если в качестве биос подсунуть некий тест, эмуль вообще падает по ексепшену. Тест div.bin, там устанавливается вектор прерывания int 00h, далее в коде происходит деление на ноль. Должно сгенерироваться int 0, но где-то тут наверно происходит крах системы -) В то же время, подобный тест sub.bin отрабатывает без ошибок. Правда в нем нет никаких обработчиков прерываний. Файлы res_div.bin и res_sub.bin содержат эталонные значения, с которыми можно сравнить содержимое памяти начиная с 0000:0000. В случае sub.bin все верно, ну кроме старших бит во флагах, но это так и должно быть. А вот с div.bin непонятно, так как эмуль падает.
С умножением похоже нелады во флагах после операций. И это не только старшие биты. Запускать вместо BIOS, потом сравнить память с res_mul.bin Флаги это важно, возможно checkit из-за этого падает с math-error
Так же интересно, почему если в качестве биос подсунуть некий тест, эмуль вообще падает по ексепшену.
Нашёл таки :) Это не баг, это фича :)
Арифметические команды выполняются 1-в-1, т.е. деление так и будет выполнено ассемблеровской командой div. Вот только ексепшен я пока не отлавливаю. Об этом я знаю. Будет сделано, когда-нибудь.
С умножением похоже нелады во флагах после операций. И это не только старшие биты.
Странно. Учитывая, что умножение тоже выполняется командой mul. Я конечно проверю ещё сохранение флагов после ассемблерных вставок, но кто его знает, может есть разница в 16ти и 32х битных режимах.
Нашёл таки :) Это не баг, это фича :)
Арифметические команды выполняются 1-в-1, т.е. деление так и будет выполнено ассемблеровской командой div. Вот только ексепшен я пока не отлавливаю. Об этом я знаю. Будет сделано, когда-нибудь.
Твой эмуль написан не на си?
Твой эмуль написан не на си?
На 99,9% на си. Просто в данном случае я решил использовать ассемблерные вставки для арифметики, чтобы не заморачиваться с тем, как каждая команда выполняется, какие флаги устанавливает. Процессор-то тот же, что и эмулируемый :)
На 99,9% на си. Просто в данном случае я решил использовать ассемблерные вставки для арифметики, чтобы не заморачиваться с тем, как каждая команда выполняется, какие флаги устанавливает. Процессор-то тот же, что и эмулируемый :)
Как-то контрпродуктивно)
Я понимаю, вставлять асм для ускорения, но для аутентичности, причем сомнительной...
Просто в данном случае я решил использовать ассемблерные вставки для арифметики, чтобы не заморачиваться с тем, как каждая команда выполняется, какие флаги устанавливает.
Если вы хотите предсказуемого поведения, боюсь заморочиться все-таки придется.
Обновил эмуль. Исправил push sp и aad.
Смысл в том, что биты 12-15 регистра флагов на 8088 хрен поменяешь, они всегда аппаратно в единице.
Я вот одного не пойму - в конце дампа res_mul.bin сохранён регистр флагов, и там старшие 4 бита нулевые. А сам говорил, что они должны быть 1. Откуда дамп?
Дамп походу с 80188, поэтому в этих дампах старшие биты нулевые. Вот здесь я тесты выцепил: http://orbides.1gb.ru/80186_tests.zip Ну только перекомпилял FASM'ом под 8Kb и в div вставил STI в начале на всякий случай. На самом деле хз, насколько они правильные и откуда (под чем) снимались дампы. Возможно даже не под реальным процом а в эмуляторе. Поэтому доверять им тоже надо 50/50
Оригинальный тред со ссылкой на тесты: http://forum.osdev.org/viewtopic.php?f=13&t=23739&sid=596c5c5d6456a2c2c25b583375b6a485&start=15
---------- Post added at 16:54 ---------- Previous post was at 16:47 ----------
Обновил эмуль. Исправил push sp и aad.
Пошел PCTOOLS с Info о системе. Пишет что установлен 80188 CPU :) Раньше был затык в месте определения проца. Изменилось поведение CheckIT - теперь на Benchmark не вылетает с math error, а висит :)
Пошел PCTOOLS с Info о системе. Пишет что установлен 80188 CPU :)
Круто :) Подозреваю, из-за неправильного количества тактов команд mul/div. Времянки пока не соответствуют действительности.
Круто :) Подозреваю, из-за неправильного количества тактов команд mul/div. Времянки пока не соответствуют действительности.
Ненене. Такты тут 99.99999% ни при чем. Вот в чем может быть дело:
;-----------------------------------------------------------------------------
; 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 флаги устанавливаются в зависимости от результата.
;-----------------------------------------------------------------------------
; 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 - ограничено. Кодес:
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.
А что, подробной доки на 8086 до сих пор нету?
То есть 8088 когда пытаются записать в конец сегмента слово, пишет один байт по смещению FFFF, а второй который не лезет - по смещению 0000.
Сделал так, всё равно пишет V20.
Ну, у меня тест из архива вообще детектит как 286 проц:
Вот этот тест детектит как 80188
Вот этот тест детектит как 80188
Добавил баг 8086 (неверный возврат после прерывания команды rep с префиксом замены сегмента), теперь пишет как положено 8088. CheckIt по прежнему детектит как V20. Интересно, как он отличает V20 от 8088?
Добавил баг 8086 (неверный возврат после прерывания команды rep с префиксом замены сегмента), теперь пишет как положено 8088. CheckIt по прежнему детектит как V20. Интересно, как он отличает V20 от 8088?
Баг какой-то не тот... cpuid1.com тестит 188 по по shl на число большее 32 (FF в данном случае). Если сдвигает - значит 86, если не сдвигает - значит 188.
Добавил сброс флага Z после умножения, теперь детектится как 8088 :)
С _mhz я ошибся, он детектит как 188 тоже. И то же по этому же принципу. SHL и SHR 8088 может сдвигать на любое число в то время как 188+ только на "число mod 32"
Баг какой-то не тот...
Без бага детектилось как V20, после того как я исправил команды сдвига. Качай новую версию. :)
---------- Post added at 15:31 ---------- Previous post was at 15:29 ----------
Но это всё мелочи. Надо разбираться с переполнением при запуске теста скорости...
Все, новая версия все ок. Единственное пожелание - все-таки сделать обработку 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 - выкидывает в монитор?
Еще вопрос - а как отлаживать программу во встроенном дебагере? Ну в смысле, как отловить момент запуска?
Я делаю так:
- запустил программу, вышел из неё
- открыл отладчик, поиском нашёл начало (несколько байт в точке входа)
- поставил туда бряк, запустил эмуль дальше (F5) и снова запустил программу
С .com файлами проще, они грузятся и запускаются по одному и тому-же адресу. У меня, например, после загрузки голого ДОСа, точка входа всегда одинаковая 0EBB:0 (ну или 0EAB:100, хотя я использую абсолютное смещение 0xEBB0, привычнее набирать без двоеточия). Ставлю бряк туда сразу после запуска отладчика.
И еще вопрос - почему эмулятор не работает с любыми другими FDD BIOS - выкидывает в монитор?
Если другой BIOS рассчитан на другой контроллер - то понятно. А если на такой-же, то выкладывай свой BIOS, я поковыряю-потрассирую.
Если другой BIOS рассчитан на другой контроллер - то понятно. А если на такой-же, то выкладывай свой BIOS, я поковыряю-потрассирую. Ну ВГ93 она ж вроде и в африке ВГ93. Порты то не меняются, а как я понимаю, контроллер через них с вгшкой общается. Вот три разных BIOS от флоповых контролллеров, во всех случаях эмуль вываливается в монитор (F1 - работа с кассетой, F2 - работа с ПЗУ). Я понимаю, если бы вис или там с дискеты не грузился, но это странное поведение какое-то.
Все три работают, вот только контрольная сумма у всех трёх 0EDh, а не ноль. Биос их даже не пытается запустить. Если подправить регистр al после суммирования - всё работает. Подозреваю, рассчитаны на другой биос, который иначе считает КС.
---------- Post added at 20:14 ---------- Previous post was at 19:46 ----------
А, я понял. Третий байт ПЗУ - длина (количество блоков по 512 байт), в этих ПЗУ указано 16 блоков, хотя реально лишь 4 блока. Если просуммировать 4 блока, то будет ноль. Я разместил ПЗУ подряд, а реально было видимо с дырками, заполненными байтом FF. Если дополнительно просуммировать 256*n байт FF, то КС не изменится.
Тогда вопрос - по каким адресам реально были размещены ПЗУ?
Контрольная сумма у всех трех = 00h. Считается сложением всех байт файла (последний байт тоже считается). Опкод OR AL,AL устанавливает флаги ZF?
Ща посмотрю на Поиске по каким адресам
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
19.12.2013, 21:56
Ну ВГ93 она ж вроде и в африке ВГ93. Порты то не меняются, а как я понимаю, контроллер через них с вгшкой общается. Вот три разных BIOS от флоповых контролллеров,
А чем они друг от друга отличаются?
А чем они друг от друга отличаются?
А хз. :)
shattered
19.12.2013, 22:11
А прошивка КЖД версии 1.7 есть? :)
А прошивка КЖД версии 1.7 есть? :)
Ну вон же она, несколькими постами выше. E200h.rom
Короче хотел воспроизвести ошибку, по которой падает Checkit в бенчмарке с
run-time error M6104: MATH
- floating point error: overflow
checkit, согласно http://thomas.fach-pedersen.net/compiler-copyrights.txt , скомпилен Microsoft C 5.1, о чем говорит строка с копирайтом в EXE:
MS Run-Time Library - Copyright (c) 1988, Microsoft Corp\x11
Установил MS C 5.1 (еле нашел), компилял какую-то писькомерку, перемножающую массив рандомных чисел несколько раз:
/*
* 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 есть несколько вариантов как работать с вещественными:
/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, который по дефолту. Все три варианта отрабатывают без ошибок :( Воспроизвести не смог.
А не, как раз вариант с /FPi (дефолтный ключ) падает так:
run-time error M6101: MATH
- floating point error: invalid
Значит /FPi генерит прям в коде опкоды сопроцессора (fld, fmul и тд). Библиотека эмулятора смотрит - если есть сопроцессор, то оставляет все как есть, если нет - то эмулятор вроде устанавливается в NMI (int 02h) и когда происходит invalid opcode обрабатывает его. Самое интересное - исходники флоат пойнт эмулятора с этой ран тайм либы в архиве EMOEM.ASM
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
23.12.2013, 22:45
http://mame.dorando.at/svn/?rev=26689 -- Поиск-1 добавили в MESS.
Восстановил схему клавиатуры 91 года (отдельно не описывал, все в коде), насколько могу судить -- все работает. Родной HDC пока работать не будет, а XT-IDE я не проверял. Флоппи ведут себя странно -- можно загрузиться и нормально работать с A: до смены диска, после этого dos начинает скипать каждую вторую дорожку (в итоге каталог дискеты читается, но файлы уже нет)
В патч входят и другие вещи (ЕС-1847, скелет ПК-88 и клавиатуры Искры 1030) -- продолжение следует :)
shattered
24.12.2013, 22:06
.... и вышел релиз MESS 0.152 с этим патчем. XT-IDE (http://code.google.com/p/xtideuniversalbios/) таки работает, но т.к. Поиск по-другому считает КС, нужно сначала стукнуть в бубен: "bpset fee68,ds==c800,{do ax=0200;go}" в отладчике перед стартом эмуляции). Итого:
http://img-fotki.yandex.ru/get/9836/264743.3/0_a098d_8438c1f2_XL.png (http://fotki.yandex.ru/users/shattered/view/657805/)
shattered
05.12.2021, 15:48
Имеется ввиду микросхема РТ4 (на схеме обозначена D50). Дамп есть в архиве PoiskComp.zip (первая страница этой темы, 8-ое сообщение).
Выглядит так:
Код:
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
Эта прошивка выглядит так же, как "D50. номер редакции программы: 00" на фотографиях ТО
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot