Vlib
unit vlib;
interface
uses crt;
const scr:pointer=ptr($a000,0);
type pal=array[0..767] of byte;
var pal_akt,pal_des:pal;
tlo:pointer;
zmienna:word;
procedure Init;
procedure Clinit;
procedure GetBk;
procedure FreeBk;
procedure WaitVbl;
procedure Plot(xe,ye:integer;c:byte);
function GetPlot(xe,ye:integer):byte;
procedure GetPal(var p:pal);
procedure SetPal(p:pal);
procedure SetColor(nr,Rpal,Gpal,Bpal:byte);
procedure GetColor(nr:byte;var Rpal,Gpal,Bpal:byte);
procedure Fader;
procedure Spread(nr1,r1,g1,b1,nr2,r2,g2,b2:byte);
procedure Cls(color:byte);
procedure Bar(x1,y1,x2,y2:word;color:byte);
procedure Box(x1,y1,x2,y2:word;color:byte);
procedure Line(x1,y1,x2,y2:word;color:byte);
procedure LineH(x1,x2,y:word;c:byte);
procedure LineV(x,y1,y2:word;c:byte);
procedure Circle(xc,yc,rc:word;cc:byte);
procedure Circle_Fill(xc,yc,rc:word;cc:byte);
procedure Beep(Hz,t:word);
procedure Kasza(zakr:byte);
function Click:boolean;
function GetKey:char;
implementation
procedure Init;
begin
asm
mov ax,13h
int 10h
end;
DirectVideo:=false;
port[$3ce]:=6;
port[$3cf]:=1;
end;
procedure Clinit;
begin
asm
mov ax,3h
int 10h
end;
end;
procedure GetBk;
begin
GetMem(tlo,64000);
move(mem[$0A000:0000],mem[seg(tlo^):ofs(tlo^)],64000);
end;
procedure FreeBk;
begin
FreeMem(tlo,64000);
end;
procedure WaitVbl;
begin
repeat until (port[$3DA] and 8)=8;
repeat until (port[$3DA] and 8)=0;
end;
procedure plot(xe,ye:integer;c:byte);assembler;
asm
mov ax,$A000
mov es,ax
mov dx,ye
mov di,xe
shl dx,6
add di,dx
shl dx,2
add di,dx
mov al,c
mov es:[di],al
end;
function getplot(xe,ye:integer):byte;
begin
asm
mov ax,$A000
mov es,ax
mov dx,ye
mov di,xe
shl dx,6
add di,dx
shl dx,2
add di,dx
mov al,es:[di]
mov @Result,al
end;
end;
procedure GetPal(var p:pal); assembler;
asm
mov dx,3c8h
xor al,al
out dx,al
inc dx
mov cx,768
les di,p
rep insb
end;
procedure SetPal(p:pal); assembler;
asm
push ds
push ds
mov ax,ds
mov es,ax
mov di,offset pal_akt
lds si,p
mov cx,768/4
db 66h; rep movsw
pop ds
mov dx,3c8h
xor al,al
out dx,al
mov si,offset pal_akt
mov cx,768
mov dx,$3c9
rep outsb
pop ds
end;
procedure SetColor(nr,Rpal,Gpal,Bpal:byte);
begin
pal_akt[(nr shl 2)-nr+0]:=Rpal;
pal_akt[(nr shl 2)-nr+1]:=Gpal;
pal_akt[(nr shl 2)-nr+2]:=Bpal;
port[$3c8]:=nr;
port[$3c9]:=Rpal;
port[$3c9]:=Gpal;
port[$3c9]:=Bpal;
end;
procedure GetColor(nr:byte;var Rpal,Gpal,Bpal:byte);
begin
port[$3c7]:=nr;
Rpal:=port[$3c9];
Gpal:=port[$3c9];
Bpal:=port[$3c9];
end;
procedure Fader;
var l1,l2:word;
pal_fad:pal;
begin
move(pal_akt,pal_fad,768);
for l1:=1 to 64 do begin
for l2:=0 to 767 do begin
pal_akt[l2]:=round((pal_des[l2]-pal_fad[l2])*l1 shr 6)+pal_fad[l2];
end;
WaitVbl;
asm
push ds
mov dx,3c8h
xor al,al
out dx,al
mov si,offset pal_akt
mov cx,768
mov dx,$3c9
rep outsb
pop ds
end;
end;
end;
procedure Spread(nr1,r1,g1,b1,nr2,r2,g2,b2:byte);
var lc:integer;
Rp,Gp,Bp:byte;
macroM:real;
begin
if nr2<nr1 then
begin
rp:=r1;
gp:=g1;
bp:=b1;
r1:=r2;
g1:=g2;
b1:=b2;
r2:=rp;
g2:=gp;
b2:=bp;
lc:=nr1;
nr1:=nr2;
nr2:=lc;
end;
for lc:=nr1 to nr2 do begin
macroM:=(lc-nr1)/(nr2-nr1);
Rp:=round(r1+(r2-r1)*macroM);
Gp:=round(g1+(g2-g1)*macroM);
Bp:=round(b1+(b2-b1)*macroM);
pal_akt[(lc shl 2)-lc+0]:=Rp;
pal_akt[(lc shl 2)-lc+1]:=Gp;
pal_akt[(lc shl 2)-lc+2]:=Bp;
end;
asm
push ds
mov dx,3c8h
xor al,al
out dx,al
mov si,offset pal_akt
mov cx,768
mov dx,$3c9
rep outsb
pop ds
end;
end;
procedure Cls(color:byte);assembler;
asm
mov ax,0a000h
mov es,ax
xor di,di
db 66h
xor ax,ax
mov al,color
mov ah,al
mov bx,ax
db 66h
shl ax,16
mov ax,bx
mov cx,16000
db 66h
rep stosW
end;
procedure Bar(x1,y1,x2,y2:word;color:byte);assembler;
asm
mov ax,$A000
mov es,ax
mov dx,y1
mov di,x1
xchg dh,dl
add di,dx
shr dx,2
add di,dx
mov cx,y2
sub cx,y1
inc cx
mov ah,color
mov al,ah
@Y: mov bx,cx
mov cx,x2
sub cx,x1
inc cx
rep stosB
add di,319
sub di,x2
add di,x1
mov cx,bx
Loop @Y
end;
procedure Box(x1,y1,x2,y2:word;color:byte);
begin
LineH(x1,x2,y1,color);
LineH(x1,x2,y2,color);
LineV(x1,y1,y2,color);
LineV(x2,y1,y2,color);
end;
procedure Line(x1,y1,x2,y2:word;color:byte);
var
wsk1,wsk2,podpr:word;
begin
asm
push si
push di
push es
mov ax,$a000
mov es,ax
mov si,320
mov cx,x2
sub cx,x1
jz @@VL
jns @@pdr1
neg cx
mov bx,x2
xchg bx,x1
mov x2,bx
mov bx,y2
xchg bx,y1
mov y2,bx
@@pdr1:
mov bx,y2
sub bx,y1
jz @@HL
jns @@pdr3
neg bx
neg si
@@pdr3:
push si
mov podpr,offset @@LL1
cmp bx,cx
jle @@pdr4
mov podpr,offset @@HL1
xchg bx,cx
@@pdr4:
shl bx,1
mov wsk1,bx
sub bx,cx
mov si,bx
sub bx,cx
mov wsk2,bx
push cx
mov ax,y1
mov bx,x1
xchg ah,al
add bx,ax
shr ax,1
shr ax,1
add bx,ax
mov di,bx
pop cx
inc cx
pop bx
jmp podpr
@@VL:
mov ax,y1
mov bx,y2
mov cx,bx
sub cx,ax
jge @@pdr31
neg cx
mov ax,bx
@@pdr31:
inc cx
mov bx,x1
push cx
xchg ah,al
add bx,ax
shr ax,1
shr ax,1
add bx,ax
pop cx
mov di,bx
dec si
mov al,color
@@pdr32:
stosb
add di,si
loop @@pdr32
jmp @@Exit
@@HL:
push cx
mov ax,y1
mov bx,x1
xchg ah,al
add bx,ax
shr ax,1
shr ax,1
add bx,ax
mov di,bx
pop cx
inc cx
mov al,color
rep stosb
jmp @@Exit
@@LL1:
mov al,color
@@pdr11:
stosb
or si,si
jns @@pdr12
add si,wsk1
loop @@pdr11
jmp @@Exit
@@pdr12:
add si,wsk2
add di,bx
loop @@pdr11
jmp @@Exit
@@HL1:
mov al,color
@@pdr21:
stosb
add di,bx
@@pdr22:
or si,si
jns @@pdr23
add si,wsk1
dec di
loop @@pdr21
jmp @@Exit
@@pdr23:
add si,wsk2
loop @@pdr21
@@Exit:
pop es
pop di
pop si
end;
end;
procedure LineH(x1,x2,y:word;c:byte);assembler;
asm
mov ax,x1
cmp ax,x2
jb @ok
xchg ax,x2
mov x1,ax
@ok:
mov ax,0A000h
mov es,ax
mov dx,y
mov di,x1
xchg dh,dl
add di,dx
shr dx,2
add di,dx
mov cx,x2
sub cx,x1
inc cx
mov al,c
rep Stosb
end;
procedure LineV(x,y1,y2:word;c:byte);assembler;
asm
mov ax,0A000h
mov es,ax
mov dx,y1
mov di,x
xchg dh,dl
add di,dx
shr dx,2
add di,dx
mov cx,y2
sub cx,y1
inc cx
mov al,c
@p:
StosB
add di,319
loop @p
end;
procedure Circle(xc,yc,rc:word;cc:byte);
begin
if rc=0 then begin plot(xc,yc,cc); exit; end;
asm
push ds
mov cx,0
mov ax,rc
mov dx,1
sub dx,rc
@do:
push dx
push $a000
pop es
mov dx,yc
mov di,xc
xchg dh,dl
add di,dx
shr dx,2
add di,dx
{push yc+y}
push di
mov dx,ax
shl dx,6
add di,dx
shl dx,2
add di,dx
mov dl,cc
mov bx,cx
mov es:[di+bx],dl
not bx
inc bx
mov es:[di+bx],dl
pop di
{push yc-y}
push di
mov dx,ax
not dx
inc dx
shl dx,6
add di,dx
shl dx,2
add di,dx
mov dl,cc
mov bx,cx
mov es:[di+bx],dl
not bx
inc bx
mov es:[di+bx],dl
pop di
{push yc+x}
push di
mov dx,cx
shl dx,6
add di,dx
shl dx,2
add di,dx
mov dl,cc
mov bx,ax
mov es:[di+bx],dl
not bx
inc bx
mov es:[di+bx],dl
pop di
{push yc-x}
push di
mov dx,cx
not dx
inc dx
shl dx,6
add di,dx
shl dx,2
add di,dx
mov dl,cc
mov bx,ax
mov es:[di+bx],dl
not bx
inc bx
mov es:[di+bx],dl
pop di
pop dx
inc cx
cmp dx,0
jl @subd
dec ax
mov bx,cx
sub bx,ax
shl bx,1
add dx,bx
inc dx
jmp @cont
@subd:
mov bx,cx
shl bx,1
add dx,bx
inc dx
@cont:
cmp cx,ax
jna @do
pop ds
end;
end;
procedure Circle_Fill(xc,yc,rc:word;cc:byte);
begin
if rc=0 then begin plot(xc,yc,cc); exit; end;
asm
push ds
mov cx,0
mov ax,rc
mov dx,1
sub dx,rc
@do:
push dx
les di,scr
mov dx,yc
mov di,xc
xchg dh,dl
add di,dx
shr dx,2
add di,dx
{push yc+y}
push di
mov dx,ax
shl dx,6
add di,dx
shl dx,2
add di,dx
sub di,cx
push ax
push cx
shl cx,1
inc cx
mov al,cc
rep stosB
pop cx
pop ax
pop di
{push yc-y}
push di
mov dx,ax
not dx
inc dx
shl dx,6
add di,dx
shl dx,2
add di,dx
sub di,cx
push ax
push cx
shl cx,1
inc cx
mov al,cc
rep stosB
pop cx
pop ax
pop di
{push yc+x}
push di
mov dx,cx
shl dx,6
add di,dx
shl dx,2
add di,dx
sub di,ax
push ax
push cx
mov cx,ax
shl cx,1
inc cx
mov al,cc
rep stosB
pop cx
pop ax
pop di
{push yc-x}
push di
mov dx,cx
not dx
inc dx
shl dx,6
add di,dx
shl dx,2
add di,dx
sub di,ax
push ax
push cx
mov cx,ax
shl cx,1
inc cx
mov al,cc
rep stosB
pop cx
pop ax
pop di
pop dx
inc cx
cmp dx,0
jl @subd
dec ax
mov bx,cx
sub bx,ax
shl bx,1
add dx,bx
inc dx
jmp @cont
@subd:
mov bx,cx
shl bx,1
add dx,bx
inc dx
@cont:
cmp cx,ax
jna @do
pop ds
end;
end;
procedure Beep(Hz,t:word);
begin
Sound(Hz);
delay(t);
nosound;
end;
procedure Kasza(zakr:byte);
var kx,ky:word;
begin
for ky:=0 to 199 do for kx:=0 to 319 do Plot(kx,ky,random(zakr));
end;
function Click:boolean;
begin
Click:=keypressed;
end;
function GetKey:char;
begin
GetKey:=Readkey;
end;
begin
end.