Графика в консоли!

Тема в разделе "WASM.WIN32", создана пользователем microprogs, 2 окт 2006.

  1. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    А не будет потому, что всю графику НТВДМ эмулит, вплоть до портов ввода-вывода. И если функции смены палитры и размеров вывода кое-как реализованы, то закодить генератор строчной развертки, что-бы получить эффект испорченного монитора :) уже не получится. По крайней мере у меня не работало ни под НТ виндой, ни под ДОС под ВМварей. В чистом ДОСе все ОК.
     
  2. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Вот еще вариант:
    В вин9х была функция прозванная в народе GDIdeath, и экспортируемая по ординалу. После вызова сбрасывала контролер и GDI ничего не выводил уже. Где-то даже была статья о быстрой графике под винду с помощью этой ф-ции :)
     
  3. ironway

    ironway New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    90
    2microprogs
    Тема интересная, хотя не представляю, где это можнно применить на практике.
    А можно ли из под виндов работать напрямую с видеоадаптером? Если да (пусть и из драйвера), тогда теоретически можно рисовать что угодно...
     
  4. microprogs

    microprogs New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2006
    Сообщения:
    54
    Да, ты единственный, кто меня здесь понял :)
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    _Serega_
    Это был из чего экспорт?
     
  6. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    1 ntvdm.exe .
    говорят на его базе отладчики-эмуляторы культурные для дос прог есть. Поэтому в своё время заинтересовался.
     
  7. Mantrid

    Mantrid New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    15
    NTVDM не работает в режиме ядра, обычное Win32 приложение.
    Приведенный выше API может юзаться VDM-драйверами (по сути-обычные DLL). Работать с графикой этот API не поможет, нужные функции\структуры придется искать самому в недрах кода NTVDM.
    NTVDM перехватывает обращение к портам\памяти DOS-приложения и эмулирует это все это в окне консоли.
     
  8. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Ну во первых я про режим ядра ничего не говорил:
    Как видишь это сказал не я.
    Вообще, создатель топика не хотел облегчить себе жизнь с работой в графике. А по поводу невозможности реализации графического интерфейса через функции ntvdm и то место на котором обычно сидят, об этом можно поспорить.
     
  9. Mantrid

    Mantrid New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    15
    Сорри, я попытался ответить на несколько сообщений сразу.
    Придумал один способ рисования:
    1. включить графический режим в NTVDM (через дос или еще как-нибудь).
    2. замапить на себя память виртуального графического адаптера дос.
    3. рисовать манипуляциями с памятью и портами вартуального графического адаптера.
     
  10. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Этот вопрос когда-то интересовал меня
    Помню там какая-то NtMapMemory...?
    Если хотите могу сырцов подкинуть :)
     
  11. Koshak

    Koshak New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2006
    Сообщения:
    31
    Адрес:
    Russia
    Если я правильно понял, то тебя интересует перевод видеоподсистемы в графический видеорежим из под NTVDM. В старом добром MS-DOS это производится через Int 10h. И рисование тоже через него. Насколько я знаю, в NTVDM перход в различные графические режимы не реализован, поэтому идея такова: написать драйвер, который будет переводить видеоподсистему в этот режим, а также в этом драйвере реализовать вызовы Int 10h для отрисовки графики. Все эти вызовы поместить в функции обработки IOCTL запросов, которые и выполнять из консольного приложения. Для Int 10h нашёл описание разных функций, если в Инете порыться, можно найти и для I/O портов видеоподсистемы.
    Вот для Int 10h
    Код (Text):
    1. Функции BIOS - INT 10H: видео сервис
    2.  
    3. Здесь детализированы функции INT 10H стандартного видеосервиса ROM-BIOS.
    4.  
    5. AH  сервис
    6. --- ----------------------------------------------------------------------------
    7. 00H уст. видео режим. Очистить экран, установить поля BIOS, установить режим.
    8.     вход:  AL=режим
    9.            AL  Тип      формат   цвета          адаптер  адрес монитор
    10.            === =======  =======  =============  =======  ====  =================
    11.             0  текст    40x25    16/8 полутона  CGA,EGA  b800  Composite
    12.             1  текст    40x25    16/8           CGA,EGA  b800  Comp,RGB,Enhanced
    13.             2  текст    80x25    16/8 полутона  CGA,EGA  b800  Composite
    14.             3  текст    80x25    16/8           CGA,EGA  b800  Comp,RGB,Enhanced
    15.             4  графика  320x200  4              CGA,EGA  b800  Comp,RGB,Enhanced
    16.             5  графика  320x200  4 полутона     CGA,EGA  b800  Composite
    17.             6  графика  640x200  2              CGA,EGA  b800  Comp,RGB,Enhanced
    18.             7  текст    80x25    3 (b/w/bold)   MA,EGA   b000  TTL Monochrome
    19.            0dH графика  320x200  16             EGA      A000  RGB,Enhanced
    20.            0eH графика  640x200  16             EGA      A000  RGB,Enhanced
    21.            0fH графика  640x350  3 (b/w/bold)   EGA      A000  Enhanced,TTL Mono
    22.            10H графика  640x350  4 или 16       EGA      A000  Enhanced
    23.        8,9,0aH  режимы PCjr
    24.        0bH,0cH  (резервируется для EGA BIOS)
    25.           замечание: для EGA и Jr можно добавить 80H к AL, чтобы
    26.                инициализировать видео режим без очистки экрана.
    27. --- ----------------------------------------------------------------------------
    28. 01H уст. размер/форму курсора (текст). курсор, если он видим, всегда мерцает.
    29.     вход:  CH = начальная строка (0-1fH; 20H=подавить курсор)
    30.            CL = конечная строка (0-1fH)
    31. --- ----------------------------------------------------------------------------
    32. 02H уст. позицию курсора. установка на строку 25 делает курсор невидимым.
    33.     вход:  BH = видео страница
    34.            DH,DL = строка, колонка (считая от 0)
    35. --- ----------------------------------------------------------------------------
    36. 03H читать позицию и размер курсора
    37.     вход:  BH = видео страница
    38.    выход:  DH,DL = текущие строка,колонка курсора
    39.            CH,CL = текущие начальная,конечная строки курсора (см. функцию 01H)
    40. --- ----------------------------------------------------------------------------
    41. 04H читать световое перо
    42.     вход:  нет
    43.    выход:  AH = триггер (0=нет значений; 1=возвращены значения светового пера)
    44.            DH,DL = строка,колонка символа (текст)
    45.            BX = колонка точки (графика)
    46.            CH = строка точки (для графики EGA возвращается в CX)
    47. --- ----------------------------------------------------------------------------
    48. 05H выбрать активную страницу дисплея
    49.     вход:  AL = номер страницы (большинство программ использует страницу 0)
    50. --- ----------------------------------------------------------------------------
    51. 06H листать окно вверх (или очистить). Листать на 1 или более строк вверх.
    52.     вход:  CH,CL = строка,колонка верхнего левого угла окна (считая от 0)
    53.            DH,DL = строка,колонка нижнего правого угла окна (считая от 0)
    54.            AL = число пустых строк, вдвигаемых снизу (0=очистить все окно)
    55.            BH = видео атрибут, используемый для пустых строк
    56. --- ----------------------------------------------------------------------------
    57. 07H листать окно вниз (вдвинуть пустые строки в верхнюю часть окна)
    58.     вход:  (аналогично функции 06H)
    59. --- ----------------------------------------------------------------------------
    60. 08H читать символ/атрибут в текущей позиции курсора
    61.     вход:  BH = номер видео страницы
    62.    выход:  AL = прочитанный символ
    63.            AH = прочитанный видео атрибут (только для текстовых режимов)
    64. --- ----------------------------------------------------------------------------
    65. 09H писать символ/атрибут в текущей позиции курсора
    66.     вход:  BH = номер видео страницы
    67.            AL = записываемый символ
    68.            CX = счетчик (сколько экземпляров символа записать)
    69.            BL = видео атрибут (текст) или цвет (графика)
    70.                 (графические режимы: +80H означает XOR с символом на экране)
    71. --- ----------------------------------------------------------------------------
    72. 0aH писать символ в текущей позиции курсора
    73.     вход:  BH = номер видео страницы
    74.            AL = записываемый символ
    75.            CX = счетчик (сколько экземпляров символа записать)
    76. --- ----------------------------------------------------------------------------
    77. 0bH выбрать цвет палитры/бордюра (CGA-совместимые режимы)
    78.     вход:  BH = 0: (текст) выбрать цвет бордюра
    79.                    BL = цвет бордюра (0-1fH; от 10H до 1fH - интенсивные)
    80.            BH = 1: (графика) выбрать палитру
    81.                    BL = 0: палитра green/red/brown
    82.                    BL = 1: палитра cyan/magenta/white
    83. --- ----------------------------------------------------------------------------
    84. 0cH писать графическую точку (слишком медленно для большинства приложений!)
    85.     вход:  BH = номер видео страницы
    86.            DX,CX = строка,колонка
    87.            AL = значение цвета (+80H означает XOR с точкой на экране)
    88. --- ----------------------------------------------------------------------------
    89. 0dH читать графическую точку (слишком медленно для большинства приложений!)
    90.     вход:  BH = номер видео страницы
    91.            DX,CX = строка,колонка
    92.    выход:  AL = прочитанное значение цвета
    93. --- ----------------------------------------------------------------------------
    94. 0eH писать символ на активную видео страницу (эмуляция телетайпа)
    95.     вход:  AL = записываемый символ (использует существующий атрибут)
    96.            BL = цвет переднего плана (для графических режимов)
    97. --- ----------------------------------------------------------------------------
    98. 0fH читать текущий видео режим
    99.     вход:  нет
    100.    выход:  AL = текущий режим (см. функцию 00H)
    101.            AH = число текстовых колонок на экране
    102.            BH = текущий номер активной страницы дисплея
    103. --- ----------------------------------------------------------------------------
    104. 10H-12H  См.  EGA BIOS сервис
    105. --- ----------------------------------------------------------------------------
    106. 13H писать строку ¦AT¦  EGA  Выдает строку в позиции курсора. символы 0dH
    107.     (CarRet), 0aH (LineFeed), 08H (backspace) и 07H (Beep) трактуются как
    108.     команды управления и не высвечиваются.
    109.     вход:   ES:BP => выводимая строка (спецформат для AL=2 и AL=3)
    110.             CX = длина строки (подсчитываются только символы)
    111.             DH,DL = строка,колонка начала вывода
    112.             BH = номер страницы
    113.             AL = код подфункции:
    114.                  0 = использовать атрибут в BL; не трогать курсор
    115.                  1 = использовать атрибут в BL; курсор - в конец строки
    116.                  2 = формат строки: char,attr, char,attr...; не трогать курсор
    117.                  3 = формат строки: char,attr, char,attr...; передвинуть курсор
    118. --------------------------------------------------------------------------------
    119. подфункции 10H-13H: EGA BIOS сервис        данные BIOS    функции ROM-BIOS
    120.  
    121.                                EGA BIOS сервис
    122.  
    123. Эти функции устанавливаются в процессе ROM-Scan при наличии платы EGA .
    124. См. Детали видео сервиса подф. 00H о видео режимах, применимых к EGA.
    125. См. порты в/в EGA о прямом доступе к средствам платы EGA.
    126. AH  сервис
    127. --- ----------------------------------------------------------------------------
    128. 10H установить регистры палитры для EGA
    129.     Выбирает цвета, используемые данным атрибутом экрана. умалчиваемые цвета -
    130.     те же, что используются с CGA (см. атрибуты экрана ).
    131.     вход:  AL = 0: уст. один регистр палитры
    132.                    BL = регистр (идентифицирует 4-битовый цвет; 0-15)
    133.                    BH = значение регистра (6-битовый rgbRGB выдаваемый цвет)
    134.            AL = 1: уст. регистр бордюра. Note: not much of a border.
    135.                    BH = значение регистра
    136.            AL = 2: уст. все регистры палитры и регистр бордюра
    137.                    ES:BX => 17 байт (регистры палитры и регистр бордюра)
    138.            AL = 3: выбрать интенсивность или мерцание
    139.                    BL = 0: интенсивность фона (16 возможных цветов фона)
    140.                    BL = 1: мерцание (8 цветов фона + мерцание переднего плана)
    141.            значения регистра палитры для подфункций 0,1,and 2:
    142.            --7-T-6-T-5-T-4-T-3-T-2-T-1-T-0-¬
    143.            ¦не исп.¦ r   g  b/I  R   G   B ¦ (6 бит = 64 возможных цвета)
    144.            L---+---+---+---+-T-+---+---+----
    145.                              L= действует как интенсивность для режимов CGA
    146. --- ----------------------------------------------------------------------------
    147. 11H EGA character generator functions.  Resets video variables without change
    148.     to the current values in the regen buffer (ie, the screen is not cleared).
    149.     вход:  AL = 0: load user-defined text-mode display font
    150.                    ES:BP => user font table
    151.                    CX = count of character patterns to store
    152.                    DX = character offset (font load starts at this ASCII value)
    153.                    BL = font block to load (0 to 4; 4 if 256K EGA memory)
    154.                    BH = count of bytes per character pattern (eg, 8 or 14)
    155.            AL = 1: load ROM 8x14 character font
    156.                    BL = font block to load (0-4)
    157.            AL = 2: load ROM 8x8 double-dot character font
    158.                    BL = font block to load (0-4)
    159.            AL = 3: set block specifier (enables two of the four 256-char sets)
    160.                    The second set of 256 chars is selected by attribute bit 3.
    161.                    (in other words, if you select a "foreground color" above 7,
    162.                     the EGA displays the secondary font).
    163.                    BL = font block selector (4 bits, 0-0fH)
    164.                    --7-T-6-T-5-T-4-T-3-T-2-T-1-T-0-¬
    165.                    ¦    not used   ¦block# ¦block# ¦
    166.                    L---+---+---+---+---+---+---+----
    167.                                      L=T=-   L===¦== selected when attr bit 3=0
    168.                                        L============ used when attr bit 3=1
    169.     ----------------------------------------------------------------------------
    170.            Sub-functions 10H,11H,and 12H expect page 0 to be active and should
    171.            be used directly after a mode reset.  These recalculate rows and
    172.            columns and reprogram several CRTC registers, including the cursor
    173.            registers.
    174.            AL=10H: load user-defined text-mode display font (see SubFn 00H)
    175.            AL=11H: load ROM 8x14 character font (see SubFn 01H)
    176.            AL=12H: load ROM 8x8 double-dot character font (see SubFn 02H)
    177.     ----------------------------------------------------------------------------
    178.            AL=20H: set up user character font for graphics modes
    179.                    ES:BP => 2048-byte table of 8x8 character set for INT 1fH
    180.            AL=21H: set up user character font for graphics modes
    181.                    ES:BP => table of 8x8 character set for INT 44H
    182.                    CX = points (bytes per character)
    183.                    BL = screen rows code
    184.                         0 = user-specified
    185.                             DL = character rows on screen
    186.                         1 = 0eH (14 character rows on screen)
    187.                         2 = 19H (25 character rows on screen)
    188.                         3 = 2bH (43 character rows on screen)
    189.            AL=22H: set up ROM 8x14 character font for graphics modes
    190.                    BL = screen rows code (see above)
    191.            AL=23H: set up ROM 8x8 double-dot character font for graphics modes
    192.                    BL = screen rows code (see above)
    193.     ----------------------------------------------------------------------------
    194.            AL=30H: Get EGA information
    195.                    BH = table pointer request code
    196.                         0 = return ES:BP => current INT 1fH graphics font addr
    197.                         1 = return ES:BP => current INT 44H graphics font addr
    198.                         2 = return ES:BP => ROM 8x14 font table addr
    199.                         3 = return ES:BP => ROM 8x8 double dot font table addr
    200.                         4 = return ES:BP => ROM 8x8 double dot addr (top)
    201.                         5 = return ES:BP => ROM 9x14 alternate table addr
    202.            выход:  CX = font points (font-definition bytes per character)
    203.                    DL = screen rows
    204. --- ----------------------------------------------------------------------------
    205. 12H EGA special functions (Alternate Select)
    206.     вход:  BL=10H: return EGA information
    207.    выход:          BH = mode (0=color; 1=monochrome)
    208.                    BL = memory size code (0=64K; 1=128K; 2=192K; 3=256K)
    209.                    CH = feature bits (values of those unused RCA connectors)
    210.                    CL = switch settings (adaptor/display primary/secondary)
    211.     вход:  BL=20H: select alternate print-screen routine (be sure to use this
    212.                    every time you change the number of screen rows).
    213. --- ----------------------------------------------------------------------------
    214. 13H write string ¦AT¦  EGA  Displays a string at a selected cursor position.
    215.     Characters 0dH (CarRet), 0aH (LineFeed), 08H (bksp), and 07H (Beep) are
    216.     treated as control commands and are not displayed.
    217.     вход:   ES:BP => string to display (special format for AL=2 and AL=3)
    218.             CX = length of string (character count only)
    219.             DH,DL = row,column to start displaying
    220.             BH = page number
    221.             AL = sub function code:
    222.                  0 = use attribute in BL; don't update cursor
    223.                  1 = use attribute in BL; leave cursor at end of string
    224.                  2 = string format: char,attr, char,attr...; don't update cursor
    225.                  3 = string format: char,attr, char,attr...; do update cursor
    Вот ещё ссылка на пример программирования графики через Int 10h http://sizov.boom.ru/draw10h.htm
     
  12. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    Используется какая-то GdiFullscreenControl ее прототипа негде нет при попытке вызова возрашает что привилегей нету :)
    Вообще графика может быть в полноэкранном режиме.