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

{
  Gayle, could you please make sure that this is packaged with KOJAKVGA
  3.3, as that is the only unit that uses PCXCache at the moment.
  Thanks.


  FILENAME : PCXCACHE.PAS

  AUTHOR   : SCOTT TUNSTALL B.Sc

  CREATION : 24TH NOVEMBER 1996
  DATE

  PURPOSE  : TO SUPPLEMENT KOJAKVGA'S PCX WRITING ROUTINES WHICH
             SHOULD NOW BE 200% FASTER THAN THE OLDER
             CONTINUOUS DISK ACCESS ROUTINES USED IN NEWGRAPH
             AND OLDER KOJAKVGA VERSIONS.

             THIS UNIT WILL WORK WITH ANY FILE-TYPE HOWEVER.


  TESTING  : TESTED ON P133 W/ 800Mb HARD DISK CAP.
  INFO       (Guess who's started work then? :) )



  DISCLAIMER : USE THIS UNIT AT YOUR OWN RISK. I TAKE NO
               RESPONSIBILITY FOR ANY DAMAGE CAUSED TO YOUR
               PC HARDWARE OR FILES CAUSED BY THESE ROUTINES.

               THEY WORK FINE ON MY PC.


}




Unit PCXCache;


Interface
Procedure InitCache(FileName: string; DoAppend: Boolean);
Procedure FlushCache;
Procedure CacheByte(TheByte: byte);
Procedure CloseCache;


Implementation

Const PCXCacheVersion = $100;   { Version 1.00 }

Var
    CacheHandle:                File;
    CacheFile:                  string[80];
    ContDiskWrite:              boolean;
    CachePtr:                   pointer;
    CacheSeg:                   word;
    CacheOffs:                  word;
    CacheReload:                word;   { To reload CacheOffs }
    CacheStored:                word;
    CacheSize:                  word;



{ Initialise cache.

  Expects: FileName is obvious.
           DoAppend, if set TRUE means 'being writing data at
           end of file <FileName>

  Returns: Nothing

  Affects: I'm NOT documenting registers affected again!
}


Procedure InitCache(FileName: string; DoAppend: Boolean);
Var CacheMemFree: word;
Begin
     CacheFile:=FileName;
     CacheMemFree:=MaxAvail;
     If CacheMemFree < 1024 Then        { If < 1K then no point in cache }
        ContDiskWrite:=True
     Else
         Begin
         ContDiskWrite:=False;
         GetMem(CachePtr,CacheMemFree);
         CacheSize:=CacheMemFree;
         CacheStored:=0;               { Num of bytes storedin cache
                                         When CacheStored = CacheSize
                                         then all data is written to
                                         disk }

         { You didn't think I was going to totally avoid assembler,
           did you? :) }

         Asm LES DI,CachePtr
             MOV CacheSeg  ,ES
             MOV CacheOffs   ,DI
             MOV CacheReload ,DI
         End;
     End;

     Assign(CacheHandle,CacheFile);
     Rewrite(CacheHandle,1);
     If DoAppend Then
        Seek(CacheHandle,FileSize(CacheHandle));
End;




{
  Dump what's currently in the cache to disk. The cache need not
  be full.
}

Procedure FlushCache;
Begin
     If (CacheStored <>0) And Not ContDiskWrite Then  { Can't write 0 bytes ! }
        Begin
        BlockWrite(CacheHandle,CachePtr^,CacheStored);
        CacheOffs:=CacheReload;
        CacheStored:=0;
        End;
End;



{ OK, so it only works with bytes at a time, but it's STILL faster than
  continuous disk access, innit? :)

  If you feel like it, create CacheWord, cacheLong etc.
}

Procedure CacheByte(TheByte: byte);
Begin
     If Not ContDiskWrite Then
        Begin
        Mem[CacheSeg:CacheOffs]:=TheByte;
        Inc(CacheOffs);
        Inc(CacheStored);
        If CacheStored = CacheSize Then
           FlushCache;
        End
     Else
         BlockWrite(CacheHandle,TheByte,1);
End;



{ Finish with cache }

Procedure CloseCache;
Begin
     FlushCache;                        { In case there's any bytes left }
     If Not ContDiskWrite Then
        Begin
        FreeMem(CachePtr,CacheSize);
        CachePtr:=Nil;                  { Indicates cache done with }
        End;
     Close(CacheHandle);                { Close cache file }
End;




{ So you can check version capabilities }

Function GetVersion:word; Assembler;
Asm
   MOV AX,PCXCacheVersion
End;



{ Announce PCXCache routine. }

Begin
     Writeln;
     Writeln('PCX-Cache routines for KOJAKVGA 3.xx units (C) 1996 Scott Tunstall.');
     Writeln('This unit is FREEWARE. Please distribute source/compiled code');
     Writeln('freely in it''s original, unaltered state.');
     Writeln;
End.

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