中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 怎样直接写屏 上一主题 | 下一主题
zzz56zzz
新手上路





积分 10
发帖 3
注册 2006-6-18
状态 离线
『楼 主』:  怎样直接写屏

vga模式12H下,怎样用汇编直接写屏幕啊?
我试了往A0000地址丢数据,但显示的却是像素条不是像素点

2006-6-18 14:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 2 楼』:  

VGA12h是使用位平面形式
每个地址对应4个位平面
所以显存中的8位数据地址实际上代表了8个像素

VGA有4种写模式和2种读模式
默认是写模式0和读模式0

写模式0:写往显存的那个字节是一个8位的位掩码——为0表示不变,为1表示改变该像素。至于具体如何改变是根据VGA寄存器的,功能非常强大、复杂。

[ Last edited by zyl910 on 2006-6-18 at 19:48 ]

   此帖被 +2 点积分    点击查看详情   




人类存在的目的就是试图理解人类为何存在
2006-6-18 19:36
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 3 楼』:  

七、VGA卡的常用寄存器

   1.时序发生器

    控制所有VGA功能的总定时信号,并完成某些存储地址译码工作.有5个寄存器,复用两个I/O地址(3C4H和3C5H),其中3C4H为索引寄存器地址.用来选择当前寄存器.

(1)时钟方式寄存器(索引号01H)   配置时序发生器的定时线路,一般应用情况不必修改.该寄存器的第4位确定EGA/VGA用字节还是用字方式编址,在实现屏幕的平滑滚动时要用到这个参数.

(2)颜色平面允许写寄存器(02H) 控制是否允许处理器写颜色平面.通过有选择地允许写某些颜色平面,可以将特定的图形显示在屏幕上,缺省值为0FH(所有平面允许写)

位定义:第7-4位     保留

       第 3 位     允许写平面3(=1,允许)

       第 2 位     允许写平面2(=1,允许)

       第 1 位     允许写平面1(=1,允许)

       第 0 位     允许写平面0(=1,允许)

(3)复位寄存器(00H)

(4)字符发生器选择寄存器(03H)

(5)存储方式寄存器(04H)

   2.图形控制器

    对要写入VRAM的数据进行逻辑运算(与、或、异或等),包括9个内部寄存器,复用两个I/O地址(3CEH和3CFH),3CEH为索引寄存器地址,在执行任何绘图操作之前还应通过设置时序发生器的颜色平面允许写寄存器选择颜色平面(当然可以什么都不做只用缺省值)

(1)置位/复位寄存器(索引号00H)

    用来存放写向VRAM的填充数据.该寄存器应和允许置位/复位寄存器联合使用.

位定义:第7-4位    保留

       第 3 位    平面3的填充数据

       第 2 位    平面3的填充数据

       第 1 位    平面1的填充数据

       第 0 位    平面0的填充数据

缺省值:所有位都为0

(2)允许置位/复位寄存器(索引号01H)

    决定哪些平面接收来自置位/复位寄存器的填充数据.任何被禁止置位/复位的平面将用通常的处理器(CPU)的处理输出数据填写.

位定义:(缺省值为0)

    第7-4位  保留

    第 3 位  允许对平面3置位/复位(=1 允许)

    第 2 位  允许对平面2置位/复位(=1 允许)

    第 1 位  允许对平面1置位/复位(=1 允许)

    第 0 位  允许对平面0置位/复位(=1 允许)

(3)颜色比较寄存器(索引号02H)

    用来在VRAM中快速查找指定的象素.颜色比较寄存器可以在单个读存储周期内将所有4个显示平面数据与参考颜色比较.并报告每个象素位置的颜色是否匹配.该寄存器在图形区域填充算法中用于边界查找特别有效.该寄存器,必需和方式寄存器联合使用(所有显示模式缺省值为0)

位定义: 第7-4位  保留

        第 3 位  平面3的颜色比较值

        第 2 位  平面2的颜色比较值

        第 1 位  平面1的颜色比较值

        第 0 位  平面0的颜色比较值

(4)数据移位和函数选择寄存器(索引号03H)

    控制两个独立的功能:写数据移位和对写数据的逻辑操作.在写周期中数据可被移位0-7位.必须选择写方式0(见方式寄存器)以允许移位.函数选择位为在VRAM上的读写操作提供了基本的硬件支持.

位定义:(缺省为0)

第7-5位   保留

第4-3位   函数选择位:=0 不修改写数据

                     =1 写数据 AND 锁存器

                     =2 写数据  OR 锁存器

                     =3 写数据 XOR 锁存器

第2-0     数据移位位数

注:如果移位和逻辑操作都允许,则先移位后逻辑操作.每个颜色平面都有一个对应的一字节的锁存器,因此在一次VRAM读周期中32位数据可同时装入锁存器.

(5)读平面选择寄存器(索引号04H)

    决定处理器可以读哪个颜色平面(除颜色比较方式以外)即颜色比较方式不受其控制.

位定义:(缺省时为0)

   第7-2位   保留

   第1-0位   定义可读的颜色平面(0-3)

(6)方式寄存器(索引号05H)

    其中大多数位不应修改,但有两位是有用的,即写方式位和颜色比较方式允许位.写方式控制处理器数据如何写进VRAM

注意:如应用程序要修改方式寄存器,则必须保护第7-4位状态

位定义:第 7 位  保留(0)

       第 6 位  256种颜色(仅对VGA)

       第 5 位  移位寄存器方式

       第 4 位  奇/偶方式

       第 3 位  颜色比较方式可工作(=1:可工作)

       第 2 位  保留

       第1-0位  写方式:=0处理器直接写

                       =1锁存器内容作为写数据

                       =2用处理器数据第n(0-3)位值填写第n个颜色平面.

                       =3没有使用

注:写方式0:通常使用,也是缺省状态,允许处理器数据直接写入VRAM,同时允许置位/复位,移位,屏蔽,与,或,异或等功能(别的写方式则不允许)

  写方式1:可以用来快速地把数据从VRAM的一个位置复制到另一个位置.处理器对VRAM的一次写操作,将从4个颜色平面中的每一个读一个字节的数据,将这32位数据锁存到处理器的锁存器中,处理器向VRAM的一次写操作将把4个字节的数据同时写回显示存储器的另一地址(只要所有的4个颜色平面都允许写)该方式可以用来构造屏幕块快速复制或移动函数.

  写方式2:与位屏蔽寄存器一起使用时,将把压缩的象素转换成平面象素并写进颜色平面.

(7)混合寄存器(索引号06H)

    由BIOS方式选择操作初始化后,不应修改.

(8)颜色忽略寄存器(索引号07H)

    与颜色比较方式配合使用.该寄存器在颜色比较周期中屏蔽特定的平面不被测试.

位定义:第7-4位  保留

       第 i 位  忽略平面i (i=0,1,2,3)

(9)位屏蔽寄存器(索引号08H)

    用来屏蔽某些位,使其在读写周期中不被修改.位屏蔽寄存器的某位为0表示显示器的一次处理写期间,该位将来自锁存器数据,不是来自处理器的输出数据.起到了屏蔽功能,在进行写操作前必须经过一次读操作使锁存器中装入正确的数据.



人类存在的目的就是试图理解人类为何存在
2006-6-18 19:44
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 4 楼』:  

http://blog.csdn.net/visioncat/archive/2005/01/12/250431.aspx
小谈汇编程序中对VGA显存直接操作

  最近闲来无聊,找了本80x86的汇编教程学习学习。在对显存直接操作的时候,发现书上说的很不清楚,

还没有说清楚呢,就开始例子了。(感觉像我们蹩脚的英语老师,说虚拟语气会说到不定式)所以,下面我

就来说一个简单的使用例子。希望各位能对各位有所启发。

首先,看一下图形控制器,它的端口是3CEH只要对这个端口传送参数,我们就可以将图形控制器9个寄存

器中的一个设置为当前操作的寄存器。然后通过3CFH传送参数给你刚才选择的寄存器。

其次,我所说的操作是对于VGA的12H模式也就是640×480 16色。

最后,我所用的汇编器是NASM,大家可以到www.sf.net上找到。

##################################################

寄存器的索引如下

寄存器名称                       索引
置位/重置寄存器                  0
允许置位/重置寄存器              1
颜色比较寄存器                   2
数据循环/功能寄存器              3
读映像选择寄存器                 4
模式选择寄存器                   5
杂用                             6
颜色无关寄存器                   7
位屏蔽寄存器                     8





关于寄存器的具体功能,在这里不做介绍。大家可以看看《IBM-PC汇编语言程序设计》第二版的10.3。

关于读模式,我看了看《IBM-PC汇编语言程序设计》上面说的还比较清楚。我在这里简单介绍一下写模式


通过对3CFH端口进行数据传送,可以对所选寄存器操作。

###################################################

写模式的种类

写模式有4种,其中0模式为默认模式,模式2是模式0的简化版本。模式3是VGA独有的。感觉和模式0差不

多。模式1是对位面的直接操作。

###################################################

操作过程

0 将屏幕设置为 12H 模式
1 通过端口对寄存器进行设置
2 对段地址为0a000h的内存进行写操作。

###################################################

简单的例子
;---------------------------------------------------
;文件:test.asm
;介绍:一个简单的对VGA写的例子。
;现象:在屏幕上出现绿黑相间的竖直条纹。
;语言:汇编语言,使用nasm汇编器
;作者:北斗星君
;邮箱:huangxiangkui@163.com
;---------------------------------------------------

;通过BIOS设置VGA模式
mov ah,00h
mov al,12h
int 10h


;以下对VGA控制器设置

;将VGA控制器,设置为写模式2
mov dx,3ceh
mov al,5
out dx,al  ;选择 模式选择寄存器 为当前可用寄存器

mov dx,3cfh
mov al,2
out dx,al  ;将模式2设为当前写模式

;对位屏蔽寄存器设置,使传送给0a000h的八个象素中设位1的象素为有效。
mov dx,3ceh
mov al,8
out dx,al  ;选择 位屏蔽寄存器 为当前可用寄存器

mov dx,3cfh
mov al,11110000b  ;让八个象素前四个有效,后四个无效
out dx,al

;对0a000h地址进行操作
;设置初始参数
mov ax,0a000h ;段地址
mov es,ax
mov bx,00000h ;起始偏移
mov al,0ah    ;绿色
mov cx,0ffffh ;循环次数

;对内存循环操作写入
jmp re
re:
mov [es:bx],al
inc bx
loop re


上面是一个简单的写入程序,我这里注释的应该相当清楚了。如果有什么问题,我非常欢迎来大家探讨。

上面的代码用nasm编译通过。由于Win32下不能操作BIOS中断。所以,我加了些代码让它在Bochs下运行。

一切正常。

如果有任何问题,可以询问。



STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)






Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=250431



人类存在的目的就是试图理解人类为何存在
2006-6-18 19:44
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
070
高级用户

苏醒的沉睡者


积分 659
发帖 217
注册 2003-2-15
来自 福建
状态 离线
『第 5 楼』:  

学汇编可以看清华大学出版社出版的《80x80汇编语言程序设计》,挺详细的,不过美中不足的是里面没有关于保护模式下的汇编编程的内容



好久没碰Dos,手都生了,赶紧回来练练.嘿嘿
2006-6-19 00:02
查看资料  发送邮件  发短消息 网志  OICQ (181315400)  编辑帖子  回复  引用回复
zzz56zzz
新手上路





积分 10
发帖 3
注册 2006-6-18
状态 离线
『第 6 楼』:  

好象很复杂的样子,那我还是用BIOS中断算了~~只是那个速度真慢
整个屏幕刷一次要好多秒~!
谢谢zyl910了
保护模式学了作用不大,对内核原代码没兴趣~~呵呵,与其说弄不懂:)

2006-6-19 13:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zzz56zzz
新手上路





积分 10
发帖 3
注册 2006-6-18
状态 离线
『第 7 楼』:  

对了,我在13H模式下直接写屏怎么就可以正确!我也没设置端口啊
只是13H分辨太小了~~~不好玩

2006-6-19 13:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zyl910
中级用户





积分 282
发帖 126
注册 2006-5-17
状态 离线
『第 8 楼』:  

一、特殊VGA模式
进入VGA 13h后,可以通过修改VGA寄存器来实现高分辨率
可参考《图形程序开发人员指南》:
第31章 VGA更高的256色分辨率
第32章 360×480 256色模式
第49章 模式X的256色动画

图形程序开发人员指南(Michael Abrash's Graphics Programming Black Book):
http://www.netyi.net/Resource/93 ... 7-e58a0ea8f52e.aspx



该方法的好处在于兼容性好
缺点是操作比较复杂




二、VESA SVGA标准
使用VESA SVGA标准能轻松的实现高分辨率(640*480、800*600、1024*768……)及高色彩(15bit、16bit、24bit、32bit)

VGSA官方网站:
http://www.vesa.org/

VBE(VESA BIOS Extension):
http://www.vesa.org/Public/VBE/

该方法的好处在于操作方便,支持的分辨率很全
缺点是兼容性不好,Windows2000/XP/2003的DOS虚拟机不支持

[ Last edited by zyl910 on 2006-6-21 at 19:06 ]



人类存在的目的就是试图理解人类为何存在
2006-6-21 19:03
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: