Переключение VGA режимов портами

Тема в разделе "WASM.OS.DEVEL", создана пользователем Treant, 14 ноя 2009.

  1. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Вот я нашел код, который должен переключать VGA режимы через порты, но так как я в си не силен меня сильно смущают фразы типа "typedef unsigned long dword"
    Прошу помочь перевести все это дело на FASM, ну или хотя бы верхнюю часть этого кода.
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    typedef -- это определение типа, то же самое, что type в Паскале. В данном случае это значит, что dword -- это тип unsigned long, т.е. 4-байтовый беззнаковый целый (обычное двойное слово). Byte и word -- тоже абсолютно стандартные (байт и слово, т.е. 2 байта).

    Пы.Сы. А Си знать надо в любом случае, на чём бы реально не работал. Как-никак, стандарт-с. Я вот пишу на асме и на Дельфи, Си ненавижу всеми фибрами души (и всем прочим, чем можно ненавидеть), но понимать его понимаю, при необходимости и пишу -- но не по доброй воле, конечно :)
     
  3. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    В общем так:
    VGA у меня получилось сменить режим - изменил разрешение по вертикали на 480.
    Потом выложу код, когда до конца разберусь с этим
    Вот такой вопрос - VGA поддерживает невысокое разрешение, хотелось бы использовать более высокое а найти документацию весьма проблематично
    VGA более менее нормально описано на codenet.ru
    Если кто нибудь интересовался этой темой прошу поделиться информацией.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Ну тогда читай про SVGA - там нормальная смена режима на то, что хочешь, без портов. Через прерывание. Есть прекрасное описание спецификации SVGA, на английском. Гуглится на раз.

    Забегая вперед (поскольку сменить разрешение через прерывание - это очевидно, но не использовано ТС): нет, без прерываний нельзя, поскольку порты у каждой железяки разные. Есть только стандартные режимы, и стандартные порты, через которые возможно не все - только до 640х480х16 цветов - долгое время это было режимом по умолчанию в Windows, и только ХР научилась устанавливать 800х600 для любых адаптеров, без каких-либо дополнительных драйверов.

    Забегая еще вперед (поскольку тема в разделе OS.KERNEL): да нет же, черт возьми, если ты пишешь свою ос, то сначала вызови прерывания SVGA и установи нужное разрешение, а потом переходи в защищенный режим.

    ЗЫ: и про порты можно прочитать, если порыться на сайте Intel, были мануалы по 815 чипсету, и по графике в том числе. Учитывая, что на большинстве адаптеров устанавливается 800*600, и в том числе - на интеловском интегрированном, какая-то часть документации достаточно универсальна.
     
  5. reversecode

    reversecode Guest

    Публикаций:
    0
    опишите задачу что вы собственно хотите сделать
     
  6. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Да ничего пока особенного - просто переключить режим на графический с высоким разрешением, а там посмотрю)
    ЗЫ вот интеловская документация:
    http://intellinuxgraphics.org/Vol_1a_G45_core_updated.pdf - часть 1я
    http://intellinuxgraphics.org/Vol_1b_G45_core.pdf - часть 2я
    ЗЗЫ есть следующие видеокарты:
    GeForce 260GTX
    GeForce 8600GT
    Intel GMA 950
     
  7. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Прерывание BIOS тоже ведь написано
    Есть OpenBIOS, но там кода много, разбираться надо
    http://www.openfirmware.info/OpenBIOS
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Treant
    1. Интеловская документация только для интеловских карт.
    2. На GeForce ты документацию не найдёшь вообще, а там всё по другому.
    3. Гиблая это идея, даже если твой код будет работать на одной карте nVidia, не факт что будет работать на другой.
     
  9. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Спасибо, начал разбираться с этим
    Скачал прошивку VideoBIOS для своей 8600GT, буду ковырять...
    Если кому нужно прошивки VideoBIOS тут:
    http://www.techpowerup.com/vgabios/
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AMD-ATI открыла документацию
    http://www.x.org/docs/AMD/
    http://developer.amd.com/documentation/guides/Pages/default.aspx#open_gpu

    На NVidia нету открытой документации зато есть полученная различными путями
    http://nouveau.freedesktop.org/wiki/
    А также несколько исходников от самой NVidea, с последующими дороботками линукс сообществом.
    http://cgit.freedesktop.org/xorg/driver/xf86-video-nv/tree/src

    Интел
    http://intellinuxgraphics.org/documentation.html
    Старая видюшка от интел i740
    ftp://download.intel.com/support/graphics/intel740/29061902.pdf

    VIA тоже открыла документацию
    http://www.x.org/docs/via/

    Очень старая видюшка от CHIP, но зато хорошая в качестве справки по VGA
    http://sunsite.rediris.es/pub/mirror/intel/graphics/mobilegraphics/datashts/010179001.pdf
     
  11. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    по нвидии только 2д акселерация, а по амд гпу-коды только последних?
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    qqwe
    На nouveau собрана различная документация по Нвидеа в том числе и 3D. И там же есть драйвер от энтузиастов, но насколько рабочий я не проверял. Но пишут что у кого-то работает.

    По поводу АТИ начиная с R300 - 2002 год Radeon 9500.
    В документе "R5xx Family 3D Programming Guide" также указанны отличия R3xx-R5xx
    Так что вроде бы не только последнии.
     
  13. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Вот тут в процессе наткнулся вот на что проверка некоторого байта на первый бит, если он 0 , то продолжать, если нет - выход, но перед этим:
    Во 2м байте содержится размер модуля в секторах, я не понимаю зачем его обнулять, что это дает?
    Мб возможность загружать в этот сегмент другой модуль BIOS
    В общем хотелось бы услышать кто что думает
     
  14. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Только что получилось что то сделать хо-хо
    Скопировал часть кода из прошивки.
    Что произошло пока не понял но было вот что:
    Я в PM, текстовый режим 40x25
    Нажимаю Enter - черный экран через секунду тот же текст на экране но на одну позицию вниз сместился
    Пока код не смотрел, так наобум скопировал первый попавшийся фрагмент, показавшийся рабочим.
    Прежде при попытках на этой GeForce8600GT либо перезагрузка, либо черный экран получался
    Буду дальше разбираться...
     
  15. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Вот код, который разрешает VGA:
    Мне непонятно in al, dx - зачем нужно. На codenet написано только про out, про in не упомянуто
    Пробовал убрать этот in - ничего не изменилось
    После выполнения этого кода al сразу перезаписывается на 1, то есть нигде не участвует.
    Подскажите пожалуйста что этот in может делать.
     
  16. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Treant
    Я не знаю, откуда вы взяли приведенный код, но выглядит он бредово. Классическая схема обычно такова:
    ...
    mov dx, port
    in al, dx
    or/and/xor al, mask
    out dx, al
    ...
    Здесь логика такая: порты, особенно видеоадаптера, в основном управляются побитно. Если сдуру записать то, что в голову взбредет, все глюкнет. Значит, сначала надо прочитать то, что было, потом выставить или обнулить те биты, какие нам надо, и записать назад в порт.

    Это было во-первых. Во-вторых, нигде нет начальной инициализации AL. XOR AL, 1 вовсе не выставляет значение AL в 1 - и даже не устанавливает нулевой бит в 1. Это ИНВЕРТИРУЕТ 0-й бит, то есть то, что запишется в порт, зависит от предыдущего значения AL, которое нигде в коде не указано...

    Ну и в третьих... Сильно подозреваю, что этот код ВООБЩЕ бессмысленен - там и так стоит 1 в 0-м бите, если вы проверите ;) В любом случае, не понимаю, зачем что-то писать в этот порт для установки режима?
     
  17. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Да вызова функции стоит xor al, al
    после входа в функцию xor al 1 даст 00000001b в al
    дальше в порт - если у них там ни еще фигня какаято на этом порту - то разрешить VGA
    потом из порта непонятно зачем
    выход из процедуры - вход в другую и сразу mov al, 1, то есть считанное из порта воообще не играет никакой роли
    вот я тут подумал, что может быть in al, dx после out'а указывает что то типа "применить включение/выключение VGA" - такое вообще бывает?
     
  18. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    О_о
    Только что глянул в интеловскую документацию - так у них там порт 3C3h вообще Reserved
     
  19. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Похоже in в порту 3c3h все таки что то значит - вот следущий кусок кода:
    Здесь сперва в порт 3с2h кладется 1
    А дальше - снова эта фигня - in в порт 3c3h и al снова не сохраняется, так как дальше идет popa
    Помогите хоть чем нибудь, а то я уже голову об это сломал((
     
  20. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Treant

    Навскидку примера не приведу, но вроде видел такие у-ва которые нужно _читать_ (просто прочесть и все). Результат чтения можно проверять, но может быть что даже проверки не нужно.

    Например (могу ошибаццо) при чтении порта 378h при установленном обработчке #SMI будет возникать это прерывание.