使用BIOS以及直接写显存绘制图形(三)
EG_GRAPHIC, %ax
movw %ax, %es
# 设置要显示的像素位置的显存地址(目的地址)
movw $(PIXEL_ROW_ST*320 + PIXEL_COL_ST), %di
movb $PA_INDEX_WHITE, %al
movw $PIXEL_COUNT, %cx
draw_a_pixel:
stosb
addw $5, %di
loop draw_a_pixel
ret
main:
movw %cx, %ax
movw %ax, %ds
movw %ax, %es
call clear_screen # 清屏
call set_video_mode # 设置显示模式
call set_screen_bk_color # 设置背景颜色
call draw_some_text # 绘制字符串
call draw_some_pixels # 绘制像素
1:
jmp 1b
# 常量定义:
VIDEO_SEG_TEXT = 0xb800
VIDEO_SEG_GRAPHIC = 0xa000
VIDEO_PALLETE_PORT = 0x3c8
COLOR_SELECTION_PORT= 0x3c9
MODE_0X13 = 0x13
PA_INDEX_BACKGROUND = 0x0
PA_INDEX_WHITE = 0x1
TEXT_ROW = 0x01
TEXT_COL = 0x00
TEXT_COLOR = 0x04
PIXEL_ROW_ST = 100
PIXEL_COL_ST = 160-5*10
PIXEL_COUNT = 20
msg_str:
msg_mode:
.asciz "video mode: 0x13"
.org msg_mode+40, 0
msg_scr_res:
.asciz "screen resolution:320x200"
.org msg_scr_res+40, 0
msg_color_num:
.asciz "color num:256"
.org msg_color_num+40*4, 0
msg_babyos:
.asciz "The new Baby OS will have a GUI,but now it can only draw some pixels, haha..And merry Christmas!"
msg_len:
.int . - msg_str - 1
.org 0x1fe, 0x90
.word 0xaa55
结果:
注释:
文字是用的B
IOS INT 0x10显示的,VGA的0x13模式下显示的文字为40列x25行,字符框8x8,看上去有点丑,以后再研究下超级VGA(SVGA)吧~