Скачиваний:
27
Добавлен:
15.09.2014
Размер:
64.35 Кб
Скачать

ВИДЕО Примеры программ Полный листинг программы сохранения содержимого экрана в файл формата BMP. Данная программа-резидент после загрузки в память активизируется по нажатию LSHIFT+G и сохраняет содержимое экрана в файл SCREEN.BMP. Выгрузка программы осуществляется по ключу "/u". Программа позволяет сохранять изображение в следующих графических видеорежимах:

ВИДЕОРЕЖИМ КОЛИЧЕСТВО ТОЧЕК КОЛИЧЕСТВО ЦВЕТОВ 4H 320*200 4 5H 320*200 4 (SHADES) 6H 640*200 2 0DH 320*200 16 0EH 640*200 16 OFH 640*350 3 (B/W/BOLD) 10H 640*350 4 OR 16 11H 640*480 2 12H 640*480 16 13H 320*200 256 ; Автор программы Азаренко С.В. .MODEL TINY .286 .code ORG 100h Begin: jmp InitiAlization ;**************************************************** ;********* Данные для сохранения файла ************ ;**************************************************** FileID dw 0 TempData db 0 TempData1 db 0 TempData2 dw 0 TempData3 dd 0 FlagCount dw 0 Bank1 db 0 Bank2 db 0 Bank3 db 0 Bank4 db 0 Buf_Color db 0,0,0,0,255,255,255,0,255,255,255,255 BMP_File_Header dw 4D42h bfsize dd 0 Res1 dd 0 bfbits dd 0 BMP_Info_Header dd 40 biWidth dd 0 biHeight dd 0 Res2 dw 1 BPP dw 0 Res3 dd 0 SizeIm dd 0 Res4 dd 0b13h Res5 dd 0 buf_Temp db 38400 dup(0) ;**************************************************** Param4h5h0dhMode Proc Near push cs pop ds mov word ptr biWidth,320 mov word ptr biHeight,200 mov word ptr bfbits,118 mov word ptr bfsize,32118 mov word ptr BPP,4 mov word ptr SizeIm,32000 mov word ptr FlagCount,4 retn Param4h5h0dhMode Endp ;**************************************************** Param6hMode Proc Near push cs pop ds mov word ptr biWidth,640 mov word ptr biHeight,200 mov word ptr bfbits,62 mov word ptr bfsize,16062 mov word ptr BPP,1 mov word ptr SizeIm,16000 mov word ptr FlagCount,2 retn Param6hMode Endp ;**************************************************** Param0dhMode Proc Near push cs pop ds mov word ptr biWidth,320 mov word ptr biHeight,200 mov word ptr bfbits,118 mov word ptr bfsize,32118 mov word ptr BPP,4 mov word ptr SizeIm,32000 mov word ptr FlagCount,4 retn Param0dhMode Endp ;**************************************************** Param0ehMode Proc Near push cs pop ds mov word ptr biWidth,640 mov word ptr biHeight,200 mov word ptr bfbits,118 mov word ptr bfsize,64118 mov word ptr BPP,4 mov word ptr SizeIm,64000 mov word ptr FlagCount,4 retn Param0ehMode Endp ;**************************************************** Param0fhMode Proc Near push cs pop ds mov word ptr biWidth,640 mov word ptr biHeight,350 mov word ptr bfbits,62 mov word ptr bfsize,28062 mov word ptr BPP,1 mov word ptr SizeIm,28000 mov word ptr FlagCount,2 retn Param0fhMode Endp ;**************************************************** Param10hMode Proc Near push cs pop ds mov word ptr biWidth,640 mov word ptr biHeight,350 mov word ptr bfbits,118 mov word ptr bfsize,0;112118 mov word ptr BPP,4 mov word ptr SizeIm,0;112000 mov word ptr FlagCount,4 retn Param10hMode Endp ;**************************************************** Param11hMode Proc Near push cs pop ds mov word ptr biWidth,640 mov word ptr biHeight,480 mov word ptr bfbits,62 mov word ptr bfsize,38462 mov word ptr BPP,1 mov word ptr SizeIm,38400 mov word ptr FlagCount,2 retn Param11hMode Endp ;**************************************************** Param12hMode Proc Near push cs pop ds mov word ptr biWidth,640 mov word ptr biHeight,480 mov word ptr bfbits,118 mov word ptr bfsize,0 mov word ptr BPP,4 mov word ptr SizeIm,0 mov word ptr FlagCount,4 retn Param12hMode Endp ;**************************************************** Param13hMode Proc Near push cs pop ds mov word ptr biWidth,320 mov word ptr biHeight,200 mov word ptr bfbits,1078 mov word ptr bfsize,65078 mov word ptr BPP,8 mov word ptr SizeIm,64000 mov word ptr FlagCount,256 retn Param13hMode Endp ;**************************************************** Decode Proc Near push ax bx cx dx xor bx,bx xor cx,cx mov cl,al xor ah,ah test al,00000100b jz AD1 add ah,0a8h AD1: test al,00100000b jz AD2 add ah,54h AD2: mov al,ah call TempProc mov al,cl xor ah,ah test al,00000010b jz AD3 add ah,0a8h AD3: test al,00010000b jz AD4 add ah,54h AD4: mov al,ah call TempProc mov al,cl xor ah,ah test al,00000001b jz AD5 add ah,0a8h AD5: test al,00001000b jz AD6 add ah,54h AD6: mov al,ah call TempProc mov al,0 call TempProc pop dx cx bx ax retn Decode Endp ;**************************************************** TempProc Proc Near push ax bx cx ds push cs pop ds mov ah,40h mov bx,FileID mov byte ptr TempData,al lea dx,TempData mov cx,1 int 21h pop ds cx bx ax retn TempProc Endp ;**************************************************** SaveDate Proc Near mov ah,40h mov bx,FileID int 21h retn SaveDate Endp ;**************************************************** Two2Four Proc Near push ax bx xor ax,ax lodsb push ax and al,11000000b shr al,2 mov bx,ax pop ax push ax and al,00110000b shr al,4 or ax,bx stosb pop ax push ax and al,00001100b shl al,2 mov bx,ax pop ax and al,00000011b or ax,bx stosb pop bx ax retn Two2Four Endp ;**************************************************** FileBMP Proc Near push cs pop ds lea dx,file ;ds:dx mov cx,0 mov ah,3ch int 21h ; откpоем файл mov bx,ax mov FileID,ax mov cx,2 lea dx,BMP_File_Header call SaveDate mov cx,4 lea dx,bfsize call SaveDate mov cx,4 lea dx,Res1 call SaveDate mov cx,4 lea dx,bfbits call SaveDate mov cx,4 lea dx,BMP_Info_Header call SaveDate mov cx,4 lea dx,biWidth call SaveDate mov cx,4 lea dx,biHeight call SaveDate mov cx,2 lea dx,Res2 call SaveDate mov cx,2 lea dx,BPP call SaveDate mov cx,4 lea dx,Res3 call SaveDate mov cx,4 lea dx,SizeIm call SaveDate mov cx,4 lea dx,Res4 call SaveDate mov cx,4 lea dx,Res4 call SaveDate mov cx,4 lea dx,Res5 call SaveDate mov cx,4 lea dx,Res5 call SaveDate retn FileBMP Endp ;**************************************************** SaveRegs Proc Near push cs pop es push cs pop ds lea di,buf_Temp cmp FlagCount,256 je CoUnt1 cmp FlagCount,4 je CoUnt2 cmp FlagCount,2 je CoUnt3 CoUnt1: mov cx,768 jmp ContCoUnt CoUnt2: mov al,CurrVideoMode cmp al,0dh jge CoUnt4 mov cx,12 mov si,offset Buf_Color rep movsb jmp MC2 CoUnt3: mov cx,3 mov al,0 rep stosb mov cx,3 mov al,0ffh rep stosb jmp MC3 CoUnt4: xor cx,cx CoUnt41: mov ax,1007h mov bl,cl int 10h xor ax,ax mov al,bh call Decode inc cl cmp cl,16 jl CoUnt41 jmp ExitSaveRegs ContCoUnt: cli mov dx,3C7h mov ax,0 out dx,al nop nop mov dx,3C9h cld get_reg: in al,dx stosb nop nop loop get_reg sti cmp word ptr FlagCount,256 je MC1 cmp word ptr FlagCount,4 je MC2 cmp word ptr FlagCount,2 je MC3 MC1: mov cx,256 lea si,buf_Temp add si,767 lea di,buf_Temp add di,1023 jmp CountMC1 MC2: mov al,CurrVideoMode cmp al,0dh jge MC4 mov cx,4 lea si,buf_Temp add si,11 lea di,buf_Temp add di,15 jmp CountMC1 MC3: mov cx,2 lea si,buf_Temp add si,5 lea di,buf_Temp add di,7 jmp CountMC1 MC4: mov cx,16 lea si,buf_Temp add si,47 lea di,buf_Temp add di,63 jmp CountMC1 CountMC1: std StoE: mov al,0 stosb lodsb shl al,2 push ax lodsb shl al,2 push ax lodsb shl al,2 stosb pop ax stosb pop ax stosb loop StoE cld cmp word ptr FlagCount,256 je CopyC1 cmp word ptr FlagCount,4 je CopyC2 cmp word ptr FlagCount,2 je CopyC3 CopyC1: mov cx,1024 jmp ContCopy CopyC3: mov cx,8 jmp ContCopy CopyC4: mov cx,64 jmp ContCopy CopyC2: mov al,CurrVideoMode cmp al,0dh jge CopyC4 xor al,al push cs pop es lea di,buf_Temp add di,16 mov cx,48 rep stosb mov cx,64 jmp ContCopy ContCopy: mov ah,40h mov bx,FileID lea dx,buf_Temp int 21h ExitSaveRegs: retn SaveRegs Endp ;*********************************************** SaveVgaBitmap Proc Near push cs pop es push 0A000h pop ds mov si,63680 lea di,cs:Buf_Temp mov dx,100 PiXW: mov cx,160 rep movsw sub si,640 dec dx jnz PiXW push cs pop ds mov ah,40h mov bx,FileID mov cx,32000 lea dx,buf_Temp int 21h push 0A000h pop ds mov si,31680 lea di,cs:Buf_Temp mov dx,100 PiXW1: mov cx,160 rep movsw sub si,640 dec dx jnz PiXW1 push cs pop ds mov ah,40h mov bx,FileID mov cx,32000 lea dx,buf_Temp int 21h retn SaveVgaBitmap Endp ;******************************************************** SaveCgaBitmap Proc Near push cs pop es push 0B800h pop ds mov si,16112 lea di,cs:Buf_Temp mov dx,100 PixW2: mov cx,80 MOVE24: call Two2Four loop MOVE24 sub si,8192 sub si,80 mov cx,80 MOVE24_1: call Two2Four loop MOVE24_1 add si,8192 sub si,160 dec dx jnz PixW2 push cs pop ds mov ah,40h mov bx,FileID mov cx,32000 lea dx,buf_Temp int 21h retn SaveCgaBitmap Endp ;*********************************************** SaveCgaMONOBitmap Proc Near push cs pop es push 0B800h pop ds mov si,16112 lea di,cs:Buf_Temp mov dx,100 PixW3: mov cx,40 rep movsw sub si,8192 sub si,80 mov cx,40 rep movsw add si,8192 sub si,160 dec dx jnz PixW3 push cs pop ds mov ah,40h mov bx,FileID mov cx,16000 lea dx,buf_Temp int 21h retn SaveCgaMONOBitmap Endp ;*********************************************** SaveVgaBitmap11h Proc Near push cs pop es push 0A000h pop ds mov si,38320 lea di,cs:Buf_Temp mov dx,480 PixW11: mov cx,40 rep movsw sub si,160 dec dx jnz PixW11 push cs pop ds mov ah,40h mov bx,FileID mov cx,38400 lea dx,buf_Temp int 21h retn SaveVgaBitmap11h Endp ;*********************************************** SaveEgaBitmap0fh Proc Near push cs pop es push 0A000h pop ds mov si,27920 lea di,cs:Buf_Temp mov dx,350 PixW12: mov cx,40 rep movsw sub si,160 dec dx jnz PixW12 push cs pop ds mov ah,40h mov bx,FileID mov cx,28000 lea dx,buf_Temp int 21h retn SaveEgaBitmap0fh Endp ;*********************************************** SaveEgaBitmap10h Proc Near push cs pop es mov si,27920 mov cx,2 PixWBegin1: push cx push 0A000h pop ds lea di,cs:Buf_Temp mov dx,120 PixW13: mov cx,80 PixW14: xor al,al mov byte ptr cs:TempData,al call write inc si dec cx jnz PixW14 sub si,160 dec dx jnz PixW13 push cs pop ds mov ah,40h mov bx,FileID mov cx,38400 lea dx,buf_Temp int 21h pop cx dec cx jnz PixWBegin1 push 0A000h pop ds mov si,8720 lea di,cs:Buf_Temp mov dx,110 PixW132: mov cx,80 PixW142: xor al,al mov byte ptr cs:TempData,al call write inc si dec cx jnz PixW142 sub si,160 dec dx jnz PixW132 push cs pop ds mov ah,40h mov bx,FileID mov cx,35200 lea dx,buf_Temp int 21h retn SaveEgaBitmap10h Endp ;*********************************************** SaveEgaBitmap12h Proc Near push cs pop es mov si,38320 mov cx,4 PixWBegin: push cx push 0A000h pop ds lea di,cs:Buf_Temp mov dx,120 PixW20: mov cx,80 PixW21: xor al,al mov byte ptr cs:TempData,al call write inc si dec cx jnz PixW21 sub si,160 dec dx jnz PixW20 push cs pop ds mov ah,40h mov bx,FileID mov cx,38400 lea dx,buf_Temp int 21h pop cx dec cx jnz PixWBegin retn SaveEgaBitmap12h Endp ;*********************************************** SaveEgaBitmap0dh Proc Near push cs pop es push 0A000h pop ds lea di,cs:Buf_Temp mov si,7960 mov dx,200 PixW30: mov cx,40 PixW31: xor al,al mov byte ptr cs:TempData,al call write inc si dec cx jnz PixW31 sub si,80 dec dx jnz PixW30 push cs pop ds mov ah,40h mov bx,FileID mov cx,32000 lea dx,buf_Temp int 21h retn SaveEgaBitmap0dh Endp ;*********************************************** SaveEgaBitmap0eh Proc Near push cs pop es mov si,15920 mov cx,2 PixWBegin2: push cx push 0A000h pop ds lea di,cs:Buf_Temp mov dx,100 PixW40: mov cx,80 PixW41: xor al,al mov byte ptr cs:TempData,al call write inc si dec cx jnz PixW41 sub si,160 dec dx jnz PixW40 push cs pop ds mov ah,40h mov bx,FileID mov cx,32000 lea dx,buf_Temp int 21h pop cx dec cx jnz PixWBegin2 retn SaveEgaBitmap0eh Endp ;================================= write proc near push ax bx cx dx cli mov dx,3ceh ; регистр адрес графики mov al,04 ; регистр выбора схемы чтения out dx,al ; выбор регистра выбора схемы управления mov dx,3cfh ; порт данных регистров 3сeh mov al,00000000b out dx,al mov al, byte ptr ds:[si] mov byte ptr cs:Bank1,al mov dx,3cfh ; порт данных регистров 3сeh mov al,00000001b out dx,al mov al, byte ptr ds:[si] mov byte ptr cs:Bank2,al mov dx,3cfh ; порт данных регистров 3сeh mov al,00000010b out dx,al mov al, byte ptr ds:[si] mov byte ptr cs:Bank3,al mov dx,3cfh ; порт данных регистров 3сeh mov al,00000011b out dx,al mov al, byte ptr ds:[si] mov byte ptr cs:Bank4,al sti mov cx,0 mov bx,4 MShift1: mov al,byte ptr cs:Bank1 shl byte ptr cs:Bank1,1 and al,10000000b shr al,cl or cs:TempData,al inc cl mov al,byte ptr cs:Bank2 shl byte ptr cs:Bank2,1 and al,10000000b shr al,cl or cs:TempData,al inc cl mov al,byte ptr cs:Bank3 shl byte ptr cs:Bank3,1 and al,10000000b shr al,cl or cs:TempData,al inc cl mov al,byte ptr cs:Bank4 shl byte ptr cs:Bank4,1 and al,10000000b shr al,cl or cs:TempData,al inc cl cmp cl,8 jl MShift1 mov al,byte ptr cs:TempData stosb xor al,al mov byte ptr cs:TempData,al xor cl,cl dec bx jnz MShift1 pop dx cx bx ax retn write endp ;================================= save proc near mov cs:NowWork,1 push ax bx cx dx si di ds es xor ax,ax mov ds,ax ;По адресу 0:0449 считываем mov al,ds:[0449h] ;текущий видеорежим mov cs:CurrVideoMode,al cmp al,04h je GoCGA cmp al,05h je GoCGA cmp al,06h je GoCGAMONO1 cmp al,0dh je Go0dhMode1 cmp al,0eh je Go0ehMode1 cmp al,0fh je Go0fhMode1 cmp al,10h je Go10hMode1 cmp al,11h je Go11hMode1 cmp al,12h je Go12hMode1 cmp al,13h je Go13Mode jmp ExitSave Go11hMode1: jmp Go11hMode GoCGAMONO1: jmp GoCGAMONO Go0fhMode1: jmp Go0fhMode Go10hMode1: jmp Go10hMode Go12hMode1: jmp Go12hMode Go0dhMode1: jmp Go0dhMode Go0ehMode1: jmp Go0ehMode Go13Mode: call Param13hMode call FileBMP call SaveRegs call SaveVgaBitmap jmp ForALL GoCGA: call Param4h5h0dhMode call FileBMP call SaveRegs call SaveCgaBitmap jmp ForALL GoCGAMONO: call Param6hMode call FileBMP call SaveRegs call SaveCgaMONOBitmap jmp ForALL Go11hMode: call Param11hMode call FileBMP call SaveRegs call SaveVgaBitmap11h jmp ForALL Go0fhMode: call Param0fhMode call FileBMP call SaveRegs call SaveEgaBitmap0fh jmp ForALL Go10hMode: call Param10hMode call FileBMP call SaveRegs call SaveEgaBitmap10h jmp ForALL Go12hMode: call Param12hMode call FileBMP call SaveRegs call SaveEgaBitmap12h jmp ForALL Go0dhMode: call Param0dhMode call FileBMP call SaveRegs call SaveEgaBitmap0dh jmp ForALL Go0ehMode: call Param0ehMode call FileBMP call SaveRegs call SaveEgaBitmap0eh jmp ForALL ForALL: mov bx,word ptr cs:FileID mov ah,3eh int 21h ; закpоем файл mov al,cs:file[7] ; наpастим номеp в имени файла mov ah,cs:file[6] inc al cmp al,'9' jbe save1 sub al,10 inc ah save1: mov cs:file[6],ah mov cs:file[7],al ExitSave: mov cs:NowWork,0 pop es ds di si dx cx bx ax retn save endp ;****************************************************************** ;********* ПЕРЕХВАТЫВАЕМЫЕ ПРЕРЫВАНИЯ ************* ;****************************************************************** MyInt08h Proc Far pushf call cs:old08h pusha push ds es cli cmp cs:NeedSave,1 ; тpебyет запyска? jne out_08h cmp cs:FlagBusyBios,0 ; 13 пpеpывание свободно? jne out_08h les bx,cs:FlagBusyDos cmp byte ptr es:[bx],0 ; 21 пpеpывание свободно? jne out_08h les bx,cs:CritError cmp byte ptr es:[bx],0 ; Hет критических ошибок? jne out_08h mov cs:NeedSave,0 ; сбpос запpоса запyска sti call save ; сбpос videobuffer на диск out_08h: sti pop es ds popa iret MyInt08h Endp ;------------------ MyInt13h Proc Far pushf cmp cs:NowWork,1 je C13h mov cs:FlagBusyBios,1 ; флаг занятости C13h: call cs:old13h mov cs:FlagBusyBios,0 iret MyInt13h Endp ;------------------ MyInt09h Proc Far pushf call dword ptr cs:old09h ; пеpеход в стаpый обpаботчик 9-го pusha push ds push es mov ax,40h ; область данных BIOS mov es,ax in al,60h mov ah,byte ptr es:[17h] ; состояние CTRL,ALT and ah,00000010b ;Hажат ли LSHIFT cmp ah,2 jne outInt09h cmp al,22h ; клавиша 'G' jne outInt09h cli cmp cs:NowWork,1 ; пpовеpка на вложенность je outInt09h cmp byte ptr cs:FlagBusyBios,0 je okBIOS mov cs:NeedSave,1 ; yстановить запpос запyска jmp outInt09h okBIOS: les bx,cs:FlagBusyDos ; 21 прерывание свободно? cmp byte ptr es:[bx],0 jne fl_err les bx,cs:CritError cmp byte ptr es:[bx],0 ; Hет критических ошибок? je okDOS fl_err: mov cs:NeedSave,1 jmp outInt09h okDOS: mov cs:NeedSave,0 sti call save ; сбpос buffer на диск outInt09h: sti pop es pop ds popa iret MyInt09h Endp ;------------------ MyInt28h Proc Far pushf pusha push es cmp cs:NeedSave,1 jne outInt28h cli les bx,cs:CritError cmp byte ptr es:[bx],0 jne outInt28h les bx,cs:FlagBusyDos cmp byte ptr es:[bx],1 ja outInt28h cmp cs:FlagBusyBios,0 jne outInt28h mov cs:NeedSave,0 sti call save outInt28h: sti pop es popa popf jmp cs:old28h MyInt28h Endp ;------------------ MyInt2fh Proc Far cmp ah,0ffh jne outInt2fh cmp al,0 jne MaybeUnload xor ax,ax iret MaybeUnload: cmp al,1 jne outInt2fh mov ax,word ptr cs:[2ch] push es push ax pop es mov ah,49h int 21h push cs pop es mov ah,49h int 21h xor ax,ax push ax pop es cli mov ax,word ptr cs:old09h[0] mov word ptr es:[9*4],ax mov ax,word ptr cs:old09h[2] mov word ptr es:[9*4+2],ax mov ax,word ptr cs:old08h[0] mov word ptr es:[8*4],ax mov ax,word ptr cs:old08h[2] mov word ptr es:[8*4+2],ax mov ax,word ptr cs:old2fh[0] mov word ptr es:[2fh*4],ax mov ax,word ptr cs:old2fh[2] mov word ptr es:[2fh*4+2],ax mov ax,word ptr cs:old28h[0] mov word ptr es:[28h*4],ax mov ax,word ptr cs:old28h[2] mov word ptr es:[28h*4+2],ax mov ax,word ptr cs:old13h[0] mov word ptr es:[13h*4],ax mov ax,word ptr cs:old13h[2] mov word ptr es:[13h*4+2],ax sti pop es xor ax,ax iret outInt2fh: jmp cs:old2fh MyInt2fh Endp ;**************************************************** ;********* Данные для работы резидента ************ ;**************************************************** old08h dd 0 old09h dd 0 old13h dd 0 old28h dd 0 old2fh dd 0 NeedSave db 0 NowWork db 0 FlagBusyDos dd 0 CritError dd 0 FlagBusyBios db 0 file db 'screen00.bmp',0 CurrVideoMode db ? ;================================= InitiAlization: mov ax,cs mov ds,ax push cs pop es mov cl,ds:[80h] cmp cl,0 je ContinueParse mov di,81h mov al,'/' xor ch,ch repne scasb cmp cx,0 ; '/' не найден je WrongParams cmp byte ptr ds:[di],'u' jne ContCmp jmp Unload ContCmp: cmp byte ptr ds:[di],'U' jne WrongParams Unload: mov ax,0ff01h int 2fh mov ah,9 lea dx,MesUnload ;Резидент выгружен из памяти int 21h mov ax,4c00h int 21h WrongParams: mov ah,9 lea dx,MesWrongParams int 21h mov ax,4c00h int 21h ContinueParse: mov ax,0ff00h int 2fh cmp ax,0ff00h je InstaLL jmp AlsOInstalleD InstaLL: mov ax,cs mov es,ax mov ah,34h int 21h mov word ptr FlagBusyDos,bx ; полный адрес mov word ptr FlagBusyDos+2,es ; флага занятости DOS dec bx mov word ptr CritError,bx ; полный адрес флага mov word ptr CritError+2,es ; критических ошибок DOS mov ax,3508h int 21h mov word ptr old08h,bx mov word ptr old08h+2,es mov ax,352fh int 21h mov word ptr old2fh,bx mov word ptr old2fh+2,es mov ax,3509h int 21h mov word ptr old09h,bx mov word ptr old09h+2,es mov ax,3513h int 21h mov word ptr old13h,bx mov word ptr old13h+2,es mov ax,3528h int 21h mov word ptr old28h,bx mov word ptr old28h+2,es mov ax,2513h mov dx,offset MyInt13h int 21h mov ax,252fh mov dx,offset MyInt2fh int 21h mov ax,2528h mov dx,offset MyInt28h int 21h mov ax,2509h mov dx,offset MyInt09h int 21h mov ax,2508h mov dx,offset MyInt08h int 21h mov ah,9 lea dx,Mes1 int 21h mov ax,3100h mov dx,(InitiAlization-Begin+10fh)/16 int 21h AlsOInstalleD: mov ah,9 lea dx,MesAL int 21h mov ax,4c00h int 21h Mes1 db 10,13,' ************* SCREEN GRABER ***************' db 10,13,' Programm is loading now.' db 10,13,' Press - LSHIFT+G to process' db 10,13,' sg.com /u - to unload programm from memory' db 10,13,' Author: Sergey Azarenko$' MesAL db 10,13,' *********** SCREEN GRABER ****************' db 10,13,' Screen Graber is ALREADY LOADED!!!' db 10,13,' Press LSHIFT+G to process.$' MesWrongParams db 10,13,'Wrong parameters.',10,13,'$' MesUnload db 10,13,'SCREEN GRABER is unloaded from memory.',10,13,'$' End Begin ;======================================= Полный листинг программы поиска видеоконтроллера, определения кода его изготовителя используемого адресного пространства и номера прерывания IRQ. ; Автор текста программы Кулаков Владимир Геннадьевич. IDEAL P386 LOCALS MODEL MEDIUM ; Подключить файл мнемонических обозначений цветов include "lst_1_05.inc" SEGMENT sseg para stack 'STACK' DB 400h DUP(?) ENDS DATASEG ; Параметры устройства PCI VendorID DW ? ;идентификатор изготовителя DeviceID DW ? ;идентификатор устройства ClassCode DD ? ;тип устройства BaseAddress0 DD ? ;базовый адрес 0 BaseAddress1 DD ? ;базовый адрес 1 BaseAddress2 DD ? ;базовый адрес 2 BaseAddress3 DD ? ;базовый адрес 3 BaseAddress4 DD ? ;базовый адрес 4 BaseAddress5 DD ? ;базовый адрес 5 InterruptLine DB ? ;номер используемого прерывания IRQ ; Координаты устройства PCI BusNumber DB ? ;номер шины DeviceNumber DB ? ;номер устройства и номер функции ; Счетчик операций нажатия/отпускания клавиш PressCounter DW ? ; Текстовые сообщения PCI DB 0,25,"Тестирование функций PCI BIOS",0 DB 4,20,"Параметры обнаруженного видеоконтроллера",0 DB 6,0,"Номер шины:",0 DB 7,0,"Номер устройства:",0 DB 8,0,"Номер функции:",0 DB 9,0,"Идентификатор изготовителя:",0 DB 10,0,"Идентификатор устройства:",0 DB 11,0,"Тип устройства:",0 DB 12,0,"Базовый адрес 0:",0 DB 13,0,"Базовый адрес 1:",0 DB 14,0,"Базовый адрес 2:",0 DB 15,0,"Базовый адрес 3:",0 DB 16,0,"Базовый адрес 4:",0 DB 17,0,"Базовый адрес 5:",0 DB 18,0,"Номер используемого прерывания:",0 DB 24,29,"Нажмите любую клавишу",0 ; Сообщение о том, что прерывание не используется NoIRQ DB 18,32,"не используется",0 ; Сообщения об ошибках NotPCI DB LIGHTRED,12,18 DB "Система не поддерживает интерфейс PCI BIOS",0 NotSVGA DB LIGHTRED,12,22 DB "Видеоконтроллер SVGA PCI не найден",0 BadRegister DB LIGHTRED,12,22 DB "Неверный номер регистра",0 Exit DB LIGHTRED,24,17 DB "Для выхода из программы нажмите любую клавишу",0 ENDS CODESEG ;***************************** ;* Основной модуль программы * ;***************************** PROC PCITest mov AX,DGROUP mov DS,AX ; Установить текстовый режим и очистить экран mov AX,3 int 10h ; Скрыть курсор - убрать за нижнюю границу экрана mov [ScreenString],25 mov [ScreenColumn],0 call SetCursorPosition ; Установить зеленый цвет символов и черный фон mov [TextColorAndBackground],LIGHTGREEN ; Вывести текстовые сообщения на экран mov CX,16 mov SI,offset PCI @@NextString: call ShowString loop @@NextString ; Установить желтый цвет символов и черный фон mov [TextColorAndBackground],YELLOW ; Опрос PCI-устройств ; Проверить наличие PCI BIOS mov AX,0B101h int 1Ah jc @@PCIBIOSNotFound cmp EDX,20494350h jne @@PCIBIOSNotFound ; Найти видеоконтроллер (найти первое ; устройство типа 30000h) mov AX,0B103h mov ECX,030000h mov SI,0 int 1Ah jc @@DeviceNotFound mov [BusNumber],BH mov [DeviceNumber],BL ; Получить идентификатор изготовителя mov AX,0B109h ;читать слово mov DI,0 ;смещение слова int 1Ah jc @@BadRegisterNumber mov [VendorID],CX ; Получить идентификатор устройства mov AX,0B109h ;читать слово mov DI,2 ;смещение слова int 1Ah jc @@BadRegisterNumber mov [DeviceID],CX ; Получить тип устройства (самопроверка) mov AX,0B10Ah ;читать двойное слово mov DI,8 ;смещение слова int 1Ah jc @@BadRegisterNumber shr ECX,8 mov [ClassCode],ECX ; Получить базовый адрес 0 mov AX,0B10Ah ;читать двойное слово mov DI,10h ;смещение слова int 1Ah jc @@BadRegisterNumber mov [BaseAddress0],ECX ; Получить базовый адрес 1 mov AX,0B10Ah ;читать двойное слово mov DI,14h ;смещение слова int 1Ah jc @@BadRegisterNumber mov [BaseAddress1],ECX ; Получить базовый адрес 2 mov AX,0B10Ah ;читать двойное слово mov DI,18h ;смещение слова int 1Ah jc @@BadRegisterNumber mov [BaseAddress2],ECX ; Получить базовый адрес 3 mov AX,0B10Ah ;читать двойное слово mov DI,1Ch ;смещение слова int 1Ah jc @@BadRegisterNumber mov [BaseAddress3],ECX ; Получить базовый адрес 4 mov AX,0B10Ah ;читать двойное слово mov DI,20h ;смещение слова int 1Ah jc @@BadRegisterNumber mov [BaseAddress4],ECX ; Получить базовый адрес 5 mov AX,0B10Ah ;читать двойное слово mov DI,24h ;смещение слова int 1Ah jc @@BadRegisterNumber mov [BaseAddress5],ECX ; Получить номер используемого устройством ; прерывания IRQ mov AX,0B108h ;читать байт mov DI,3Ch ;смещение байта int 1Ah jc @@BadRegisterNumber mov [InterruptLine],CL ; Вывести полученные данные на экран в ; шестнадцатеричном коде ; Отобразить основные параметры устройства mov [ScreenString],6 mov [ScreenColumn],12 mov AL,[BusNumber] call ShowByteHexCode inc [ScreenString] mov [ScreenColumn],18 mov AL,[DeviceNumber] shr AL,3 call ShowByteHexCode inc [ScreenString] mov [ScreenColumn],15 mov AL,[DeviceNumber] and AL,111b call ShowByteHexCode inc [ScreenString] mov [ScreenColumn],28 mov AX,[VendorID] call ShowHexWord inc [ScreenString] mov [ScreenColumn],26 mov AX,[DeviceID] call ShowHexWord inc [ScreenString] mov [ScreenColumn],16 mov EAX,[ClassCode] call ShowHexDWord ; Отобразить базовые адреса inc [ScreenString] mov [ScreenColumn],17 mov EAX,[BaseAddress0] call ShowHexDWord inc [ScreenString] mov [ScreenColumn],17 mov EAX,[BaseAddress1] call ShowHexDWord inc [ScreenString] mov [ScreenColumn],17 mov EAX,[BaseAddress2] call ShowHexDWord inc [ScreenString] mov [ScreenColumn],17 mov EAX,[BaseAddress3] call ShowHexDWord inc [ScreenString] mov [ScreenColumn],17 mov EAX,[BaseAddress4] call ShowHexDWord inc [ScreenString] mov [ScreenColumn],17 mov EAX,[BaseAddress5] call ShowHexDWord ; Вывести номер используемого прерывания IRQ inc [ScreenString] mov [ScreenColumn],32 mov AL,[InterruptLine] cmp AL,0FFh ;прерывание используется? je @@IRQNotUsed call ShowByteHexCode jmp short @@End @@IRQNotUsed: mov SI,offset NoIRQ call ShowString jmp short @@End ; Обработка ошибок @@BadRegisterNumber: ; Неверный номер регистра mov SI,offset BadRegister jmp @@ErrorMessage @@DeviceNotFound: ; Не найден видеоконтроллер mov SI,offset NotSVGA jmp @@ErrorMessage @@PCIBIOSNotFound: ; Не поддерживается PCI BIOS mov SI,offset NotPCI @@ErrorMessage: ; Выдать сообщение о типе ошибки call ClearScreen call ShowColorString mov SI,offset Exit call ShowColorString ; Окончание работы @@End: ; Ожидать нажатия любой клавиши call GetChar ; Переустановить текстовый режим и очистить экран mov AX,3 int 10h ; Выход в DOS mov AH,4Ch int 21h ENDP PCITest ENDS ; Подключить процедуры вывода данных на экран include "lst_1_02.inc" END Данная программа подключает несколько внешних файлов: Файл lst_1_02.inc. Файл, содержащий процедуры ввода/вывода общего назначения для работы в цветном текстовом режиме. Файл lst_1_05.inc. Файл мнемонических обозначений цветов.

Полный листинг программы проверки наличия VESA BIOS, режима с линейной адресацией, разрешением 640x480, палитрой 256 цветов и получение его параметров. ; Автор текста программы Кулаков Владимир Геннадьевич. IDEAL P386 LOCALS MODEL MEDIUM ; Подключить файл мнемонических обозначений ; кодов управляющих клавиш include "lst_1_03.inc" ; Подключить файл мнемонических обозначений цветов include "lst_1_05.inc" DATASEG ; Код исследуемого видеорежима GraphicsMode DW ? ; Место для хранения информации VESA BIOS VESA_BIOS DB 512 DUP(?) ; Место для хранения информации о параметрах видеорежима VESA_info DB 256 DUP(?) ; Текстовые сообщения Txt0 DB LIGHTCYAN,0,33,"ТЕСТ VESA BIOS",0 DB YELLOW,24,29,"Нажмите любую клавишу",0 Txt1 DB 2,29,"Обнаружен драйвер VESA",0 DB 4,29,"Сигнатура:",0 DB 5,21,"Номер версии VESA:",0 DB 6,31,"Имя OEM:",0 DB 7,22,"Объем памяти, Мб:",0 DB 12,25,"Номера поддерживаемых режимов:",0 Txt2 DB 4,27,"Параметры режима № h:",0 DB 6,13,"Атрибуты режима:",0 DB 7,13,"Атрибуты окна A:",0 DB 8,13,"Атрибуты окна B:",0 DB 9,2,"Гранулярность окна (Кбайт):",0 DB 10,9,"Размер окна (Кбайт):",0 DB 11,4,"Начальный сегмент окна A:",0 DB 12,4,"Начальный сегмент окна В:",0 DB 13,5,"Адрес функции поз. окна:",0 DB 14,2,"Байтов на строку развертки:",0 DB 15,3,"Горизонтальное разрешение:",0 DB 16,5,"Вертикальное разрешение:",0 DB 17,11,"Ширина знакоместа:",0 DB 18,11,"Высота знакоместа:",0 DB 19,5,"Число плоскостей памяти:",0 DB 6,46,"Число битов на пиксель:",0 DB 7,49,"Число банков памяти:",0 DB 8,51,"Тип модели памяти:",0 DB 9,44,"Размер банка памяти (Кб):",0 DB 10,43,"Число полных видеостраниц:",0 DB 11,43,"Размер красной компоненты:",0 DB 12,40,"Нач. поз. красной компоненты:",0 DB 13,43,"Размер зеленой компоненты:",0 DB 14,40,"Нач. поз. зеленой компоненты:",0 DB 15,45,"Размер синей компоненты:",0 DB 16,42,"Нач. поз. синей компоненты:",0 DB 17,41,"Размер резервной компоненты:",0 DB 18,43,"Нач. поз. рез. компоненты:",0 DB 19,41,"Линейный адрес буфера кадра:",0 Err1 DB 12,0,"Ошибка: команды VESA " DB "не поддерживаются видеоконтроллером.",0 ENDS SEGMENT sseg para stack 'STACK' DB 400h DUP(?) ENDS CODESEG ;***************************** ;* Основной модуль программы * ;***************************** PROC VESA_BIOS_Test mov AX,DGROUP mov DS,AX ; Установить текстовый режим mov AX,3 int 10h ; Скрыть курсор - убрать за нижнюю границу экрана mov [ScreenString],25 mov [ScreenColumn],0 call SetCursorPosition ; Вывести заголовок mov SI,offset Txt0 call ShowColorString call ShowColorString ; ПРОВЕРИТЬ НАЛИЧИЕ VESA BIOS ; Получить информацию о наличии VESA BIOS mov AX,DS mov ES,AX mov AX,4F00h mov DI,offset VESA_BIOS int 10h ; Проверить результат выполнения функции cmp AX,4Fh jne @@Err ; Вывести поясняющий текст mov [TextColorAndBackground],LIGHTGREEN mov SI,offset Txt1 call ShowString call ShowString call ShowString call ShowString call ShowString call ShowString ; Вывести сигнатуру mov AX,0B800h mov ES,AX cld mov SI,offset VESA_BIOS mov DI,(4*80+40)*2 mov AH,WHITE mov CX,4 @@Sign: lodsb stosw loop @@Sign ; Вывести номер версии mov [TextColorAndBackground],WHITE mov [ScreenString],5 mov [ScreenColumn],40 mov AX,[word ptr VESA_BIOS+4] call ShowHexWord ; Вывести имя OEM mov [ScreenString],6 mov [ScreenColumn],40 mov BX,06h call ShowVESAString ; Вывести объем памяти mov [ScreenString],7 mov [ScreenColumn],40 mov AX,[word ptr VESA_BIOS+12h] shr AX,4 ;разделить на 16 call ShowDecWord ; Вывести список номеров режимов mov [ScreenString],14 mov [ScreenColumn],0 mov BX,[word ptr VESA_BIOS+0Eh] mov AX,[word ptr VESA_BIOS+10h] mov ES,AX mov CX,128 @@j0: mov AX,[ES:BX] cmp AX,0FFFFh je @@j1 inc [ScreenColumn] call ShowHexWord add BX,2 loop @@j0 ; Ожидать нажатия любой клавиши @@j1: call GetChar ; ПОКАЗАТЬ ПАРАМТРЫ ДОСТУПНЫХ ВИДЕОРЕЖИМОВ ; Загрузить адрес массива номеров mov BX,[word ptr VESA_BIOS+0Eh] @@NextMode: ; Загрузить кодовый номер очередного режима mov AX,[word ptr VESA_BIOS+10h] mov ES,AX mov AX,[ES:BX] mov [GraphicsMode],AX cmp AX,0FFFFh je @@End ; Очистить экран call ClearScreen ; Вывести заголовок mov SI,offset Txt0 call ShowColorString call ShowColorString ; Получить параметры видеорежима mov AX,DS mov ES,AX mov AX,4F01h mov CX,[GraphicsMode] mov DI,offset VESA_info int 10h ; Установить зеленый цвет символов и черный фон mov [TextColorAndBackground],LIGHTGREEN ; Вывести текстовые сообщения на экран mov CX,29 mov SI,offset Txt2 @@NextString: call ShowString loop @@NextString ; Вывести номер режима mov [ScreenString],4 mov [ScreenColumn],46 mov AX,[GraphicsMode] call ShowHexWord ; Установить белый цвет символов и черный фон mov [TextColorAndBackground],WHITE ; Вывести значения полей на экран ; Атрибуты режима mov [ScreenString],6 mov [ScreenColumn],30 mov AX,[word ptr VESA_info] call ShowHexWord ; Атрибуты окна A inc [ScreenString] mov [ScreenColumn],30 mov AL,[VESA_info+02h] call ShowByteHexCode ; Атрибуты окна B inc [ScreenString] mov [ScreenColumn],30 mov AL,[VESA_info+03h] call ShowByteHexCode ; Гранулярность окна inc [ScreenString] mov [ScreenColumn],30 mov AX,[word ptr VESA_info+04h] call ShowDecWord ; Размер окна inc [ScreenString] mov [ScreenColumn],30 mov AX,[word ptr VESA_info+06h] call ShowDecWord ; Начальный сегмент окна A inc [ScreenString] mov [ScreenColumn],30 mov AX,[word ptr VESA_info+08h] call ShowHexWord ; Начальный сегмент окна В inc [ScreenString] mov [ScreenColumn],30 mov AX,[word ptr VESA_info+0Ah] call ShowHexWord ; Адрес функции позиционирования окна inc [ScreenString] mov [ScreenColumn],30 mov EAX,[dword ptr VESA_info+0Ch] call ShowHexDWord ; Байт на одну строку развертки inc [ScreenString] mov [ScreenColumn],30 mov AX,[word ptr VESA_info+10h] call ShowDecWord ; Горизонтальное разрешение inc [ScreenString] mov [ScreenColumn],30 mov AX,[word ptr VESA_info+12h] call ShowDecWord ; Вертикальное разрешение inc [ScreenString] mov [ScreenColumn],30 mov AX,[word ptr VESA_info+14h] call ShowDecWord ; Ширина знакоместа inc [ScreenString] mov [ScreenColumn],30 mov AL,[VESA_info+16h] call ShowDecByte ; Высота знакоместа inc [ScreenString] mov [ScreenColumn],30 mov AL,[VESA_info+17h] call ShowDecByte ; Число плоскостей памяти inc [ScreenString] mov [ScreenColumn],30 mov AL,[VESA_info+18h] call ShowDecByte ; Число битов на пиксель mov [ScreenString],6 mov [ScreenColumn],70 mov AL,[VESA_info+19h] call ShowDecByte ; Число банков памяти inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+1Ah] call ShowDecByte ; Тип модели памяти inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+1Bh] call ShowDecByte ; Размер банка памяти inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+1Ch] call ShowDecByte ; Число полных видеостраниц inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+1Dh] call ShowDecByte ; Размер красной компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+1Fh] call ShowDecByte ; Начальная позиция красной компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+20h] call ShowDecByte ; Размер зеленой компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+21h] call ShowDecByte ; Начальная позиция зеленой компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+22h] call ShowDecByte ; Размер синей компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+23h] call ShowDecByte ; Начальная позиция синей компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+24h] call ShowDecByte ; Размер резервной компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+25h] call ShowDecByte ; Начальная позиция резервной компоненты inc [ScreenString] mov [ScreenColumn],70 mov AL,[VESA_info+26h] call ShowDecByte ; Линейный адрес буфера кадра inc [ScreenString] mov [ScreenColumn],70 mov EAX,[dword ptr VESA_info+28h] call ShowHexDWord call GetChar add BX,2 jmp @@NextMode ; СООБЩЕНИЯ ОБ ОШИБКАХ @@Err: mov [TextColorAndBackground],LIGHTRED mov SI,offset Err1 call ShowString call GetChar ; КОНЕЦ ПРОГРАММЫ @@End: ; Установить текстовый режим mov AX,3 int 10h ; Выход в DOS mov AH,4Ch int 21h ENDP VESA_BIOS_Test ;************************************************ ;* ВЫВОД СТРОКИ ИЗ ОБЛАСТИ ДАННЫХ VESA НА ЭКРАН * ;* Параметры: * ;* BX - cмещение указателя на строку. * ;************************************************ PROC ShowVESAString near pusha push ES ; Настраить регистр ES на видеопамять mov AX,0B800h mov ES,AX cld ; Вычислить адрес для строки в видеопамяти mov AL,[byte ptr ScreenString] mov AH,160 mul AH add AX,[ScreenColumn] add AX,[ScreenColumn] ; Переписать результат в индексный регистр DI mov DI,AX ; Загрузить атрибут цвета в AH mov AH,[TextColorAndBackground] ; Установить указатель на строку push DS add BX,offset VESA_BIOS mov SI,[BX] mov BX,[BX+2] mov DS,BX ; Вывести строку @@L1: lodsb and AL,AL jz @@L2 stosw jmp @@L1 @@L2: pop DS pop ES popa ret ENDP ShowVESAString ENDS ; Подключить процедуры вывода данных на экран include "lst_1_02.inc" ; Подключить "математические" процедуры для перевода ; чисел из двоичного кода в десятичный include "lst_2_05.inc" END Данная программа подключает несколько внешних файлов: Файл lst_1_02.inc. Файл, содержащий процедуры ввода/вывода общего назначения для работы в цветном текстовом режиме. Файл lst_1_03.inc. Файл мнемонических обозначений кодов управляющих клавиш. Файл lst_1_05.inc. Файл мнемонических обозначений цветов. Файл lst_2_05.inc. Файл, содержащий набор подпрограмм, предназначенных для перевода целых и вещественных чисел из двоичной системы счисления в десятичную и наоборот. Полный листинг программы на языке "C", демонстрирующей работу с видеобуфером. Программа выводит на экран язык пламени с дымом. // Автор текста программы Педько Артур #include #include #include #define XH 135 #define XL 120 #define YH 200 #define YL 0 #define Dif 1 unsigned int c, x, y, c1, c2, c3, c4; unsigned char far *mem=(unsigned char far *)0xa0000000l; void setrgb(char c,char r,char g,char b) { outp(0x3c8,c); outp(0x3c9,r); outp(0x3c9,g); outp(0x3c9,b); } void main (void) { randomize(); asm { mov ax, 0x13 //включение видеорежима int 0x10 //320*200 256 цветов } for(x=0;x>2, x>>2 , x>>2); setrgb(x+64, (63-x)>>2, (63-x)>>2, (63-x)>>2 ); // setrgb(x,0,0,0); // setrgb(x+64,0,0,0); setrgb(x+128, x, 0, 0); setrgb(x+192, 63, x, 0); } do { for(x=XL;x110)) c--; // для огня if ((c%4)&&(c beg) return tmp; goto mt; } void main (void) { randomize(); asm { mov ax, 0x13 //переход в видеорежим int 0x10 //320*200 256 цветов } for(x=0;x=(YL+Dif);y--) { for(x=(XL-6);x110)) c--; if ((c%4)&&(c 0 && c < 11)&&y > 60) c = random(c) + (c+20); if((y > 65 && y < 120)&&(c > 45&&c 120 && y < 160) {if(c < 100)c += 2;else c -=2; } mem[(y+Dif)*320+x] = c; } } } while(!kbhit()); //пока не нажата //клавиша getch(); asm { mov ax, 0x03 //возврат в int 0x10 //текстовый режим } } Полный листинг программы на языке Ассемблера, демонстрирующей работу с видеобуфером. Картинка вычиляется по приблизительной формуле F(x,y) = Icolor*(cos(a*cos(x+k1)+b*sin(y+k2))), где k, k1 и k2 - варьируются и задают динамичность, а Icolor - max значение интенсивности цвета. а и b - подбираются экспериментально, или вообще не подбираются. Размер запускного .com файла - 200 байт! ; Автор текста программы Зуйков Алекс. Ideal model tiny Radix 16 p386 locals codeseg org 100 start: ; Установка Video режима mov ax, 0013 int 10 ; Строится Sin&Cos таблица (DDF) mov bx, offset SinTable+2 mov si, offset CosTable-3E mov di, offset stb xor eax, eax stosd mov eax, 64855 stosd mov ebp, 0FFEC42 mov cx, 13E SinLoop: imul ebp shrd eax, edx, 18-1 sub eax, [di - 8] stosd mov edx, eax sar edx, 10 mov [bx], dl sar dx, 1 mov [si], dl inc bx inc si loop SinLoop ; Генерация палитры xor ax, ax xor bx, bx mov dx, 03C8 out dx, al inc dx mov cl, 80 mov di, offset pal push di palLoop: mov al, bl shr al, 1 push ax stosb shr al, 1 stosb pop ax stosb inc bx loop palLoop ; mov cl, 80 mov si, di dec si palLoop2: std lodsb cld stosb dec si std lodsw inc si cld ror ax, 8 stosw loop palLoop2 ; Установка в DAC pop si mov ch, 3 rep outsb mainLoop: push 0A000 pop es xor di, di xor ax, ax mov si, offset cosTable mov cx, 0C8 Loop2: mov dx, 140 Loop1: mov bl, cl paramX: add bl, 2 mov al, [si + bx] mov bl, dl paramY: add bl, 4 add al, [offset sinTable + bx] mov bl, al mov al, [si + bx] add al, dl add al, dl stosb ; Set vmem dec dx jnz Loop1 loop Loop2 ; Корректировка параметров sub [byte paramX+2], 4 add [byte paramY+2], 2 ; mov dx, 03DA frame: in al, dx and al, 8 jz frame ; mov ah, 1 int 16 jz mainLoop ; mov ax, 03 int 10 retn ; Данные SinTable db 0, 6 db 200 dup (?) CosTable db 200 dup (?) stb dd 40 dup (?) dd 100 dup (?) pal db 300 dup (?) ; End Start Полный листинг программы на языке "C", демонстрирующей работу с видеобуфером. При запуске программы в виде сеанса DOS под Windows рекомендуется устанавливать полноэкранный режим. #include #include #define PI 3.1415926 #define KX 2*PI/320 // KX & KY константы для рисования #define KY 2*PI/200 /* wtsync ожидает для вертикального возврата Это произойдет когда электрический луч прыгнет обратно из правого нижнего угла экрана в левый верхний угол экрана Произойдет смена предмета на экране, смена палитры */ void wtsync(void) { asm mov dx,3DAh WaitVR1: asm in al,dx asm test al,8 asm jne WaitVR1 WaitVR2: asm in al,dx asm test al,8 asm je WaitVR2 } // Установка 256 цветов палитры void setpal(char*pal) { int i; outp(0x3c8,0); // установка индекса цвета в 0 for(i=0;i

Соседние файлы в папке Учебник