[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
 AL> Does anyone have any basic graphics routines in assembler that I
 AL> could learn from. ie. graphics mode asm
 AL> int 13h
 AL> mov DX, ??
 AL> end

That would be something like:
        ASM
           mov  ax,0013h
           int  10h
        END;


Here's some routines I've been using for awhile:
------------------------------ CUT --------------------------------------- }
{                   A simple
graphics unit.                           }{ Routines by Denthor of Asphyxia,
Vassago and Cenor of Fata Morgana. } {          Feel free to use these
routines. Have fun!                 }
UNIT GFX;

INTERFACE

USES Crt;

CONST VGA = $A000;

TYPE Virtual = Array [1..64000] of byte;  { The size of our Virtual Screen }
     VirtPtr = ^Virtual;                  { Pointer to the virtual screen }

PROCEDURE Paint( StartPoint,EndPoint , From, Dest : Word );
   { Paints screen over another one, doesn't handle color 0 }
PROCEDURE ScrollUp(Where:Word);
   { Scrolls screen up, fast with virtualscreen }
PROCEDURE ScrollUp2(Where:Word);
   { Scrolls screen up, faster when virtualscreen are not used }
PROCEDURE ShutDown;
   { This frees the memory used by the virtual screen }
PROCEDURE SetUpVirtual;
   { This sets up the memory needed for the virtual screen }
PROCEDURE Cls (Where:word;Col : Byte);
   { This clears the screen to the specified color }
PROCEDURE Flip (source,dest:Word);
  { This copies the entire screen at "source" to destination }
PROCEDURE Pal (Col,R,G,B : Byte);
  { This sets the Red, Green and Blue values of a certain color }
PROCEDURE GetPal (Col : Byte; Var R,G,B : Byte);
  { This gets the Red, Green and Blue values of a certain color }
PROCEDURE Putpixel (X,Y : Integer; Col : Byte; where:word);
  { This puts pixel directly to memory, fast }
FUNCTION  Getpixel (X,Y : Integer; where:word):byte;
  { This gets color of pixel from memory, fast }
PROCEDURE SetMCGA;
  { This procedure gets you into 320x200x256 mode. }
PROCEDURE SetText;
  { This procedure returns you to text mode.  }
PROCEDURE WaitRetrace;
  { Waits fo vertical retrace }

VAR    Virscr : VirtPtr;                      { 1st Virtual Screen }
       VirScr2 : VirtPtr;                     { 2nd Virtual Screen }
       VirScr3 : VirtPtr;                     { 3rd Virtual Screen }
       VirtualScreen1  : word;                { Virtual Screen 1. seg }
       VirtualScreen2 : Word;                 { Virtual Screen 2. seg }
       VirtualScreen3 : Word;                 { Virtual Screen 3. seg }

       Palette,Palette2 : Array[0..255,1..3] of Byte;
       Scr_Ofs : Array[0..199] of Word;

IMPLEMENTATION

PROCEDURE Paint( StartPoint,EndPoint , From, Dest : Word ); BEGIN;
      StartPoint:=StartPoint*320;
      EndPoint:=EndPoint*320-StartPoint;
      ASM
         push    ds
         mov     ax, From
         mov     es, ax
         mov     ax, Dest
         mov     ds, ax
         mov     di, EndPoint
         mov     Cx, StartPoint
      @Looppi:
         mov     Al, Es:[Di]
         cmp     Al, 0
         jz      @Ohi
         mov     Ds:[di], Al
      @Ohi:
         inc     di
         loop    @Looppi
         pop     ds
     END;
END;

PROCEDURE ScrollUp(Where:Word); Assembler; ASM
        push    ds
        mov     ax, [Where]
        mov     es, ax
        mov     ax, [Where]
        mov     ds, ax
        mov     Si, 320
        mov     di, 0
        mov     cx, 31840
        rep     movsw
        pop     ds
END;

PROCEDURE ScrollUp2(Where:Word); Assembler; ASM
        push    ds
        mov     ax, [Where]
        mov     es, ax
        mov     ax, [Where]
        mov     ds, ax
        mov     Si, 320
        mov     di, 0
        mov     cx,15920
        db      0F3h, 66h, 0A5h
        pop     ds
END;

Procedure ShutDown;
   { This frees the memory used by the virtual screen }
BEGIN
  FreeMem (VirScr,64000);
  FreeMem (VirScr2,64000);
  FreeMem (VirScr3,64000);
END;


Procedure SetUpVirtual;
   { This sets up the memory needed for the virtual screen }
BEGIN
  GetMem (VirScr,64000);
  VirtualScreen1 := seg (virscr^);
  GetMem (VirScr2,64000);
  VirtualScreen2 := seg (virscr2^);
  GetMem (VirScr3,64000);
  VirtualScreen3 := seg (virscr3^);
END;

Procedure Cls (Where:word;Col : Byte); assembler;
   { This clears the screen to the specified color }
asm
   push    es
   mov     cx, 32000;
   mov     es,[where]
   xor     di,di
   mov     al,[col]
   mov     ah,al
   rep     stosw
   pop     es
End;

procedure flip(source,dest:Word); assembler;
  { This copies the entire screen at "source" to destination }
asm
  push    ds
  mov     ax, [Dest]
  mov     es, ax
  mov     ax, [Source]
  mov     ds, ax
  xor     si, si
  xor     di, di
  mov     cx, 32000
  rep     movsw
  pop     ds
end;

Procedure Pal(Col,R,G,B : Byte); assembler;
  { This sets the Red, Green and Blue values of a certain color }
asm
   mov    dx,3c8h
   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 GetPal(Col : Byte; Var R,G,B : Byte);
  { This gets the Red, Green and Blue values of a certain color }
Var
   rr,gg,bb : Byte;
Begin
   asm
      mov    dx,3c7h
      mov    al,col
      out    dx,al

      add    dx,2

      in     al,dx
      mov    [rr],al
      in     al,dx
      mov    [gg],al
      in     al,dx
      mov    [bb],al
   end;
   r := rr;
   g := gg;
   b := bb;
end;

Procedure Putpixel (X,Y : Integer; Col : Byte; where:word); assembler;
  { This puts a pixel on the screen by writing directly to memory. }
asm
   mov  ax,where
   mov  es,ax
   mov  bx,[y]
   shl  bx,1
   mov  di,word ptr [Scr_Ofs + bx]
   add  di,[x]
   mov  al,[col]
   mov  es:[di],al
end;

Function Getpixel (X,Y : Integer; where:word):byte; assembler;
  { This puts a pixel on the screen by writing directly to memory. }
asm
   mov  ax,where
   mov  es,ax
   mov  bx,[y]
   shl  bx,1
   mov  di,word ptr [Scr_Ofs + bx]
   add  di,[x]
   mov  al,es:[di]
end;

Procedure SetMCGA;  { This procedure gets you into 320x200x256 mode. } BEGIN
  asm
     mov        ax,0013h
     int        10h
  end;
END;

Procedure SetText;  { This procedure returns you to text mode.  } BEGIN
  asm
     mov        ax,0003h
     int        10h
  end;
END;

procedure WaitRetrace; assembler;
  {  This waits for a vertical retrace to reduce snow on the screen }
label
  l1, l2;
asm
    mov dx,3DAh
l1:
    in al,dx
    and al,08h
    jnz l1
l2:
    in al,dx
    and al,08h
    jz  l2
end;

VAR Loop1:integer;

BEGIN
  For Loop1 := 0 to 199 do
    Scr_Ofs[Loop1] := Loop1 * 320;
END.

[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]