📄 readme.txt
字号:
--再论SPT图形文件处理技巧(SPT图形文件的打印)
我们可以利用汇编语言的高效灵活以及与其他系统接口规范方便的特点来重编
此打印程序,同时利用foxbase与汇编的接口功能,使foxbase具有图形打印功能,
定能使我们编出的数据库管理系统增色不少。
下面我们以LQ-1600K打印机为例来说明这个问题:
其图形打印方式的指令格式为:
ESC * m n1 n2
在这条指令中,m表示图象选择,而n1及n2表示图象需占用的列数。为确定n1
及n2,先用总列数除以256,所得商为n2,而余数为n1。
在打印机接收了这个代码后,它将下一个数字翻译成打印针模式:其编码规则如下,
打印时以列为打印的基本单位,一列共24针,分为三个字节,依次送入打印机,某处
有点的则在此位为1,无点的置0。在送完所有的图形数据之后打印机自动回到文本
方式下。
为了使打出来的图形在长和宽的比例上保持原样,应选用三倍密度打印(参数可以
从用户手册中找到)。
打印机在打印图形时需要将点阵数据转换成打印机模式,即显示点阵正好与打印点
阵成转置关系。这可利用SPT所提供的左右翻转和版面旋转来达到目的,为了使打印
符合我们正常习惯还应将其反白显示后存盘,因为SPT规定0为黑色,1为白色,而
打印机1为黑色,0为白色,正好相反。
实 例
;sptp.asm
;此程序为foxbase的一个图形函数
;使用LQ 1600K 作图形打印
;图形格式:Super Star.
;将SPT图形先左右翻转,再旋转90度,最后反白显示,即可打出正常
;的图形
.model tiny
.code
org 00h
start:
jmp bg
file db 50 dup(0)
wth dw 0
lenth dw 0
handle dw 0
mdv db 0
hdv db 0
npos dw 0
buff db 3 dup(0)
bg:
_cts proc far
push cs
pop es
mov si,bx
lea di,file
mov cx,50
cld
repz movsb
;从Foxbase环境的with 参
;数中得到文件名
xor si,si
push cs
pop ds
mov ah,3dh
mov al,0;只读
lea dx,file
int 21h;打开文件
mov handle,ax
;保存文件句柄
mov ah,42h
mov al,0
mov bx,handle
xor cx,cx
mov dx,22h
int 21h
;设置当前文件位置
mov ah,3fh
mov bx,handle
mov cx,2
lea dx,wth
int 21h
;读入图形的宽度
mov ah,42h
mov al,0
mov bx,handle
xor cx,cx
mov dx,24h
int 21h
;设置当前文件位置
mov ah,3fh
mov bx,handle
mov cx,2
lea dx,lenth
int 21h
;读入图形的高度
mov ah,42h
mov al,0
mov bx,handle
xor cx,cx
mov dx,40h
int 21h
;设置当前文件位置
xor dx,dx
mov ax,lenth
mov bx,256
div bx
mov mdv,dl;余数
mov hdv,al;商
xor dx,dx
mov ax,wth
mov bx,8
div bx
sub ax,3
mov npos,ax;商
mov ah,1
xor dx,dx
int 17h
print_bytes:
xor dx,dx
mov ax,wth
mov bx,24
div bx
mov bp,ax;行数
rpt:
mov bx,lenth;列数
mov ah,0
;调用DOS的打印功能
mov al,1bh;换码代码
xor dx,dx
int 17h
;发送这个码
xor ah,ah
mov al,2ah
;图形方式码
int 17h
xor ah,ah
mov al,39
;设定三倍密度24针
int 17h
xor ah,ah
mov al,mdv;列数(余数)
int 17h
xor ah,ah
mov al,hdv;(商)
int 17h
pt:
push bx
mov ah,3fh
mov bx,handle
mov cx,3
lea dx,buff
;读入三个字节的内容
int 21h
mov ah,42h
mov al,1
mov bx,handle
xor cx,cx
mov dx,npos
int 21h
;设置新位置
mov ah,0
mov al,buff
xor dx,dx
int 17h
xor ah,ah
mov al,buff+1
int 17h
xor ah,ah
mov al,buff+2
int 17h
pop bx
dec bx
jnz pt
xor ah,ah
mov al,1bh
int 17h
xor ah,ah
mov al,4ah
int 17h
xor ah,ah
mov al,24
int 17h;换行
xor ah,ah
mov al,13
int 17h;回车
mov ah,42h
mov al,0
mov bx,handle
xor cx,cx
mov dx,40h
add si,3
add dx,si
int 21h
;设置当前文件位置
dec bp
jz cont2
jmp far ptr rpt
cont2:
mov ah,3eh
mov bx,handle
int 21h;关闭文件
ret
_cts endp
ends
end start
将此程序编译成sptp.com文件,再改名sptp.bin,使用load sptp这样便可以在
foxbase中使用call sptp with SPT图形文件名 来进行调用。
注意:如果我们在使用引打印程序之前加载了汉字系统的打印驱动程序会因为
它截取了17号中断而使SPT图形打印不正常,可以在加载汉字系统之前先保留
17号中断向量,在调用此中断时直接跳到此地址即可。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -