[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{$A+,B-,D+,E+,F-,G+,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V-,X+,Y+}
{$M 16384,0,655360}
Program Tiles; { by Paul H. Kahler 1994 }
USES CRT; {email: phkahler@oakland.edu}
{ This program is mostly undocumented. If you want to know whats going on,
see the other program, it has more comments and much of the same code, so
it should be more helpful. This version doesn't account for the non-square
pixels in mode 13h (see the other program to fix that) and it's slower
because a different fixed-point format is used (see the hloop of both
programs). I like it because it's shorter and simpler. }
{ A 32x32 bitmap is defined in the data below. Feel free to change it to
whatever you like, I just punched in the first thing that came to mind. }
Const Tile: array [0..1023] of byte =
( 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
2,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
2,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
2,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
2,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
2,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,0,0,5,5,5,5,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,0,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,3,3,3,3,0,0,3,3,3,0,0,0,3,3,3,0,0,3,0,0,0,0,0,0,0,0,
2,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,0,0,0,0,
2,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,0,0,0,0,
2,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,0,0,0,0,
2,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,0,0,0,0,
2,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,3,3,3,3,0,0,3,3,3,0,0,0,3,3,3,0,0,3,3,3,3,3,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 );
Var SinTable,CosTable: Array[0..255] of longint;
Procedure MakeTables;
Var direction:integer;
angle:real;
begin
For Direction:=0 to 255 do begin
angle:=Direction;
angle:=angle*3.14159265/128;
SinTable[Direction]:=round(Sin(angle)*256);
CosTable[Direction]:=round(Cos(angle)*256);
end;
end;
Procedure GraphMode; {set 320x200x256 mode}
begin
Asm
Mov AH,00
Mov AL,13h
Int 10h
end;
end;
Procedure DrawScreen(x,y:word; rot,scale:byte);
var Temp:Longint;
ddx,ddy,d2x,d2y:word;
i,j:word;
label hloop,vloop;
begin
Temp:=(CosTable[rot]);Temp:=(Temp*Scale) div 32;
ddx:=Temp;
Temp:=(SinTable[rot]);Temp:=(Temp*Scale) div 256;
ddy:=Temp;
Temp:=(CosTable[(rot+64) and 255]);Temp:=(Temp*SCALE) div 32;
d2x:=Temp;
Temp:=(SinTable[(rot+64) and 255]);Temp:=(Temp*SCALE) div 256;
d2y:=Temp;
i:=x-ddx*160-d2x*100; j:=y-ddy*160-d2y*100;
ASM
mov ax,0
mov di,ax
mov ax,$a000
mov es,ax
mov cx,200
vloop:
push cx
mov ax,[i]
mov dx,[j]
mov cx,320
hloop:
add ax,[ddx]
add dx,[ddy]
mov bl,ah
mov bh,dh
shr bx,3
and bx,$03FF
add bx,OFFSET tile
mov si,bx
movsb
loop hloop
mov ax,d2x
add i,ax
mov ax,d2y
add j,ax
pop cx
loop vloop
end;
end;
Var dist,dd,rot,dr:byte;
x,y:word;
Begin
MakeTables;
GraphMode;
x:=32768; y:=1024;
rot:=0; dr:=1;
dist:=127; dd:=255;
repeat
DrawScreen(x,y,rot,dist);
rot:=rot+dr;
y:=y+128;
dist:=dist+dd;
if (dist=250) or (dist=3) then dd:=-dd;
if random(150)=3 then begin
dr:=0; while dr=0 do dr:=random(5)-3; end;
until keypressed;
ASM {back to 80x25}
MOV AX,3
INT 10h
END;
end.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]