[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
For the people who requested a faster sprite drawing program, here it is.
This program is just Bas van Gaalen's sprite program with a few modifications
to make it run quicker. I am currently working on this program, so that it
will be able to handle more sprites than one..
------------------- CUT HERE ----------------------
}
PROGRAM Game_sprites;
{ By Bas van Gaalen, Holland, PD }
{$G+}
USES crt;
CONST w=16; h=16; sega000= $0A000;
TYPE
SPRBUF = Array[1..256] of Byte;
VAR
Bckbuf,Sprite : SPRBUF;
px,py : Word;
CCOS,CSIN : Array [0..360] of WORD;
CONST
SegS : Word = SEG(Sprite);
OfsS : Word = OFS(Sprite);
SegB : Word = SEG(BckBuf);
OfsB : Word = OFS(BckBuf);
PROCEDURE setpal(col,r,g,b : byte); assembler;
ASM
mov dx,03c8h
mov al,col
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 retrace; assembler;
ASM
mov dx,03dah
@l2:
in al,dx
test al,8
jz @l2
END;
PROCEDURE putsprite(x,y:word);
BEGIN
ASM
CLI
PUSH DS
MOV AX,0A000h
MOV ES,AX
MOV DS,SegB
MOV AX,PY
SHL AX,6
MOV DI,AX
SHL AX,2
ADD DI,AX
ADD DI,PX
MOV DX,1010h
MOV AX,OfsB
MOV SI,AX
XOR AX,AX
@1:
MOV AL,[DS:SI] { Display the sprite buffer over the old sprite }
MOV [ES:DI],AL
INC DI
INC SI
DEC DL
JNZ @1
ADD DI,304
MOV DL,16
DEC DH
JNZ @1
MOV AX,Y
SHL AX,6
MOV DI,AX
SHL AX,2
ADD DI,AX
ADD DI,X
MOV DX,1010h
MOV AX,OfsB
MOV SI,AX
XOR AX,AX
@2: { Store the background into the Sprite Buffer }
MOV AL,[ES:DI]
MOV [DS:SI],AL
INC DI
INC SI
DEC DL
JNZ @2
ADD DI,304
MOV DL,16
DEC DH
JNZ @2
MOV AX,Y
SHL AX,6
MOV DI,AX
SHL AX,2
ADD DI,AX
ADD DI,X
MOV DX,1010h
MOV AX,OfsS
MOV SI,AX
XOR AX,AX
@3:
CMP [DS:SI],AH { Display the Sprite at it's new location }
JZ @4
MOV AL,[DS:SI]
MOV [ES:DI],AL
@4:
INC DI
INC SI
DEC DL
JNZ @3
ADD DI,304
MOV DL,16
DEC DH
JNZ @3
POP DS
STI
END;
px:=x; py:=y;
END;
(* This procedure I added to speed up the rotation used when displaying the
sprite. This is not nessary, but usefull *)
PROCEDURE Calc_Cos_Sin;
VAR I : word;
BEGIN
FOR I := 0 to 360 DO
BEGIN
CCOS[I] := ROUND(COS(PI*I/180)*150);
CSIN[I] := ROUND(SIN(PI*I/180)*75);
END;
END;
var i,j:word;
BEGIN
ASM
mov ax,13h
int 10h
END;
Calc_Cos_Sin;
for i:=1 to 255 do setpal(i,255-i div 6,255-i div 4,20);
fillchar(bckbuf,sizeof(bckbuf),0);
{ create background }
for i:=0 to 319 do
for j:=0 to 199 do
mem[sega000:j*320+i]:=round(5+0.4*i+0.4*j)+random(10);
{ create random sprite }
randomize;
for i:=1 to 256 do
sprite[i]:=random(255);
{ clear middle part }
for i:=6 to 10 do
for j:=6 to 10 do
sprite[j*w+i]:=0;
i:=0;
{ save first old backup screen }
px:=0; py:=0;
(* The following assembly code is required to save the sprites background when
it is first displayed. I am still trying to figure how to incorperate this
into the main assembly code for displaying the sprite *)
ASM
CLI
PUSH BP
PUSH DS
MOV AX,SegA000
MOV ES,AX
MOV DS,SegB
MOV AX,0
SHL AX,6
MOV DI,AX
SHL AX,2
ADD DI,AX
ADD DI,0
MOV DX,1010h
MOV AX,OfsB
MOV BP,AX
XOR AX,AX
@2:
MOV AL,[ES:DI]
MOV [DS:BP],AL
INC DI
INC BP
DEC DL
JNZ @2
ADD DI,304
MOV DL,16
DEC DH
JNZ @2
POP DS
POP BP
STI
END;
{ move sprite over background }
repeat
retrace;
putsprite(150+CCOS[I],100+CSIN[I]);
i:=1+i mod 360;
until keypressed;
ASM
mov ax,3h
int 10h
END;
END.
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]