Skip to content

wbcbz7/S3VBEFIX

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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.0
         blah-blah copyleft (cl) 2o16-2o22 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!

   следующие фичи - только для 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

 ...вот и все :)