А не будет потому, что всю графику НТВДМ эмулит, вплоть до портов ввода-вывода. И если функции смены палитры и размеров вывода кое-как реализованы, то закодить генератор строчной развертки, что-бы получить эффект испорченного монитора уже не получится. По крайней мере у меня не работало ни под НТ виндой, ни под ДОС под ВМварей. В чистом ДОСе все ОК.
Вот еще вариант: В вин9х была функция прозванная в народе GDIdeath, и экспортируемая по ординалу. После вызова сбрасывала контролер и GDI ничего не выводил уже. Где-то даже была статья о быстрой графике под винду с помощью этой ф-ции
2microprogs Тема интересная, хотя не представляю, где это можнно применить на практике. А можно ли из под виндов работать напрямую с видеоадаптером? Если да (пусть и из драйвера), тогда теоретически можно рисовать что угодно...
1 ntvdm.exe . говорят на его базе отладчики-эмуляторы культурные для дос прог есть. Поэтому в своё время заинтересовался.
NTVDM не работает в режиме ядра, обычное Win32 приложение. Приведенный выше API может юзаться VDM-драйверами (по сути-обычные DLL). Работать с графикой этот API не поможет, нужные функции\структуры придется искать самому в недрах кода NTVDM. NTVDM перехватывает обращение к портам\памяти DOS-приложения и эмулирует это все это в окне консоли.
Ну во первых я про режим ядра ничего не говорил: Как видишь это сказал не я. Вообще, создатель топика не хотел облегчить себе жизнь с работой в графике. А по поводу невозможности реализации графического интерфейса через функции ntvdm и то место на котором обычно сидят, об этом можно поспорить.
Сорри, я попытался ответить на несколько сообщений сразу. Придумал один способ рисования: 1. включить графический режим в NTVDM (через дос или еще как-нибудь). 2. замапить на себя память виртуального графического адаптера дос. 3. рисовать манипуляциями с памятью и портами вартуального графического адаптера.
Этот вопрос когда-то интересовал меня Помню там какая-то NtMapMemory...? Если хотите могу сырцов подкинуть
Если я правильно понял, то тебя интересует перевод видеоподсистемы в графический видеорежим из под NTVDM. В старом добром MS-DOS это производится через Int 10h. И рисование тоже через него. Насколько я знаю, в NTVDM перход в различные графические режимы не реализован, поэтому идея такова: написать драйвер, который будет переводить видеоподсистему в этот режим, а также в этом драйвере реализовать вызовы Int 10h для отрисовки графики. Все эти вызовы поместить в функции обработки IOCTL запросов, которые и выполнять из консольного приложения. Для Int 10h нашёл описание разных функций, если в Инете порыться, можно найти и для I/O портов видеоподсистемы. Вот для Int 10h Код (Text): Функции BIOS - INT 10H: видео сервис Здесь детализированы функции INT 10H стандартного видеосервиса ROM-BIOS. AH сервис --- ---------------------------------------------------------------------------- 00H уст. видео режим. Очистить экран, установить поля BIOS, установить режим. вход: AL=режим AL Тип формат цвета адаптер адрес монитор === ======= ======= ============= ======= ==== ================= 0 текст 40x25 16/8 полутона CGA,EGA b800 Composite 1 текст 40x25 16/8 CGA,EGA b800 Comp,RGB,Enhanced 2 текст 80x25 16/8 полутона CGA,EGA b800 Composite 3 текст 80x25 16/8 CGA,EGA b800 Comp,RGB,Enhanced 4 графика 320x200 4 CGA,EGA b800 Comp,RGB,Enhanced 5 графика 320x200 4 полутона CGA,EGA b800 Composite 6 графика 640x200 2 CGA,EGA b800 Comp,RGB,Enhanced 7 текст 80x25 3 (b/w/bold) MA,EGA b000 TTL Monochrome 0dH графика 320x200 16 EGA A000 RGB,Enhanced 0eH графика 640x200 16 EGA A000 RGB,Enhanced 0fH графика 640x350 3 (b/w/bold) EGA A000 Enhanced,TTL Mono 10H графика 640x350 4 или 16 EGA A000 Enhanced 8,9,0aH режимы PCjr 0bH,0cH (резервируется для EGA BIOS) замечание: для EGA и Jr можно добавить 80H к AL, чтобы инициализировать видео режим без очистки экрана. --- ---------------------------------------------------------------------------- 01H уст. размер/форму курсора (текст). курсор, если он видим, всегда мерцает. вход: CH = начальная строка (0-1fH; 20H=подавить курсор) CL = конечная строка (0-1fH) --- ---------------------------------------------------------------------------- 02H уст. позицию курсора. установка на строку 25 делает курсор невидимым. вход: BH = видео страница DH,DL = строка, колонка (считая от 0) --- ---------------------------------------------------------------------------- 03H читать позицию и размер курсора вход: BH = видео страница выход: DH,DL = текущие строка,колонка курсора CH,CL = текущие начальная,конечная строки курсора (см. функцию 01H) --- ---------------------------------------------------------------------------- 04H читать световое перо вход: нет выход: AH = триггер (0=нет значений; 1=возвращены значения светового пера) DH,DL = строка,колонка символа (текст) BX = колонка точки (графика) CH = строка точки (для графики EGA возвращается в CX) --- ---------------------------------------------------------------------------- 05H выбрать активную страницу дисплея вход: AL = номер страницы (большинство программ использует страницу 0) --- ---------------------------------------------------------------------------- 06H листать окно вверх (или очистить). Листать на 1 или более строк вверх. вход: CH,CL = строка,колонка верхнего левого угла окна (считая от 0) DH,DL = строка,колонка нижнего правого угла окна (считая от 0) AL = число пустых строк, вдвигаемых снизу (0=очистить все окно) BH = видео атрибут, используемый для пустых строк --- ---------------------------------------------------------------------------- 07H листать окно вниз (вдвинуть пустые строки в верхнюю часть окна) вход: (аналогично функции 06H) --- ---------------------------------------------------------------------------- 08H читать символ/атрибут в текущей позиции курсора вход: BH = номер видео страницы выход: AL = прочитанный символ AH = прочитанный видео атрибут (только для текстовых режимов) --- ---------------------------------------------------------------------------- 09H писать символ/атрибут в текущей позиции курсора вход: BH = номер видео страницы AL = записываемый символ CX = счетчик (сколько экземпляров символа записать) BL = видео атрибут (текст) или цвет (графика) (графические режимы: +80H означает XOR с символом на экране) --- ---------------------------------------------------------------------------- 0aH писать символ в текущей позиции курсора вход: BH = номер видео страницы AL = записываемый символ CX = счетчик (сколько экземпляров символа записать) --- ---------------------------------------------------------------------------- 0bH выбрать цвет палитры/бордюра (CGA-совместимые режимы) вход: BH = 0: (текст) выбрать цвет бордюра BL = цвет бордюра (0-1fH; от 10H до 1fH - интенсивные) BH = 1: (графика) выбрать палитру BL = 0: палитра green/red/brown BL = 1: палитра cyan/magenta/white --- ---------------------------------------------------------------------------- 0cH писать графическую точку (слишком медленно для большинства приложений!) вход: BH = номер видео страницы DX,CX = строка,колонка AL = значение цвета (+80H означает XOR с точкой на экране) --- ---------------------------------------------------------------------------- 0dH читать графическую точку (слишком медленно для большинства приложений!) вход: BH = номер видео страницы DX,CX = строка,колонка выход: AL = прочитанное значение цвета --- ---------------------------------------------------------------------------- 0eH писать символ на активную видео страницу (эмуляция телетайпа) вход: AL = записываемый символ (использует существующий атрибут) BL = цвет переднего плана (для графических режимов) --- ---------------------------------------------------------------------------- 0fH читать текущий видео режим вход: нет выход: AL = текущий режим (см. функцию 00H) AH = число текстовых колонок на экране BH = текущий номер активной страницы дисплея --- ---------------------------------------------------------------------------- 10H-12H См. EGA BIOS сервис --- ---------------------------------------------------------------------------- 13H писать строку ¦AT¦ EGA Выдает строку в позиции курсора. символы 0dH (CarRet), 0aH (LineFeed), 08H (backspace) и 07H (Beep) трактуются как команды управления и не высвечиваются. вход: ES:BP => выводимая строка (спецформат для AL=2 и AL=3) CX = длина строки (подсчитываются только символы) DH,DL = строка,колонка начала вывода BH = номер страницы AL = код подфункции: 0 = использовать атрибут в BL; не трогать курсор 1 = использовать атрибут в BL; курсор - в конец строки 2 = формат строки: char,attr, char,attr...; не трогать курсор 3 = формат строки: char,attr, char,attr...; передвинуть курсор -------------------------------------------------------------------------------- подфункции 10H-13H: EGA BIOS сервис данные BIOS функции ROM-BIOS EGA BIOS сервис Эти функции устанавливаются в процессе ROM-Scan при наличии платы EGA . См. Детали видео сервиса подф. 00H о видео режимах, применимых к EGA. См. порты в/в EGA о прямом доступе к средствам платы EGA. AH сервис --- ---------------------------------------------------------------------------- 10H установить регистры палитры для EGA Выбирает цвета, используемые данным атрибутом экрана. умалчиваемые цвета - те же, что используются с CGA (см. атрибуты экрана ). вход: AL = 0: уст. один регистр палитры BL = регистр (идентифицирует 4-битовый цвет; 0-15) BH = значение регистра (6-битовый rgbRGB выдаваемый цвет) AL = 1: уст. регистр бордюра. Note: not much of a border. BH = значение регистра AL = 2: уст. все регистры палитры и регистр бордюра ES:BX => 17 байт (регистры палитры и регистр бордюра) AL = 3: выбрать интенсивность или мерцание BL = 0: интенсивность фона (16 возможных цветов фона) BL = 1: мерцание (8 цветов фона + мерцание переднего плана) значения регистра палитры для подфункций 0,1,and 2: --7-T-6-T-5-T-4-T-3-T-2-T-1-T-0-¬ ¦не исп.¦ r g b/I R G B ¦ (6 бит = 64 возможных цвета) L---+---+---+---+-T-+---+---+---- L= действует как интенсивность для режимов CGA --- ---------------------------------------------------------------------------- 11H EGA character generator functions. Resets video variables without change to the current values in the regen buffer (ie, the screen is not cleared). вход: AL = 0: load user-defined text-mode display font ES:BP => user font table CX = count of character patterns to store DX = character offset (font load starts at this ASCII value) BL = font block to load (0 to 4; 4 if 256K EGA memory) BH = count of bytes per character pattern (eg, 8 or 14) AL = 1: load ROM 8x14 character font BL = font block to load (0-4) AL = 2: load ROM 8x8 double-dot character font BL = font block to load (0-4) AL = 3: set block specifier (enables two of the four 256-char sets) The second set of 256 chars is selected by attribute bit 3. (in other words, if you select a "foreground color" above 7, the EGA displays the secondary font). BL = font block selector (4 bits, 0-0fH) --7-T-6-T-5-T-4-T-3-T-2-T-1-T-0-¬ ¦ not used ¦block# ¦block# ¦ L---+---+---+---+---+---+---+---- L=T=- L===¦== selected when attr bit 3=0 L============ used when attr bit 3=1 ---------------------------------------------------------------------------- Sub-functions 10H,11H,and 12H expect page 0 to be active and should be used directly after a mode reset. These recalculate rows and columns and reprogram several CRTC registers, including the cursor registers. AL=10H: load user-defined text-mode display font (see SubFn 00H) AL=11H: load ROM 8x14 character font (see SubFn 01H) AL=12H: load ROM 8x8 double-dot character font (see SubFn 02H) ---------------------------------------------------------------------------- AL=20H: set up user character font for graphics modes ES:BP => 2048-byte table of 8x8 character set for INT 1fH AL=21H: set up user character font for graphics modes ES:BP => table of 8x8 character set for INT 44H CX = points (bytes per character) BL = screen rows code 0 = user-specified DL = character rows on screen 1 = 0eH (14 character rows on screen) 2 = 19H (25 character rows on screen) 3 = 2bH (43 character rows on screen) AL=22H: set up ROM 8x14 character font for graphics modes BL = screen rows code (see above) AL=23H: set up ROM 8x8 double-dot character font for graphics modes BL = screen rows code (see above) ---------------------------------------------------------------------------- AL=30H: Get EGA information BH = table pointer request code 0 = return ES:BP => current INT 1fH graphics font addr 1 = return ES:BP => current INT 44H graphics font addr 2 = return ES:BP => ROM 8x14 font table addr 3 = return ES:BP => ROM 8x8 double dot font table addr 4 = return ES:BP => ROM 8x8 double dot addr (top) 5 = return ES:BP => ROM 9x14 alternate table addr выход: CX = font points (font-definition bytes per character) DL = screen rows --- ---------------------------------------------------------------------------- 12H EGA special functions (Alternate Select) вход: BL=10H: return EGA information выход: BH = mode (0=color; 1=monochrome) BL = memory size code (0=64K; 1=128K; 2=192K; 3=256K) CH = feature bits (values of those unused RCA connectors) CL = switch settings (adaptor/display primary/secondary) вход: BL=20H: select alternate print-screen routine (be sure to use this every time you change the number of screen rows). --- ---------------------------------------------------------------------------- 13H write string ¦AT¦ EGA Displays a string at a selected cursor position. Characters 0dH (CarRet), 0aH (LineFeed), 08H (bksp), and 07H (Beep) are treated as control commands and are not displayed. вход: ES:BP => string to display (special format for AL=2 and AL=3) CX = length of string (character count only) DH,DL = row,column to start displaying BH = page number AL = sub function code: 0 = use attribute in BL; don't update cursor 1 = use attribute in BL; leave cursor at end of string 2 = string format: char,attr, char,attr...; don't update cursor 3 = string format: char,attr, char,attr...; do update cursor Вот ещё ссылка на пример программирования графики через Int 10h http://sizov.boom.ru/draw10h.htm
Используется какая-то GdiFullscreenControl ее прототипа негде нет при попытке вызова возрашает что привилегей нету Вообще графика может быть в полноэкранном режиме.