Проблема с эмуляцией режима VESA 103h 800x600x256 в Win XP. Программа реального режима работает с видеорежимом VESA 103h 800x600x256. Заполняет экран и ждет нажатия клавиши по INT 16h. Каждый вызов разных функций INT 10h проверяется на успех, в случае ошибки выдается сообщение. В ДОС программа работает как надо, а в WIN_XP тоже полностью выполняется (нет выхода по ошибке, все проверки на поддержку видеорежима и его инициализацию пройдены успешно), но проблема с отображением на экран: монитор тухнет и мигает светодиодом. При нажатии клавиши происходит нормальный выход в WIN c восстановлением предыдущего видеорежима.
Alexei_WASM Проблема с эмуляцией под ХР портов, которые мепированны на память. У меня была такая же ситуация с Matrox ом. Как обойти - я выдрал кусок видео БИОСа отвечающий за сохранение и востановление состояния видеокарты и написал драйвер ХР, который все вышеуказанное делает, но программа получилась неуниверсальной.
Alexei_WASM Есть такая программа "UserPort" от Tomas Franzon exe и sys разблокирует обращения к любым портам при работе под Win32. Возможно тогда и переделывать ничего не придется
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): .286 .MODEL TINY .CODE ORG 100h ccc: MOV SP,OFFSET STACKEN ;установить область стека MOV AH,0Fh ;запомнить видеорежим INT 10h MOV VIDEOR,AL ;видеорежим в VIDEOR MOV AX,OFFSET PRCON+0Fh;в ax конец программы плюс 15 SHR AX,4 ; байт. уменьшить ax в 16 раз, MOV BX,CS ;т.о. вычислен сегментный ADD AX,BX ;адрес конца программы MOV PICSEG,AX PUSH DS MOV SI,AX MOV DX,OFFSET CS:FILEINTRO ;bmp-файл с картинкой MOV AX,3D00h ;функция открытия, только чтение INT 21h MOV BX,AX ;запомнить номер файла MOV CX,0FFF0h ;длина записи XOR DX,DX B0: MOV DS,SI ;двигаемся по файлу MOV AH,3FH ;функция чтения INT 21H ADD SI,0FFFh ;увеличиваем адрес сегмента CMP AX,0FFF0h ;считались все FFF0h? JNB B0 MOV AH,3Eh ;закрываем файл INT 21h POP DS PUSH ES MOV ES,PICSEG MOV CX,256 MOV AX,4F02h ;установить видеомоду MOV BX,101h ;video_mode 640x480x256 INT 10h POP ES OR AH,AH ;(AH=0?)видеокарта JZ B2 ;поддерживает VESA? JMP EXIT B2: MOV DS,PICSEG XOR SI,SI LODSW CMP AX,'MB' ;bmp-файл? JZ B3 JMP EXIT B3: MOV SI,1Ch LODSB CMP AL,8 ;если в нашем файле JZ B4 ;не 256 цветов JMP EXIT ;завершаем программу B4: MOV SI,37h ;формируем таблицу цветов MOV DI,OFFSET CS:PALETTE;в файле формат BGRedRez, A1: LODSW ;нам нужен -RedGB SHR AX,2 XCHG AH,AL STOSW SUB SI,3 LODSB SHR AL,2 STOSB ADD SI,4 LOOP A1 MOV AX,1012h ;установить блок ЦАП регистров XOR BX,BX MOV CX,256 MOV DX,OFFSET CS:PALETTE INT 10h MOV DX,4;позиционируемся на нижний неполный MOV DI,0AD7Fh;сегмент;DI=0AFFFh-640 начало последней DEC SI; строки в этом сегменте начало картинки PUSH 0A000h ;ES:=A000h POP ES ;BH=0 select video memory window, MOV AX,4F05h ;BL=0 window A INT 10h ;VESA Super VGA BIOS INC BX ;-CPU Video Memory Control MOV AX,4F05h ;BH=0 select video memory window, INT 10h ;BL=1 window B MOV CX,46h BANK1: PUSH CX MOV CX,160 .386 REP MOVSD ;заполняем строку из 640 пикселей .286 SUB DI,1280 ;поднимаемся на строку вверх POP CX LOOP BANK1 ADD DI,385 ADD CS:PICSEG,0AFBh MOV DS,CS:PICSEG MOV SI,3 MOV CX,64 .386 REP MOVSD ;заполняем неполную строку из 256 пикселей .286 ADD CS:PICSEG,50h ;переходим дальше DEC DX ;DX=window address in Video Memory (in MOV CX,4 ; granularity units)4 части по 64kb BANK: PUSH CX MOV SI,4 MOV DI,0FD7Fh;DI=0FFFFh-640 начало последней ;строки в этом сегменте MOV DS,CS:PICSEG DEC BX;BH=0 select video memory window,BL=0 ;window A MOV AX,4F05h ;VESA Super VGA BIOS -CPU Video INT 10h ; Memory Control INC BX ;BH=0 select video memory window, BL=1 ;window B MOV AX,4F05h INT 10h MOV CX,102 BANK2: PUSH CX MOV CX,160 .386 REP MOVSD ;заполняем строку из 640 пикселей .286 SUB DI,1280 ;поднимаемся на строку вверх POP CX LOOP BANK2 ADD DI,385 ADD CS:PICSEG,0FB8h MOV DS,CS:PICSEG MOV SI,5 MOV CX,64 .386 REP MOVSD;заполняем неполную строку из 256 пикселей .286 ADD CS:PICSEG,50h POP CX A2: DEC DX ;DX=window address in Video Memory (in LOOP BANK ; granularity units) MOV AH,0 ;ждем нажатия на любую клавишу INT 16h EXIT: MOV AX,WORD PTR CS:VIDEOR INT 10h ;восстанавливаем видеорежим RET ;и выходим из программы FILEINTRO db '*.bmp',0 ;картинка PALETTE db 300h dup (0) ;место под таблицу цветов 256*3 VIDEOR db 0,0 PICSEG dw 0 STAKB dw 100 dup(' ') STACKEN dw 0 PRCON db 0 END ccc