狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統(tǒng)之家 > 技術開發(fā)教程 > 詳細頁面

圖形顯示方式屏幕的保存與恢復

圖形顯示方式屏幕的保存與恢復

更新時間:2024-04-11 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

在程序中常常要暫時的保存圖形顯示方式屏幕上的內容,然后把自己的信息輸出到屏幕上,結束后再恢復原來的屏幕內容,特別在內存駐留程序彈出一個窗口時更要用到,但是圖形方式下顯示緩沖區(qū)的容量巨大,在常用的 80 x 25 文本方式下,顯示緩沖區(qū)僅大小僅為 80 x 25 x 2 = 4000 字節(jié),而在模式 13H 320 x 200 x 256 色時為 320 x 200 = 64000 字節(jié),現(xiàn)在常用的高彩色、真彩色下如 800 x 600 x 65535 色時為 800 x 600 x 2 = 960000 字節(jié),涉及到如此大的數(shù)據(jù)量程序必須使用磁盤交換方法或用到 XMS 做為數(shù)據(jù)保存緩沖區(qū),使編程復雜化。
本文用了 INT 10H 中不清除顯示內存設置新顯示模式的方法,使不管在什么顯示方式下,用到的緩沖區(qū)大下都在 10K 左右,即使在 1024 x 768 x 16.7M 色也能正常保存。
本程序的適用范圍為保存屏幕后自己的程序僅僅使用文本模式 3 的情況,如果要用到圖形模式,那么還是要保存全部的顯示緩沖區(qū)。在兼容性方面,由于使用 VESA 標準功能,在現(xiàn)在的 PCI/VESA 顯示卡上都能正常運行,我發(fā)現(xiàn)唯一不能運行的是有一段時期生產(chǎn)的 TVGA 8900/9000 卡,因為此卡在 VESA 功能剛出現(xiàn)的時候生產(chǎn),支持 VESA 的偽彩色顯示模式,卻又不支持很多其他的 VESA 功能。大家找到克服的方法告訴我一聲。
本程序要用到的一些中斷的說明如下:

INT 10H 的 00H 功能,設置顯示模式:

功能 入口參數(shù) 出口參數(shù)
INT 10H 的 00H功能
設置顯示模式 AH = 00H  
AL = 模式(如果位 7 置位,則不清除顯示緩沖區(qū))

INT 10H 的 1BH 功能,檢測是否 VGA 卡:

功能 入口參數(shù) 出口參數(shù)
INT 10H 的 1BH功能
取 VGA/MCGA 的功能、狀態(tài)信息 AH = 1BH AL = 1BH 成功(說明顯示卡為 VGA 以上)
ES:DI 返回狀態(tài)信息
BX = 0000
AL <> 1BH 非VGA/MCGA 顯示卡
ES:DI 指向 64 字節(jié)緩沖區(qū)

INT 10H 的 1CH 功能,保存/恢復視頻狀態(tài):

功能 入口參數(shù) 出口參數(shù)
INT 10H 的 1C00H 功能
返回狀態(tài)緩沖區(qū)容量 AX = 1C00H AL = 1CH 成功
BX = 需要的 64 字節(jié)塊數(shù)目
INT 10H 的 1C01H 功能
保存視頻狀態(tài) AX = 1C01H  
ES:BX 指向緩沖區(qū)
INT 10H 的 1C02H 功能
恢復視頻狀態(tài) AX = 1C01H  
CX = 要求的狀態(tài)
位 0 = 恢復視頻硬件狀態(tài)
位 1 = BIOS 數(shù)據(jù)區(qū)
位 2 = 彩色寄存器和 DAC 狀態(tài)
ES:BX 指向緩沖區(qū)(用1C01H功能保存下來的)

INT 10H 的 4FH 功能,VESA 功能:

功能 入口參數(shù) 出口參數(shù)
INT 10H 的 4F00H功能
取顯示卡 VESA 信息 AX = 4F00H AL = 4FH 說明顯示卡支持VESA
AH = 00H 成功
AH = 01H 失敗
ES:DI 指向緩沖區(qū) (256 字節(jié)) AL <> 4FH 顯示卡不支持VESA
INT 10H 的 4F05H功能
控制對 VESA 顯示卡視頻 RAM 的訪問 BH = 00H 選視頻內存窗口
DX = 視頻內存窗口地址 AH = 00H 成功
AH = 01H 失敗
BH = 01H 取視頻內存窗口 AH = 00H 成功
DX = 視頻內存窗口地址
AH = 01H 失敗

INT 33H 的 16H/17H 功能,保存/恢復鼠標驅動程序狀態(tài):

功能 入口參數(shù) 出口參數(shù)
INT 33H 的 0015H功能
確定保存鼠標驅動程序狀態(tài)所需
的空間 AX = 0015H BX = 所需大小
INT 33H 的 0016H功能
保存鼠標驅動程序狀態(tài) AX = 0016H  
BX = 緩沖區(qū)大小(用 0015H 獲得)
ES:DX 指向緩沖區(qū)
INT 33H 的 0017H功能
恢復鼠標驅動程序狀態(tài) AX = 0017H  
BX = 緩沖區(qū)大小(用 0015H 獲得)
ES:DX 指向緩沖區(qū)

源程序:

;by Luo Yun Bin
;http://asm.yeah.net

;這個子程序用來檢測顯示卡的類型,鼠標狀態(tài)等等
;在程序初始化時執(zhí)行

;文中要用到的一些緩沖區(qū)請自己定義,注意大小!

flag db ? ;標志位,位 7 置 1 表示安裝了鼠標
vga_type db ? ;顯示卡類型
video_mode db ? ;顯示模式
vga_win1 dw ? ;視頻窗口,暫存 VESA 的窗口狀態(tài)
vga_win2 dw ? ;
vga_win3 dw ? ;

...

TEST_VGA PROC

push 0 ;檢測是否安裝鼠標驅動程序
pop ds
cmp word ptr ds:[33h*4],0
jz no_mouse
or cs:flag,10000000b ;has mouse installed
no_mouse:
push cs
pop ds
mov ah,1bh ;檢測是否是 VGA 以上顯示卡
xor bx,bx
mov di,offset file_end
int 10h
cmp al,1bh
jnz tv_no_vga
mov ax,4f00h ;檢測是否支持 VESA 功能
mov di,offset file_end
int 10h
cmp al,4fh
jz tv_is_vesa
mov dx,3c4h ;檢測是否 TVGA 9000 卡
mov al,0eh ;這一段是照抄的,找不到資料
out dx,al
inc dx
in al,dx
mov bl,al
xor al,al
out dx,al
in al,dx
xchg al,bl
out dx,al
test bl,2
jnz tv_is_tvga
mov dx,3cdh ;檢測是否 ET6000 卡
in al,dx
mov ah,al
mov al,11h
out dx,al
in al,dx
xchg ah,al
out dx,al
cmp ah,11h
jz tv_is_tseng
mov vga_type,4
ret
tv_is_vesa:
mov vga_type,1
ret
tv_is_tvga:
mov vga_type,2
ret
tv_is_tseng:
mov vga_type,3
ret
tv_no_vga:
int 20h ;非 VGA 卡退出

TEST_VGA ENDP

...

;================================================================
;保存顯示緩沖區(qū)內容并設置新的顯示模式到 80 x 25 文本 (模式 3)
SAVE_SCR PROC
push ds
push es
test flag,10000000b ;見前面
jz ss_no_mouse
mov ax,16h ;保存鼠標狀態(tài)
mov dx,offset mouse_buffer
int 33h
ss_no_mouse:
mov ax,1c01h ;保存視頻狀態(tài)
mov bx,offset video_buffer
mov cx,7
int 10h
mov ah,0fh ;保存原顯示模式
int 10h
mov video_mode,al
cmp al,3 ;80 x 25 x 16 色
jz ss_mode3
cmp al,7 ;80 x 25 黑白
jz ss_mode7
xor ax,ax ;以下為圖形方式保存顯示緩沖區(qū)
call vga_page
call vga_base
call save_vram
mov ax,0083h ;設置新的顯示模式,不清除顯示內存
int 10h

push 0b800h
pop ds ;保存顯示內存
xor si,si
mov cx,1000h
mov di,offset ram_buffer
push cs
push ds
cld
rep movsb
xor di,di ;
mov cx,80*25
mov ax,57b1h ;填充背景,不然有亂字符
cld
rep stosw
scr_ret:
pop es
pop ds
ret
ss_mode3:
call save_vram ;顯示模式 3 保存顯示 RAM
jmp short scr_ret
ss_mode7:
push 0b000h ;顯示模式 7 保存顯示 RAM
pop ds
call save_vram1
mov ax,3
int 10h
call restore_vram
jmp short scr_ret
SAVE_SCR ENDP
SAVE_VRAM PROC
push 0b800h ;把顯示內存保存到自己的緩沖區(qū)
pop ds
save_vram1:
push cs
pop ds
xor si,si
mov di,offset ram_buffer
mov cx,2000h
cld
rep movsb
ret

SAVE_VRAM ENDP
RESTORE_VRAM PROC

push 0b800h ;恢復顯示緩沖區(qū)內容
pop es
restore_vram1:
xor di,di
push cs
pop ds
mov si,offset ram_buffer
mov cx,2000h
cld
rep movsb
ret

RESTORE_VRAM ENDP
VGA_PAGE PROC
cmp vga_type,1
jnz other_vga1
cmp ah,1
jz vp_vesa2
cmp ah,2
jz vp_vesa1
mov ax,4f05h ;保存 VESA 顯示卡狀態(tài)
mov bx,0100h
int 10h
mov vga_win1,dx
mov ax,4f05h
mov bx,0101h
int 10h
mov vga_win2,dx
vp_vesa1:
mov ax,4f05h
xor bx,bx
xor dx,dx
int 10h
mov ax,4f05h
mov bx,0001h
xor dx,dx
int 10h
ret
vp_vesa2:
mov ax,4f05h
xor bx,bx
mov dx,vga_win1
int 10h
mov ax,4f05h
mov bx,0001h
mov dx,vga_win2
int 10h
ret
other_vga1:
cmp vga_type,3
jnz other_vga2
mov dx,3cdh
cmp ah,1
jz vp_tseng2
cmp ah,2
jz vp_tseng1
in al,dx
mov vga_win3,al
vp_tseng1:
xor al,al
out dx,al
ret
vp_tseng2:
mov al,vga_win3
out dx,al
vp_ret:
ret
other_vga2:
cmp vga_type,2
jnz vp_ret
mov al,0eh
mov dx,03c4h
cmp ah,1
jz vp_tvga2
out dx,al
inc dx
in al,dx
cmp ah,2
jz vp_tvga1
mov vga_win3,al
xor al,al
out dx,al
ret
vp_tvga1:
mov al,2
out dx,al
ret
vp_tvga2:
mov ah,vga_win3
out dx,ax
ret
VGA_PAGE ENDP
VGA_BASE PROC
mov dx,3c4h ;這一段是照抄的,找不到資料
mov ax,402h
out dx,ax
mov ax,704h
out dx,ax
mov dx,3ceh
mov ax,0ff08h
out dx,ax
mov ax,0c06h
out dx,ax
mov ax,204h
out dx,ax
mov ax,5
out dx,ax
ret
VGA_BASE ENDP

;====================================================
;本子程序為恢復原來的顯示內容
;在自己的程序執(zhí)行完后使用
RESTORE_SCR PROC
push cs
pop ds
mov al,video_mode ;根據(jù)不同的原顯示模式不同處理
cmp al,3
jz rs_mode3
cmp al,7
jz rs_mode7
push 0b800h ;以下為圖形方式恢復顯示內容
pop es
push cs
pop ds
mov si,offset ram_buffer
xor di,di
mov cx,1000h
cld
rep movsb ;恢復顯示 RAM

mov ah,2
call vga_page
call vga_base
call restore_vram
xor ah,ah ;恢復到原來的顯示模式
mov al,video_mode
or al,80h
int 10h
mov ah,1
call vga_base
jmp short rs_mode31
rs_mode3:
call restore_vram
rs_mode31:
push cs
pop es
push cs
pop ds
mov ax,1c02h ;恢復視頻狀態(tài)
mov bx,offset video_buffer
mov cx,7
int 10h
test flag,10000000b
jz rs_no_mouse
mov ax,17h ;恢復鼠標狀態(tài)
mov dx,offset mouse_buffer
int 33h
rs_no_mouse:
ret
rs_mode7:
mov ax,7 ;顯示模式 7 恢復
int 10h
push 0b000h
pop es
call restore_vram1
jmp short rs_mode31
RESTORE_SCR ENDP

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
欧美在线免费观看视频| 日产精品久久久久久久性色| 一区二区三区欧美日| 奇米亚洲午夜久久精品| 97se狠狠狠综合亚洲狠狠| 国产亚洲网站| 亚洲精品在线三区| 日韩在线一区二区| 欧美精品一区二区三区在线看午夜| 亚洲一区二区三区午夜| 欧美大肚乱孕交hd孕妇| 亚洲福利视频三区| 97超碰欧美中文字幕| 91成人免费电影| 国产精品久久久久久户外露出 | 亚洲欧美网站| 久久久av毛片精品| 美女脱光内衣内裤视频久久影院| 欧美日韩国产亚洲一区| 欧美日韩视频不卡| 亚洲一区在线电影| 欧美日韩在线一二三| 欧美精品在线观看一区二区| 亚洲人成小说网站色在线| 成人av资源在线| 色天使色偷偷av一区二区| 国产精品美女久久久久高潮| 国产成人精品影视| 一本久道久久综合中文字幕 | 国产精品久久久久久久久久妞妞| 国产精品国产自产拍高清av王其 | 精品久久久三级丝袜| 麻豆成人免费电影| 老鸭窝91久久精品色噜噜导演| 国产视频在线观看一区二区三区 | 国产欧美精品日韩区二区麻豆天美| 久久电影网站中文字幕| 亚洲欧美日韩国产一区二区| 亚洲国产高清不卡| 97久久精品人人爽人人爽蜜臀| 欧美人伦禁忌dvd放荡欲情| 婷婷中文字幕综合| 99这里有精品| 亚洲天堂免费在线观看视频| 欧美一区免费视频| 欧美v日韩v国产v| 高清久久久久久| 555www色欧美视频| 久久国产尿小便嘘嘘尿| 欧美亚洲一区三区| 青娱乐精品视频| 在线观看日韩国产| 免费成人小视频| 欧美在线免费播放| 久久国产麻豆精品| 在线观看亚洲一区| 精品一区二区在线观看| 欧美天堂亚洲电影院在线播放| 午夜精品成人在线| 色哟哟一区二区在线观看| 偷拍一区二区三区| 色就色 综合激情| 青青青伊人色综合久久| 欧美日韩国产综合一区二区| 紧缚捆绑精品一区二区| 7777精品伊人久久久大香线蕉的 | 亚洲成av人片在www色猫咪| 99国内精品久久久久久久软件| 日韩伦理电影网| 亚洲一区二区在线看| 天天综合网天天综合色| 色香色香欲天天天影视综合网| 日日夜夜精品视频天天综合网| 久久久亚洲一区| 久久精品国产99国产| 3d成人动漫网站| 成人黄色国产精品网站大全在线免费观看| 538在线一区二区精品国产| 丁香六月综合激情| 国产欧美一区二区精品性色超碰 | 亚洲二区免费| 亚洲电影第三页| 欧美人与禽zozo性伦| 成人毛片在线观看| 国产欧美一区二区精品性| aa日韩免费精品视频一| 五月激情综合网| 日韩无一区二区| 国语精品一区| 日韩av在线播放中文字幕| 7777精品伊人久久久大香线蕉| 成人福利电影精品一区二区在线观看| 久久久亚洲精品一区二区三区| 亚洲日本精品国产第一区| 日韩av一级片| 久久久精品欧美丰满| 国产精品免费看| 国产成人在线视频网址| 国产精品久久久久永久免费观看| 亚洲一区黄色| 大尺度一区二区| 一区二区高清在线| 91麻豆精品国产91| 亚洲人成毛片在线播放女女| 麻豆国产精品777777在线| 久久久久久久久久看片| 国产日韩高清一区二区三区在线| 精品亚洲国产成人av制服丝袜| 国产亚洲欧洲997久久综合| 亚洲女人av| 99久久久免费精品国产一区二区| 亚洲另类一区二区| 日韩一级二级三级精品视频| 亚洲经典一区| 国产成人免费在线| 亚洲国产美女搞黄色| 欧美变态凌虐bdsm| 噜噜噜躁狠狠躁狠狠精品视频| 成人性生交大合| 天堂一区二区在线| 中文文精品字幕一区二区| 91成人在线精品| 在线观看日韩av电影| 国产黄色精品视频| 亚洲h精品动漫在线观看| 国产日韩欧美电影| 欧美日韩一区二区电影| 一区免费视频| 成人免费视频app| 日韩精品电影在线观看| 日本一区二区不卡视频| 91.麻豆视频| 久久久噜噜噜久久狠狠50岁| 欧美精品国产一区二区| 国产精品12区| 久久国产乱子精品免费女| 一区二区三区精品在线| 国产午夜精品一区二区三区视频| 精品视频1区2区| 亚洲一区三区电影在线观看| 欧美高清视频一区| 国产盗摄女厕一区二区三区| 免费亚洲电影在线| 国产精品sm| 激情文学综合丁香| 日产欧产美韩系列久久99| 一区av在线播放| 国产精品日产欧美久久久久| 日韩一区二区三区四区| 在线观看欧美黄色| 久久久久久久久久久一区 | 亚洲电影一级黄| 亚洲欧美日韩一区| 国产精品三级视频| 久久久精品国产免大香伊| 91精品国产手机| 欧美狂野另类xxxxoooo| 欧美综合欧美视频| 在线视频国内一区二区| 裸体一区二区| 久久久久一区二区| 久久国产免费| 老司机一区二区三区| 免播放器亚洲| 久久香蕉精品| 色成年激情久久综合| 久久综合一区二区三区| 久久亚洲综合| 在线观看精品一区| 欧美在线观看视频在线| 欧美性做爰猛烈叫床潮| 欧美午夜电影一区| 欧美片在线播放| 日韩午夜av电影| 久久免费的精品国产v∧| 久久久亚洲高清| 国产精品午夜免费| 亚洲视频每日更新| 亚洲国产精品久久艾草纯爱| 香蕉久久夜色精品国产使用方法 | 精品国产免费一区二区三区四区| 日韩午夜在线影院| 国产亚洲婷婷免费| 亚洲人成网站色在线观看| 一区二区三区在线视频观看58| 亚洲一区二区综合| 奇米777欧美一区二区| 国产美女一区二区| 99久久伊人精品| 亚洲视频高清| 久久亚洲精选| 欧美大白屁股肥臀xxxxxx| 国产午夜精品美女毛片视频| 中文字幕在线不卡视频| 亚洲国产精品久久不卡毛片| 久久国产精品露脸对白| 99精品视频一区二区三区| 禁久久精品乱码| 欧洲av在线精品| xfplay精品久久|