使用BIOS以及直接写显存绘制图形(二)

2014-11-24 08:43:24 · 作者: · 浏览: 1
movb $0x0, %bh
movb $0x02, %dh
movb $0x04, %dl
int $0x10
# 画一条直线
movb $0x0, %bh # 视频页
movw $300, %dx # y坐标
movw $100, %cx # x坐标
movb $0x0c, %ah # 功能号
movb $9, %al # 像素值(颜色)
1:
int $0x10
incw %cx # 下一个像素
cmpw $700, %cx # 是否到了结束位置
jne 1b
1:
jmp 1b
msgstr:
.asciz "line: start(100, 300), end(700, 300)\n"
len:
.int . - msgstr
.org 0x1fe, 0x90
.word 0xaa55
结果:
3.内存映射图形
对于内存映射图形视频模式0x13最容易使用。这时屏幕像素映射为一个字节数组,每个像素一个字节。
共有320*200个像素,因为有256种颜色,所以每个像素一个字节。左上角像素对应地址0xa0000。
模式0x13中,每个整数色彩值表示调色板的色彩表的索引。调色板中每个项都由三个独立的整数(0~63)构成,称为RGB值。调色板的第0项控制着屏幕的背景色。
有两个输出端口用于控制视频调色板:送往端口0x3c8的值表示要修改的调色板表项,送往端口0x3c9的是要修改的颜色值。
示例:
[cpp]
# This program draws color pixels at mode 0x13
# 2012-12-24 21:31
# guzhoudiaoke@126.com
.section .text
.global _start
.code16
_start:
jmp main
#--------------------------------------------------------------
# 清屏函数:
# 设置屏幕背景色,调色板的索引0指代的颜色为背景色
clear_screen: # 清屏函数
movb $0x06, %ah # 功能号0x06
movb $0, %al # 上卷全部行,即清屏
movb $0, %ch # 左上角行
movb $0, %ch # 左上角列
movb $24, %dh # 右下角行
movb $79, %dl # 右下角列
movb $0x07, %bh # 空白区域属性
int $0x10
ret
#----------------------------------------------------------------
# 设置显示模式函数
set_video_mode:
movb $0, %ah # 功能号0x0
movb $MODE_0X13, %al # 显示模式
int $0x10
ret
#---------------------------------------------------------------
# 显示一些文字函数:
# 使用INT 0x10中断0x13功能,显示计算机当前工作的显示模式
draw_some_text:
movw $msg_str, %bp # ES:BP为字符串地址
movw msg_len, %cx # 显示字符数
movb $0x13, %ah # 功能号
movb $0, %al # 显示模式
movb $TEXT_COLOR,%bl # 属性值
movb $0, %bh # 视频页
movb $TEXT_ROW, %dh # 显示起始行
movb $TEXT_COL, %dl # 显示起始列
int $0x10
ret
#----------------------------------------------------------------
# 设置背景颜色为深蓝色
set_screen_bk_color:
movw $VIDEO_PALLETE_PORT, %dx
movb $PA_INDEX_BACKGROUND, %al
outb %al, %dx
movw $COLOR_SELECTION_PORT, %dx
movb $0, %al # 红
outb %al, %dx
movb $0, %al # 绿
outb %al, %dx
movb $18, %al # 蓝(亮度18/63)
outb %al, %dx
ret
#----------------------------------------------------------------
# 通过写显存绘制一些像素点:
# 首先设置调色板索引1处的颜色为白色
# 然后通过写显存的方式,向ES:DI写入数据(PA_INDEX_WHITE)
draw_some_pixels:
# 把索引1处的颜色改为白色(63,63,63)
movw $VIDEO_PALLETE_PORT, %dx
movb $PA_INDEX_WHITE, %al
outb %al, %dx
movw $COLOR_SELECTION_PORT, %dx
movb $63, %al # 红
outb %al, %dx
movb $63, %al # 绿
outb %al, %dx
movb $63, %al # 蓝
outb %al, %dx
# 设置ES的值
movw $VIDEO_S