Napisalem taki prosty programik do drukowania i testuje go na OKI Microline 320. Z drukiem tekstu nie mam problemow ale chce tez wydrukowac graficznie piramidke. Zamiast piramidy drukuje sie litera K i w nastepnej linii dwa znaki zapytania i lewa strona czubka piramidy. Prosze o pomoc w znalezieniu bledow. Dodam tylko, ze nie znam kodow sterujacych typowo dla OKI, na stronie producenta wyczytalem, ze ten model potrafi emulowac Epsona FX i wlasnie takich kodow uzywam. Prosze o pomoc, bo juz sam nie wiem czy to ja cos zle robie czy drukarka zle interpretuje te kody.
;-----------------------------
; SEGMENT STOSU
;-----------------------------
Mojstos SEGMENT STACK ; DOS laduje segment SS
DB 64 DUP ('STOSIK!!') ; rezerwacja 512 bajt˘w na stos
Mojstos ENDS
;-----------------------------
; SEGMENT DANYCH
;-----------------------------
Mojdane SEGMENT
Dane DB "Testowy wydruk.",0Ah,0Dh,00h ; bufor do wydrukowania
LPT DW 00h ; numer portu drukarki 00h-LPT1 itd.
SoftReset DB 1Bh,"@",00h ; sekwencja resetujaca drukarke
Gl_W_Lewo DB 1Bh,3Ch,00h ; sekwencja przesowajaca glowice drukarki na lewe skrajne polozenie
SetBold DB 1Bh,"E",00h ; sekwencja ustawiajaca druk wytluszczony
UnSetBold DB 1Bh,"F",00h ; sekwencja kasujaca druk wyluszczony
OdstepPionowy DB 1Bh,"A",08h,00h ; sekwencja ustawiajaca odstep miedzy wierszami: 12h (druk tekstowy), 08h (druk graficzny)
Skos_LG DB 255,127,63,63,31,15,7,7,3,1
Skos_LD DB 128,192,224,224,240,248,252,252,254,255
Skos_PG DB 1,3,7,7,15,31,63,63,127,255
Skos_PD DB 255,254,252,252,248,240,224,224,192,128
; Skosy potrzebne do zbudowania piramidki, oznaczaja zawartosc poszczegolnych kolumn (binarnie 1 - igla uderza 0 - nie uderza)
Mojdane ENDS
;-----------------------------
; SEGMENT KODU
;-----------------------------
Mojprog SEGMENT
ASSUME CS:Mojprog, DS:Mojdane
Main PROC
Start: ; poczatek programu
mov AX,0003H ; ustaw. tryb video: AH=0 AL=tryb (=3-80x25)
int 10H ; wywolanie uslugi BIOS
mov AX,Mojdane ; zaladowanie wlasciwego adresu DS
mov DS,AX
;lea SI,SoftReset
;call SendSequence
;lea SI,OdstepPionowy
;call SendSequence
mov CX,50
mov DX,0
push CX
push DX
loop1:
pop DX
pop CX
sub CX,10
push CX
push DX
mov AL,0
call Drukuj_Kol
lea SI,Skos_LG
call Drukuj_Pole
pop DX
pop CX
push CX
push DX
mov CX,DX
mov AL,0
call Drukuj_Kol
lea SI,Skos_PG
call Drukuj_Pole
call NewLine
pop DX
pop CX
add DX,20
push CX
push DX
cmp CX,0
jne loop1
mov AX,4C00H ; wywolanie procedury DOS konczacej program
int 21h ; przekazanie sterowania do DOS
;-----------------------------
; PROCEDURY
;-----------------------------
SendByte PROC ; wysyla do drukarki zawartosc AL
mov AH,00h ; po wykonaniu przerwania w AL znajduje sie status drukarki
mov DX,LPT
int 17h
ret
SendByte ENDP
H_Reset PROC ; Hardware'owy reset drukarki
mov AH,01h
mov DX,LPT
int 17h
ret
H_Reset ENDP
GetStatus PROC ; nie przyjmuje argukmentow, w AL zwraca status drukarki
mov AH,02h
mov DX,LPT
int 17h
ret
GetStatus ENDP
SendSequence PROC ; wysyla sekwencje wskazywana przez SI do drukarki
mov AL,[SI]
cmp AL,00h
je seq_end
call SendByte
inc SI
jmp SendSequence
seq_end:
ret
SendSequence ENDP
DrukGraf PROC ; sekwencja druku graficznego
mov AL,1Bh
call SendByte
mov AL,"K"
call SendByte
mov AL,CL
call SendByte
mov AL,CH
call SendByte
ret
DrukGraf ENDP
Drukuj_Kol PROC ; drukuje CX-krotnie kolumne zdefiniowana w AL
cmp CX,0
je kol_end
call DrukGraf
dec CX
kolumna:
call SendByte
loop kolumna
kol_end:
ret
Drukuj_Kol ENDP
Drukuj_Pole PROC
mov CX,10
call DrukGraf
pole:
mov AL,[SI]
call SendByte
inc SI
dec CX
jnz pole
ret
Drukuj_Pole ENDP
NewLine PROC
mov AL,0Ah
call SendByte
mov AL,0dh
call SendByte
ret
NewLine ENDP
;-----------------------------
Main ENDP
Mojprog ENDS
END Start