?? readme.txt
字號:
--再論SPT圖形文件處理技巧(SPT圖形文件的打印)
我們可以利用匯編語言的高效靈活以及與其他系統(tǒng)接口規(guī)范方便的特點(diǎn)來重編
此打印程序,同時(shí)利用foxbase與匯編的接口功能,使foxbase具有圖形打印功能,
定能使我們編出的數(shù)據(jù)庫管理系統(tǒng)增色不少。
下面我們以LQ-1600K打印機(jī)為例來說明這個(gè)問題:
其圖形打印方式的指令格式為:
ESC * m n1 n2
在這條指令中,m表示圖象選擇,而n1及n2表示圖象需占用的列數(shù)。為確定n1
及n2,先用總列數(shù)除以256,所得商為n2,而余數(shù)為n1。
在打印機(jī)接收了這個(gè)代碼后,它將下一個(gè)數(shù)字翻譯成打印針模式:其編碼規(guī)則如下,
打印時(shí)以列為打印的基本單位,一列共24針,分為三個(gè)字節(jié),依次送入打印機(jī),某處
有點(diǎn)的則在此位為1,無點(diǎn)的置0。在送完所有的圖形數(shù)據(jù)之后打印機(jī)自動回到文本
方式下。
為了使打出來的圖形在長和寬的比例上保持原樣,應(yīng)選用三倍密度打印(參數(shù)可以
從用戶手冊中找到)。
打印機(jī)在打印圖形時(shí)需要將點(diǎn)陣數(shù)據(jù)轉(zhuǎn)換成打印機(jī)模式,即顯示點(diǎn)陣正好與打印點(diǎn)
陣成轉(zhuǎn)置關(guān)系。這可利用SPT所提供的左右翻轉(zhuǎn)和版面旋轉(zhuǎn)來達(dá)到目的,為了使打印
符合我們正常習(xí)慣還應(yīng)將其反白顯示后存盤,因?yàn)椋樱校砸?guī)定0為黑色,1為白色,而
打印機(jī)1為黑色,0為白色,正好相反。
實(shí) 例
;sptp.asm
;此程序?yàn)閒oxbase的一個(gè)圖形函數(shù)
;使用LQ 1600K 作圖形打印
;圖形格式:Super Star.
;將SPT圖形先左右翻轉(zhuǎn),再旋轉(zhuǎn)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環(huán)境的with 參
;數(shù)中得到文件名
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
;設(shè)置當(dāng)前文件位置
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
;設(shè)置當(dāng)前文件位置
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
;設(shè)置當(dāng)前文件位置
xor dx,dx
mov ax,lenth
mov bx,256
div bx
mov mdv,dl;余數(shù)
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;行數(shù)
rpt:
mov bx,lenth;列數(shù)
mov ah,0
;調(diào)用DOS的打印功能
mov al,1bh;換碼代碼
xor dx,dx
int 17h
;發(fā)送這個(gè)碼
xor ah,ah
mov al,2ah
;圖形方式碼
int 17h
xor ah,ah
mov al,39
;設(shè)定三倍密度24針
int 17h
xor ah,ah
mov al,mdv;列數(shù)(余數(shù))
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
;讀入三個(gè)字節(jié)的內(nèi)容
int 21h
mov ah,42h
mov al,1
mov bx,handle
xor cx,cx
mov dx,npos
int 21h
;設(shè)置新位置
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
;設(shè)置當(dāng)前文件位置
dec bp
jz cont2
jmp far ptr rpt
cont2:
mov ah,3eh
mov bx,handle
int 21h;關(guān)閉文件
ret
_cts endp
ends
end start
將此程序編譯成sptp.com文件,再改名sptp.bin,使用load sptp這樣便可以在
foxbase中使用call sptp with SPT圖形文件名 來進(jìn)行調(diào)用。
注意:如果我們在使用引打印程序之前加載了漢字系統(tǒng)的打印驅(qū)動程序會因?yàn)?它截取了17號中斷而使SPT圖形打印不正常,可以在加載漢字系統(tǒng)之前先保留
17號中斷向量,在調(diào)用此中斷時(shí)直接跳到此地址即可。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -