Смекни!
smekni.com

Бібліотека ASM-86 для перегляду графіки в стандартах BMP та PCX (стр. 2 из 2)

readln; {ждет нажатия Enter}

setvideo($5f);

graphresult1:=LoadBmp(1,1,'a3.bmp');

readln;

setvideo(3); {установка текстового видеорежима}

if graphresult<>0 then writeln('Ошибка чтения a1.pcx');

if graphresult1<>0 then writeln('Ошибка чтения a3.bmp');

end

else {paramcount - количество параметров}

for i:=1 to paramcount do begin {перебор всех параметров команд. стр.}

setvideo($5f); {устанавливает видеорежим 640x480 256 цветов}

if pos('.pcx',paramstr(i))>0 then

graphresult:=LoadPcx(1,1,paramstr(i)){вызывает функцию для чтения .PCX

с указанным в командной строке именем файла

и возвращает результат чтения}

else

graphresult:=LoadBMP(1,1,paramstr(i));{вызывает функцию для чтения .BMP

и возвращает результат чтения}

if graphresult<>0 then begin

setvideo(3); {установка текстового видеорежима}

writeln('Ошибка чтения '+paramstr(i));

readln;

end else readln; {ждет нажатия Enter}

end;

readln;

setvideo(3); {установка текстового видеорежима}

end.

Текст бібліотеки:

.386 ;разрешение инструкций 386 процессора

IDEAL ;переход в идеальный режим

model SMALL,PASCAL ;модель памяти SMALL для распределения кода и данных

;и совместимая с паскалем

PUBLIC PASCAL LoadPcx ;Обьявляем общие процедуры

PUBLIC PASCAL LoadBmp

CODESEG

zagpcx db 130 dup(0) ;буфер для заголовков BMP и PCX

nfile db 'a.pcx',100 dup(0) ;буфер для имени файла

flc dw 0 ;индекс файла

x1 dw 0 ;координаты текущей точки

y1 dw 0

x2 dw 0

y2 dw 0

col db 770 dup(0) ;буфер для палитры

c1 dw 0 ;цвет текущей точки

yres dw 0 ;размер картинки

xres dw 0

povt db 0 ;повторитель(сколько пикселей нарисовать)

buf db 1024 dup(0) ;буфер для данных

bufsz dw 1024 ;размер буфера данных

bufpos dw 0 ;текущее положение буфера

maxx dw 640

PROC PutPixel ;процедура вывода точки на экран

pusha ;сохранение регистров в стеке

mov ax,[maxx] ;проверка на выход за экран

cmp [x1],ax

jnb @@ex

mov ax,[C1] ;задаем цвет

mov ah,0ch

mov cx,[x1] ;задаем координаты

mov dx,[y1]

mov bh,0

int 10h ;вывод точки

@@ex:

popa ;восстановление регистров

ret

ENDP

PROC LoadBmp ;процедура вывода картинки в стандарте BMP

ARG nx:WORD,ny:WORD,file:WORD:2 ;параметры ;адрес строки имени картинки

pusha; ;сохранение регистров

push ds

mov dx,cs ;установка DS на сегмент кода

mov ds,dx

MASM ;переход в режим MASM

mov ax,[file] ;копирование имени файла

mov bx,ax

mov ax,[file]+2

mov es,ax

mov si,offset nfile

IDEAL ;переход в идеальный режим

mov al,[es:bx];

inc bx;

@lpabmp:mov cl,[es:bx];

mov [si],cl;

inc si;

inc bx;

sub al,1;

jnz @lpabmp; ;копирование имени файла в буфер

mov al,0

mov [si],al;

mov ax,3d00h; ;открытиефайла

mov dx,offset nfile;адресименифайла

int 21h;

jnc @lpbbmp;

jmp @lppoorbmp;

@lpbbmp:

mov [flc],ax;сохраняем номер файла

mov dx,offset zagpcx;адрес буфера

mov cx,54; количество байт для чтения данных из файла

mov bx,[flc]; заносим номер файла

mov ax,3f00h; чтение файла

int 21h;

mov bx,offset zagpcx;адрес буфера заголовка

mov ax,[bx];первое слово заголовка

cmp ax,4D42h;проверка на PCX

jz @lpcbmp;

jmp @lppoor1bmp;

@lpcbmp:

@lpdbmp:add bx,18; чтение координат окна картинки

mov ax,[bx];

mov [x1],ax;

add bx,4;

mov ax,[bx];

mov [y1],ax;

add bx,4;

mov ax,[nx];

add ax,[x1];

mov [xres],ax;

add bx,2;

mov ax,[ny];

add ax,[y1];

mov [yres],ax;

mov ax,[nx]; устанавливаем текущую точку в начальную точку

mov [x1],ax;

mov ax,[ny];

mov [y1],ax;

mov [x2],0;

mov [y2],0;

@lpgbmp:

mov dx,offset col;

mov cx,768;

mov bx,[flc];

mov ax,3f00h;

int 21h;

mov bx,offset col;

mov cx,768;

MASM

@lpfbmp:ror byte ptr [bx],2;деление на 4 всех элементов палитры

IDEAL

inc bx;

sub cx,1;

jnz @lpfbmp;

mov dx,offset col;

mov ax,ds;

mov es,ax;

mov ax,1012h;

mov bx,0h;

mov cx,256;

int 10h; установка палитры

mov bx,offset zagpcx;

add bx,10

mov dx,[bx];

mov ax,4200h;

mov bx,[flc];

mov cx,0;

int 21h;

mov [povt],0;

@lpibmp:mov bx,[flc];

mov cx,[bufsz]; ;чтение данных в буфер по блокам (1 Kb).

mov ax,3f00h;

mov dx,offset buf

int 21h;

mov [bufpos],0;

@lpxbmp:

push ds

pop es

mov bx,offset buf

add bx,[bufpos];

mov ax,[bufpos];

cmp ax,[bufsz];

jz @lpibmp;

mov al,[es:bx];

inc [bufpos];

cmp [povt],0;

jz @lpkbmp;

mov cl,[povt];

mov ah,0h;

mov [c1],ax;

@lmdbmp:

call putpixel ;выводточки

inc [x1];

inc [x2];

mov ax,[x2];

cmp ax,[xres];

jnz @lmcbmp;

mov ax,[nx];

mov [x1],ax;

mov [x2],0;

inc [y1];

inc [y2];

mov ax,[y2];

dec ax;

cmp ax,[yres];

jnz @lmcbmp;

jmp @lpokbmp;

@lmcbmp:dec cl;

cmp cl,0;

jnz @lmdbmp;

mov [povt],0;

jmp @lpxbmp;

@lpkbmp:

mov ah,al;

@lpybmp:

mov ah,0h;

mov [c1],ax;

call putpixel; выводточки

inc [x1];

inc [x2];

mov ax,[x2];

dec ax;

cmp ax,[xres];

jnz @lpxbmp;

mov ax,[nx];

mov [x1],ax;

mov [x2],0;

inc [y1];

inc [y2];

mov ax,[y2];

dec ax;

cmp ax,[yres];

jnz @lpxbmp;

jmp @lpokbmp;

@lpokbmp:

pop ds

popa; ;восстановление регистров

mov ax,0

jmp @lpubmp;

@lppoor1bmp:

mov ah,3eh; ;закрытие файла

mov bx,[flc];

int 21h;

@lppoorbmp:

pop ds

popa; ;восстановление регистров

mov ax,3

@lpubmp:

ret

endp

PROC LoadPcx ;процедура чтения и вывода на экран PCX

ARG nx:WORD,ny:WORD,file:WORD:2 ;адрес строки имени картинки

pusha; ;сохранение регистров

push ds

mov dx,cs ;установка сегмента данных равным сегменту кода

mov ds,dx

MASM

mov ax,[file] ;копирование имени файла в буфер

mov bx,ax

mov ax,[file]+2

mov es,ax

mov si,offset nfile

IDEAL

mov al,[es:bx];

inc bx;

@lpa:mov cl,[es:bx];

mov [si],cl;

inc si;

inc bx;

sub al,1;

jnz @lpa; ;конец копирование имени файла в буфер

mov al,0

mov [si],al;

mov ax,3d00h; ;открытиефайла

mov dx,offset nfile;адресименифайла

int 21h;

jnc @lpb;

jmp @lppoor;

@lpb:

mov [flc],ax;сохраняем номер файла

mov dx,offset zagpcx;адрес буфера

mov cx,128; количество байт для чтения данных из файла

mov bx,[flc]; заносим номер файла

mov ax,3f00h; чтение файла

int 21h;

mov bx,offset zagpcx;адрес буфера заголовка

mov ax,[bx];первое слово заголовка

cmp ax,050ah;проверка на PCX

jz @lpc;

jmp @lppoor1;

@lpc:add bx,2;

mov ax,[bx];

cmp ax,0801h; проверка на 256 цветов

jz @lpd;

jmp @lppoor1;

@lpd:add bx,2; чтение координат окна картинки

mov ax,[bx];

mov [x1],ax;

add bx,2;

mov ax,[bx];

mov [y1],ax;

add bx,2;

mov ax,[bx];

sub ax,[x1];

mov [xres],ax

add bx,2;

mov ax,[bx];

sub ax,[y1];

mov [yres],ax ; вычисление размеров картинки

mov ax,[nx];

mov [x1],ax; устанавливаем текущую точку в начальную точку

mov ax,[ny];

mov [y1],ax;

mov [x2],0;

mov [y2],0;

add bx,55;

mov al,[bx]; проверка

cmp al,01h;

jz @lpg;

jmp @lppoor1;

@lpg:mov ax,4202h; установка указателя файла на конец файла

mov bx,[flc];

mov cx,0;

mov dx,0;

int 21h;

sub ax,769; вычисление начало палитры

sbb dx,0h;

mov cx,dx;

mov dx,ax;

mov bx,[flc];

mov ax,4200h; установка указателя файла на начало палитры

int 21h;

mov dx,offset col;чтение палитры

mov cx,769; количество байт для чтения

mov bx,[flc];

mov ax,3f00h;

int 21h; чтение

mov bx,offset col;

MASM

cmp byte ptr [bx],0ch; проверка на 256 цветов

jz @lpe;

jmp @lppoor1;

@lpe:inc bx;

mov cx,768;

@lpf:ror byte ptr [bx],2;деление на 4 всех элементов палитры

IDEAL

inc bx ;

sub cx,1;

jnz @lpf;

mov dx,offset col+1;

mov ax,ds;

moves,ax;

mov ax,1012h; установка палитры

mov bx,0h;

mov cx,256;

int 10h;

mov ax,4200h; установка положения указателя файла на 128 от начала

mov bx,[flc]; для чтения данных

mov cx,0;

mov dx,80h;

int 21h;

mov [povt],0;

@lpi:mov bx,[flc];

mov cx,[bufsz];

mov ax,3f00h;

mov dx,offset buf ;чтение данных в буфер по блокам (1 Kb).

int 21h;

mov [bufpos],0;устaнoвка положения буфера в 0

@lpx:

push ds

pop es

mov bx,offset buf

add bx,[bufpos];

mov ax,[bufpos];

cmp ax,[bufsz]; проверка на конец блока

jz @lpi;

mov al,[es:bx];

inc [bufpos]; увеличение положения буфера

cmp [povt],0; установка повторителя в 0

jz @lpk;

mov cl,[povt]; чтение повторителя

mov ah,0h;

mov [c1],ax; установка цвета точки

@lmd:

call putpixel ;вывод точки на экран

inc [x1]; увеличение Х

inc [x2];

mov ax,[x2];

dec ax;

cmp ax,[xres]; сравнение с размерами картинки

jnz @lmc;

mov ax,[nx]; установка X в начальное положение

mov [x1],ax;

mov [x2],0;

inc [y1]; увеличение Y

inc [y2];

mov ax,[y2];

dec ax;

cmp ax,[yres]; сравнение с размерами картинки

jnz @lmc;

jmp @lpok;

@lmc:dec cl;

cmp cl,0; проверка количества точек на 0

jnz @lmd;

mov [povt],0; установка повторителя в 0

jmp @lpx;

@lpk:mov ah,al;

and ah,0c0h; проверка на несколько точек

cmp ah,0c0h;

jnz @lpy;

and al,3fh;

mov [povt],al; установка повторителя в кол. точек

jmp @lpx;

@lpy:mov ah,0h;

mov [c1],ax; установка цвета

call putpixel; вывод точки

inc [x1]; увеличение Х

inc [x2];

mov ax,[x2];

dec ax;

cmp ax,[xres];сравнение с размерами картинки

jnz @lpx;

mov ax,[nx]; установка X в начальное положение

mov [x1],ax;

mov [x2],0;

inc [y1]; увеличение Y

inc [y2];

mov ax,[y2];

dec ax;

cmp ax,[yres]; сравнение с размерами картинки

jnz @lpx;

jmp @lpok;

@lpok:

pop ds

popa; ;восстановление регистров

mov ax,0

jmp @lpu;

@lppoor1:

mov ah,3eh; ;закрытие файла

movbx,[flc];

int 21h;

@lppoor:

pop ds

popa; ;восстановление регистров

mov ax,3

@lpu:

ret

endp

END