Не запускается Doom на 486 с PCI?

Ответить
Аватара пользователя
arti9m
Сообщения: 1500
Зарегистрирован: Пн июл 12, 2021 5:57 pm
Откуда: Минск

Не запускается Doom на 486 с PCI?

Сообщение arti9m »

Пост для тех, кто столкнётся с такой же проблемой, как и я.

Имеется плата под 486-е процессоры PC Chips m915i. Чипсет UMC UM8881/8886.
На плате есть и PCI, и VLB, и сама плата довольно шустрая.

Имеем проблему: не запускается ни Doom, ни Duke3D из чистого MS-DOS 6.22. При запуске имеем просто моргающий курсор. Плата реагирует на CTRL+ALT+DELETE.

Проблема проявляется при любых процессорах, от Intel SX-25 до AMD 5x86, на любой частоте шины с любым количеством памяти.
Проблема проявляется при любых версиях BIOS (даже не от этой платы, AMI, AWARD) без явной зависимости от того, какая периферия установлена.
Проблема проявляется при любых настройках BIOS.
Единственную закономерность, которую изначально подметил - всё хорошо работает с ISA-видеокартой TRIDENT 8900CL. А с TRIDENT 8900D - уже нет. Cirrus Logic - опять же нет. PCI видеокарта (TNT или S3 Trio/Virge) - та же проблема.

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

Если (независимо от наличия сетевой карты) запустить win 3.11, и из неё уже запустить Doom - запускается. Duke3D - запускается, но намертво вешает систему как только начинается демка.

Doom и Duke3D - игры так называемого "защищённого" режима, для запуска используют загрузчик DOS/4GW, который как бы переключает процессор в другой режим работы. Примерно то же самое делает и win 3.11, когда запускается на 386 или выше.
Загрузчик DOS/4GW вшит в EXE-шник каждой из этих игр, а также многих-многих других.

Существует аналогичный загрузчик DOS32A, который выполняет ровно те же задачи, что и DOS/4G(W), только при этом в нём исправлена туева хуча багов.
Так вот, если запустить Doom или Duke3D через этот загрузчик, то всё запускается и работает идеально!
Запускать можно так: C:/GAMES/DOOM/DOS32A.EXE DOOM.EXE
Или пересобрать сам EXE-шник так, чтобы вообще выпилить из него старый DOS/4GW и замест него впилить DOS32A.

Однажды я уже сталкивался с подобными проблемами, когда на ноуте (P3) в чистом DOS пытался играть в игры со встроенным PCI звуком. Вышеозначенные игры то и дело намертво вешались в случайных местах, а вот с использованием DOS32A всё работало идеально.

У DOS32A есть и недостатки - с некоторыми играми работать не будет из-за особенностей аудио-драйверов, вшитых в эти игры. Так что воткнутая сетевуха - более постоянное и надёжное решение.

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

Если у кого-то здесь есть мысли, почему изначально подобное происходит и как это можно пофиксить правильно, или хотя бы в каком направлении гуглить - высказывайтесь :)
Аватара пользователя
SiO
Сообщения: 606
Зарегистрирован: Ср июн 24, 2020 2:26 pm
Откуда: Минск, Чижовка
Контактная информация:

Re: Не запускается Doom на 486 с PCI?

Сообщение SiO »

Возможно сетевая карта "глушит" какое то оборудование и загрузчик не пытается его инициализировать. Типа совпадает irq, dma, или io например, а при попытке инициализации виснет, т.к. не получает ответ от железа по какой то причине.
Паяльник & Отвертка TEAM
Аватара пользователя
arti9m
Сообщения: 1500
Зарегистрирован: Пн июл 12, 2021 5:57 pm
Откуда: Минск

Re: Не запускается Doom на 486 с PCI?

Сообщение arti9m »

SiO писал(а): Сб май 06, 2023 4:07 pm Возможно сетевая карта "глушит" какое то оборудование и загрузчик не пытается его инициализировать. Типа совпадает irq, dma, или io например, а при попытке инициализации виснет, т.к. не получает ответ от железа по какой то причине.
Были мысли в этом направлении. Но исследовать все I/O и IRQ линии на предмет неполадок - задачка пугающая)
DMA в порядке, т.к. сетевая карта его не использует, даже контакты не разведены на плате.

Абсолютно всё, что можно отключить, я отключал. Значит либо какое-то набортное устройство нормально не отключается, либо где-то какая-то подтяжка отвалилась.

Ещё думал думать в сторону гейта А20. На этой плате уже нет традиционного клавиатурного контроллера, который за это должен отвечать. Т.е. здесь имеем встроенную в чипсет раннюю реализацию. Но ведь другие загрузчики нормально загружаются в защищённый режим. Попробую поискать, как именно работает DOS/4GW.
Аватара пользователя
arti9m
Сообщения: 1500
Зарегистрирован: Пн июл 12, 2021 5:57 pm
Откуда: Минск

Re: Не запускается Doom на 486 с PCI?

Сообщение arti9m »

tl;dr: Победил! Вернее, нашёл наименее корявый фикс. Нужно добавить в AUTOEXEC.BAT: SET DOS16M=INBOARD
После чего всё работает исправно!


---
Ниже излагаю мои очередные находки по этой теме.

1. Я далеко не первый с такими проблемами, как оказалось.
Проблема была с самого начала, жалобы сохранились прямиком из 1993:
https://groups.google.com/g/comp.sys.ib ... LLsEMYoYMJ
Здесь предполагают несовместимость DOS/4GW и определённых чипсетов (по ссылке выше упоминаются OPTi).

2. Всё работает прекрасно при загруженном EMM386.EXE (без сетевой карты). Скорее всего работает потому, что EMM386 переключает проц в защищённый режим, снимая эту задачу с DOS/4GW.
У большинства людей EMM386 настроен утилитой MEMMAKER сразу после установки DOS 6.22 или Win 3.11, поэтому и проблему эту они не увидят.

3. Пока писал этот пост, выяснил, что DOS/4GW по-разному инициализируется в зависимости от оборудования.
Оказалось, что можно не полагаться на его автоопределение железа, а задать железо вручную.

Для этого надо выполнить команду (либо задать её в AUTOEXEC.BAT):
SET DOS16M={значение}

Доступные значения можно посмотреть здесь, начиная с 55-й строки:
https://github.com/open-watcom/open-wat ... dos4gw.doc

В моём случае SET DOS16M=3 (которое задаёт 386/486) не помогло. Также не заработали значения 0 и 11 (486 с DPMI и VCPI соответственно), но оно и неудивительно, т.к. мы загружаемся из реального режима (DPMI и VCPI - интерфейсы защищённого режима).

Зато помогло следующее:
SET DOS16M=INBOARD
Запихнул эту строку в AUTOEXEC.BAT, после чего все игрушки наконец-то стабильно запускаются независимо от всей остальной конфигурации!

Ящитаю, виноваты криворукие погромисты, писавшие DOS/4GW, и само лишь существование DOS32A косвенно поддерживает мою точку зрения.
Ответить