DOS и FB программа
|
|
haav | Дата: Четверг, 23.04.2020, 21:32 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Тут надо было проверить один исходник на DOS . Поскольку там задействуется функционал, который не пашет в DOSBOX , я решил скомпилить в эмуляторе и потом загрузиться с дискеты в реальный dos и запустить готовый EXE-шник. А тут облом, дос пишет: "program too big to fit in memory". Программа имеет размер что-то вроде 130кб. Что за фигня думаю я, ведь помню , что когда-то запускал и побольше программмы. Ну ладно думаю заморочусь дальше, раз начал. В общем попробую прямо в досе скомпилить и запустить. Все сделал и заработало , причем размер программы такой же , как при компиляции в DOSBOX. Задача решена , но осадок остался. Получается , что если надо будет кодить под dos , эмулятор не вариант...
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
DarkDemon | Дата: Воскресенье, 26.04.2020, 14:58 | Сообщение # 2 |
Полковник
Группа: Друзья
Сообщений: 200
Статус: Offline
| Стас почему эмулятор не вариант, поставь виртуальную машину, никакой разницы с железом нет(кроме скорости инструкций конечно). DOSBox вроде эмулирует только DOS версии 5 и часть драйверов там уже вшито. "program too big to fit in memory" - это скорее сообщение самой программы, возможно ей нужна EMS\XMS или ровный чистый кусок в основной памяти(чтобы адресовать всю область через сегментные регистры), а там может посередине где-то драйвер висит, хотя звучит абсурдно конечно. Да и вроде у DOSBox-а уже встроены обработчики EMS\XMS.
Сообщение отредактировал DarkDemon - Воскресенье, 26.04.2020, 15:08 |
|
| |
haav | Дата: Воскресенье, 26.04.2020, 18:10 | Сообщение # 3 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата DarkDemon ( ) "program too big to fit in memory" - это скорее сообщение самой программы, возможно ей нужна EMS\XMSили ровный чистый кусок в основной памяти(чтобы адресовать всю область через сегментные регистры), а там может посередине где-то драйвер висит, хотя звучит абсурдно конечно. Да и вроде у DOSBox-а уже встроены обработчики EMS\XMS. Леха , а может это быть из-за разницы DOS версий? То есть если скомпилил в более ранней , а запустил в более поздней?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
DarkDemon | Дата: Воскресенье, 26.04.2020, 20:29 | Сообщение # 4 |
Полковник
Группа: Друзья
Сообщений: 200
Статус: Offline
| Цитата Леха , а может это быть из-за разницы DOS версий? То есть если скомпилил в более ранней , а запустил в более поздней? хз, по идее не должно. Таблица изменений: https://ru.wikipedia.org/wiki/MS-DOS Система конечно сколько-то жрёт, но не всю же базовую оперативу.
130 Кб это ваще фигня, я 9 сегментов на MASM-е последовательно резервировал. А чё за прога?
Сообщение отредактировал DarkDemon - Воскресенье, 26.04.2020, 20:32 |
|
| |
haav | Дата: Воскресенье, 26.04.2020, 21:08 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата DarkDemon ( ) А чё за прога?
Вот эта: https://www.freebasic.net/forum/viewtopic.php?f=7&t=28482
В DOSBOX прерывание не пашет , по крайней мере у меня.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
DarkDemon | Дата: Воскресенье, 26.04.2020, 22:11 | Сообщение # 6 |
Полковник
Группа: Друзья
Сообщений: 200
Статус: Offline
| Стас, не знаю что там делает та штуковина, но по таймеру я тебе расскажу: под DOS есть 2 прерывания таймера, 1 аппаратное(IRQ 0, т.е. вектор 8) и 1 программное (вектор 28). Можно перехватывать любое, но если хватаешь аппаратное надо в конце обработчика прерывания писать:
Код MOV al, 20h OUT 20h, al (OUT A0h, al - для второго контроллера прерываний, если исп его прерывания, они начинаются с вектора 70h)
Для 28 вектора это сообщение контроллеру IRQ не нужно. Для вектора 0 - нужно только первому контроллеру(т.е. без того, что в скобках). Перехватив таймер ты можешь настроить его частоту через сооотв. порты контроллера.
Вот тут код посмотри: http://expiredpopsicle.com/2017/04/13/DOS_Timer_Stuff.html
И вот честно меньше всего хочется понимать что там и где в mingw. Проще самому перехватить и настроить где надо, тут сложности нет вообще. В книге Пирогова по асму тоже вроде всё было по таймеру. Давно уже этим не занимался уже не помню точных деталей.
Если чем то поможет вот процедуры замены и восстановления любого вектора на MASM 5.1: Код ; Смена вектора прерывания ; Di - номер вектора который надо поменять ; Bx - Сегмент новой процедуры ; Сx - Смещение новой процедуры
VectorsPOINTS Dd 160 Dup(0) VectorsIN_USE Db 160 Dup(0) ReplaceVECTOR Proc Far Push es Push ax Push bx Push dx Push di Xor ax, ax Mov al, cs:VectorsIN_USE [di]; Or al, al Jnz SkipREPLACE Mov ax, 1 ; Метим вектор Mov cs:VectorsIN_USE[di], al CLI Xor ax, ax Mov es, ax ; es = 0 Shl di, 2 ; Номер = Номер * 4 Mov dx, es: [di]; Взять смещение Mov Word Ptr cs:VectorsPOINTS[di], dx ; Сохр. смещение Mov dx, es:[di+2] ; Взять сегмент Mov Word Ptr cs:VectorsPOINTS[di+2], dx ; Сохр. сегмент Mov es:[di], cx ; Вектор - новое смещение Mov es:[di+2], bx ; Вектор - новый сегмент STI SkipREPLACE: Pop di Pop dx Pop bx Pop ax Pop es Ret ReplaceVECTOR EndP
; Возврат старого вектора ; Di - номер возвращаемого вектора
RecoverVECTOR Proc Far Push es Push ax Push bx Push di Xor ax, ax Mov al, cs:VectorsIN_USE [di]Or al, al Jz SkipRecover Xor ax, ax Mov cs:VectorsIN_USE[di], al CLI Xor ax, ax Mov es, ax ; es = 0 Shl di, 2 ; Номер = Номер * 4 Mov bx, Word Ptr cs:VectorsPOINTS [di]; Смещение Mov es:[di], bx ; + Recover + Mov bx, Word Ptr cs:VectorsPOINTS[di+2] ; Сегмент Mov es:[di+2], bx ; + Recover + STI SkipRecover: Pop di Pop bx Pop ax Pop es Ret RecoverVECTOR EndP
Вообще таймер абилка сугубо железная, тестировать лучше на железе под голым DOS. Кстати аппаратный вызывает программный и если ты его перехватишь, программный вектор перестанет срабатывать, некоторые проги могут олососится.
Асм код в архиве, форум его коверкает почему-то.
Сообщение отредактировал DarkDemon - Воскресенье, 26.04.2020, 22:31 |
|
| |
haav | Дата: Понедельник, 27.04.2020, 07:03 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Спасибо Леха!
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
DarkDemon | Дата: Понедельник, 27.04.2020, 22:01 | Сообщение # 8 |
Полковник
Группа: Друзья
Сообщений: 200
Статус: Offline
| У меня там опечатка была Цитата Для вектора 0 - нужно конечно для вектора 8
|
|
| |
|