home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 18 / CD_ASCQ_18_111294_W.iso / dos / prg / pas / gfxfx / sprites.pas < prev    next >
Pascal/Delphi Source File  |  1994-06-22  |  4KB  |  119 lines

  1.  
  2. program sprites;
  3. { update of the sprites program, v2.0, by Bas van Gaalen, Holland, PD }
  4. uses
  5.   crt;
  6. const
  7.   vidseg:word=$a000;
  8.   maxsprites=10; { change to whatever you need }
  9.   xsize=17; ysize=17;
  10. type
  11.   sprrec=record x,y,sprseg:word; buf:pointer; end;
  12. var
  13.   sprite:array[1..maxsprites] of sprrec;
  14.   xsprspd,ysprspd:array[1..maxsprites] of shortint;
  15.   heap,virscr,bgscr:pointer;
  16.   virseg,bgseg:word;
  17.  
  18. procedure setpal(col,r,g,b:byte); assembler; asm
  19.   mov dx,03c8h; mov al,col; out dx,al; inc dx; mov al,r
  20.   out dx,al; mov al,g; out dx,al; mov al,b; out dx,al; end;
  21.  
  22. procedure flip(src,dst,offs:word); assembler; asm
  23.   push ds; mov ds,[src]; mov si,[offs]; mov es,[dst]
  24.   xor di,di; mov cx,320*200/2; rep movsw; pop ds; end;
  25.  
  26. procedure cls(dst:word); assembler; asm
  27.   mov es,[dst]; xor di,di; xor ax,ax; mov cx,320*200/2; rep stosw; end;
  28.  
  29. procedure retrace; assembler; asm
  30.   mov dx,03dah; @vert1: in al,dx; test al,8; jnz @vert1
  31.   @vert2: in al,dx; test al,8; jz @vert2; end;
  32.  
  33. procedure putsprite(x,y,sprseg,virseg:word); assembler;
  34. asm
  35.   push ds
  36.   mov ds,sprseg; xor si,si { get sprite segment }
  37.   mov es,virseg; xor di,di { get virtial screen segment }
  38.   mov ax,[y]; shl ax,6; mov di,ax; shl ax,2; add di,ax { y*320 }
  39.   add di,[x] { y*320+x }
  40.   mov dx,320-xsize { number of pixels left on line }
  41.   mov bx,ysize
  42.  @l1:
  43.   mov cx,xsize
  44.  @l0:
  45.   lodsb; or al,al; jz @skip { get byte from sprite and check if black }
  46.   mov [es:di],al { draw it }
  47.  @skip:
  48.   inc di; dec cx; jnz @l0
  49.   add di,dx; dec bx; jnz @l1
  50.   pop ds
  51. end;
  52.  
  53. var offs,hx,hy,np,n,i,j,k,l:word;
  54. begin
  55.   asm mov ax,13h; int 10h; end;
  56.   randomize;
  57.   getmem(virscr,320*200); virseg:=seg(virscr^); cls(virseg);
  58.   getmem(bgscr,320*200); bgseg:=seg(bgscr^); cls(bgseg);
  59.   mark(heap);
  60.  
  61.   np:=128 div maxsprites;
  62.   for i:=0 to maxsprites-1 do begin
  63.     case i mod 6 of
  64.       0:begin hx:=23; hy:=i*np; n:=0; end;
  65.       1:begin hx:=i*np; hy:=23; n:=0; end;
  66.       2:begin hx:=i*np; hy:=0; n:=23; end;
  67.       3:begin hx:=23; hy:=0; n:=i*np; end;
  68.       4:begin hx:=0; hy:=23; n:=i*np; end;
  69.       5:begin hx:=0; hy:=i*np; n:=23; end;
  70.     end;
  71.     for j:=0 to np-1 do begin
  72.       k:=j shr 1;
  73.       setpal(np*i+j+1,k+hx,k+hy,k+n);
  74.     end;
  75.   end;
  76.  
  77.   for i:=1 to 128 do setpal(127+i,i div 3,20+i div 5,20+i div 7);
  78.  
  79.   for i:=0 to 319 do
  80.     for j:=0 to 199 do
  81.       mem[bgseg:j*320+i]:=128+abs(i*i-j*j) and 127;
  82.  
  83.   hx:=xsize shr 1; hy:=ysize shr 1;
  84.   for k:=1 to maxsprites do begin
  85.     xsprspd[k]:=random(6)-3; if xsprspd[k]=0 then xsprspd[k]:=1;
  86.     ysprspd[k]:=random(6)-3; if ysprspd[k]=0 then ysprspd[k]:=1;
  87.     with sprite[k] do begin
  88.       x:=20+random(280-xsize);
  89.       y:=20+random(160-ysize);
  90.       getmem(buf,xsize*ysize);
  91.       sprseg:=seg(buf^);
  92.       for i:=0 to xsize-1 do for j:=0 to ysize-1 do begin
  93.         l:=(i-hx)*(i-hx)+(j-hy)*(j-hy);
  94.         if (l<hx*hx) and (l>hx*hx div 8)
  95.         then mem[sprseg:j*xsize+i]:=k mod np+np*(k-1)
  96.         else mem[sprseg:j*xsize+i]:=black;
  97.       end;
  98.     end;
  99.   end;
  100.  
  101.   offs:=0;
  102.   repeat
  103.     flip(bgseg,virseg,offs);
  104.     offs:=(offs+1) mod 320;
  105.     retrace;
  106.     for i:=1 to maxsprites do
  107.       with sprite[i] do begin
  108.         putsprite(x,y,sprseg,virseg);
  109.         inc(x,xsprspd[i]); if (x<10) or (x>(310-xsize)) then xsprspd[i]:=-xsprspd[i];
  110.         inc(y,ysprspd[i]); if (y<10) or (y>(190-ysize)) then ysprspd[i]:=-ysprspd[i];
  111.       end;
  112.     flip(virseg,vidseg,0);
  113.   until keypressed;
  114.  
  115.   release(heap);
  116.   freemem(virscr,320*200); freemem(bgscr,320*200);
  117.   textmode(lastmode);
  118. end.
  119.