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