首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VESA图形模式下绘制像素

在VESA图形模式下绘制像素
EN

Stack Overflow用户
提问于 2018-05-26 07:27:11
回答 1查看 1.9K关注 0票数 1

如何在VESA图形模式下绘制像素?

我正在尝试中断10h函数0ch,但它不起作用。怎么啦?

(注意:我用NASM语法编写了这段代码,并用qemu进行了测试)

代码语言:javascript
复制
; Code:
Mov ax, 4F02h
Mov bx, 0105h ; 1024x768 pixels
Int 10h

Mov ah, 0ch ; Draw pixel function
Mov cx, 2           ; column
Mov dx, 3           ; row
Mov bh, 0    
Mov bl, 00000101b   ; colour
Int 10h

Jmp $            ; jump forever
Times 510-($-$$) db 0
Dw 0xaa55
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-26 10:45:38

即使使用VESA模式,函数Int 10h/AH=0Ch也应该工作。

确保正确使用它,像素的颜色进入al

代码语言:javascript
复制
;Set video mode
mov ax, 4f02h
mov bx, 105h
int 10h

;Draw pixel
mov ax, 0c09h    ;09h = Blue
mov cx, 2 
mov dx, 3     
xor bx, bx   
int 10h

从技术上讲,您应该使用Int 10h/AX=4F01h来检索视频模式信息,包括模式属性字段的第2位(支持2 BIOS输出),以检查BIOS功能是否工作。

使用BIOS函数编写高分辨率图像可能太慢,因此值得直接将其写入线性或窗口的帧缓冲区。

写入线性框架缓冲区可能需要使用虚幻模式,可以通过使用加窗口的框架缓冲区来避免这种情况。

这样做,除了较慢外,亦较为繁琐。

这是一个非常简单的程序,用可怕的灰色填充30行。

为了简洁和清晰,我去掉了所有的检查,为了避免做一些数学,我做了很多假设。

这是个糟糕的做法,我只用它做原型。

我强烈鼓励您阅读Int 10h/AX=4F01h返回的全部信息,并使用这些信息选择正确的窗口,进行正确的填充和计算。

代码语言:javascript
复制
BITS 16

ORG 100h

mov ax, ds
mov es, ax 

;Set video mode
mov ax, 4f02h
mov bx, 105h
int 10h

;Get video mode info
mov ax, 4f01h
mov cx, 105h
mov di, modeInfo 
int 10h

;Assume first window is valid 
mov ax, WORD [es:modeInfo + 08h]
mov es, ax

;Example of how to change the window 
mov ax, 4f05h
xor bx, bx
mov dx, 5       ;This is granularity units
int 10h

xor di, di 
mov al, 0f1h
mov cx, 3*1024*20

rep stosb

;Wait for key
xor ax, ax
int 16h

;Restore DOS text mode
mov ax, 0003h
int 10h

;Exit
mov ax, 4c00h
int 21h

modeInfo    TIMES 256 db 0

这是在NASM语法,我通常使用TASM (出于喜爱)的DOS程序,但这一次我很匆忙。

结果是

请记住,一般情况下,每个scanline都可以填充( scanline的大小在视频模式信息中返回)。

对于1024像素宽的扫描线,使用3x8bpp,我们有3072字节/扫描线,因为这可以被4整除,所以不可能出现填充。

窗口开始地址是在粒度单元中给出的(也可以在视频模式信息中找到),总帧缓冲区是1024x768x3字节= 2.25 MiB,假设没有填充。

窗口大小也可以在视频模式信息中找到。

所有这些都足以写入框架缓冲区。

一旦建立了不真实的模式,线性框架缓冲区就更容易处理(填充仍然是一个需要考虑的方面)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50540401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档