该文件用于设置调色板,并绘制相应的图形。
Set_color_palette:设置前16个调色板的值(整个系统仅用16个颜色);
draw_line:画横线;
draw_long_string:画竖线;
draw_rectangle:画矩形;
;===============================================================================
;=== 本程序提供图形化功能: ===
;=== 1.调色板初始化 ===
;=== 2.各类绘画接口 ===
;===============================================================================
;-------------------------------------------------------------------------------
Set_color_palette: ;设置前16个调色板的值
cli ;关中断
pushad ;保存寄存器
xor eax, eax
mov dx, 0x3c8
out dx, al ;起始调色板号(我从从0开始设置)
mov ecx, 48 ;一共要写入48个字节,三个对应一个调色板
xor ebx, ebx
mov dx, 0x3c9
_color_palette_loop: ;依次将每个调色板的R、B、G写入
mov al, byte [palette_color_buf + ebx]
shr al, 2
out dx, al
inc ebx
loop _color_palette_loop
popad ;恢复寄存器
ret
;-------------------------------------------------------------------------------
draw_line: ;画横线
;输入:EAX-低16位为起点Y值,高16位为起点X的值
;输入:EBX-横线长度
;输入:CL=颜色
pushad
mov edx, eax
and eax, 0x0000ffff
push eax ;记录Y值,[ebp+8]
shr edx, 16
push edx ;记录X值,[ebp+4]
push ebx ;记录长度,[ebp]
mov ebp, esp
xor edx, edx
mov eax, [ebp+8]
mov ebx, 320
mul ebx
mov ebx, [ebp+4]
mov edx, [ebp]
_dr_line:
mov [pic_mem_addr + eax + ebx], cl
inc ebx
dec edx
cmp edx, 0
ja _dr_line
add esp, 12 ;修正堆栈指针
popad
ret
;-------------------------------------------------------------------------------
draw_long_string: ;画竖线
;输入:EAX-低16位为起点Y值,高16位为起点X的值
;输入:EBX-竖线长度
;输入:CL=颜色
pushad
mov edx, eax
and eax, 0x0000ffff
push eax ;记录Y值,[ebp+8]
shr edx, 16
push edx ;记录X值,[ebp+4]
push ebx ;记录长度,[ebp]
mov ebp, esp
xor edx, edx
mov eax, [ebp+8]
mov ebx, 320
mul ebx
mov ebx, [ebp+4]
mov edx, [ebp]
_dr_long_string:
mov [pic_mem_addr + eax + ebx], cl
add ebx, 320
dec edx
cmp edx, 0
ja _dr_long_string
add esp, 12 ;修正堆栈指针
popad
ret
;-------------------------------------------------------------------------------
draw_rectangle: ;画矩形
;EAX-低16位为Y值,高16位为Y的高度
;EBX-低16位为X值,高16位为X的宽度
;CL=颜色
pushad
mov edx, eax
and eax, 0x0000ffff
push eax ;Y值[ebp+12]
shr edx, 16
push edx ;Y的高度[ebp+8]
mov edx, ebx
and ebx, 0x0000ffff
push ebx ;X值[ebp+4]
shr edx, 16
push edx ;X的宽度[ebp]
mov ebp, esp
mov eax, [ebp+4]
shl eax, 16
mov ebx, [ebp+12]
or eax, ebx
mov ebx, [ebp]
mov edx, [ebp+8]
_drw_rectangle:
call draw_line
inc eax
dec edx
cmp edx, 0
ja _drw_rectangle
add esp, 16
popad
ret
;--------------------------------全局变量---------------------------------------
align 4
;调色板的颜色配置数据,共16色
palette_color_buf db 0x00, 0x00, 0x00, ;黑
db 0xff, 0x00, 0x00, ;亮红
db 0x00, 0xff, 0x00, ;亮绿
db 0xff, 0xff, 0x00, ;亮黄
db 0x00, 0x00, 0xff, ;亮蓝
db 0xff, 0x00, 0xff, ;亮紫
db 0x00, 0xff, 0xff, ;浅亮蓝
db 0xff, 0xff, 0xff, ;白
db 0xc6, 0xc6, 0xc6, ;亮灰
db 0x84, 0x00, 0x00, ;暗红
db 0x00, 0x84, 0x00, ;暗绿
db 0x84, 0x84, 0x00, ;暗黄
db 0x00, 0x00, 0x84, ;暗青
db 0x84, 0x00, 0x84, ;暗紫
db 0x00, 0x84, 0x84, ;浅暗蓝
db 0x84, 0x84, 0x84 ;暗灰