NMI_SERVICE:
CLD
PUSH ES
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH SI
PUSH DI
PUSH AX
MOV AX,DSEGMENT
MOV DS,AX
mov bx,sp
;SS:[BP] - ВР
;SS:[BP+2] - IP
;SS:[BP+4] - CS
;SS:[BP+6] - флаги
mov rep_now,0
mov ax,ss:[bx+4+14]
mov bx,ss:[bx+2+14]
mov es,ax
cmp byte ptr es:[bx],0F3h
jne skip_rep
mov rep_now,1
jmp skip_rep2
skip_rep:
cmp byte ptr es:[bx-2],0F3h
jne skip_rep2
mov rep_now,1
skip_rep2:
Смысл в том, что когда CX=2 и rep stosw, то я получаю в NMI уже опкод команды, следующей за rep stpsw. Поэтому для такого случая приходится проверять es:[bx-2]. С другой стороны, когда CX=1 и rep stosw, я здесь зря отрисую два символа. И когда CX=3, должно сработать первое условие es:[bx].
Скомпилил биос, прошил... Ну.... Волков работает. Дальше пока не могу тестить, клава не работает :E
Ну, раз волков онлайн, значит проблема, по сути, решена. Искренне поздравляю, такие баги ловить - занятие неблагодарное.
И чсх, никому кроме тебя это не надо, и никому кроме тебя это не интересно. Но как же приятно найти и удавить засранца!
В общем - грац!
Спасибо. Но не все гладко - те сорцы биоса, что есть - это 89 года, видимо одна из самых первых версий. Много багов, например не правильное определение кол-ва памяти (в меньшую сторону), не отображает инверсные цвета, клавиатура немного по-другому назначены кнопки, например ESC - это F1, F2 - это F1 и тд)... То есть работает, но не так, как с биосом 91-ого года... Ну думаю потихоньку подправлю...
Так а я о чем изначально? Замена 2 вектора (без каких-либо модификаций любого биоса!) - лучшее решение.
Скажем, резидент, подменяющий NMI. Ну скушает он 20-30 параграфов памяти. Кто умрет-то (в текстовом режиме причем)?
Зато загружабелен и выгружабелен (волков альт+ф5, если мне не изменяет склелоз) по желанию, а не прибит гвоздями в биосе. Который еще перешить чем-то надо.
Vic3Dexe Посмотрел твой исходник - вроде бы все хорошо, только это будет медленно на мой взгляд (генерировать еще раз nmi путем перезаписи байта). Поиск и так то тормозит с выводом на экран... Чем хорош вариант с BIOS - не нужно дважды проходить груду push ax, push bx, push dx.... pop dx, pop bx, pop ax.
Если просто записать в порт 28h нужный адрес и джампнуться еще раз в NMI, не будет ли побыстрее, чем аппаратно генерировать NMI?
Записать в 28h ничего не получится - глянь по схеме, он пишется по фронту NMI. У меня тоже такая мысль была. =)
А что медленно... Ну NMI придется звать так или иначе. И как бы в варианте вшивания в биос дольше не получилось, из-за того, что инструкции в биосе лежат (я не в курсе - он у поиска медленней RAM?).
Да, и нашел 3 бага у себя же:
1. После mov [es:bx],al нужно добавить сброс флага mov [cs:flag],0
2. После pop DS перед iret нужно добавить pop bp
3. В инструкциях cmp [cs:flag],1 / je exit метку нужно сменить на exit1, которую поставить на iret (мы же в этом месте регистры еще не сохраняли)
upd:
4. mov al,[es:bx+2] / mov [es:bx+2],al
Угу, я тоже эти баги еще вчера видел, но это и так понятно, поэтому не заострял. Сегодня попозже попробую протестить, щаз уезжаю по делам. Вообще, есть мысль переписать нафиг int 10h и nmi на свои полностью, для начала резидентом конечно, а в дальнейшем и в BIOS встроить. В частности в процедурах отображения символов использовать таблицы, а не на ходу вычислять позицию в буфере и тд. Но работка не очень легкая.... Но интересная.
Все-таки решил пилить BIOS, потому что... Ну потому что тормоза будут, если подменять int 2 из-под доса. Прям чувствую. Ну и с биосом можно поиграться в плане перевода части команд на V20 для ускорения, оптимизации. Пока дописал нормальное отображение инверсного цвета (это было легко). И взялся за клавиатуру... Выручает имеющийся эмулятор Поиска - EMU за авторством b2m (http://bashkiria-2m.narod.ru/index/files/0-11 ), хоть и не без косяков он, но юзать можно. В биосе 91-ого года совершенно по другому реализовано сканирование клавиш, код не совпадает с имеющимися листингами совсем. Долго не думая, решил диззасемблернуть 91-ый биос и впилить кусок, отвечающий за сканирование в имеющиеся исходники... Все шло гладко, пока не дошел до таблиц перекодировок. Но я думаю еще несколько часов в дизасме и хекс редакторе и все-таки наступит "просветление".. Так что вот так пока.
Ну сорцы - 89 года, которые везде есть в инетах. А биос в бинарнике - от 14.02.91. Все-таки впилил дезассемблированную обработку сканирования клавиш из биоса 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) Ну и по мелочи, оптимизация, приведение кода в человеческий вид...
Вот такие планы...
На всякий случай прикладываю текущий модифицированный биос с исходниками. Собираю в dosbox, запуская make_p1.bat. На выходе bios.bin.
You do not have the required permissions to view the files attached to this post.
Так я как раз про бинарник-91. Где лежит-то этот кнопкосканер в нем (или с чем сейчас проблема)? В дизассемблинге опыт есть (любимая Elite разобрана по байтику за мелкими исключениями, UFO на очереди). Даже морровинд ковырял, но сиплюсплюснутые компиляторы вымораживают...
В общем по асму/дизасму - любые вопросы.
К сожалению, с запуском Принца и пр. помочь не смогу - железа нет, и как выглядит проблема я не знаю. Эмуляторы едут лесом, и вот почему. Разбирался с потрохами VGA (мне его в свой проект на FPGA пихать надо), первые же нестандратные проверки на реальном (хоть и современном) железе и эмуляторах показали полную несостоятельность последних. Так что эмуляторам доверять перестал вообще. Исключение, пожалуй, досбокс - там уклон именно в точную эмуляцию старого железа.
Справился с клавиатурой худо-бедно. Перенес по кускам из версии 91-ого года. Благо int 9 похож на int 9 из сорцов биоса Поиск-2, практически байт-байт копипаста. Таблицу переконвертации русских букв они выкинули из SCANINT2 и засунули в int16. И теперь это стала реально таблица, а раньше была небольшая табличка и множество условий...
Вообще клава работает.
Теперь видео - тоже не совпадает код в 91 и 89 года версии, то же они там многое поменяли... В 89 все как-то сыровато - глюки с видео-страницами, с прятаньем курсора, курсор оставляет инвертированные пиксели на символах, палитра не переключается для 320x200, и тд и тп. Наверное целиком in10h я не перетащу, больно большой... Не знаю...
Попробовать новый int10h впилить и к нему прикручивать уже Поисковое...