home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / diskmags / deutsch / microcod / stod2 / sources / pas16pcx.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-31  |  3KB  |  79 lines

  1. PROGRAM PCX16Farben;
  2.  
  3. USES CRT,DOS;
  4.  
  5. CONST DateiName = 'c:\mag\stod\stodmain.pcx';
  6.  
  7. VAR Bild   : File;
  8.     Puffer : Pointer;
  9.     Regs   : Registers;
  10.  
  11. PROCEDURE InitMode(Mode : BYTE);
  12. BEGIN
  13.  Regs.AH := $00;
  14.  Regs.AL := Mode;
  15.  Intr($10,Regs);                    {Setze VideoModus}
  16. END;
  17.  
  18. PROCEDURE ZeigePCX;
  19. VAR Zeiger    : ^BYTE;
  20.     Palette   : ARRAY[1..48] OF BYTE;
  21.     Index,
  22.     BitPlane  : BYTE;
  23.     Offset,i  : WORD;
  24. BEGIN
  25.  PORTW[$03CE] := $0005;       {WriteMode #0}
  26.  PORTW[$03C4] := $0102;       {BitPlane #0 einblenden}
  27.  PORTW[$03CE] := $FF08;       {BitMaske auf $FF}
  28.  PORTW[$03CE] := $0003;       {Punkte ersetzen}
  29.  
  30.  Zeiger := Puffer;                {Zeiger auf Adresse von Puffer setzen}
  31.  INC(Zeiger,16);                  {Zeiger auf Farbtabelle}
  32.  PORT[$03C8] := 0;                {Mit Farbe 0 anfangen}
  33.  
  34.  FOR i := 0 TO 15 DO BEGIN       {Farben setzen}
  35.  
  36.   Index := PORT[$03DA];           {Farben auf sich selbst setzen...}
  37.   PORT[$03C0] := i; PORT[$03C0] := i;
  38.   PORT[$03C0] := 32;
  39.  
  40.   FOR Index := 1 TO 3 DO BEGIN    {RGB-Werte eintragen}
  41.    PORT[$03C9] := Zeiger^ SHR 2;
  42.    Inc(Zeiger);
  43.   END;
  44.  END;
  45.  
  46.  Index := 0; BitPlane := 1; Offset := 0;
  47.  Zeiger := Puffer; Inc(Zeiger,128);         {Variablen initialisieren}
  48.  
  49.  REPEAT
  50.   IF Zeiger^ AND $C0 = $C0 THEN BEGIN       {Wenn ZählByte, dann}
  51.    Index := Zeiger^ AND $3F; Inc(Zeiger);      {Setze Index und erhöhe Zeiger}
  52.    FOR i := Offset TO Offset+Index DO MEM[$A000:i] := Zeiger^; {Trage Farbe 'Index-Mal' ein}
  53.    Inc(Offset,Index); Index := 0; Inc(Zeiger); {Offset um Index erhöhen, Index wieder auf 0}
  54.   END ELSE BEGIN                            {Wenn kein ZählByte}
  55.    MEM[$A000:Offset] := Zeiger^;            {Setze Farbe}
  56.    Inc(Offset); Inc(Zeiger);                {Erhöhe Offset/Zeiger um eins}
  57.   END;
  58.   IF Offset MOD 80 = 0 THEN BEGIN           {Wenn Ende einer Zeile erreicht, dann:}
  59.    IF BitPlane <> 8 THEN BEGIN              {Wenn BitPlane <> #3, dann:}
  60.     BitPlane := BitPlane SHL 1;             {Nächste BitPlane}
  61.     Dec(Offset,80);                         {Offset wieder auf ZeilenBeginn}
  62.    END ELSE BitPlane := 1;                  {Sonst : BitPlane #0}
  63.    PORT[$03C5] := BitPlane;                 {Trage BitPlane ein}
  64.   END;
  65.  UNTIL (Offset = 38400) OR KeyPressed;      {Ende: Wenn BildEnde oder Tastendruck}
  66.  ReadLn;
  67. END;
  68.  
  69. BEGIN
  70.  InitMode($12);                             {VidMode: 640x580x16}
  71.  Assign(Bild,DateiName);
  72.  Reset(Bild,1);                             {Datei muß vorhanden sein!}
  73.  GetMem(Puffer,FileSize(Bild));             {Genügend Speicher reservieren}
  74.  BlockRead(Bild,Puffer^,FileSize(Bild));    {Lese Datei in Speicher/Puffer}
  75.  ZeigePCX;
  76.  FreeMem(Puffer,FileSize(Bild));            {Speicher wieder freigeben}
  77.  Close(Bild);
  78.  InitMode($03);                             {Wieder in TextModus}
  79. END.