version 2.02 copile/use this in far model wait for the new 3.00 version - 70k large {$G+} type VirtualArray = array[1..64000] of byte; VPointer = ^VirtualArray; coor = record x,y:word; end; coordtyp = array [1..2,1..12] of integer; fp = longint; var coord : array [1..20] of coor; { ******************************* DOS ************************************ } function DosMax : longint;assembler;{vrati velikost volne dol. pam. v bytech} asm {OK} mov bx,0ffffh mov ah,48h int 21h mov ax,bx mov bx,16 mul bx end; function GMem(size:longint) : pointer;assembler; asm {OK} @@1: mov ax,word ptr [size] mov dx,word ptr [size+2] mov cx,16 div cx inc ax mov bx,ax mov ah,48h int 21h jnc @@2 xor ax,ax @@2: mov dx,ax xor ax,ax end; procedure FMem(p:pointer);assembler; asm {OK} mov es,word ptr [p+2] mov ah,49h int 21h end; function ReAlloc(p:pointer; newsize:longint) : pointer;assembler; asm {OK} mov ax,word ptr [p+2] mov es,ax mov ax,word ptr [newsize] mov dx,word ptr [newsize+2] mov cx,16 div cx inc ax mov bx,ax mov ah,4ah int 21h jnc @@end xor dx,dx xor ax,ax @@end: end; { ******************************* CRT ************************************ } { MOUSE } procedure MouseInit(no:word);assembler; asm mov ax,no int 33h end; procedure GetMouse(var x,y,b:word);assembler; asm {OK} mov ax,3 int 33h les di,dword ptr [bp+0eh] mov word ptr es:[di],bx les di,dword ptr [bp+0ah] mov word ptr es:[di],cx les di,dword ptr [bp+6] mov word ptr es:[di],dx end; procedure SetMWin(x,y,x2,y2:word);assembler; asm {OK} mov ax,7 mov cx,[x] mov dx,[x2] int 33h inc ax mov cx,[y] mov dx,[y2] int 33h end; {OK} procedure NewCur(hotspotx,hotspoty:word;var newcursor);assembler; asm mov ax,word ptr newcursor+2 mov es,ax mov dx,word ptr newcursor mov ax,9h mov bx,hotspotx mov cx,hotspoty int 33h end; { KEYBOARD } procedure KeybOn;assembler; asm {OK} in al,21h and al,11111101b out 21h,al end; procedure KeybOff;assembler; asm {OK} in al,21h or al,00000010b out 21h,al end; function KeyPressed:boolean; begin asm mov ah,1 int 16h jnz @true mov [@result],false jmp @end @true: mov [@result],true @end: end; end; function ReadKey:char;assembler; asm {OK} mov ah,0h int 16h end; { PC SPEAKER } procedure NoSound;assembler; asm {OK} in al,61h and al,0fch out 61h,al end; procedure Sound(hz:word);assembler; asm {OK} mov bx,hz mov ax,34ddh mov dx,0012h cmp dx,bx jnc @2 div bx mov bx,ax in al,61h test al,3 jnz @1 or al,3 out 61h,al mov al,0b6h out 43h,al @1: mov al,bl out 42h,al mov al,bh out 42h,al @2: end; { MISCELANEOUS } procedure XDelay(ms:word);assembler; asm {OK} mov ax,1000 mul ms mov cx,dx mov dx,ax mov ah,86h int 15h end; { ******************************** GRAPH ********************************** } { BASIC } procedure SetVga(mode:word);assembler; asm {OK} mov ax,[mode] int 10h end; procedure Cls(target:word);assembler; asm {OK} mov ax,[bp+offset target] mov es,ax xor di,di db 66h; xor ax,ax mov cx,16000 db 0f3h,66h,0abh end; procedure CCls(color:byte;target:word);assembler; asm {OK} mov ax,[target] mov es,ax xor di,di mov cx,16000 mov al,[color] mov ah,al {hi i low maji hodnotu barvy} mov bx,ax db 66h; shl ax,16 {ax*65535 -> hi word eax} mov ax, bx {dolni word eax - v kazdym bytu eax je hodnota barvy} db 0f3h,66h,0abh {rep movsd} end; procedure PPix(x,y: Integer;color:byte;target:word); assembler; asm {OK} mov ax,target mov es,ax mov ax,y mov di,ax shl ax,6 shl di,8 add di,ax add di,x mov al,color mov es:[di],al end; function GPix(x,y:integer;target:word):byte;assembler; asm {OK} mov ax,target mov es,ax mov ax,y mov di,ax shl ax,6 shl di,8 add di,ax add di,x mov al,es:[di] mov [bp-1],al end; { 2D GRAPHIC } procedure HLn(x1,x2,y:word;col:byte;target:word);assembler; asm {OK} mov ax,target mov es,ax mov ax,y mov di,ax shl ax,8 shl di,6 add di,ax add di,x1 {pocatecni x1} mov al,col mov ah,al mov cx,x2 sub cx,x1 {cx:=x2-x1} inc cx shr cx,1 {cx:=cx/2} jnc @1 {sklace na @1 a misto stosb jede 2* rychlejsi stosw} mov es:[di],ah inc di @1: rep stosw {mov es:[di],ah cx/2*2 krat} end; procedure HLn32(x1,x2,y:word;col:byte;target:word);assembler; asm {OK} mov ax,target mov es,ax mov ax,y mov di,ax shl ax,8 shl di,6 add di,ax add di,x1 {pocatecni x1} mov al,col mov ah,al mov bx,ax db $66; shl ax,16 mov ax,bx mov cx,x2 sub cx,x1 {cx:=x2-x1} inc cx mov bx,cx and bx,3 shr cx,2 db 66h; rep stosw @2: mov es:[di],al add di,1 dec cx jns @2 end; procedure VLn(x1,y1,y2:word;c:byte;target:word);assembler; asm {OK} mov ax,x1 mov bx,y1 mov dx,y2 @1: mov di,bx mov cx,di shl cx,8 shl di,6 add di,cx add di,ax mov cx,[target] mov es,cx mov cx,dx sub cx,bx inc cx mov al,c @2: stosb add di,319 loop @2 end; procedure XLine(x,y,x2,y2:integer;color:byte;target:word); var ax,bx,ay,by,f,aa,bb:integer; begin if xby then begin aa:=(by-bx)*2; bb:=by*2; f:=bb-bx; repeat if(f>=0)then begin inc(y,ay);inc(f,aa);end else inc(f,bb);inc(x,ax); PPix(x,y,color,target); until(x=x2); end else begin aa:=(bx-by)*2; bb:=bx*2; f:=bb-by; repeat if(f>=0)then begin inc(x,ax);inc(f,aa);end else inc(f,bb);inc(y,ay); PPix(x,y,color,target); until(y=y2); end; end; procedure XCircle(x,y:integer;radius,ankle:word;color:byte; presnost:word;posun:integer;target:word); {posun- 1/8 presnosti} var g,h,e,f,c,d,a:real; i,rotX,rotY:integer; b:word; begin a:=presnost/ankle; b:=round(presnost*(ankle/360)); c:=a*radius; d:=(2*Pi)/presnost; e:=5/6; for i:=posun to posun+b do begin f:=d*i; g:=c*sin(f); h:=c*cos(f); rotX:=round((g-h)/a); rotY:=round(((g+h)/a)*e); ppix((rotX+x),(rotY+y),color,target); end; end; procedure Ellipse(x,y,a,b:integer;c:byte;target:word); var xa,ya:integer; aa,aa2,bb,bb2,d,dx,dy:longint; begin xa:=0;ya:=b; aa:=longint(a)*a;aa2:=2*aa; bb:=longint(b)*b;bb2:=2*bb; d:=bb-aa*b+aa div 4; dx:=0;dy:=aa2*b; ppix(x,y-ya,c,target); ppix(x,y+ya,c,target); ppix(x-a,y,c,target); ppix(x+a,y,c,target); while(dx0)then begin dec(ya); dec(dy,aa2); dec(d,dy); end; inc(xa); inc(dx,bb2); inc(d,bb+dx); ppix(x+xa,y+ya,c,target); ppix(x-xa,y+ya,c,target); ppix(x+xa,y-ya,c,target); ppix(x-xa,y-ya,c,target); end; inc(d,(3*(aa-bb)div 2-(dx+dy))div 2); while(ya>0)do begin if(d<0)then begin inc(xa); inc(dx,bb2); inc(d,bb+dx); end; dec(ya); dec(dy,aa2); inc(d,aa-dy); ppix(x+xa,y+ya,c,target); ppix(x-xa,y+ya,c,target); ppix(x+xa,y-ya,c,target); ppix(x-xa,y-ya,c,target); end; end; procedure FillEllipse(x,y,a,b:integer;c:byte;target:word); var xa,ya:integer; aa,aa2,bb,bb2,d,dx,dy:longint; begin xa:=0;ya:=b; aa:=longint(a)*a; aa2:=2*aa; bb:=longint(b)*b; bb2:=2*bb; d:=bb-aa*b+aa div 4; dx:=0;dy:=aa2*b; vLn(x,y-ya,y+ya,c,target); while(dx0)then begin dec(ya); dec(dy,aa2); dec(d,dy); end; inc(xa); inc(dx,bb2); inc(d,bb+dx); vLn(x-xa,y-ya,y+ya,c,target); vLn(x+xa,y-ya,y+ya,c,target); end; inc(d,(3*(aa-bb)div 2-(dx+dy))div 2); while(ya>=0)do begin if(d<0)then begin inc(xa); inc(dx,bb2); inc(d,bb+dx); vLn(x-xa,y-ya,y+ya,c,target); vLn(x+xa,y-ya,y+ya,c,target); end; dec(ya); dec(dy,aa2); inc(d,aa-dy); end; end; procedure Triangle(x1,y1,x2,y2,x3,y3:integer;color:byte;target:word); var x,minY,maxY,ax,bx,yy,p1,q1,p2,q2,p3,q3:integer; begin minY:=y1; maxY:=y1; if y2maxY then maxY:=y2; if y3maxY then maxY:=y3; p1:=x1-x3; q1:=y1-y3; p2:=x2-x1; q2:=y2-y1; p3:=x3-x2; q3:=y3-y2; for yy:=minY to maxY do begin ax:=320; bx:=-1; if (y3>=yy) or (y1>=yy) then if (y3<=yy) or (y1<=yy) then if not(y3=y1) then begin x:=(yy-y3)*p1 div q1+x3; if xbx then bx:=x; end; if (y1>=yy) or (y2>=yy) then if (y1<=yy) or (y2<=yy) then if not(y1=y2) then begin x:=(yy-y1)*p2 div q2+x1; if xbx then bx:=x; end; if (y2>=yy) or (y3>=yy) then if (y2<=yy) or (y3<=yy) then if not(y2=y3) then begin x:=(yy-y2)*p3 div q3+x2; if xbx then bx:=x; end; if ax<=bx then hln(ax,bx,yy,color,target); end; end; procedure XTriangle(x1,y1,x2,y2,x3,y3:integer;color:byte;target:word);assembler; var tmp1,tmp2,neg1,neg2,ax1,ax2,ay1,ay2:integer; asm {OK} cli {y-trideni} mov cx,2 {cx=2} @sort: mov ax,[y2] cmp ax,[y3] jbe @ok1 { if y2 <= y3 then @ok1 } xor ax,[y3] xor [y3],ax xor ax,[y3] mov [y2],ax mov ax,[x2] {ted neco jako xchg y2,y3} xor ax,[x3] xor [x3],ax xor ax,[x3] mov [x2],ax {stejne pro x} @ok1: mov ax,[y1] cmp ax,[y2] jbe @ok2 {kdyz je y1 vetsi,jak y2 pak na @3} xor ax,[y2] xor [y2],ax xor ax,[y2] mov [y1],ax {jinak xchg y1,y2} mov ax,[x1] xor ax,[x2] xor [x2],ax xor ax,[x2] mov [x1],ax {xchg x1,x2} @ok2: mov ax,[y1] cmp ax,[y3] jbe @ok3 {y1<=y3 pak ok} xor ax,[y3] xor [y3],ax xor ax,[y3] mov [y1],ax {xchg y1,y3} mov ax,[x1] xor ax,[x3] xor [x3],ax xor ax,[x3] {xchg x1,x3} mov [x1],ax @ok3: loop @sort mov dx,[y1] {vypocet offsetu} shl dx,6 mov bx,dx shl dx,2 add dx,bx add dx,[x1] mov si,dx {si,dx:=320*y1+x1} mov ax,[y3] {vypocet ay-nu} sub ax,[y1] inc ax mov [ay1],ax {*ay1=y3-y1} mov [tmp1],ax {*tmp1=y3-y1} mov ax,[y2] sub ax,[y1] inc ax mov [ay2],ax {*ay2=y2-y1} mov [tmp2],ax {*tmp2=y2-y1} {vypocet ax-u} mov [neg1],1 {*if1=1} mov ax,[x3] sub ax,[x1] {ax,sirka} jnc @noneg1 {kdyz>=0 pak skip, jinak} neg ax {a dostanu abs(x3-x1)} neg [neg1] {*neg1=65535} @noneg1: inc ax {inc sirka} mov [ax1],ax {*ax1=x3-x1} mov [neg2],1 {*neg2=1} mov ax,[x2] sub ax,[x1] jnc @noneg2 {x2-x1 jnc skok} neg ax {neg-abs} neg [neg2] {*neg2=65535} @noneg2: inc ax mov [ax2],ax {*ax2=x2-x1} mov ax,[target] mov es,ax mov al,[color] mov ah,al {ax,color} mov cx,[ay2] {od y1 do y2} @draw1: push cx mov di,dx {hln} mov cx,si cmp cx,di ja @noswap1 xchg cx,di @noswap1: sub cx,di inc cx shr cx,1 jnc @1 stosb @1: rep stosw {zmena tmpu a ay} mov bx,[tmp1] {bx=y3-y1} sub bx,[ax1] {bx:=(y3-y1)-(x3-x1)} cmp bx,0 jg @no1 {=0 then skok, else..} @yes1: add bx,[ay1] {bx:=2*(y3-y1)-(x3-x1)} add dx,[neg1] {add dx,1 nebo 65535} cmp bx,0 jle @yes1 {loop} @no1: add dx,320 {offset+320} mov [tmp1],bx mov bx,[tmp2] {y2-y1} sub bx,[ax2] {-(x2-x1)} cmp bx,0 jg @no2 @yes2: add bx,[ay2] add si,[neg2] cmp bx,0 jle @yes2 {dokud bx>=0} @no2: add si,320 {add ofs2,320} mov [tmp2],bx pop cx loop @draw1 {2. cast polyho} push dx mov dx,[y3] sub dx,[y2] inc dx mov [ay2],dx mov [tmp2],dx mov [neg2],1 mov dx,[x3] sub dx,[x2] jnc @x2pos neg dx neg [neg2] @x2pos: inc dx mov [ax2],dx pop dx mov cx,[ay2] @draw2: push cx mov di,dx mov cx,si cmp cx,di ja @noswap2 xchg cx,di @noswap2: sub cx,di inc cx shr cx,1 jnc @2 stosb @2: rep stosw mov bx,[tmp1] sub bx,[ax1] cmp bx,0 jg @no3 @yes3: add bx,[ay1] add dx,[neg1] cmp bx,0 jle @yes3 @no3: add dx,320 mov [tmp1],bx mov bx,[tmp2] sub bx,[ax2] cmp bx,0 jg @no4 @yes4: add bx,[ay2] add si,[neg2] cmp bx,0 jle @yes4 @no4: add si,320 mov [tmp2],bx pop cx loop @draw2 @exit: sti end; procedure Poly4(x1,y1,x2,y2,x3,y3,x4,y4:integer;color:byte;target:word); var x,minY,maxY,ax,bx,yy,p1,q1,p2,q2,p3,q3,p4,q4:integer; begin minY:=y1; maxY:=y1; if y2maxY then maxY:=y2; if y3maxY then maxY:=y3; if y4maxY then maxY:=y4; {y2-4 se porovnaji k y1, ziska se nejmensi a nejvetsi y} if minY<0 then minY:=0; if maxY>199 then maxY:=199; if minY>199 then exit; if maxY<0 then exit; {nebude se prekreslovat zpatky} p1:=x1-x4; q1:=y1-y4; p2:=x2-x1; q2:=y2-y1; p3:=x3-x2; q3:=y3-y2; p4:=x4-x3; q4:=y4-y3; {vzdalenosti mezi vsemy x a mezi vsemy y} {pro vysku polyho dela..} for yy:=minY to maxY do begin ax:=320; bx:=-1; if (y4>=yy) or (y1>=yy) then if (y4<=yy) or (y1<=yy) then {jestlize je yy mezi y1 a y4 pak.. } if not(y4=y1) then begin x:=(yy-y4)*p1 div q1+x4; if xbx then bx:=x; end; if (y1>=yy) or (y2>=yy) then if (y1<=yy) or (y2<=yy) then {jestlize je yy mezi y1 a y2 pak..} if not(y1=y2) then begin x:=(yy-y1)*p2 div q2+x1; if xbx then bx:=x; end; if (y2>=yy) or (y3>=yy) then if (y2<=yy) or (y3<=yy) then {jestlize je yy mezi y2 a y3 pak..} if not(y2=y3) then begin x:=(yy-y2)*p3 div q3+x2; if xbx then bx:=x; end; if (y3>=yy) or (y4>=yy) then if (y3<=yy) or (y4<=yy) then {jestlize je yy mezi y3 a y4 pak..} if not(y3=y4) then begin x:=(yy-y3)*p4 div q4+x3; if xbx then bx:=x; end; if ax<0 then ax:=0; if bx>319 then bx:=319; if ax<=bx then hln(ax,bx,yy,color,target); {horesli horiz. caru} end; end; procedure PolyInit(var init:coordtyp;PocetBodu:byte); var i:byte; begin for i:=1 to PocetBodu do begin coord[i].x:=init[1,i]; coord[i].y:=init[2,i]; end; end; procedure XPoly(rohu:byte;color:byte;target:word); type int=record p,q:integer; end; var yy,x,ax,bx,i,minY,maxY:integer; internal:array[1..20] of int; begin minY:=coord[1].y; maxY:=coord[1].y; for i:=2 to rohu do begin if coord[i].ymaxY then maxY:=coord[i].y; end; if minY<0 then minY:=0; if maxY>199 then maxY:=199; if minY>199 then exit; if maxY<0 then exit; internal[1].p:=coord[1].x-coord[rohu].x; internal[1].q:=coord[1].y-coord[rohu].y; for i:=0 to rohu-2 do begin internal[i+2].p:=coord[i+2].x-coord[i+1].x; internal[i+2].q:=coord[i+2].y-coord[i+1].y; end; for yy:=minY to MaxY do begin ax:=320; bx:=-1; if (coord[rohu].y>=yy) or (coord[1].y>=yy) then if (coord[rohu].y<=yy) or (coord[1].y<=yy) then if not(coord[rohu].y=coord[1].y) then begin x:=(yy-coord[rohu].y)*internal[1].p div internal[1].q+coord[rohu].x; if xbx then bx:=x; end; if ax<0 then ax:=0; if bx>319 then bx:=319; if ax<=bx then hln(ax,bx,yy,color,target); for i:=0 to rohu-2 do begin if (coord[i+1].y>=yy) or (coord[i+2].y>=yy) then if (coord[i+1].y<=yy) or (coord[i+2].y<=yy) then if not(coord[i+1].y=coord[i+2].y) then begin x:=(yy-coord[i+1].y)*internal[i+2].p div internal[i+2].q+coord[i+1].x; if xbx then bx:=x; if ax<0 then ax:=0; if bx>319 then bx:=319; if ax<=bx then hln(ax,bx,yy,color,target); end; end; end; end; { PALETTE } procedure SetRGB(color,r,g,b:Byte);assembler; asm {OK} mov dx,3c8h mov al,[Color] out dx,al inc dx mov al,[r] out dx,al mov al,[g] out dx,al mov al,[b] out dx,al end; procedure GetRGB(Color:byte;var r,g,b:byte);assembler; asm {OK} mov dx,3c7h mov al,[color] out dx,al inc dx inc dx in al,dx les di,dword ptr [bp+14] mov byte ptr es:[di],al in al,dx les di,dword ptr [bp+10] mov byte ptr es:[di],al in al,dx les di,dword ptr [bp+6] mov byte ptr es:[di],al end; procedure RotPal(r,g,b:byte;skipR,skipG,skipB:boolean;loops,ms:integer); type tcount = record r,g,b:real; end; var i,c,rr,gg,bb:byte; red,blue,green:real; current,count:array [0..255] of tcount; begin for c:=0 to 255 do begin getrgb(c,rr,gg,bb); if skipr=false then count[c].r:=(r-rr)/loops; if skipg=false then count[c].g:=(g-gg)/loops; if skipb=false then count[c].b:=(b-bb)/loops; current[c].r:=rr; current[c].g:=gg; current[c].b:=bb; end; for i:=1 to loops do begin for c:=0 to 255 do begin if skipr=false then current[c].r:=count[c].r+current[c].r; if skipg=false then current[c].g:=count[c].g+current[c].g; if skipb=false then current[c].b:=count[c].b+current[c].b; setrgb(c,round(current[c].r),round(current[c].g),round(current[c].b)); end; xdelay(ms); end; end; procedure FadeIn(r,g,b:byte;loops,ms:integer); type tcount = record r,g,b:real; end; var i,c,rr,gg,bb:byte; red,blue,green:real; current,count:array [0..255] of tcount; begin for c:=0 to 255 do begin getrgb(c,rr,gg,bb); count[c].r:=(r-rr)/loops; count[c].g:=(g-gg)/loops; count[c].b:=(b-bb)/loops; current[c].r:=rr; current[c].g:=gg; current[c].b:=bb; end; for i:=1 to loops do begin for c:=0 to 255 do begin current[c].r:=count[c].r+current[c].r; current[c].g:=count[c].g+current[c].g; current[c].b:=count[c].b+current[c].b; setrgb(c,round(current[c].r),round(current[c].g),round(current[c].b)); end; xdelay(ms); end; end; { VIRTUAL SCREENS } function VSetup(VScreen:VPointer):word; begin {OK} new(Vscreen); VSetup:=seg(vscreen^); end; procedure VDispose(Va:word); var vscreen:pointer absolute va; begin {OK} dispose(Vscreen); end; procedure Flip(source,target:word);assembler; asm {OK} push ds {kdyz se neulozi, pak je hodnota pointru nil a je to v prdeli} mov ax,target mov es,ax {target:=es:[di]} mov ax,Source mov ds,ax {sourcre:=ds:[si]} xor si,si xor di,di mov cx,16000 db $f3,66h,$a5 {rep movsd} pop ds end; procedure FImage(x1,y1,x2,y2,sx,sy:integer;source,target:word);assembler; asm push ds mov ax,target mov es,ax {target:=es:[di]} mov ax,Source mov ds,ax {sourcre:=ds:[si]} mov si,y1 mov ax,si shl si,6 shl ax,8 add si,ax add si,x1 {source} mov di,sy mov ax,di shl di,6 shl ax,8 add di,ax add di,sx {dest} mov cx,y2 sub cx,y1 inc cx {h} mov dx,x2 sub dx,x1 inc dx {w} mov ax,dx and ax,3 @loop: mov bx,cx mov cx,dx shr cx,2 db 66h; rep movsw mov cx,ax rep movsb add si,320 add di,320 sub si,dx sub di,dx mov cx,bx loop @loop pop ds end; { IMGAES & BITMAPS } procedure Bitmap(x,y,w,h:word;var bitmap);assembler; asm push ds mov ax,word ptr bitmap+2 mov ds,ax mov ax,$0a000 mov es,ax mov si,word ptr bitmap mov ax,[y] mov di,ax shl ax,8 shl di,6 add di,ax add di,[x] mov cx,[h] @loop: mov bx,cx mov cx,[w] shr cx,1 jnc @1 movsb @1: rep movsw add di,320 sub di,[w] mov cx,bx loop @loop pop ds end; procedure RLEBitmap(x,y,w,h:word;var bitmap);assembler; asm push ds mov ax,word ptr bitmap+2 mov ds,ax mov ax,$0a000 mov es,ax xor si,si xor di,di mov si,word ptr bitmap mov ax,[y] mov di,ax shl ax,8 shl di,6 add di,ax add di,[x] mov cx,[h] @loop: mov bx,cx mov cx,[w] @1: mov al,ds:[si] cmp al,0 je @2 mov es:[di],al @2: inc di inc si loop @1 add di,320 sub di,[w] mov cx,bx loop @loop pop ds end; procedure ScBitmap(x,y,w,h,tox,toy:word;var bitmap); var tmp1,rx,repx,restx,ry,repy,resty:word; {tmp1=add di,320 sub di,tox} begin repx:=tox div w; restx:=tox mod w; rx:=restx; repy:=toy div h; resty:=toy mod h; ry:=resty; asm mov ax,320 sub ax,tox mov tmp1,ax push ds mov ax,word ptr bitmap+2 mov ds,ax mov ax,0a000h mov es,ax mov si,word ptr bitmap mov ax,[y] mov di,ax shl ax,8 shl di,6 add di,ax add di,[x] mov cx,[h] @loop: mov dx,cx mov bx,repy @line: mov cx,[w] @pixel: mov ax,repx @rep: movsb dec si dec ax jnz @rep mov ax,restx cmp ax,0 je @no_rest movsb dec restx dec si @no_rest: inc si dec cx jnz @pixel add di,tmp1 mov ax,rx mov restx,ax sub si,[w] dec bx jnz @line mov bx,resty cmp bx,0 je @no_ry mov cx,[w] @pixel2: mov ax,repx @rep2: movsb dec si dec ax jnz @rep2 mov ax,restx cmp ax,0 je @no_rest2 movsb dec restx dec si @no_rest2: inc si dec cx jnz @pixel2 add di,tmp1 mov ax,rx mov restx,ax sub si,[w] dec bx mov resty,bx @no_ry: add si,[w] mov cx,dx dec cx jnz @loop end; end; procedure GImage(x,y,x2,y2:word;p:pointer);assembler; asm {OK} push ds mov es,word ptr p+2 mov di,word ptr p mov ax,0a000h mov ds,ax mov dx,[bp+offset x2] sub dx,[bp+offset x] inc dx mov ax,dx and ax,3 mov es:[di],dx {sirka dx} mov cx,[bp+offset y2] sub cx,[bp+offset y] inc cx mov es:[di+2],cx {vyska cx} add di,4 mov si,[bp+offset y] mov bx,si shl si,8 shl bx,6 add si,bx add si,[bp+offset x] @loop: mov bx,cx mov cx,dx shr cx,2 db 66h; rep movsw mov cx,ax rep movsb add si,320 sub si,dx mov cx,bx loop @loop pop ds end; procedure PImage(x,y:word;p:pointer);assembler; asm push ds mov ds,word ptr p+2 mov si,word ptr p mov ax,0a000h mov es,ax mov cx,word ptr ds:[si+2] {vyska} mov ax,word ptr ds:[si] mov dx,ax {sirka} and ax,3 {sub dx,(dx shr,2 ; dx shl,2)} add si,4 mov di,[bp+offset y] mov bx,di shl di,8 shl bx,6 add di,bx add di,[bp+offset x] @loop: mov bx,cx mov cx,dx shr cx,2 db 66h; rep movsw mov cx,ax rep movsb add di,320 sub di,dx mov cx,bx loop @loop pop ds end; procedure Save2File(x,y,x2,y2:integer;filename:string); var f:file; p:pointer; size:word; begin assign(f,filename); size:=abs(x2-x)*abs(y2-y)+10; rewrite(f,size); GetMem(p,size); GImage(x,y,x2,y2,p); BlockWrite(f,p^, 1); freemem(p,size); close(f); end; procedure LoadFFile(x,y,sx,sy,sx2,sy2:integer;filename:string); var f:file; p:pointer; size:word; begin assign(f,filename); size:=abs(sx2-sx)*abs(sy2-sy)+10; reset(f,size); GetMem(p,size); BlockRead(f,p^, 1); PImage(x,y,p); FreeMem(p,size); close(f); end; { SCROLLING } procedure ScrollDown(x1,y1,x2,y2:integer);assembler; asm {OK} push ds mov ax,$a000 mov es,ax mov ds,ax mov si,[y1] mov cx,[y2] mov ax,cx mov bx,cx shl ax,8 shl bx,6 add ax,bx sub cx,si inc cx mov bx,[x1] mov dx,[x2] add ax,bx sub dx,bx inc dx cld @1: mov bx,cx mov di,ax mov si,ax sub si,320 mov cx,dx shr cx,2 db $f3,$66,$a5 {rep movsd} mov cx,dx and cx,3 rep movsb @2: mov cx,bx sub ax,320 loop @1 pop ds end; procedure ScrollLeft(X1,Y1,X2,Y2:integer);assembler; asm {OK} push ds mov ax,$a000 mov es,ax mov ds,ax mov si,[y1] mov ax,si shl ax,6 shl si,8 add si,ax mov cx,[y2] sub cx,si inc cx mov dx,[x1] add ax,dx mov bx,[x2] sub bx,dx inc bx cld @1: mov dx,cx mov di,ax dec di mov si,ax mov cx,bx shr cx,2 db $f3,$66,$a5 {rep movsd} mov cx,bx and cx,3 rep movsb @2: mov cx,dx add ax,320 loop @1 pop ds end; procedure ScrollRight(x1,y1,x2,y2:integer);assembler; asm {OK} push ds mov ax,$a000 mov es,ax mov ds,ax mov si,[y1] mov ax,si shl ax,6 shl si,8 add si,ax mov cx,[y2] sub cx,si inc cx mov dx,[x1] mov bx,[x2] add ax,bx sub bx,dx inc bx std @1: mov dx,cx mov di,ax mov si,ax dec si mov cx,bx shr cx,2 db $f3,$66,$a5 {rep movsd} mov cx,bx and cx,3 rep movsb @2: mov cx,dx add ax,320 loop @1 cld pop ds end; procedure ScrollUp(x1,y1,x2,y2:integer);assembler; asm {OK} push ds mov ax,$a000 mov es,ax mov ds,ax mov si,[y1] mov cx,[y2] sub cx,si inc cx mov ax,si shl si,8 shl ax,6 add ax,si mov dx,[x1] add ax,dx mov bx,[x2] sub bx,dx inc bx cld @1: mov dx,cx mov di,ax sub di,320 mov si,ax mov cx,bx shr cx,2 db $f3,$66,$a5 {rep movsd} mov cx,bx and cx,3 rep movsb @2: mov cx,dx add ax,320 loop @1 pop ds end; { MISCELANEOUS } procedure WaitRet; assembler; asm {OK} mov dx,3dah @1: in al,dx test al,08h jnz @1 @2: in al,dx test al,08h jz @2 end; { VESA } var VI : record MAtrib : word; WinA : byte; WinB : byte; WGran : word; WSize : word; WsegA : word; WsegB : word; SetBank : procedure; ScanLn : word; ScreenW : word; ScreenH : word; CharW : byte; CharH : byte; Planes : byte; BitsPixel : byte; Banks : byte; MemModel : byte; BnkSize : byte; ImgPages : byte; Res1 : byte; RMSize : byte; RFPos : byte; GMSize : byte; GFPos : byte; BMSize : byte; BFPos : byte; MSize : byte; MPos : byte; DCinfo : byte; Res2 : byte; trash : array [$2a..255] of byte; end; cbank : byte; procedure GetMode(mode:word);assembler; asm {OK} mov ax,ds { protoze je to vlastne promenna } mov es,ax mov ax,4f01h mov cx,mode mov di,offset VI int 10h end; function SetVesa(mode:word):boolean;assembler; asm {OK} mov ax,4f02h mov bx,mode int 10h sub ax,004fh mov [bp-1],al end; function GetVesa:word;assembler; asm {OK} mov ax,4f03h int 10h cmp ax,004fh je @ok mov ax,-1 jmp @end @ok: mov ax,bx @end: end; procedure GScanLn(var BytesPerScanline,PixsPerScanline,NumOfScanlines:word);assembler; asm {OK} mov ax,4f06h mov bl,01h int 10h les di,dword ptr [bp+0eh] mov word ptr es:[di],bx les di,dword ptr [bp+0ah] mov word ptr es:[di],cx les di,dword ptr [bp+6] mov word ptr es:[di],dx end; procedure SScanLn(width:word);assembler; asm {OK} mov ax,4f06h mov bl,00h mov cx,word ptr width int 10h end; procedure GDStart(var x,y:integer);assembler; { Get Display Start } asm {OK} mov ax,4f07h mov bx,0001h int 10h les di,dword ptr [bp+0ah] mov word ptr es:[di],cx les di,dword ptr [bp+6] mov word ptr es:[di],dx end; procedure SDStart(x,y:integer);assembler; { Set Display Start } asm {OK} mov ax,4f07h sub bx,bx mov cx,word ptr x mov dx,word ptr y int 10h end; procedure PPix8(x,y:word;c:byte);assembler; { vypocet efektivni adresy: 1024x768x256: db 66h;mov di,y db 66h;shl di,10 db 66h;add di,x ; y:=y*1024+x db 66h;mov dx,di ; puvodni mul uklada to co se nevleze do r16,r/m16 db 66h;shr dx,16 ; do dx:ax, s dx se ale dal pracuje a nepouziva se edx proto nakonci ten shrdx,16} asm {OK} mov ax,$0a000 mov es,ax mov di,x mov ax,y mul vi.screenw add di,ax adc dx,0 cmp dl,cbank je @skip mov cbank,dl mov ax,4f05h xor bx,bx adc dx,0 int 10h @skip: mov al,byte ptr c mov es:[di],al end; { ********************************* MATH ********************************** } { 8087x } procedure Init8087;assembler; asm finit end; function fmul(s1,s2:single):single; var s:single; begin asm fld s1 fmul s2 fstp s end; fmul:=s; end; function fdiv(s1,s2:single):single; var s:single; begin asm fld s1 fdiv s2 fstp s end; fdiv:=s; end; function fadd(s1,s2:single):single; var s:single; begin asm fld s1 fadd s2 fstp s end; fadd:=s; end; function fsub(s1,s2:single):single; var s:single; begin asm fld s1 fsub s2 fstp s end; fsub:=s; end; function fabs(s1:single):single; var s:single; begin asm fld s1 fabs fstp s end; fabs:=s; end; function fneg(s1:single):single; var s:single; begin asm fld s1 fchs fstp s end; fneg:=s; end; function fsqrt(s1:single):single; var s:single; begin asm fld s1 fsqrt fstp s end; fsqrt:=s; end; function fround(s1:single):single; var s:single; begin asm fld s1 frndint fstp s end; fround:=s; end; procedure fnop;assembler; asm fnop end; function esc:byte;assembler; asm in al,60h mov [bp-1],al end; { ----------------------------- CUT HERE ---------------------------------- } var va1,c,color:word; x,y,Gd,Gm:integer; vs1:vpointer; p:pointer; const Cur: array [0..1,0..15] of word= (($FFCF, { 1111111111001111 } { PenCursor} $FF87, { 1111111110000111 } $FF03, { 1111111100000011 } $FE01, { 1111111000000001 } $FC03, { 1111110000000011 } $F807, { 1111100000000111 } $F00F, { 1111000000001111 } $E01F, { 1110000000011111 } $C03F, { 1100000000111111 } $807F, { 1000000001111111 } $00FF, { 0000000011111111 } $01FF, { 0000000111111111 } $03FF, { 0000001111111111 } $07FF, { 0000011111111111 } $0FFF, { 0000111111111111 } $9FFF), { 1001111111111111 } ($0000, { 0000000000000000 } $0030, { 0000000000110000 } $0078, { 0000000001111000 } $009C, { 0000000010011100 } $01E8, { 0000000111101000 } $03F0, { 0000001111110000 } $07E0, { 0000011111100000 } $0FC0, { 0000111111000000 } $1F80, { 0001111110000000 } $2700, { 0010011100000000 } $7A00, { 0111101000000000 } $5C00, { 0101110000000000 } $4800, { 0100100000000000 } $5000, { 0101000000000000 } $6000, { 0110000000000000 } $0000)); { 0000000000000000 } const Cur2: array [0..1,0..15] of word= (($0000, { 0000000000000000 } $0000, { 0000000000110000 } $0000, { 0000000001111000 } $0000, { 0000000010011100 } $0000, { 0000000111101000 } $0000, { 0000001111110000 } $0000, { 0000011111100000 } $0000, { 0000111111000000 } $0000, { 0001111110000000 } $0000, { 0010011100000000 } $0000, { 0111101000000000 } $0000, { 0101110000000000 } $0000, { 0100100000000000 } $0000, { 0101000000000000 } $0000, { 0110000000000000 } $0000) ,($FFfF, { 1111111111001111 } { PenCursor} $FFff, { 1111111110000111 } $FFff, { 1111111100000011 } $Ffff, { 1111111000000001 } $Ffff, { 1111110000000011 } $Ffff, { 1111100000000111 } $FffF, { 1111000000001111 } $fffF, { 1110000000011111 } $fffF, { 1100000000111111 } $ffff, { 1000000001111111 } $ffFF, { 0000000011111111 } $fffF, { 0000000111111111 } $fFfF, { 0000001111111111 } $fFFf, { 0000011111111111 } $FfFF, { 0000111111111111 } $FFfF)); { 1001111111111111 } { 0000000000000000 } const map:array[1..7,1..17] of byte=( (05,15,05,15,05,15,05,15,05,15,05,15,05,15,05,15,05), (15,05,15,05,15,05,15,05,15,05,15,05,15,05,15,05,15), (05,15,05,15,05,15,05,15,05,15,05,15,05,15,05,15,05), (15,05,15,05,15,05,15,05,15,05,15,05,15,05,15,05,15), (05,15,05,15,05,15,05,15,05,15,05,15,05,15,05,15,05), (15,05,15,05,15,05,15,05,15,05,15,05,15,05,15,05,15), (05,15,05,15,05,15,05,15,05,15,05,15,05,15,05,15,05)); const map2:array[1..7,1..17] of byte=( (02,15,02,15,02,15,02,15,02,15,02,15,02,15,02,15,02), (15,02,15,02,15,02,15,02,15,02,15,02,15,02,15,02,15), (02,15,02,15,02,15,02,15,02,15,02,15,02,15,02,15,02), (15,02,15,02,15,02,15,02,15,02,15,02,15,02,15,02,15), (02,15,02,15,02,15,02,15,02,15,02,15,02,15,02,15,02), (15,02,15,02,15,02,15,02,15,02,15,02,15,02,15,02,15), (02,15,02,15,02,15,02,15,02,15,02,15,02,15,02,15,02)); const bar1 : coordtyp =((0,100,100,0,0,0,0,0,0,0,0,0),{x} (0,0,100,100,0,0,0,0,0,0,0,0));{y} begin setvesa($101); getmode($101); ppix8(100,100,156); ppix8(200,200,14); readln; setvga($13); rlebitmap(100,100,17,7,map); readln; scbitmap(20,20,17,7,100,100,map2); readln; mouseinit(0); mouseinit(1); readln; newcur(1,1,cur); readln; newcur(1,2,cur2); readln; xtriangle(50,50,100,100,100,0,14,$0a000); xcircle(170,100,85,300,9,400,20,$0a000); ppix(100,100,2,$0a000); c:=gpix(100,100,$0a000); ppix(101,100,c,$0a000); repeat SetRGB(16,x,y,63); xcircle(170,100,85,300,16,400,20,$0a000); x:=succ(x); if x=63 then begin y:=y+9; x:=0;end; xdelay(5); until y=63; p:=gmem(150); {if realloc(p,10000)=nil then writeln('ee');} {realloc(p,10050);} p:=gmem(10050); gimage(0,0,100,100,p); ccls(14,$0a000); pimage(30,30,p); waitret; readln; cls($0a000); Xline(0,0,300,199,1,$0a000); {Poly(100,100,15,05,45,45,94,43,2,$0a000);} readln; va1:=vsetup(vs1); flip($0a000,va1); cls($0a000); xline(0,100,319,100,2,$0a000); randomize; x:=0; repeat inc(x); ppix(random(320),random(100),random(15),$0a000); until x=200; readln; flip(va1,$0a000); Vdispose(va1); readln; cls($0a000); x:=330; repeat inc(x); until x=3000; x:=0; repeat ppix(random(320),random(200),random(15),$0a000); inc(x); until x=3000;{ polyinit(bar1,4); xpoly(4,2,$0a000); coord[1].x:=0; coord[1].y:=0; coord[2].x:=20; coord[2].y:=5; coord[3].x:=30; coord[3].y:=30; coord[4].x:=50; coord[4].y:=40; coord[5].x:=28; coord[5].y:=100; coord[6].x:=10; coord[6].y:=60; Xpoly(6,1,$0a000); va1:=vsetup(vs1); fimage(0,0,100,100,0,0,$0a000,va1); readln; fimage(0,0,100,100,219,100,va1,$0a000); vdispose(va1); readln; } rotpal(63,0,0,false,false,false,63,18); end.