-
Notifications
You must be signed in to change notification settings - Fork 0
PC/MSDOS TSR fix for S3 VESA video BIOS
License
wbcbz7/S3VBEFIX
Folders and files
Name | Name | Last commit message | 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 ...вот и все :)
About
PC/MSDOS TSR fix for S3 VESA video BIOS