Ничего на свете лучше нету... Попытаюсь расказать вам то, что сам знаю.
За безупречную работу программ я ответственности ни какой не несу.
В конце этой страници есть полезные файлы!
1) Подключение графического режима
2) Как быстро поставить точку
3) Как быстро найти точку
4) Быстрая заливка всего экрана
5) Быстрое построение BAR
6) Взять спрайт
7) Поставить спрайт
8) Подсчитать размер спрайта
9) Установка цвета
10) TestVGA
1) Начнём с подключения графического режима.
а) Подключения графических драйверов
Например :
Program Init256Graph;
Uses Graph;
Var GraphDriver, GraphMode, E : Integer;
Begin
GraphDriver:=InstallUserDriver('Svga256', NIL);
GraphMode:=0;
InitGraph(GraphDriver, GraphMode, '');
E:=GraphResult;
If E<>Grok then Writeln(GraphErrorMSG(E))
Else
Begin
End;
CloseGraph;
End.
б) Использование ASM вставки
Например :
PROCEDURE SetMode( m : Byte ); ASSEMBLER;
ASM
XOR AH,AH
MOV AL,[m]
INT 10h
END;
в) Inline($B8/$13/0/$CD/$10); {320x200x256}
Inline($B8/$3/0/$CD/$10); {Normal text mode}
2) Как быстро поставить точку.
а) Пример :
Procedure PutPixel(X, Y : Word; Color : Byte); assembler;
asm
mov ax,[Y]
mov bx,ax
shl bx,6
add bh,al
add bx,[X]
mov es,[SEGA000]
mov ax,[Color]
mov es:[bx],al
end;
б) Пример :
Procedure PutPixel(X, Y : Integer; Color : Byte);
Begin
mem[$A000:((y SHL 8) + (y SHL 6)) + x]:=c;
End;
3) Как быстро найти точку.
а) Пример :
Function GetPixel;Assembler;
Asm
push ds
mov ax,$a000
mov ds,ax
mov si,y
mov ax,y
shl si,8
shl ax,6
add si,ax
add si,x
sub si,321
lodsb
pop ds
End;
б) Пример :
FUNCTION Get_Pixel(x,y:integer):byte;
BEGIN
get_pixel:=mem[$A000:((y SHL 8) + (y SHL 6)) + x];
END;
4) Быстрая заливка всего экрана
Пример :
procedure clear(color:word);assembler;
asm
mov AX,$a000
mov ES,AX
xor di,di
mov CX,320*100
mov AL,BYTE PTR color
mov AH,AL
rep STOSW
end;
5) Быстрое построение BAR
Пример :
Procedure Bar(x1,y1,x2,y2:word;c:byte);assembler;
asm
mov ax,320
mul y1
mov di,x1
add di,ax
mov ax,0A000h
mov es,ax
mov cx,x2
sub cx,x1
inc cx
mov si,cx
mov bx,320
sub bx,cx
mov dx,y2
sub dx,y1
inc dx
mov al,c
cld
@Go:
rep stosb
mov cx,si
add di,bx
dec dx
jnz @Go
end;
6) Взять спрайт
Пример :
Procedure GetImage(x1,y1,x2,y2:word;var A);assembler;
asm
push ds
mov ax,320
mul y1
mov si,x1
add si,ax
mov ax,0A000h
mov ds,ax
les di,A
cld
mov cx,x2
sub cx,x1
inc cx
mov ax,cx
stosw
mov dx,y2
sub dx,y1
inc dx
mov ax,dx
stosw
mov bx,320
sub bx,cx
mov ax,cx
@Go:
rep movsb
mov cx,ax
add si,bx
dec dx
jnz @Go
pop ds
end;
7) Поставить спрайт
Пример :
Procedure PutImage(x,y:word;var A);assembler;
asm
push ds
mov ax,320
mul y
mov di,x
add di,ax
mov ax,0A000h
mov es,ax
lds si,A
cld
lodsw
mov cx,ax
lodsw
mov dx,ax
mov bx,320
sub bx,cx
mov ax,cx
@Go:
rep movsb
mov cx,ax
add di,bx
dec dx
jnz @Go
pop ds
end;
8) Подсчитать размер спрайта
Пример :
Function ImageSize(x1,y1,x2,y2:word):word;
begin
ImageSize:=(abs(x2-x1)+1)*(abs(y2-y1)+1)+4;
end;
9) Установка цвета
Пример :
Procedure SetColor(colnum,red,green,blue:byte);assembler;
asm
mov ax,1010h
mov bl,colnum
xor bh,bh
mov dh,red
mov ch,green
mov cl,blue
int 10h
end;
10) TestVGA
Пример :
function TestVGA:word;assembler;
asm
mov ax,$1A00
int $10
cmp bl,$07
jl @NotVGA
mov ax,$0000
jmp @Exit
@NotVGA:
mov ax, $FFFF
@Exit:
end;
Файлы :
1) BGI драйвера (20,4 КБ)
2) Загрузка GIF картинок (16,6 КБ)
3) Загрузка PCX картинок (3,77 КБ)
4) Стандартные шрифты (45,1 КБ)
5) Быстрые линии (686 байт)
Всё!