INT 10H 的 00H 功能,设置显示模式:
| 功能 | 入口参数 | 出口参数 |
| INT 10H 的 00H功能 设置显示模式 |
AH = 00H | |
| AL = 模式(如果位 7 置位,则不清除显示缓冲区) |
INT 10H 的 1BH 功能,检测是否 VGA 卡:
| 功能 | 入口参数 | 出口参数 |
| INT 10H 的 1BH功能 取 VGA/MCGA 的功能、状态信息 |
AH = 1BH | AL = 1BH 成功(说明显示卡为
VGA 以上) ES:DI 返回状态信息 |
| BX = 0000 | ||
| AL <> 1BH 非VGA/MCGA 显示卡 | ||
| ES:DI 指向 64 字节缓冲区 |
INT 10H 的 1CH 功能,保存/恢复视频状态:
| 功能 | 入口参数 | 出口参数 |
| INT 10H 的 1C00H 功能 返回状态缓冲区容量 |
AX = 1C00H | AL = 1CH 成功 BX = 需要的 64 字节块数目 |
| INT 10H 的 1C01H
功能 保存视频状态 |
AX = 1C01H | |
| ES:BX 指向缓冲区 | ||
| INT 10H 的 1C02H
功能 恢复视频状态 |
AX = 1C01H | |
| CX = 要求的状态 位 0 = 恢复视频硬件状态 位 1 = BIOS 数据区 位 2 = 彩色寄存器和 DAC 状态 |
||
| ES:BX 指向缓冲区(用1C01H功能保存下来的) |
INT 10H 的 4FH 功能,VESA 功能:
| 功能 | 入口参数 | 出口参数 |
| INT 10H 的 4F00H功能 取显示卡 VESA 信息 |
AX = 4F00H | AL = 4FH 说明显示卡支持VESA
AH = 00H 成功 AH = 01H 失败 |
| ES:DI 指向缓冲区 (256 字节) | 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 功能,保存/恢复鼠标驱动程序状态:
| 功能 | 入口参数 | 出口参数 |
| INT 33H 的 0015H功能 确定保存鼠标驱动程序状态所需 的空间 |
AX = 0015H | BX = 所需大小 |
| INT 33H 的 0016H功能 保存鼠标驱动程序状态 |
AX = 0016H | |
| BX = 缓冲区大小(用 0015H 获得) | ||
| ES:DX 指向缓冲区 | ||
| INT 33H 的 0017H功能 恢复鼠标驱动程序状态 |
AX = 0017H | |
| BX = 缓冲区大小(用 0015H 获得) | ||
| ES:DX 指向缓冲区 |
源程序:
;by Luo Yun Bin
;http://asm.yeah.net
;这个子程序用来检测显示卡的类型,鼠标状态等等
;在程序初始化时执行
;文中要用到的一些缓冲区请自己定义,注意大小!
FLAG DB ? ;标志位,位 7 置 1 表示安装了鼠标
VGA_TYPE DB ? ;显示卡类型
VIDEO_MODE DB ? ;显示模式
VGA_WIN1 DW ? ;视频窗口,暂存 VESA 的窗口状态
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
...
;================================================================
;保存显示缓冲区内容并设置新的显示模式到 80 x 25 文本 (模式 3)
SAVE_SCR PROC
PUSH DS
PUSH ES
TEST FLAG,10000000B ;见前面
JZ SS_NO_MOUSE
MOV AX,16H ;保存鼠标状态
MOV DX,OFFSET MOUSE_BUFFER
INT 33H
SS_NO_MOUSE:
MOV AX,1C01H ;保存视频状态
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 ;以下为图形方式保存显示缓冲区
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 ;把显示内存保存到自己的缓冲区
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 ;恢复显示缓冲区内容
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 显示卡状态
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
;====================================================
;本子程序为恢复原来的显示内容
;在自己的程序执行完后使用
RESTORE_SCR PROC
PUSH CS
POP DS
MOV AL,VIDEO_MODE ;根据不同的原显示模式不同处理
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 ;恢复视频状态
MOV BX,OFFSET VIDEO_BUFFER
MOV CX,7
INT 10H
TEST FLAG,10000000B
JZ RS_NO_MOUSE
MOV AX,17H ;恢复鼠标状态
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