FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 15:32Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
DOS и FB программа
haavДата: Четверг, 23.04.2020, 21:32 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Тут надо было проверить один исходник на DOS . Поскольку там задействуется функционал, который не пашет в DOSBOX ,  я решил скомпилить в эмуляторе и потом загрузиться с дискеты в реальный dos и запустить готовый EXE-шник. А тут облом, дос пишет: "program too big to fit in memory". Программа имеет размер что-то вроде 130кб. Что за фигня думаю я, ведь помню , что когда-то запускал и побольше программмы. Ну ладно думаю заморочусь дальше, раз начал. В общем попробую прямо в досе скомпилить и запустить. Все сделал и заработало , причем размер программы такой же , как при компиляции в DOSBOX. Задача решена , но осадок остался. Получается , что если надо будет кодить под dos ,  эмулятор не вариант...

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Воскресенье, 26.04.2020, 14:58 | Сообщение # 2
Полковник
Группа: Друзья
Сообщений: 200
Репутация: -1
Статус: 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
Репутация: 50
Статус: Offline
Цитата DarkDemon ()
"program too big to fit in memory" - это скорее сообщение самой программы, возможно ей нужна EMS\XMSили ровный чистый кусок в основной памяти(чтобы адресовать всю область через сегментные регистры),
а там может посередине где-то драйвер висит, хотя звучит абсурдно конечно. Да и вроде у DOSBox-а
уже встроены обработчики EMS\XMS.

Леха , а может это быть из-за разницы DOS версий? То есть если скомпилил в более ранней , а запустил в более поздней?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Воскресенье, 26.04.2020, 20:29 | Сообщение # 4
Полковник
Группа: Друзья
Сообщений: 200
Репутация: -1
Статус: 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
Репутация: 50
Статус: Offline
Цитата DarkDemon ()
А чё за прога?


Вот эта: https://www.freebasic.net/forum/viewtopic.php?f=7&t=28482

В DOSBOX прерывание не пашет , по крайней мере у меня.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Воскресенье, 26.04.2020, 22:11 | Сообщение # 6
Полковник
Группа: Друзья
Сообщений: 200
Репутация: -1
Статус: 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.
Кстати аппаратный вызывает программный и если ты его перехватишь, программный вектор перестанет срабатывать,
некоторые проги могут олососится.

Асм код в архиве, форум его коверкает почему-то.
Прикрепления: InterLIB.zip (0.7 Kb)


Сообщение отредактировал DarkDemon - Воскресенье, 26.04.2020, 22:31
 
haavДата: Понедельник, 27.04.2020, 07:03 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Спасибо Леха!

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Понедельник, 27.04.2020, 22:01 | Сообщение # 8
Полковник
Группа: Друзья
Сообщений: 200
Репутация: -1
Статус: Offline
У меня там опечатка была
 
Цитата
Для вектора 0 - нужно

конечно для вектора 8
 
  • Страница 1 из 1
  • 1
Поиск: