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

    {
     CF> I am working with VGA 320x200x256.  Can anyone please help
     CF> me with a good line routine and the PCX format?  I have
     CF> tryed both and things go bad.. If you have code laying
     CF> around it would help me a lot...  Thanks

    }

    PROCEDURE load_pcx(dx, dy : WORD; name : STRING);
    VAR q                          : FILE;        { Quellendatei-Handle         }
        b                          : ARRAY[0..2047] OF BYTE;  { Puffer          }
        anz, pos, c, w, h, e, pack : WORD;        { diverse ben�tigte Variablen }
        x, y                       : WORD;        { f�r die PCX-Laderoutine     }

    LABEL ende_background;                        { Sprungmarken definieren     }

    BEGIN
      x := dx; y := dy;                           { Nullpunkt festsetzen        }

      ASSIGN(q, name); {$I-} RESET(q, 1); {$I+}   { Quellendatei �ffnen         }
      IF IORESULT <> 0 THEN                       { Fehler beim ™ffnen?         }
        GOTO ende_background;                     { Ja: zum Ende springen       }

      BLOCKREAD(q, b, 128, anz);                  { Header einlesen             }

      IF (b[0] <> 10) OR (b[3] <> 8) THEN         { wirklich ein PCX-File?      }
      BEGIN
        CLOSE(q);                                 { Nein: Datei schlieáen und   }
        GOTO ende_background;                     {       zum Ende springen     }
      END;

      w := SUCC((b[9] - b[5]) SHL 8 + b[8] - b[4]);  { Breite auslesen          }
      h := SUCC((b[11] - b[7]) SHL 8 + b[10] - b[6]);  { H�he auslesen          }

      pack := 0; c := 0; e := y + h;
      REPEAT
        BLOCKREAD(q, b, 2048, anz);

        pos := 0;
        WHILE (pos < anz) AND (y < e) DO
        BEGIN
          IF pack <> 0 THEN
          BEGIN
            FOR c := c TO c + pack DO
              MEM[SEGA000:y*320+(x+c)] := b[pos];
            pack := 0;
          END
          ELSE
            IF (b[pos] AND $C0) = $C0 THEN
              pack := b[pos] AND $3F
            ELSE
            BEGIN
              MEM[SEGA000:y*320+(x+c)] := b[pos];
              INC(c);
            END;

          INC(pos);
          IF c = w THEN                           { letzte Spalte erreicht?     }
          BEGIN
            c := 0;                               { Ja: Spalte auf 0 setzen und }
            INC(y);                               {     in die n�chste Zeile    }
          END;
        END;
      UNTIL (anz = 0) OR (y = e);

      SEEK(q, FILESIZE(q) - 3 SHL 8 - 1);
      BLOCKREAD(q, b, 3 SHL 8 + 1);

      IF b[0] = 12 THEN
        FOR x := 1 TO 3 SHL 8 + 1 DO
          b[x] := b[x] SHR 2;

      PORT[$3C8] := 0;

      FOR x := 0 TO 255 DO
      BEGIN
        PORT[$3C9] := b[x*3+1];
        PORT[$3C9] := b[x*3+2];
        PORT[$3C9] := b[x*3+3];
      END;

      CLOSE(q);

    ende_background:
    END;

    BEGIN
        Load_Pcx(1,1,'c:\lpexface.pcx');
    END.

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