Assembler - язык неограниченных возможностей


Вывод на экран через линейный кадровый буфер - часть 3


; псевдослучайная полоска внизу экрана, которая служит генератором пламени generator_bar: xadd bp,ax stosw stosw loop generator_bar pop es ; восстановить ES для вывода на экран

;вывод пламени на экран xor edi,edi ; ES:EDI - LFB push esi add esi,offset buffer ; DS:ESI - буфер mov ecx,dword ptr scr_size ; размер буфера в двойных словах rep movsd ; скопировать буфер на экран pop esi mov ah,1 ; если не была нажата int 16h ; никакая клавиша, jz main_loop ; продолжить основной цикл, mov ah,0 ; иначе - int 16h ; считать эту клавишу

exit_all: mov ах,03h ; восстановить текстовый режим int 10h mov ax,4C00h ; AH = 4Ch int 21h ; выход из программы под расширителем DOS

; различные обработчики ошибок DPMI_error: ; ошибка при выполнении ; одной из функций DPMI mov edx,offset DPMI_error_msg mov ah,9 int 21h ; вывести сообщение об ошибке jmp short exit_all ; и выйти VBE_error: ; не поддерживается VBE mov edx,offset VBE_error_msg mov ah,9 int 21h ; вывести сообщение об ошибке jmp short start_with_vga ; и использовать VGA LFB_error: ; не поддерживается LFB mov edx,offset LFB_error_msg mov ah,9 ; вывести сообщение об ошибке int 21h start_with_vga: mov ah,0 ; подождать нажатия любой клавиши int 16h mov ax,13h ; переключиться в видеорежим 13h int 10h ; 320x200x256 mov ax,2 ; функция DPMI 0002h mov bx,0A000h ; построить дескриптор для реального int 31h ; сегмента mov dword ptr scr_width,320 ; установить параметры режима mov dword ptr scr_height,200 mov dword ptr scr_size,320*200/4 jmp enter_flame ; и перейти к пламени

.data ; различные сообщения об ошибках VBE_error_msg db "Ошибка VBE 2.0",0Dh,0Ah db "Будет использоваться режим VGA 320x200",0Dh,0Ah,'$' DPMI_error_msg db "Ошибка DPMI$" LFB_error_msg db "LFB недоступен",0Dh,0Ah db "Будет использоваться режим VGA 320x200",0Dh,0Ah,'$' ; параметры видеорежима scr_width dd 640 scr_height dd 480 scr_size dd 640*480/4 ; структура, используемая функцией DPMI 0300h v86_regs label byte v86_edi dd 0 v86_esi dd 0 v86_ebp dd 0 v86_res dd 0 v86_ebx dd 0 v86_edx dd 0 v86_ecx dd 0 v86_eax dd 0 v86_flags dw 0 v86_es dw 0 v86_ds dw 0 v86_fs dw 0 v86_gs dw 0 v86_ip dw 0 v86_cs dw 0 v86_sp dw 0 v86_ss dw 0 ; дескриптор сегмента, соответствующего LFB videodsc dw 0 ; биты 15-0 лимита dw 0 ; биты 15-0 базы db 0 ; биты 16-23 базы db 10010010b ; доступ db 10000000b ; биты 16-19 лимита и другие биты db 0 ; биты 24 - 31 базы ; селектор сегмента, описывающего LFB videosel dw 0

.data? ; буфер для экрана buffer db 640*483 dup(?)

; стек .stack 1000h end _start

Программирование с DOS-расширителями — один из лучших выходов для приложений, которые должны работать в любых условиях, включая старые версии DOS, и в то же время требуют 32-битный режим. Еще совсем недавно большинство компьютерных игр, в частности знаменитые Doom и Quake, выпускались именно как программы, использующие расширители DOS. Сейчас, с повсеместным распространением операционных систем для PC, работающих в 32-битном защищенном режиме, требование работы в любых версиях DOS становится менее актуальным и все больше программ выходят только в версиях для Windows 95 или NT, чему и будет посвящена следующая глава.





Начало  Назад