Tronix, Могу дать погонять китайский 16канальный Saleae.
16 каналов будут на 16мгц сэмплиться.
Всёравно пока без дела лежит.
Забирать на м.калужской, как обычно
Tronix, Могу дать погонять китайский 16канальный Saleae.
16 каналов будут на 16мгц сэмплиться.
Всёравно пока без дела лежит.
Забирать на м.калужской, как обычно
С уважением, Дмитрий.
Спасибо, но наверное пока не нужно. У меня на работе тоже есть 16-ти канальник, какой-то злой, на ПЛИС, очень большие мегагерцы может снифать. Если что его возьму....
Просуммирую мысли, в кратце, чтобы самому не забыть:
У Поиска есть две области видео-памяти по 16Kb каждая, отображаться на экране может одна из них. В графическом режиме отображается B800h, в текстовом - отображается BC000h, содержащая графическое представление текстовых символов из B800h. Происходит это в моем понимании примерно так: когда установлен текстовый режим, при записи символа в видео-память B800h срабатывают ловушки адреса (регистры-защелки), которые запоминают, по какому адресу произошла запись. Дальше вызывается обработчик NMI, который в свою очередь читает из портов 28h и 29h значение адреса (из регистров-защелок), по которому произошла запись, и отрисовывает символ в видимой графической области BC000. Сам код символа записывается в B8000h.
За отслеживание, что запись происходит в видео-память отвечает РТ4 (с небольшой помощью РТ5?), при удачной дешифрации формирующая сигнал /CRTIOM. Дальше этот сигнал вместе с некоторыми другими запускает мультивибратор, который дает длинный импульс NMI (не менее пяти тактов, наверное).
По сигналу NMI происходит защелкивания текущего адреса в регистры-защелки:
Ну и дальше проц должен уйти на обработчик NMI, который прочтет из портов 28h,29h адрес куда писался байт и отрисует его графическое представление в отображаемый экран BC000h. Дешифрует порты РТ5, формируя сигнал /TRAPSEL, который потом разделяется на 28h (TRAPL),29h (TRAPH) и 2ah (TRAPDAT) с помощью ИД7.
Так вот, когда идет запись двух байт (mov cx,2; rep stosw), первый байт - есть сигнал /CRTIOM, затем длинный NMI и затем уже /TRAPSEL, TRAPL и TRAPH. А вот второй байт - нет сигнала /CRTIOM, соответственно нет и всего остального. Такое ощущение, что "проскакивает" он.
Я щас глянул даташит на NEC v20, увидел интересный момент. У него скважность CLK по спецификации равна двум. А на Поиске-то она равна трем. Учитывая, что переключение шин процессора происходит скорее всего по фронту сигнала, это действительно может вызывать подобную хрень.
Поиск-1, Поиск-2, Парус ВИ-201, Олимпик-С, Электроника МК61
похоже что /trapsel на v20 кривой изза другого поведения /inta? либо изза другого состояния на шине в момент формирования /trapsel
Не доходит дело до /TRAPSEL. Это я неправильно смотрел. Сначала должен сформироваться сигнал /CRTIOM, чтобы вызвать NMI и по этому же сигналу (NMI) защелкнуть текущий адрес на шине адреса в ИР23. А /TRAPSEL уже потом, его процедура обработки NMI формирует для доступа к портам 28,29h, из которых она узнает по какому адресу произошла запись. Так дело до NMI не доходит, так как нет /CRTIOM
А /CRTIOM дешифруется просто с шины адреса... Неужели на шине адреса не выставляется адрес по какому происходит запись в память? Но этого же не может быть, иначе бы вообще ничего не работало. Да и потом, физически, запись в B800h происходит, то есть байты там появляются (в памяти). Значит все-таки проц работает нормально, и адреса выставляет нужные на шину. Только если РТ4 не успевает сработать из-за короткого CLK?
Есть другая безумная идея - сделать свой дешифратор на мелкой ПЛИС для сигнала /CRTIOM и сравнить с текущим дешифратором. Если у меня сигнал будет формироваться, а у Поиска нет - то скорее всего дело в РТ4(и РТ5?). С другой стороны, как же работают остальные сигналы /PROMSEL (доступ к ПЗУ) и /RAMSEL (доступ к RAM)... Не понимаю.
Последний раз редактировалось Tronix; 03.11.2015 в 08:00.
Хммм... Уставшим взглядом после работы посмотрел опять на схему дешифратора и увидел, что кроме адресов и DT/R по входу еще присутствует сигнал /NMIDIS.
Рулится програмно, через 68h порт бит 3...Формирование сигнала немаскируемого прерывания произво-
дится при записи данных в буфер дисплея B8000Н - BBFFFН
только при наличии сигнала разрешения NMIDISABLE (потенциал
низкого уровня на выводе 1 микросхемы D42).
Вот его бы интересно взглянуть. Пока что-то не найду на схеме...Код:---------------------------------------------------- Порт ввода-вывода 68Н ----T-------------------T--------------------------- N ¦Наименование ¦ Назначение бита¦сигнала управления ¦ ----+-------------------+--------------------------- 0 ¦ R (Red) ¦ ----+-------------------+Цвет изображения и фона 1 ¦ G (Green) ¦ ----+-------------------+ 2 ¦ B (Blue) ¦ ----+-------------------+--------------------------- 3 ¦ NMI DISABLE ¦Запрет/разрешение формиро- ¦ ¦вания немаскируемого ¦ ¦прерывания ----+-------------------+--------------------------- 4 ¦ PALETTE ¦Цветовой выбор (палитра) ----+-------------------+--------------------------- - 32 - 5 ¦ I (INTENS) ¦Интенсивность изображения ¦ ¦и фона ----+-------------------+--------------------------- 6 ¦ DISPLAY BANK ¦0/1 страница видеопамяти ----+-------------------+--------------------------- 7 ¦ HIRES ¦Графика высокого/среднего ¦ ¦ разрешения
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Вообщем, пока форум лежал, решил проконсультироваться тут: http://www.nedopc.org/forum/viewtopic.php?f=87&t=11189 . В итоге, были проведены ряды экспериментов: я записывал по кругу цифру "1" (mov cx,1; rep stosw) на экран и два раза цифру "2" (mov cx,2; rep stosw). В самом обработчике NMI вывожу содержимое из регистров-защелок (in ax,28h), затем значение по этому адресу в памяти символа и его аттрибута (CHR: ) и значение по этому адресу плюс два (CHR+2). Поведение на 8088 предсказуемо:
А вот V20:
Выяснилось, что при операции прямой записи в память типа MOV CX,2; REP STOSW попадая в NMI для обработки первого символа в памяти уже находится и второй символ!
Такие дела... В итоге взял исходники BIOS 89 года, которые есть везде, и попробовал сделать следующее - при в ходе в NMI взять из стека адрес CS:IP предшествующей команды и сравнить ее на наличие префикса REP (0xF3). Если есть - значит мы попали в NMI в разрыве между REP xxxx, и значит нужно рендерить сразу два символа - текущий и по адресу текущий+2. Но пришлось сделать две проверки - когда CX=2 и rep stosw, то я получаю в NMI уже опкод команды, следующей за rep stpsw. Поэтому для такого случая приходится проверять es:[bx-2]. С другой стороны, когда CX=1 и rep stosw, я здесь зря отрисую два символа. Когда CX=3, должно сработать первое условие es:[bx].
Скомпилил и тут же словил первый баг - не правильно распознавался объем RAM. Вместо 480Кб дос рапортовала о 306Кб вроде, и CheckIt не запускался, ругаясь на нехватку памяти. Переписал процедуру определения RAM. Скомпилял. Запустил VC - работает как надо. Запустил тесты в CheckIt - ну.... снизилась видео-скорость конечно... 430 bios speed и 822 direct speed. Ну и вообще, биос 89-ого года из сорцов - уж очень ранний, что-ли. Багов много - не правильно настроена клава. Клавиша ESC - это F1, F2 - это F1, нельзя нажать Ctrl+L, потому что Ctrl - это вроде бы Alt и тд. Странно отрисовываются инверсные цвета, не так как в биосе 91-ого года (когда фон белый а сам символ черный). Не полностью работают CGA-порты, особенно на чтение, поэтому Принц Персии не запускается и ругается на отсутствие видеоадаптера. И это только на первый взгляд. Ах да, я еще выпилил полностью работу с кассетой, а то мне места не хватало. Но на всякий случай выложу здесь, в прикрепленном файле с исходниками.
А так можно попробовать подменять NMI из-под доса резидентом...
Последний раз редактировалось Tronix; 14.11.2015 в 19:36.
впилил дезассемблированную обработку сканирования клавиш из биоса 91-ого года. Теперь клавиши начали соответствовать своей раскладке на клавиатуре (ESC - это ESC, F1 - это F1 и тд), начали срабатывать комбинации Ctrl + буква, начал включаться синий фон при нажатии правого Ctrl (переключение на русский). Однако само переключение не происходит, символы по прежнему печатаются английские, и не выключается синий фон повторным нажатием на правый Ctrl. Видимо что-то еще там не того, наверное еще и int9 надо менять... Но все равно, уже гораздо лучше, по сравнению с самым первым вариантом.
Итого, уже пофикшено:
1) Правильное определение количества набортной памяти. По умолчанию сильно занижал, например на реальных 480Кб дос рапортовала о ~306Kb. Не стал разбираться, а переписал функцию. Сделал вывод на экран количества памяти (места много, так как выкинул кассетные функции).
2) Нормальный вывод символов, с инверсными аттрибутами. Volkov Commander стал выглядеть так-же, как и на биос 91-ой версии
3) Частично заработала клавиатура. Описано выше. Изменен SCANINT2.ASM. Старый сохранен как SCANINT2.A__
Что еще надо сделать:
1) Клавиатура - описано выше (русские символы, убирание синего фона при повторном нажатии пр. Ctrl)
2) Впилить более корректную обработку CGA портов в NMI, в том числе вроде в 91-ой версии есть возможность читать значения из CGA портов, а не только их туда писать. Добится запуска принца персии.
3) Посмотреть что с курсором - он не убирается, когда его выключают, хотя вроде бы функции такие в 89 биосе есть.
4) Посмотреть что с переключением видео-страниц. При тестировании видеостраниц в Checkit происходит не пойми что.
5) Шрифт - взять из 91-ой версии, потому что мне он больше нравится. Различаются начертанием кодов >127
6) Ну и по мелочи, оптимизация, приведение кода в человеческий вид...
Вот такие планы...
Спасибо, Tronix!
Самому очень хочется заняться BIOSом, да времени катастрофически не хватает.
А нет ли у Вас в планах - знакогенератором заняться?
Привести к привычному виду символы псевдографики?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)