[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
example 0064.pas of egavga.swg is buggy.
please replace it with the corrected attachment.
(gerhard piran is my pseudonym ;-) so please don't change! )
thanx for great work on SWAG
have fun, Gerd
{$Q-,R-}
{
JAMES SAITO
> I wonder if I can allocate With GetMem more than 64K, though. You see, I'm
> interested in creating games With my own code, and the most important part
> of games is Graphics. You don't want to play some dumb monochrome Text
> adventure With a little man (@). :) Do you have any tips For outputting a
> screen of information such as a part of a dungeon? I'd sorta like to keep
> the Character centered like in Nintendo games.
Well. if you want to make a 320x200x256 game, I know the right stuff. if you
would like to make the Character centered, and when you press
up/down/left/right, the whole screen scrolls. Here is an example on a playing
field that is umm. Let's say 1000x200 (200K).
GERHARD PIRAN
correted and accelerated
}
uses crt;
procedure DMove (var source, dest; count: word); assembler;
asm
push ds
lds si,source {ds,si = source}
les di,dest {es,di = dest}
mov cx,count {cx = count}
mov ax,cx {ax = count}
cld
shr cx,2 {cx = count / 4}
db 66h
rep movsw {copy double words}
mov cl,al {get rest bytes}
and cl,3
rep movsb {copy rest}
pop ds
end;
const maxY = 199;
maxL = 999;
type line = array[0..maxL] of byte;
linePtr = ^line;
vga = array[0..63999] of byte;
Var
ws: array [0..maxY] of linePtr; {work space}
lp : linePtr;
vp : ^vga; {pointer to vga buffer}
vm : vga absolute $A000:0;
x,y : word;
begin
{Init The Graphics}
Asm
MOV AH,00H {AH = 0}
MOV AL,13H {AL = 13H,which is the Graphics mode 320x200x256}
INT 10H {Call the Graphics bios services}
end;
if Mem[$40:$49] <> $13 Then
begin
WriteLn('VGA Graphics Required For this game');
Halt(1);
end;
For y := 0 to maxY do
begin
new (lp); {Find a chunk of memory For the field}
if lp = nil then RunError (203);
ws[y] := lp; {Find a chunk of memory For the field}
For x := 0 to maxL do
lp^[x] := random(256); {Create a random field}
end;
new(vp);
if vp = nil then RunError (203);
For x := 0 to 679 do
begin
For y := 0 to maxY do
move (ws[y]^[x], vp^[y*320], 320);
{Now do put your player on, supposing it's a white block}
For y := 90 to 110 do
FillChar(vp^[y*320 + 150], 20, 15);
{WaitVRetrace}
repeat until (port[$03DA] and $08) = 0;
repeat until (port[$03DA] and $08) <> 0;
{Now copy that workspace into the video memory}
DMove (vp^, vm, 64000);
if keypressed then break;
end;
{Now time to close the Graphics}
Asm
MOV AH,$00;
MOV AL,$03;
INT 10H
end;
{Free all blocks}
dispose(vp);
For y := 0 to maxY do dispose(ws[y]);
end.
{
Well. That's it. It actually took me 20 minutes to Type this whole thing
right in the message base. I guess there's a bit of errors. - James Saito
}
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]