Pull to refresh

Comments 32

Так получилось что никогда не программировал под DOS/4GW, но играл как и все. Можете рассказать подробнее и с примерами как это выглядело со стороны программы?

Присоединяюсь к просьбе, интересно как приходилось программисту напрягаться чтобы сделать что-то больше одной страницы.

На Си или на асме? На Си это было прозрачно совершенно. Хотите мегабайт для массива? Просто выделяете этот мегабайт. Компилятор Watcom всё остальное делал сам.


А вот так на Watcom делались вставки на асме в 32-битном режиме:


pragma aux putscreen parm[]=\

"mov esi,dpt"\
"mov ecx,16000"\
"mov eax,ecx"\
"mov edi,0xa0000"\
"rep movsd"\
modify [esi edi ecx eax];

не хотелось бы спорить, но я писал на Watcom (пытался), еще в 1994-1996, но в силу отсутствии документации лично у меня я не мог писать что-то больше чем стандартные программы на 640 Кб ОЗУ, при запросе памяти просто была ошибка и никакой расширитель не приклеивался. Вероятно сам процесс сборки требовал настройки под такие условия, что я не делал конечно же. Собственно в свое время я и хотел на ваткоме писать код именно что с применением большего количества памяти.

Да никак. У вас просто было 32-битное адресное пространство без всего этого геморроя со страницами.

это вы про что? стандартное приложение DOS работает в 640Кб пространстве. Сколько писал на Turbo C. Потом полез в Watcom чтобы этот вопрос закрыть, но не получилось.

Так вся фишка dos4gw (во всяком случае, при использовании wacom c с дефолтными настройками) – что вам dos4gw прямо на старте программы проц переводит в защищённый режим и делает плоское адресное пространство (с известными адресами видеопамяти и т.п.). Вы просто работаете на всём готовом (и модель памяти – "самая маленькая", cs/ds/es/ss назначены на одно и то же и не трогаются никогда).

значит я не раскурил ватком, потому что на нём я не смог делать такие приложения.

В простейшем случае программа просто писалась с расчётом на 32-битность и плоскую модель, собиралась Watcom C(++), компоновщик которого сам ваш код компоновал в формат LE (OS/2 Linear Executable), затем добавлял к нему DOS MZ заголовок и сам DOS/4GW как DOS stub. При запуске получившегося ехе первым получал управление DOS/4GW (т.к. DOS не понимал формат LE и видел только MZ часть), который, как и описано в статье, искал уже работающий DPMI-сервер (через прерывание INT 2F, закреплённое за DPMI), при отсутствии оного сам «вешался» на это прерывание, а дальше через функцию того же INT 2F (обрабатываемую либо самим DOS/4GW, либо «чужим» DPMI-сервером) переходил в защищённый режим, через функции INT 31 (DPMI API уже в 32-битном режиме, DPMI-сервер и его должен обрабатывать) выделял память под пользовательскую программу, загружал её туда (разбирая уже LE-часть) и в конце концов «прыгал» на пользовательскую точку входа, указанную в LE-заголовке.

Другая часть «магии» Watcom находилась в его стандартной библиотеке, которая «заворачивала» работу с файлами/консолью в вызовы DOS через функции всё того же INT 31, выделяла/освобождала память опять же через INT 31 итд.

Если программе не требовалось что-нибудь низкоуровневое вроде установки обработчика прерывания, прямого доступа к видеобуферу и подобного, она выглядела как самый обычный С/С++. Для низкоуровневых же вещей требовалось уже вручную вызывать всё тот же INT 31.

Как-то так.

И этот dos/4gw стаб можно было тупо оторвать, оставив остальное, положить рядом отдельностоящий dos4gw.exe, положить ему конфиг (.ini кажется), а в конфиге прописать свап-файл - и гонять в игры, которым не хватало установленной физической памяти.

Для включения виртуальной памяти достаточно было задать переменную среды SET DOS4GVM=1

Но, тут была проблема - если в игре был звук на саундбластере, то через некоторое время она крешилась. Реально поиграть можно было только без звука.

И вот какой парадокс - спасал Windows 95, именно 95, в нём была лучшая поддержка DOS/4GW, в Windows 98 такой уже не было.

То есть я хотел поиграть в свою любимую игру Blood, а она требовала 16 МБ, а у меня было всего 8 МБ, я просто запускал её под Windows 95.

И всё прекрасно работало и не крешилось на звуке. Только частый своп иногда притормаживал игру.

Так это виндоус её свопил?

Интересно, как расширитель определял, что запущенная именно игра. Или же программы тоже шли хорошо.

В смысле, именно игра? А какая разница с не игрой?

По тексту кажется, что приоритет был на игры:


нам достаточно было устранить их один раз и сразу для всех игр. С другой стороны, если проблему нельзя было устранить, это бы сломало множество игр.
Чудесным образом большинство игр просто работало, несмотря на то, что они запускались не под тем DPMI-сервером, для которого разрабатывались изначально. Иногда возникали проблемы с отдельными играми. Самыми частыми оказывались проблемы с играми...

Просто почти все современные на тот момент игры использовали dos/4gw. Но точно так же это могли быть совершенно любые приложения.
Кстати, буковка w означала версию для watcom.

Интересно, а был вообще какой-нибудь более-менее популярный софт под DOS/4GW? В 90-е уже все под Windows переползали, чтобы была потребность в защищенном режиме, но именно под ДОС - это что-то специфическое должно быть...

Вряд ли он был. Дело в том, что этот софт не требовал выжимать от аппаратуры всё, а потому гораздо лучше его писать с использованием Windows API. А вот игры требовали максимума отдачи от оборудования (в Windows первые Direct-X были кривыми и тормознутыми по сравнению с прямой работой с аппаратурой, да и от COM-модели разработчиков игр тошнило), потому даже в 1997 тот же Duke Nukem 3D шёл под MS-DOS.

Duke Nukem 3D это начало 96-го

игра -- одногодка первого Quake

Да. Перепутал с Blood, которая как раз 1997 и на том же движке.

FoxProX работал под DOS4/GW.

Пара ссылок по теме - не единым DOS4/GW, не зря же в статье написано "видел много баннеров расширителей DOS "

386Max и иже с ним
http://www.sudleyplace.com/
https://github.com/sudleyplace/
Хвастались, что оно Windows 3.1x из под себя могло запустить, т.е. было совместимо максимально.

Другие, например HX
https://github.com/Baron-von-Riedesel?tab=repositories

К слову, полную спеку DPMI как всегда зажали, породив кучу almost works.

Под Clipper 5, насколько помню, такие расширения были

Игры - это само собой, я имел в виду - для чего-то помимо игр

Числяк. Ну в смысле когда надо много считать, а данные не помещаются в 64k (а использование указателей вида сегмент:смещение создаёт лишние тормоза). Хотя этот софт трудно назвать популярным, это для единиц)

Ну и довольно долго винду недолюбливали всё-таки. Когда ресурсов у компа не так много – не хочется тратить их зазря.

у каждого свои 90-е, я от MS-DOS Config.sys (менюшка с emm386, himem.sys и всякими вариантами под разные игры, как мне помнится Worms и Doom 2 Plutonia Experiment дольше всего у меня держали DOS) избавился только в 2001 году перейдя на WinMe, NT/2000 по сути мимо прошли и где-то в 2004 я на XP перешёл, в 2007 на Виста и в 2009 на 7, в 2014 на 8/8.1 и через год кажется на 10 инсайдер. На 10 до сих пор.

Просмотрщик картинок Sea.

В те времена, видев на экране надпись DOS/4GW я знал, что игра будет хорошей, даже не понимая, что это и зачем. Вот такие забавные ассоциации у меня)

не то чтобы хорошей, скорее масштабной, в то время плохих игр не было ))))) это сейчас я вон Starfield запустил и не знаю в чем смысл этой игры (я о том что бегать стрелять во врагов и летать на звездолёте мне абсолютно неинтересно, а большего игра не предлагает) - скукотища безумная, а графика вообще дело десятое.

Sign up to leave a comment.

Articles