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

    {
       320x200x256c BMP loader
       written by:
     .--------- Simon R Bowser ------- aka Pinrut -----------.
     |  Department of Computer Science, Aberdeen University  |
     |            E-Mail: u04srb@abdn.ac.uk                  |
     |     Simon.Bowser@launchpad.unc.edu  |
     `-------------------------------------------------------'
      This code if FREEWARE, do with it as you will.

      note: this ONLY works for 320x200 images
    }

    Procedure LoadBMP(Name:String;where:word);
    type
         Virtual = Array [1..64000] of byte;
    VAR
       PicBuf: ^Virtual;

       Data:File;
       RGB:ARRAY[0..255,1..4] OF Byte;
       Header:Array[1..54] of Byte;
       aAddr :word;

       I:Byte;
       {x,y:integer;}

      Procedure SetPal(Col,R,G,B : Byte); assembler;
        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;

    BEGIN
         GetMem (PicBuf,64000);
         Assign(Data,Name); Reset(Data,1);
         BlockRead(Data,Header,54);                 { read and ignore :) }
         BlockRead(Data,RGB,1024);                  { pal info }
         FOR I:=0 TO 255 DO
      SetPal(I,RGB[I,3] div 4,RGB[I,2] div 4,RGB[I,1] div 4);
         BlockRead(Data,PicBuf^,64000);
         Close(Data);
         aAddr := seg (PicBuf^);

      asm                    {AMS routine 2.7 times faster than Pascal one!}
         push si             {wibble, wobble ;) }
         push di             {I'm no ASM, programmer so there MUST me room}
         push es             {for optimisation}
         push ds
         mov es, [where]
         mov ds, [aAddr]
         mov di, 0
         mov dx, 63680
         mov cx, 200
      @page:
         push cx
         mov cx, 320
         mov si, dx
      @line:
         mov bh, byte ptr ds:[si]
         mov es:[di], bh
         inc di
         inc si
         loop @line
         sub dx, 320
         pop cx
         loop @page
         pop ds
         pop es
         pop di
         pop si
      end;

    {    for y:=0 to 199 do
          for x:=0 to 319 do
     Mem[where:y*320+x] := Mem[aAddr:(199-y)*320+x];}

      FreeMem(PicBuf,64000);
    END;

    begin
      asm mov        ax,0013h;int        10h; end;      { set MCGA }
      LoadBMP('whatever.bmp',$A000);

      { repeat until keypressed;  (use crt) }
    end.

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