Реальный 8086/88 + FPGA

16-битные ПЦ-совместимые компьютеры с процессорами 8086/8088/80286 работающие под управлением ДОС

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

antsnark wrote:Железо вроде подходящее :) (кроме пузырьковой памяти)
Да а че ей - это просто память... у них тогда не было другой, а у нас сейчас - есть!
Если знать начальный адрес видео-ОЗУ и структуру экрана, можно на JS бы эмульнуть.

Процессор есть на JS, только бы экран ему приделать... и усё!!!
iLavr
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

newold86 wrote:
jdigreze wrote:Я в таком случае обычно откладываю поиски проблемы до утра. Взгляд "замыливается", и очевидную ошибку, лежащую на видном месте, просто не видно.
Самое интересное, что так и произошло - сейчас утром перед работой решил взглянуть еще раз (без особой надежды), и случилось чудо - удалось вернуть работоспособность :)
Этот трюк всегда работает :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:Этот трюк всегда работает :roll:
И даже вошел в народный фольклор:"Утро вечера мудреннее!" :D

Я обычно оставляю всё на утро если под руками начинают пропадать скальпель и пинцет... :lol:
iLavr
Vic3Dexe
Doomed
Posts: 370
Joined: 16 Dec 2014 11:58
Location: Киев

Post by Vic3Dexe »

jdigreze wrote:Я в таком случае обычно откладываю поиски проблемы до утра. Взгляд "замыливается", и очевидную ошибку, лежащую на видном месте, просто не видно.
[offtop]Когда-то давно попутал регистры bl и dl (очепятка приключилась). Искал часа 4. Код уже на память знал, в буквальном сымсле. Плюнул, лег спать. Засыпая, "увидел" эту долбаную очепятку.[/offtop]

По теме - что значит "между вызовами биос"? Т.е. в самом коде доса? Как определяли? В общем, если можно, поподробнее, мне предстоит примерно то же самое (процы ко мне уже приехали, жду ссыклон, плату и пр. от китайцев).
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Vic3Dexe wrote:По теме - что значит "между вызовами биос"? Т.е. в самом коде доса? Как определяли? В общем, если можно, поподробнее, мне предстоит примерно то же самое (процы ко мне уже приехали, жду ссыклон, плату и пр. от китайцев).
Да никакого особого метода тут не было... Просто вначале было просто - ДОС вызывает какую-то функцию BIOS'а, которая у меня не сделана или недоделана, я это вижу, а также вижу, что сразу после этого все зависает. Это является хорошим поводом внимательнее взглянуть на эту функцию BIOS.

А тут вдруг стало виснуть после вызова самой невинной функции, причем не сразу, а сначала поработав диском (т.е. SD-картой). Решилось, как у меня часто бывает, просто обдумыванием, в процессе которого вспомнил, что ранее добавил определение объема оперативной памяти (ранее эту цифру просто жестко в BIOS'е прошивал).

Определение у меня было примитивным - записал байт, прочитал и сравнил. Так вот, оказалось, что если записать байт и быстро его обратно прочитать, то он там в глубинах FPGA сохраняется (при отсутствии нормальной памяти в данном участке адресного пространства) !!! Естественно, мой тест решал, что памяти много, и выставлял соответствующую цифру в области данных BIOS, которой потом пользовался ДОС (естественно, косвенно - через соответствующую функцию BIOS). Но вот ДОС пользоваться межбитным пространством для хранения данных не умел :), поэтому подвисал...

В процессе наведения порядка не удержался и сделал несколько новых вещей, из которых самая эффектная:

Image

Пока еще есть мусор на экране (как всегда, проблема лишней или недостающей точки), да и регистры палитры отсутствуют, но с такими картинками уже приятнее работать :)

Кстати, при работе над графическим режимом потерял час времени, пытаясь запихнуть 8192 в 13 бит :) - все не мог понять, почему адрес получается совершенно не тем, каким должен быть...
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Убрал лишнюю точку, а потом не удержался :) :

Image
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

newold86 wrote:Убрал лишнюю точку, а потом не удержался :)
С таким постоянным неудержанием - скоро доделаешь! :lol:
iLavr
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Lavr wrote:
newold86 wrote:Убрал лишнюю точку, а потом не удержался :)
С таким постоянным неудержанием - скоро доделаешь! :lol:
Учитывая, что изначальная цель была просто помигать светодиодом, некоторый прогресс действительо есть :)

Также как и есть появившееся понимание, что нужно либо на этом остановиться, либо тогда уж делать аппарат практически на 100% совместимым по железу с оригинальной XT.

После двух (или сколько там) месяцев ковыряния эта задача уже не кажется реально сложной - думаю, дело всего лишь во времени.

Наверное, реальным следующим этапом на пути к совместимости может стать реализация таймера 8254 - похоже, многие игрушки его используют, и не только для музыки.

Я изначально собирался поставить "железные" 8259 и 8254, поэтому пока сделал на VHDL только простейшие затычки, но сейчас думаю, что вполне реально без особых усилий сделать 100% совместимые 8259 и 8254 внутри FPGA.

Проблема в том, что FPGA нужного размера существуют только на 3.3 (и меньше)V, а 82xx я на 3.3V не нашел, поэтому необходимое количество согласователей уровней превратит схему в уродливого монстра. Я просто не могу для себя придумать никакого оправдания такому подходу, поэтому потихоньку утрясаю в голове пути реализации 8254 (как минимум).
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

newold86 wrote:Проблема в том, что FPGA нужного размера существуют только на 3.3 (и меньше)V, а 82xx я на 3.3V не нашел, поэтому необходимое количество согласователей уровней превратит схему в уродливого монстра. Я просто не могу для себя придумать никакого оправдания такому подходу, поэтому потихоньку утрясаю в голове пути реализации 8254 (как минимум).
Как мне видится, элегантный выход здесь уже упоминали, но по условиям топика -
он считается неспортивным.

А выход - упихать и сам 8086 в FPGA нужного размера.

Да, я знаю все возражения против, но для самого себя у меня большой аргумент ЗА.
Если уж я соберусь приобрести такую довольно дорогую штуку и обзаведусь всеми
сопутствующими "блэкджэками", то у меня не будет никаких моральных ограничений,
чтобы не цеплять к ней этот устаревший процессор.

А кстати, его КМОП-версия не может работать от 3.3 В ?
iLavr
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Был в разъездах, поэтому в последнее время устройством занимался чисто теоретически. Тем не менее, за это время в голове сложилась схема реализации более быстрого интерфейса с SD картой.

До этого момента аппаратно передавал/принимал один байт, все остальное делалось программно. В результате скорость показывало около 35 кБ/сек.

После возвращения домой первым делом реализовал аппаратное чтение/запись блоков произвольного размера (пока без ПДП), в результате даже без оптимизации INT 13 (который все еще ориентирован, в основном, на побайтную работу), получилось следующее:

Image
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Блин, крутую конструкцию я сделал - обнаружил, что из-за звона сигналов в шлейфе у меня, в частности, тактовый сигнал обрастал лишними импульсами. И, не смотря на это, все (практически) работает !

Было несколько непонятных проблем, я их убрал, вылечив симптомы, а сейчас вроде и причину обнаружил...
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Как говорится, теперь и со звуком - http://my.mail.ru/mail/nastalk/video/_myvideo/1.html

С этой игрой связан один прикол. Всего я поставил десятка полтора игрушек, с помощью которых проверяю совместимость с PC XT. В какой-то момент эта игра заработала, но раз в 100 медленнее, чем должна.

Перепроверил все, откуда можно брать временную информацию - от таймера до регистра CGA адаптера с состоянием обратного хода развертки (и все остальное). Поставил ловушки на обращения ко всем портам - ничего...

В конце концов вдруг увидел в каталоге игрушки файл с названием popspeed.exe - я просто забыл, что в те времена игрушки зачастую сами не подстраивались под железо, а нужно было это делать вручную...
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Не, ну всякое видел, но такое... Скачал почти три десятка старых игр, которыми проверяю совместимость. Одна из игрушек в упор отказывалась видеть CGA, как я не плясал с бубном... И это при том, что у меня сейчас с CGA такая совместимость, что в BIOS'е используется 100% родной функции INT 10 - т.е., по идее, круче уже не бывает.

Тем не менее, сейчас узнал еще один способ, которым пытались определить наличие CGA адаптера (кстати, на мой взгляд, не очень корректный, и уж точно не имеющий большого смысла). Короче, писали байт 55 в порт, определяющий положение курсора на экране, а потом оттуда читали и сравнивали с тем, что записали. У меня эти порты, естественно, реализованы, но только на запись - вообще не думал, что стандартный CGA подразумевает возможность чтения из них...

Быстро подправил, результат:

Image
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

newold86 wrote:писали байт 55 в порт, определяющий положение курсора на экране, а потом оттуда читали и сравнивали с тем, что записали. У меня эти порты, естественно, реализованы, но только на запись - вообще не думал, что стандартный CGA подразумевает возможность чтения из них...
Ну как бы у всех портов "на запись" при чтении обычно считывается последнее записанное значение,
за редким исключением.
iLavr
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Post by newold86 »

Lavr wrote:
newold86 wrote:писали байт 55 в порт, определяющий положение курсора на экране, а потом оттуда читали и сравнивали с тем, что записали. У меня эти порты, естественно, реализованы, но только на запись - вообще не думал, что стандартный CGA подразумевает возможность чтения из них...
Ну как бы у всех портов "на запись" при чтении обычно считывается последнее записанное значение,
за редким исключением.
В данном случае в родном CGA, как оказывается, из 16 портов в этой группе можно прочитать 4. Это не совсем обычные порты - у них нет прямого адреса, сначала номер порта пишется в индексный регистр, а потом уже идет обращение по адресу этой группы.

А вот если CGA реализован на более продвинутом (по сравнению с родным 6845) чипом, то там уже все порты читаются.

В любом случае, непонятно, чего программист добивался именно таким способом определения наличия режима...

P.S. Кстати, хочу заметить, что у меня по игрушкам сейчас совместимость уже лучше, чем в тех аналогичных проектах, которые я нашел в интернете...