Проблема с VESA в WIN_XP

Тема в разделе "WASM.WIN32", создана пользователем Alexei_WASM, 17 апр 2007.

  1. Alexei_WASM

    Alexei_WASM New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    4
    Проблема с эмуляцией режима VESA 103h 800x600x256 в Win XP.
    Программа реального режима работает с видеорежимом VESA 103h 800x600x256.
    Заполняет экран и ждет нажатия клавиши по INT 16h.
    Каждый вызов разных функций INT 10h проверяется на успех, в случае ошибки выдается сообщение.
    В ДОС программа работает как надо, а в WIN_XP тоже полностью выполняется
    (нет выхода по ошибке, все проверки на поддержку видеорежима и его инициализацию пройдены успешно),
    но проблема с отображением на экран: монитор тухнет и мигает светодиодом. При нажатии клавиши происходит нормальный выход в WIN c восстановлением предыдущего видеорежима.
     
  2. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    А если запускать с консоли развернутой во весь экран? мне помогло :)
     
  3. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Alexei_WASM
    Попробуй запустить под Win98, а еще лучше выложи срец, может быть найдем ошибку
     
  4. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Alexei_WASM

    Проблема с эмуляцией под ХР портов, которые мепированны на память. У меня была такая же ситуация с Matrox ом. Как обойти - я выдрал кусок видео БИОСа отвечающий за сохранение и востановление состояния видеокарты и написал драйвер ХР, который все вышеуказанное делает, но программа получилась неуниверсальной.
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Alexei_WASM
    Есть такая программа "UserPort" от Tomas Franzon exe и sys разблокирует обращения к любым портам при работе под Win32. Возможно тогда и переделывать ничего не придется
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Alexei_WASM
    Нашел свою программу, древняя как мамонт, писалась под DOS, но работает и под WIN95,WIN98 и под WIN XP разные сервиспаки. Единственный минус, неправильно определяет текущий видеорежим, ну это сам поправишь.
    Эта программа выводит на экран картинку 640х480х256 цветов. Все проверки ошибок сведены к минимуму. В стандартном bmp-файле картинка расположена вверх ногами. Поэтому вывод осуществляется в правый нижний угол копированием пикселей в обратном порядке, со старших адресов памяти к младшим. 640*480=307200. В видеопамять SVGA файл можно выводить кусками по 65536 байт. 307200=65536*4+45056 т.е. 4 нормальных сегмента по 64 Кбайта с адресами от 0000 до FFFFh и один неполный сегмент с адресами от 0000 до AFFFh. Вывод пикселей начинаем в неполный сегмент построчно двигаясь в направлении уменьшения адресов. В нормальном сегменте 65536/640=102 полных строк и одна неполная строка из 256 пикселей. В неполном сегменте 45056/640=70 полных строк и одна неполная строка из 256 пикселей.
    480 строк - (102*4+70)=2 строки
    2 строки по 640 точек =256*5
    Для вывода пикселей в сегмент по строкам используем цикл. Для более быстрого вывода пикселей выводим на экран в строку сразу по 4 пикселя, используя для этого команду микропроцессора i80386 MOVSD (копирование двойных слов). После вывода одной строки пикселей на экран смещаемся на одну строку вверх
    Код (Text):
    1. .286
    2. .MODEL TINY
    3. .CODE
    4.     ORG 100h
    5. ccc:      MOV SP,OFFSET STACKEN ;установить область стека
    6.             MOV AH,0Fh      ;запомнить видеорежим
    7.             INT 10h
    8.             MOV VIDEOR,AL       ;видеорежим в VIDEOR
    9.             MOV AX,OFFSET PRCON+0Fh;в ax конец программы плюс 15
    10.             SHR AX,4            ; байт. уменьшить ax в 16 раз,
    11.             MOV BX,CS ;т.о. вычислен сегментный
    12.             ADD AX,BX ;адрес конца программы
    13.             MOV PICSEG,AX
    14.             PUSH    DS
    15.             MOV SI,AX
    16.             MOV DX,OFFSET CS:FILEINTRO  ;bmp-файл с картинкой
    17.             MOV AX,3D00h        ;функция открытия, только чтение
    18.             INT 21h
    19.             MOV BX,AX           ;запомнить номер файла
    20.             MOV CX,0FFF0h       ;длина записи
    21.             XOR DX,DX
    22. B0:        MOV DS,SI        ;двигаемся по файлу
    23.             MOV AH,3FH      ;функция чтения
    24.             INT 21H
    25.             ADD SI,0FFFh    ;увеличиваем адрес сегмента
    26.             CMP AX,0FFF0h       ;считались все FFF0h?
    27.             JNB B0
    28.              MOV    AH,3Eh      ;закрываем файл
    29.              INT    21h
    30.     POP     DS
    31.     PUSH    ES
    32.     MOV     ES,PICSEG
    33.     MOV     CX,256
    34.     MOV AX,4F02h    ;установить видеомоду
    35.              MOV BX,101h            ;video_mode 640x480x256
    36.              INT 10h
    37.     POP ES 
    38.              OR AH,AH           ;(AH=0?)видеокарта
    39.     JZ B2 ;поддерживает VESA?
    40.              JMP    EXIT
    41. B2:        MOV DS,PICSEG
    42.     XOR SI,SI
    43.     LODSW
    44.     CMP AX,'MB' ;bmp-файл?
    45.     JZ  B3
    46.     JMP EXIT
    47. B3: MOV SI,1Ch
    48.     LODSB
    49.     CMP AL,8            ;если в нашем файле
    50.              JZ B4 ;не 256 цветов
    51.     JMP EXIT            ;завершаем программу
    52. B4: MOV SI,37h          ;формируем таблицу цветов
    53.     MOV DI,OFFSET CS:PALETTE;в файле формат BGRedRez,
    54. A1: LODSW ;нам нужен -RedGB
    55.     SHR     AX,2
    56.     XCHG    AH,AL
    57.     STOSW
    58.     SUB SI,3
    59.     LODSB
    60.     SHR     AL,2
    61.     STOSB
    62.     ADD     SI,4
    63.     LOOP    A1 
    64.              MOV AX,1012h       ;установить блок ЦАП регистров
    65.     XOR BX,BX
    66.              MOV    CX,256
    67.     MOV     DX,OFFSET CS:PALETTE
    68.     INT 10h
    69.     MOV DX,4;позиционируемся на нижний неполный
    70.              MOV DI,0AD7Fh;сегмент;DI=0AFFFh-640 начало последней
    71.              DEC SI; строки в этом сегменте начало картинки
    72.              PUSH   0A000h      ;ES:=A000h
    73.              POP    ES ;BH=0 select video memory window,
    74.              MOV    AX,4F05h        ;BL=0 window A
    75.              INT    10h         ;VESA Super VGA BIOS
    76.              INC    BX      ;-CPU Video Memory Control
    77.              MOV    AX,4F05h ;BH=0 select video memory window,
    78.              INT 10h ;BL=1 window B
    79.              MOV CX,46h
    80. BANK1:  PUSH CX
    81.     MOV CX,160
    82. .386
    83.     REP MOVSD   ;заполняем строку из 640 пикселей
    84. .286
    85.     SUB DI,1280 ;поднимаемся на строку вверх
    86.     POP CX
    87.     LOOP BANK1
    88.     ADD DI,385
    89.     ADD CS:PICSEG,0AFBh
    90.     MOV DS,CS:PICSEG
    91.     MOV SI,3
    92.     MOV CX,64
    93. .386
    94.              REP MOVSD ;заполняем неполную строку из 256 пикселей
    95. .286
    96.     ADD CS:PICSEG,50h       ;переходим дальше
    97.     DEC DX ;DX=window address in Video Memory (in
    98.     MOV CX,4 ; granularity units)4 части по 64kb
    99. BANK:     PUSH CX
    100.     MOV SI,4
    101.     MOV DI,0FD7Fh;DI=0FFFFh-640 начало последней ;строки в этом сегменте
    102.     MOV DS,CS:PICSEG
    103.     DEC BX;BH=0 select video memory window,BL=0 ;window A
    104.     MOV AX,4F05h ;VESA Super VGA BIOS -CPU Video
    105.     INT 10h ; Memory Control
    106.     INC BX ;BH=0 select video memory window, BL=1 ;window B
    107.     MOV AX,4F05h
    108.     INT 10h
    109.     MOV CX,102
    110. BANK2:    PUSH CX
    111.     MOV CX,160
    112. .386
    113.     REP MOVSD   ;заполняем строку из 640 пикселей
    114. .286
    115.     SUB DI,1280     ;поднимаемся на строку вверх
    116.     POP CX
    117.     LOOP BANK2
    118.     ADD DI,385
    119.     ADD CS:PICSEG,0FB8h
    120.     MOV DS,CS:PICSEG
    121.     MOV SI,5
    122.     MOV CX,64
    123. .386
    124.              REP MOVSD;заполняем неполную строку из 256 пикселей
    125. .286
    126.     ADD CS:PICSEG,50h
    127.              POP CX
    128. A2:        DEC DX ;DX=window address in Video Memory (in
    129. LOOP BANK ; granularity units)
    130.     MOV AH,0    ;ждем нажатия на любую клавишу
    131.     INT 16h
    132. EXIT:     MOV AX,WORD PTR CS:VIDEOR
    133.              INT 10h    ;восстанавливаем видеорежим
    134.     RET         ;и выходим из программы
    135. FILEINTRO   db '*.bmp',0    ;картинка
    136. PALETTE     db  300h dup (0)   
    137. ;место под таблицу цветов 256*3
    138. VIDEOR  db 0,0
    139. PICSEG  dw 0
    140. STAKB   dw 100 dup(' ')
    141. STACKEN dw 0
    142. PRCON   db 0
    143. END ccc