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

  1.  
  2. program game_sprites;
  3. { Slow game-sprites-example, by Bas van Gaalen, Holland, PD }
  4. uses crt;
  5. const w=16; h=16;
  6. type sprbuf=array[0..w*h-1] of byte;
  7. var bckbuf,sprite:sprbuf; px,py:word;
  8.  
  9. procedure setpal(col,r,g,b : byte); assembler; asm
  10.   mov dx,03c8h; mov al,col; out dx,al; inc dx; mov al,r
  11.   out dx,al; mov al,g; out dx,al; mov al,b; out dx,al; end;
  12.  
  13. procedure retrace; assembler; asm
  14.   mov dx,03dah; @l1: in al,dx; test al,8; jnz @l1
  15.   @l2: in al,dx; test al,8; jz @l2; end;
  16.  
  17. procedure putsprite(x,y:word; spr:sprbuf);
  18. var i,j:byte;
  19. begin
  20.   { re-display old backupbuffer on old location }
  21.   for i:=0 to w-1 do
  22.     for j:=0 to h-1 do
  23.       mem[sega000:(py+j)*320+px+i]:=bckbuf[j*w+i];
  24.   { get new backupbuffer at new location }
  25.   for i:=0 to w-1 do
  26.     for j:=0 to h-1 do
  27.       bckbuf[j*w+i]:=mem[sega000:(y+j)*320+x+i];
  28.   px:=x; py:=y;
  29.   { draw sprite at current location }
  30.   for i:=0 to w-1 do
  31.     for j:=0 to h-1 do
  32.       if spr[j*w+i]<>0 then
  33.         mem[sega000:(y+j)*320+x+i]:=spr[j*w+i];
  34. end;
  35.  
  36. var i,j:word;
  37. begin
  38.   asm mov ax,13h; int 10h; end;
  39.   for i:=1 to 255 do setpal(i,255-i div 6,255-i div 4,20);
  40.   fillchar(bckbuf,sizeof(bckbuf),0);
  41.   { create background }
  42.   for i:=0 to 319 do
  43.     for j:=0 to 199 do
  44.       mem[sega000:j*320+i]:=round(5+0.4*i+0.4*j)+random(10);
  45.   { create random sprite }
  46.   randomize;
  47.   for i:=0 to h*w-1 do
  48.     sprite[i]:=random(256);
  49.   { clear middle part }
  50.   for i:=5 to 10 do
  51.     for j:=5 to 10 do
  52.       sprite[j*w+i]:=0;
  53.   i:=0;
  54.   { save first old backup screen }
  55.   px:=0; py:=0;
  56.   for i:=0 to w-1 do
  57.     for j:=0 to h-1 do
  58.       bckbuf[j*w+i]:=mem[sega000:j*320+i];
  59.   { move sprite over background }
  60.   repeat
  61.     retrace;
  62.     putsprite(150+round(cos(pi*i/180)*100),
  63.       100+round(sin(pi*i/180)*50),sprite);
  64.     i:=1+i mod 360;
  65.   until keypressed;
  66.   textmode(lastmode);
  67. end.
  68.  
  69. { version 1.0, as you can see }
  70.