Code Monkey home page Code Monkey logo

s3vbefix's Introduction

.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

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

s3vbefix's People

Contributors

wbcbz7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

s3vbefix's Issues

VBETEST crash when /M[x] key is used

first issue :)

When using /M[x] key (override memory size), where x is NOT equal actual memory size in 64kb units, VBETEST.EXE from SciTech Display Doctor is unable to finish videomode test. While attempting to scroll virtual screen it crashes with this message:

CauseWay DOS Extender v3.25 Copyright 1992-96 Michael Devore.
All rights reserved.

Exception: 0E, Error code: 0006

EAX=00000000 EBX=00000000 ECX=0007FC00 EDX=00000000 ESI=004640AC
EDI=FF600000 EBP=00463F58 ESP=00463F48 EIP=0043D1AB EFL=00213214

CS=01A7-FFBCA000 DS=01AF-FFBCA000 ES=01AF-FFBCA000
FS=0000-xxxxxxxx GS=01B7-xxxxxxxx SS=01AF-FFBCA000

CR0=00000000 CR2=00000000 CR3=00000000 TR=0000

Info flags=00008042

Writing CW.ERR file....

CauseWay error 09 : Unrecoverable exception. Program terminated.

I think it crashes because VESA function 0x4F06 returns incorrect number of available scan lines in DX register, so we need to patch or rewrite this function.

p.s. freaking DOS extenders :)

S3 virge-virge dx frequency setting & brightness bug

Hello i'm sorry to contact you in such uncommon way but it was the only one I could find.

I'm trying to identify the offsets in the bios of s3 cards (virge, virge dx and trio 64v+) which controls the memory and core frequency (to my knowledge they are syncro).

According to MCLK there are 3 settings to set the frequency clock, despite of that I can't find the right offsets in the bios:
[IMG]https://i.imgur.com/xF8N38f.png[/IMG]

I also found the trio64v+ full documentation (http://vgamuseum.info/index.php/cards/item/download/516_2bbbf61d0bbde9fe22086633b5908851) section 9-1 explain how the frequency is selected (pdf pages 74-75-76)

In attachment there is my bios collection, it contains bios from my virge dx cards, one with 70 mhz with the infamous bright bug (https://www.vogons.org/viewtopic.php?f=63&t=43472&start=80), the second is the bios version at 66 mhz coming from another card, the others 2 are bios I donwloaded and according to vogoners the most recent versions which have 50 mhz for memory and core).

https://drive.google.com/open?id=1agGrV13styN2YDHFP2hlAG3LW2S7CjEG

Thank you in advance for any help.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.