计算机中的字符与图形本是一回事。显示器上出现的字符也是由点组成的,这一点我们在第六章已有讲述。比如说字母A,它在屏幕上实际是如图9-2所示的一组点。
图9-2 "A"的构成
现在的问题就是这样一组点如何用数字表示。试想如果我们把不亮的点用0表示,把亮点用1表示,那么字母A最顶端的8个点就可以表示为"00010000",这实际上是一个8位二进制数。下面几行同样可以用几个8位二进制数表示,因此字母A可以用8个8位二进制数表示,共用8个字节。
在计算机内有很多地方使用这种方法描述文字与符号,我们所常见的汉字也有用此方法描述的。只不过由于汉字的宽度与高度都大于8个点,所以描述汉字要使用更多的字节。
我们常把描述一个字符(汉字)的一组点称为"点阵",而把"点阵"的"数字表示"称为"字模"(Font Mask)R,以刚才所举的字母A为例,组成字母A的64个点就是这个字母的点阵,而表示这个点阵的8个8位二进制数就是这个字母的字模。
由许多字模数据所组成的文件就是"字模库"。比如UCDOS汉字系统中的文件"HZK16"就是包含了6768个国标汉字字模的一个"库"。当然,描述字形的技术还有其它的,并不是仅此一种,但上述方法在处理时比较简单,十分适合描述较简单的字形。
有了上述这些基础知识,我们现在就可以来具体地研究BIOS提供的图形功能了。如前所述,"点"是构成复杂图形的基本单元,我们现在就来学习如何在屏幕指定位置画上一个点。10H中断提供的0CH功能可用于在图形模式下画点,这个功能的用法如下:
功能号:0CH
用 途:在图形屏幕上的指定位置画一个"点"(像素)
参 数:CX=指定位置的X坐标
DX=指定位置的Y坐标
AL=颜色值
调用:INT 10H
返回:无
在应用这个功能之前大家先要清楚屏幕坐标是如何规定的。在第六章我们说到过在字符模式下屏幕坐标原点在左上角,X轴方向向右与习惯相同。而Y轴方向向下,正好与习惯相反。在图形模式下屏幕依旧如此,只不过坐标的划分更细了。下面这个程序可在屏幕上画出一个彩色的方块来:
code segment
assume cs:code,ds:code
org 100h
main proc near
jmp short start ;跳过数据区
l_u dw 20,20 ;方块左上角的(X,Y)坐标
r_d dw 100,150 ;方块右下角的(X,Y)坐标
start:
mov ax,0004h ;设置图形显示模式4
int 10h
mov si,word ptr r_d ;右下角的X坐标送入SI寄存器
sub si,word ptr l_u ;减去左上角的X坐标,计算X方向上的点数
mov cx,word ptr l_u ;左上角X坐标送入CX寄存器
b_loop1:
mov di,word ptr r_d+2 ;右下角的Y坐标送入DI寄存器
sub di,word ptr l_u+2 ;减去左上角的Y坐标,计算Y方向上的点数
mov dx,word ptr l_u+2 ;左上角的Y坐标送入DX寄存器
mov al,2 ;选择洋红色
b_loop2:
mov ah,0ch ;利用10H中断的0CH功能画点
int 10h
inc dx ;Y坐标加1,
dec di ;已画完Y方向上所有的点了吗?
jnz b_loop2 ;若没画完Y方向上全部点,转B_LOOP2继续
inc cx ;X坐标加1,准备画下一条竖线
dec si ;X方向上所有竖线都画完了吗?
jnz b_loop1 ;若未画完X方向上全部竖线,转B_LOOP1继续
mov ah,0 ;等待键盘输入
int 16h
mov ax,0003h ;设置字符显示模式3
int 10h
int 20h ;结束进程
main endp
code ends
end main
STARMAP的程序,这个程序可以从UCDOS的字模库文件HZK16中读出一些数据,加以处理后在字符屏幕上显示出一幅由星号构成的图形。下面这个程序由STARMAP略做修改而成:
DOTMAP.ASM
data segment
assume ds:data
fname db 'hzk16',0 ;UCDOS汉字系统的显示字模库
buffer db 32 dup(0) ;文件缓冲区
off dw 1520h,0002h,3340h,0001h ;所需数据在字模库中的偏移位置
dw 18e0h,0000h,74a0h,0002h, 2520h,0001h
msg db Press any key to display the next font.',0dh,0ah,24h
data ends
code segment
assume cs:code
code segment
assume cs:code
main proc far
mov ax,data ;初始化DS寄存器
mov ds,ax