[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]