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)