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

    {
      Sean Palmer

    > Does anyone know of any way to display a single screen of Graphics on
    > EGA 640x350 mode *quickly*.  It can be VGA as well; I'm just trying to
    > display the screen *fast* from a disk File.  I know, I could have used
    > the GIF or PCX format (or any other format), but I want to make a
    > proprietary format to deter hacking of the picture.  So, what I want to
    > know is how to read the data from disk directly to screen.  I've
    > figured out that BlockRead (if I can get it to work) is the best method
    > of reading the data from the disk, but I don't know of any fast, and I
    > mean *fast*, methods of writing the data to the screen.  Would it be
    > feasible to use an Array the size of the screen and Move the Array to
    > the screen (I'd need memory locations For that, if possible)?  Any
    > response (ideas, solutions, code fragments) would be appreciated.

    You could set up the screen as an Absolute Variable.
    Then read in each plane as an Array DIRECTLY from the disk File.
    Before reading each plane, set up Write mode 0 (should be already in mode 0)
    and make sure that the enable set/reset register is set to 0 so that the cpu
    Writes go directly to the planes. Set the sequencer map mask register for
    each plane so you only Write to them one at a time. and enable the entire Bit
    Mask register ($0F). Then after telling it which plane, read directly from
    the File. No I haven't tested the following code and most of it's gonna be
    from memory but give it a try:

    the File:
      Plane 0
      Plane 1
      Plane 2
      Plane 3

    each Plane:
      350 rows of 80 Bytes (each bit belongs to a different pixel)
    }

    Type
      scrRec = Array[0..640 * 350 div 8 - 1] of Byte;
    Var
      screen : scrRec Absolute $A000 : 0000;
      dFile  : File of scrRec;

    Const
      gcPort  = $3CE;  {EGA/VGA Graphics controller port}
      seqPort = $3C4;  {EGA/VGA sequencer port}

    Procedure readFileToMode10h(s:String);
    Var
      dFile : File of scrRec;
      i     : Byte;
    begin
      Asm
        mov ax, $10;
        int $10;
      end;  {set up video mode}
      assign (dFile,s);
      reset(s);  {no error checking 8) }
      portw[gcPort] := $0001;    {clear enable set/reset reg}
      portw[gcPort] := $FF08;    {set entire bit mask (this is the default?)}
      For i := 0 to 3 do
      begin
       {set map mask reg to correct plane}
       portw[seqPort] := (1 shl (i + 8)) + $02;
       read(dFile, screen); {load that plane in}
      end;
      portw[seqPort] := $0F02;   {restore stuff to normal}
      portw[gcPort]  := $0F01;
      close(dFile);
    end;

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