wbcbz7/S3VBEFIX
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
.utf8! for english readme, please read README.TXT
< logo placeholder >
S3VBEFIX - TSR fix for S3 VESA 2.0 BIOS v.0.6.1
blah-blah copyleft (cl) 2o16-2o24 by Artem Vasilev - wbcbz7
. _ _____________________________________________________________________ _ .
0x0. disclaimer
сей "продукт" распространяется "как есть", если в процессе работы сей проги
ваш цомпутер ВНЕЗАПНО скопытится\взорвется или потеряются данные (но вероят-
ность этого стремится к нулю), то я как автор не несу НИКАКОЙ ответственности
за произошедшие деяния (не, ну набить морду можно, но не более того :)
0x1. а что это вообще такое?!
Ну, начну с того, что у S3-шек где-то с 97-го года есть классные видеобиосы
версий 2.0x (начиная с Trio64V2/DX и ViRGE/DX), в которых есть ПОЛНАЯ поддержка
VBE 2.0 с целым букетом разных видеорежимов (в том числе мелких типа 320x240)
и вполне безглючной работой (UniVBE уже нервничает, а S3VBE20 так вообще :),
по крайней мере 90% софтов\игр\демок\интрошек работают без проблем.
...однако...
...без ложечки вонючей жижи не обошлось. Вылезло несколько неприятненьких
багов, портящих приятное впечатление, и я решил их таки пофиксить.
в общем, так и появилась сия TSR-ина :)
upd. o2.1o.2o22: набралось достаточно фидбека, решил слегка обновить
0x2. системныя требования
- 100% IBM PC/AT-совместимый персональный компьютер (ну тут ничего особенного)
- процессор - 80386 иливыше
- память... около 1 кб свободной (сама прога занимает где-то 900-1200 байт в
зависимости от количества VESA-режимов). ОЧЕНЬ рекомендуется грузить в UMB!
- система... на MS-DOS 3.3 и выше должно работать (проверял на 6.22 и 7.1)
- и самое главное - ВИДЕОКАРТА! конечно же S3 ;), ОЧЕНЬ желательно с версией
BIOS 2.0 или выше (проверить очень просто - если БЕЗ всяких VESA-резидентов
проги говорят о наличии VBE 2.0, то у вас как раз нужная версия видеобиоса)
если у вас Trio64V+, можно попробовать режим "фейкового VBE 2.0" (см. ниже),
ну а если в наличии ViRGE/DX, Trio3D или Savage - вперед!
PCI или AGP - без разницы, но с VLB-картами ничего обещать не могу.
0x3. фичи
что же вообще умеет S3VBEFIX?
- фикс primary stream fifo fetch
этот самый fifo fetch используется для оптимизации производительности карты
в 2D, но по факту нужен лишь в VESA-режимах. Прикол в том, что видеобиос по
возврату в VGA-режим забывает этот самый fifo fetch отключить, в результате
могут возникнуть неприяные глюки, вот пример:
- запускаем Quake, обязательно БЕЗ ключа -stdvid!
- переключиться в VGA-режим 320x200 (vid_mode 0 в консоли)
- выполняем vid_describemodes, ищем там номер VESA(!)-режима 320x240
- vid_mode #, # - наш номер (если его нет, то, скорее всего, у вас видеобиоc
версии 1.x, и про VESA 2.0 режимы он не знает)
- переключаемся в любой Mode-X режим с шириной 360 пикселов (напр. 360x480)
- ...а теперь внимательно смотрим на правый край экрана. впечатляет?
если наблюдается мусор или черные полосы справа, то баг пойман.
- выходим из кваки и опять смотрим на правый край экрана. теперь в текстовом
режиме можно наблюдать мусор справа (особенно заметно на панелях NC\VC)
На Trio3D дела обстоят хуже - там fifo fetch с кривыми параметрами включен
ПОСТОЯННО, причем текстовый режим пашет нормально, а Mode-X-режимы 360x???
перестают корректно отображаться. вообще.
S3VBEFIX просто отключает primary stream fifo fetch во всех VGA-режимах, тем
самым все проблемы устраняются. На скорость это не влияет - можете убедиться
сами :)
- поддержка VESA 320x[400\480] 8/15/16/24/32bpp режимов
добавлена для некоторых демок/интр (в основном от replay :), которые так и
норовят использовать эти режимы, а другие юзать не умеют.
по сути, это режимы 320x200/240 со сброшенным битом doublescan.
- переопределение объема установленной памяти, версии VBE и макс.числа страниц
вкратце - если есть кривая софтина, которую колбасит от слишком большого
количества памяти на видяшке или из-за кривого детекта версии VBE, или же
криво работает double/triple buffering, то можно эту прогу обмануть.
кроме того, можно использоать эту фичу для "фейкового" VBE 2.0, см. ниже
- настройка линейного кадрового буфера (LFB)
в некоторых случаях требуется отключить LFB или хотя бы пометить VESA-режимы
как не поддерживающие LFB, для чего можно использовать ключ /S1. Ключ /S2,
наоборот, помечает все VESA режимы как поддерживающие LFB, и дополнительно
позволяет вручную включить его в случае, если BIOS не имеет поддержки.
опять же, полезен для фейкового VBE 2.0, см.ниже
/S0 - использовать настрйоки BIOS
- фикс установки LFB-режимов
сначала устанавливается banked-режим с сохранением флагов, затем в случае
успеха ставится LFB-режим без очистки экрана (OR 0x8000) и проверяется факт
его инициализации в железе. Фиксит зависания с включенным бустером, также
позволяет реализовать "фейковый" VBE 2.0 (см. ниже)
- собственные процедуры VBE Get/Set Palette (0x4F09) и Display Window (0x4F05)
стандартный код смены банков не дружит с бустером, поэтому S3VBEFIX тащит
за собой собственную реализацию. Ключом /Q можно добавить альтернативную
процедуру чтения/записи палитры, необходимую для "фейкового" VBE 2.0 и прог
и игр типа Quake, которые брезгуют в VBE-режимах долбить палитру в порты :)
- принудительные настройки для set display start
как известно, для функции установки начальной позиции кадра (AX=0x4F07)
можно задать флаг "ждать обратного хода луча" (BL = 0x80 вместо 0x00).
Проблема в том, что некоторые софты используют его некорректно, из-за чего
картинку начинает колбасить\глючить\рвать
Задается через ключ /S[x].
- бустер (ускоритель) для VESA banked режимов
ну и самое вкусное :p
Да, это и есть тот самый ускоритель из S3SPDUP, толкьо теперь уже не нужно
грузить S3VBE20 для его корректной работы - все работает отдельно!
Сам принцип работы прост - для окна по адресу 0xA0000 включается линейная
адресация, но переключение банков остается (кстати, в даташитах этот режим
является документированным!). Причем прирост скорости виден невооруженным
глазом - на моей P200MMX скорость записи в видеопамять возрастает с 22 МБ\с
до нереальных 80-85 МБ\с, как в линейных режимах!
(кто не верит - возьмите VIDSPEED или VIDBENCH и сравните!)
Увы, дальше ускорять LFB-режимы некуда - они и так по скорости на уровне
Matrox Millennium или Tseng ET6000 и без всяких бустеров, также не имеет
смысла включать бустер для VGA-режимов - можно поиметь проблемы с Mode-X.
Включается\отключается ускоритель ключом /B[+\-].
ВНИМАНИЕ: бустер НЕ работает на S3 Savage!
- перед установкой VGA-режимов принудительно форсится предел в 256кб VRAM,
некоторые видеобиосы, в частности от Vision864/868, забывают ставить его.
симптомы - мусор при аппаратном скроллинге, например в Commander Keen.
- сброс триггера индекс/данные для контроллера атрибутов во время установки
режима - фиксит скролл в Kukoo 2 и еще по мелочи
следующие фичи - только для S3 Trio3D/Savage
- установка разрядности палитры в RAMDAC (Trio3d и выше)
Старые S3-шки (ViRGE/DX и ранее) поддерживают только 6 бит на канал (18 бит
всего) в палитре для ЦАПа в палитровых режимах. Trio3D и новее могут исполь-
зовать режим 8 бит на канал (24 бит всего), в итоге давая большее число
цветов и оттенков из палитры (16,7 млн против 262144). Некоторые игры (типа
Terra Nova) вроде бы поддерживают этот режим, но работают в нем криво (цвета
слишком темные либо вообще закосячены нафиг), посему ключом /D6 можно заста-
вить эти проги использовать 6 бит на канал в палитре. /D0 или /D8 - вернуть
возможность менять разрядность палитры (на ViRGE/DX и старше этот ключ бес-
бесполезен, так как палитру больше 6 бит на канал они не умеют аппаратно)
- гамма-коррекция в Hi/TrueColor режимах
малополезная фишка (пока нет ни одной программы, которая ее умела бы), но
поскольку она документирована начиная с VBE 2.0, и RAMDAC в Trio3D/Savage
поддерживает гамма-коррекцию, то почему бы и нет?
По умолчанию настраивается линейная гамма (00..FF), собственные кривые (8
бит на канал) загружаются аналогично палитре в 256-цветных режимах.
Вот, пожалуй, и все фичи на текущий момент, если хотите узнать больше, можно
почитать TODO.TXT (но он написан в таком стиле, что глаза болеть начинают :))
0x4. инструкция по применению
Запускается как обычно - [LH] S3VBEFIX.COM <параметр> <параметр>...
где <параметр>:
- /M[x] - переопределение объема видеопамяти (x - объем памяти в блоках
по 64 килобайт, /M16 - 1 МБ, /M0 - по умолчанию)
- /P[x] - ограничить макс. число видеостраниц (x - предел, x = 0 - по
умолчанию - 127 страниц)
- /V[x] - задать возвращаемую версию VBE (/V102 - 1.2, /V200 - 2.0)
- /Q - заменить процедуру чтения/записи палитры (0x4F09) (до выгрузки!)
- /X - добавить VESA-режимы 320x400 and 320x480 (до выгрузки!)
- /L - управление LFB:
x = 0 - по умолчанию, x = 1 - выключить
x = 2 - включить несмотря ни на что (для фейкового VBE 2.0)
- /S[x] - настройка работы флага "ждать ретрейса" для set display start:
x = 0 - флагом управляет приложение
x = 1 - всегда ждать ретрейса, даже если флаг не установлен
x = 2 - не ждать ретрейса, даже если флаг установлен
- /B[+\-] - включить\отключить бустер для VESA banked режимов (кроме Savage)
по умолчанию ускоритель отключен.
- /I - дополнительно перехватывать INT 6D, отключает выгрузку!
- /U, /R - выгрузить резидент из памяти. НАСТОЯТЕЛЬНО рекомендую выгружать
прогу именно этим ключом, (НЕ при помощи RELEASE или VC), иначе
при включенном бустере не будет восстановлен адрес LFB в карте,
в результате машина может повиснуть при установке LFB-режимов.
S3 Trio3D/Savage only:
- /D[x] - задать режим работы RAMDAC (/D6 - всегда использовать 6 бит на
канал, /D0 или /D8 - разрешить переключение разрядности RAMDAC)
- /G[+/-] - включить/отключить гамма-коррекцию в Hi/TrueColor
- LH - грузить S3VBEFIX в верхнюю память (рекомендуется при ее наличии)
пример:
S3VBEFIX.COM /B+ /S2 - включить бустер, при установке начала отображения
кадра игнорировать флаг "ждать ретрейса)
S3VBEFIX.COM /M32 - установить объем видеопамяти 2 МБ
Кстати, некоторые параметры можно менять прямо во время работы резидента.
Также можно заменить косую черту на дефис, а также "развернуть" ключи:
"S3VBEFIX.COM /BOOSTER=+ /MEMORY=8" и "S3VBEFIX.COM -b+ -m8" равнозначны.
Регистр букв значения также не имеет.
Ключи /Q и /X раздувают размер TSR в памяти и действуют до его выгрузки.
0x5. фейковый VBE 2.0
ВНИМАНИЕ: очень экспериментальная фича, для владельцев VBE 1.2 карт типа
Trio64/V+/оригинальной ViRGE, добавляет _частичную_ поддержку VBE 2.0 с LFB
ТОЛЬКО НА СВОЙ СТРАХ И РИСК, если есть возможность - лучше UniVBE/S3VBE20
включается так: S3VBEFIX /V200 /L2 /Q
ключ /Q нужен для Quake и других программ, которые работают с палитрой через
функцию 0x4F09, поскольку в VBE 1.2 она не определена.
Никаких новых VESA-режимов не добавляется (кроме случая с ключом /X, но если
оригинальный BIOS не предоставляет VESA-режимы 320x200 / 320x240, то тогда и
320x400 / 320x480 не будет и ключ /X оказывается бесполезен).
Кроме того, VBE 2.0-поля в информации об адаптере (0x4F00) остаются пустыми,
некоторым программам такое может не понравиться.
Разумеется, protected mode интерфейс (0x4F0A) также не реализован.
0x5. встроенный int10 api и некоторая инфа по резидентной части
используется в основном для проверки на наличие в памяти резидента.
вход: AX = 0xCE00
DX = 0x656E ('ne') -.
выход: AX = 0x0000 > (pretty nice, eh? ^.^)
DX = 0x6F6B ('ko') -'
ES:BX = точка входа в обработчик int10
дополнительные переменные:
word ptr ES:[BX-8] - сигнатура S3VBEFIX = 'fK'
word ptr ES:[BX-6] - версия S3VBEFIX в формате 0x1234 - v.12.3.4
word ptr ES:[BX-4] - смещение к внутренним переменным
word ptr ES:[BX-2] - флаг inTSR (0x0001, если уже внутри обработчика)
dword ptr ES:[BX+9] - указатель на предыдущий обработчик int10
- если AX и DX не равны выходным значениям, то S3VBEFIX не загружен.
- если возвращенное значение ES:BX не равно значению после int0x21 AX=0x3510
то S3VBEFIX не является последнем в цепочке int10, выгрузка невозможна
- можно временно отключить S3VBEFIX, если установить флаг inTSR в 0x0001, но
на текущий момент данная фича не используется (0 - нормальная работа)
- так как резидент просто пропитан самомодифицирующимся кодом, то на данный
момент нет надежного способа определить местоположение ВСЕХ внутренних пере-
менных, так что изменять их следует ТОЛЬКО соответстующей версией S3VBEFIX,
чтобы вдруг не поймать сюрприз в виде глюков или зависаний ;)
может быть, заюзаю дырки в PSP
- кстати да, резидент частично перекрывает PSP (находится по смещению CS:0x40,
но перед компиляцией можно поменять данное значение), но не стоит надеяться,
что резидент ЖЕЛЕЗНО располагается в этой области.
0x6. баги\глюки
- ключ /M[x]
Настоятельно не рекомендуется устанавливать размер видеопамяти больший, чем
установлено на карте, в противном случае возможны сюрпризы в виде вылетов
или зависаний программ. (не пиши там, где нельзя :)
Кроме того, возможны проблемы у владельцев видеокарт с >=64 МБ видеопамяти -
при показе текущего статуса S3VBEFIX будет отображать неверный объем, помимо
этого, неизвестно, будет ли работать резидент корректно - в общем, все на
свой страх и риск (хотя, насколько я знаю, S3-шек с 64 и более метрами не
так и много, мне они не попадались ни разу)
- VBETEST
и всё-таки он иногда глючит :) по ощущениям умудряется обходить S3VBEFIX
исправлено:
- VBETEST.EXE и ключ /M[x]
VBETEST из SciTech Display Doctor может рухнуть при попытке скроллинга вир-
туального экрана во время тестов видеорежимов, если использован ключ /M[x].
>>после добавления фикса функции 0x4F06 проблема ушла.
- Chasm: The Rift и Runtime Error 216 после установки режима
>>фикс процедуры переключения банков, там вообще был рассадник багов.
Если что-то еще откажется нормально работать либо же поломается по причине
моей проги - пишите.
0x7. планы
в TODO.TXT. а вообще, пока всё заморожено и обновляется очень редко :)
возможно, вырежу часть фич в отдельный универсальный резидент, а специфич-
ные для каждого чипа вещи можно сделать в отдельных TSRах.
0x8. исходные коды и авторский булшит
исходники доступны в репе на github: https://github.com/wbcbz7/S3VBEFIX
0x9. координаты
mailto: wbcbz7.at(at)gmail.com
telegram: (at)wbcbz7
discord: wbcbz7#3519, можно найти на https://discord.io/demoscene
vogons.org - wbc, phantom.sannata.ru and other sites - wbcbz7
...вот и все :)