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

{
Here you have the PCX source code. It works in 320x200 in 256 colors
I still haven't study the SVGA modes.

I hope it could serves you.

 JL> Thanks in advance.

(In the other message i've send you the GIF routine (in two messages cos the
extension)

==============Cut===============================Cut========================}

      PROGRAM GPCX;      {Por: Javier Perez Vigo 1994}
      USES Crt,graph,dos;
      TYPE
        PFich=^RFich;
        RFich=Record
          Size:Word;
          Octeto:Array[0..64999] of Byte;
          Sig:pFich;
        End;
      VAR
        BORRA:FILE;
        cadena:string[11];
        f: text;
       TECLA:BOOLEAN;
       largo:integer;
       muu:Longint;
       ch:char;
       Fich:File;
       i,j,k:Integer;
       a,b,c:Byte;
       X,Y:Integer;
       GD,GM,a14:Integer;
       a17:LongInt;
       s,F1:String;
       Primero,Actual,Siguiente:PFich;
       Count:Word;
       Pall:Array[0..767] of Byte;
       Reg:Registers;
       {$F+}

       Procedure Inicia;assembler;
        asm
        mov ax,$13
        int $10
        end;

      FUNCTION EXISTE_ARCH(Nombre:STRING):BOOLEAN;
         VAR
           F:FILE;
           OK:BOOLEAN;
         BEGIN            { Existe_Arch }
           Assign (f,Nombre);
           {$I-}
           Reset(f);
           {$I+}
           OK:=IOresult=0;
           If Not OK then
              Existe_Arch:=False
            else
              begin
                close(f);
                existe_Arch:=True;
              end;        { else }
         END;             { Existe_Arch }

       FUNCTION DetectVga256:integer;
        begin
        DetectVGA256:=1;
        end;
       {$F-}

   
       PROCEDURE no_tecla;
        var
          cabeza_Tampon:integer absolute $0000:$041A;{cabeza actual}
          cola_Tampon:integer absolute $0000:$041C;{cola actual}
        begin
           cola_Tampon:=cabeza_Tampon;
        end;


       BEGIN {Bloque principal}
        clrscr;
        wRITELn('   Utilidad de ficheros PCX');
        F1:=ParamStr(1);
       If Pos('.',F1)<1 THEN
       F1:=F1+'.pcx';
        Largo:=LENGTH(Paramstr(1));
        if largo=0 then
         begin
          Textcolor(red);
          writeLn('Escriba nombre de fichero');
          TextColor(white);
          textcolor(white);
          writeLN;
          halt(2)
         end;
       if not(existe_arch(f1)) then
         BEGIN
           TextColor(RED);
           WriteLn('  No existe el fichero ORIGEN ! ');
           TextColor(WHITE);
           writeLn;
           Halt(3);
         END
      else
      begin
       INICIA;
       gm:=0;
       gd:=1;
       initgraph(gd,gm,'c:\tp\bgi'); {the directory where the Unit is}
       x:=0;y:=0;
       Assign(Fich,F1);
       Reset(Fich,1);
       New(Actual);

       Primero:=Actual;
       BlockRead(Fich,Actual^.Octeto,65000,Actual^.Size);
       While not EOF(Fich) do
        Begin
         New(Siguiente);
         Actual^.sig:=Siguiente;
         Actual:=Siguiente;
         BlockRead(Fich,Actual^.Octeto,65000,Actual^.Size);
        End;
       Actual^.Sig:=Nil;
       Close(Fich);
       For i:=0 to 255 do
        Begin
         SetPalette(i,i);
         Pall[3*i]:=Actual^.Octeto[Actual^.Size-768+3*i] div 4;
        Pall[3*i+1]:=Actual^.Octeto[Actual^.Size-767+3*i] div 4;
        Pall[3*i+2]:=Actual^.Octeto[Actual^.Size-766+3*i] div 4;

        end;
       reg.ax:=$1012;
       reg.bx:=$00;
       reg.cx:=$100;
       reg.es:=seg(pall);
       reg.dx:=ofs(pall);
       Intr($10,reg);
       Count:=128;
       Actual:=Primero;
       j:=0;
      REPEAT
      a:=Actual^.Octeto[Count];
      Inc(Count);
      if Count>Actual^.Size then
       BEGIN
         Actual:=Actual^.Sig;
         Count:=0;
       END;
      If a>192 then
      BEGIN
        b:=a-192;
        a:=Actual^.Octeto[Count];
        Inc(Count);
        If Count>Actual^.Size then
        BEGIN
          Actual:=Actual^.Sig;
          Count:=0;
        End;
      END
       else
        b:=1;
       While b<>0 do
       begin
         dec(b);
         if a<>0 then
           mem[$A000:320*Y+X]:=a;
         Inc(X);
         If X>319 then
          begin
            x:=0;
            Inc(y);
          end;
        end;
     Until(Actual^.sig=NIL) and (Actual^.size<768+count);
         muu:=0;
         repeat
            NO_TECLA;
            TECLA:=KEYPRESSED;
            muu:=muu+1;
         until (muu=150000) or TECLA;

       begin
          textmode(c80);
          Halt(4);
        end;
    end;
  end.

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