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));