OSDev

для всех
Текущее время: 12 дек 2018, 13:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 29 сен 2012, 23:10 

Зарегистрирован: 29 сен 2012, 23:04
Сообщения: 3
Используя функции биос-а буквенно-цифровой режим из 80x25 в 40x25 можно перевести следующим образом:

Код:
mov ah,0
mov al,1
int 10h


как это сделать не используя функции биос-а и дос-а, только через регистры и порты.

И ещё как через порты и регистры погасить курсор, через функции биос-а это делается так:

Код:
mov ah,1
mov ch,20h
int 10h


Только не спрашивайте зачем мне это надо.
Если кто знает как это сделать помогите пожалуйста.
За помощь заранее благодарен!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 сен 2012, 23:55 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1197
Добро пожаловать!

Я занимался непосредственно программированием vga очень давно, но попробую ответить.

1. Вы хотите установить весьма древний режим. Я сам этого никогда не делал, но читал об этом. Скорее всего вам нужен регистр синхронизатора с индексом 1, бит 3. В доках, на которые я сейчас смотрю, они называются соответственно Clocking Mode Register и Dot Clock Rate (DCR).

2. Это можно сделать двумя способами: либо переместить курсор за пределы экрана, либо установить в регистре начальной линии курсора бит 5 (см. тут). Я использую второй способ.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 сен 2012, 14:46 

Зарегистрирован: 29 сен 2012, 23:04
Сообщения: 3
phantom-84 спасибо за помощь, но хотелось бы получить более подробную информацию.
Сейчас смотрю твою ссылку на форум.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 сен 2012, 21:55 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1197
v4567 писал(а):
phantom-84 спасибо за помощь, но хотелось бы получить более подробную информацию.
Типа выложить код и еще объяснить, как он работает? :? Установка видеорежима - это перепрограммирование большого количества регистров (причем некоторых многократно) в правильном порядке. И хотя лично я придерживаюсь именно этого подхода, тебе посоветовал бы все-таки сначала установить видеорежим 3 через сервис BIOS, а потом его модифицировать перепрограммированием регистров. Даже я пользуюсь этим подходом, т.к. может быть недостаточно даже полного перепрограммирования всех регистров vga, чтобы выполнить переключение из SVGA-режима. Короче режим 1 отличается от режима 3, по-моему, только значением одного бита, о котором я говорил ранее. Нулевое значение этого бита позволяет иметь 640 или 720 точек в строке (80 знакомест), а единичное - 320 или 360 точек (40 знакомест). Код установки бита примерно такой (могу ошибиться, т.к. пишу без проверки):
Код:
#define VIDEO_SAR 0x3C4
#define VIDEO_SDR 0x3C5
...
/* синхронный сброс, т.к. будем перепрограммировать регистр режима синхронизатора */
outw(VIDEO_SAR,0x100);
 
/* установка бита DCR */
outb(VIDEO_SAR,1);
outb(VIDEO_SDR,inb(VIDEO_SDR)|8);

/* возврат к нормальному режиму работы */
outw(VIDEO_SAR,0x300);


Цитата:
Сейчас смотрю твою ссылку на форум.
Я там выкладывал код того способа, которым пользуюсь сам. А если хочешь перемещать курсор за пределы экрана, то для этого к примеру можно установить суперпозицию курсора в позицию сразу после последнего знакоместа, отображаемого на экране. Например, если у тебя стартовая позиция видеобуфера равна нулю, а на экране отображается 40x25=1000 знакомест, то установи суперпозицию курсора в значение 1000:
Код:
#define VIDEO_CRTAR 0x3D4
#define VIDEO_CRTDR 0x3D5
...
outw(VIDEO_CRTAR,0xE+(1000&0xFF00));
outw(VIDEO_CRTAR,0xF+((1000&0xFF)<<8));


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 окт 2012, 00:26 

Зарегистрирован: 28 май 2012, 09:31
Сообщения: 28
фантом-84, подскажите как переключиться под виндой из графики в текст непосредственно через программирование портов? Понятно, что ринг0


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 окт 2012, 14:11 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1197
Странный вопрос :shock: Даже если такое удастся сделать, как после этого работать с системой? Вообще чисто теоретически нужно просто установить какой-либо текстовый режим VGA путем перепрограммирования всех регистров VGA (обычна эта группа регистров остается доступной через пространство портов в/в по стандартным адресам), однако, как я уже говорил, я не знаю какой-либо универсальной перемычки для переключения из SVGA-режима в VGA-совместимый режим.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 окт 2012, 20:42 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1092
Цитата:
фантом-84, подскажите как переключиться под виндой из графики в текст непосредственно через программирование портов? Понятно, что ринг0


Ответ прост никак.

Для этого видео драйвер экспортирует
Int10CallBios
Int10FreeBuffer
Int10ReadMemory
Int10WriteMemory

Windows при необходимости смены режима пользуется этими функциями.

В простейшем случае Int10CallBios можно сделать так сделать вызов CallBios и передавать туда параметры.
CallBios реализуется при помощи перехода в реальный режим и обратно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 окт 2012, 15:34 

Зарегистрирован: 28 май 2012, 09:31
Сообщения: 28
решение все же есть http://exelab.ru/f/index.php?action=vth ... opic=19324


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 окт 2012, 21:15 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1197
Нифига. Я при первом переключении видеорежима в обязательном порядке перезагружаю шрифты, но, повторяю, при переключении из SVGA-режима это не всегда позволяет активировать VGA-совместимый видеорежим. Помогает только mov ax,3 плюс int 10h. Я конечно перестраховываюсь, т.к. при старте всегда активен текстовый режим, но все-таки. Я до этого дошел след. путем: если предварительно через BIOS включить какой-либо графический режим VESA, то мой код инициализации (первое переключение видеорежима) не всегда давал положительный результат. Если же между первым и вторым добавить код включения режима 3, то это работает в 100% случаев.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 окт 2012, 11:59 

Зарегистрирован: 28 май 2012, 09:31
Сообщения: 28
А что волшебного делает int 10? Почему нельзя в своем кодесе выполнить те же действия?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB