home *** CD-ROM | disk | FTP | other *** search
/ CD-X 1 / cdx_01.iso / demodisc / ca_v_at / cdxintro.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1995-04-07  |  12.1 KB  |  398 lines

  1. {$G+}
  2. uses   crt, dos;
  3.  
  4. const  MAX_WIDTH = 4000;
  5.        COMPRESS_NUM = $C0;
  6.        MAX_BLOCK = 4096;
  7.        RED = 0;
  8.        GREEN = 1;
  9.        BLUE = 2;
  10.  
  11. type   file_buffer = array [0..127] of byte;
  12.        block_array = array [0..MAX_BLOCK] of byte;
  13.        pal_array = array [0..255, RED..BLUE] of byte;
  14.        ega_array = array [0..16] of byte;
  15.        line_array = array [0..MAX_WIDTH] of byte;
  16.        pcx_header = record
  17.                        Manufacturer: byte;
  18.                        Version: byte;
  19.                        Encoding: byte;
  20.                        Bits_per_pixel: byte;
  21.                        Xmin: integer;
  22.                        Ymin: integer;
  23.                        Xmax: integer;
  24.                        Ymax: integer;
  25.                        Hdpi: integer;
  26.                        Vdpi: integer;
  27.                        ColorMap: array [0..15, RED..BLUE] of byte;
  28.                        Reserved: byte;
  29.                        Nplanes: byte;
  30.                        Bytes_per_line_per_plane: integer;
  31.                        PaletteInfo: integer;
  32.                        HscreenSize: integer;
  33.                        VscreenSize: integer;
  34.                        Filler: array [74..127] of byte;
  35.                     end;
  36.  
  37.        type paletterec   = record
  38.                              red,
  39.                              green,
  40.                              blue  : byte;
  41.                            end;
  42.              palettetype = array[0..255] of paletterec;
  43.  
  44.  
  45. var    BlockFile   :  file;
  46.        BlockData   :  block_array;
  47.        Header      :  pcx_header;
  48.        Palette256  :  pal_array;
  49.        PCXline     :  line_array;
  50.        Ymax        :  integer;
  51.        NextByte    :  integer;
  52.        Index       :  integer;
  53.        Data        :  byte;
  54.        Reg         :  registers;
  55.  
  56.        pcx_picture :  pointer;
  57.        pcx_palette :  palettetype;
  58.        temppal     :  palettetype;
  59.        i           :  byte;
  60.        oldint09    :  procedure;
  61.  
  62. procedure show_palette; { a pcx képek palettáját inicializálja }
  63. var       i: integer;
  64. begin
  65.           for i := 0 to 255 do
  66.              begin
  67.                Palette256 [i, RED]   := Palette256 [i, RED]   shr 2;
  68.                Palette256 [i, GREEN] := Palette256 [i, GREEN] shr 2;
  69.                Palette256 [i, BLUE]  := Palette256 [i, BLUE]  shr 2;
  70.              end;
  71.           Reg.ah := $10;
  72.           Reg.al := $12;
  73.           Reg.bx := 0;
  74.           Reg.cx := 255;
  75.           Reg.dx := ofs (Palette256);
  76.           Reg.es := seg (Palette256);
  77.           intr ($10, Reg);
  78. end;
  79.  
  80. procedure load_mcga_pic (Y: integer); { soronként elrakja a memóriába a pcx képet }
  81. begin
  82.           Move (PCXline [0], mem[seg(pcx_picture^):y*320], 320);
  83. end;
  84.  
  85. procedure Read256palette; { betölti a pcx kép palettáját }
  86. var       b: byte;
  87. begin
  88.           seek (BlockFile, FileSize (BlockFile) - 769);
  89.           BlockRead (BlockFile, b, 1);
  90.           BlockRead (BlockFile, Palette256, 3*256);
  91.           seek (BlockFile, 128);
  92. end;
  93.  
  94. procedure ReadHeader; { a pcx kép fejlécét tölti be }
  95. begin     {$I-}
  96.           BlockRead (BlockFile, Header, 128);
  97.           Ymax := 199;
  98.           Read256palette;
  99.           Index := 0;
  100.           NextByte := MAX_BLOCK;
  101.           {$I+}
  102. end;
  103.  
  104. procedure ReadByte;  { egy byte-ot tölt be a pcx - képpbôl }
  105. var       NumBlocksRead: integer;
  106. begin
  107.           if NextByte = MAX_BLOCK then
  108.              begin
  109.              BlockRead (BlockFile, BlockData, MAX_BLOCK, NumBlocksRead);
  110.              NextByte := 0;
  111.              end;
  112.           data := BlockData [NextByte];
  113.           inc (NextByte);
  114. end;
  115.  
  116. procedure read_pcx_line;  { egy sort olvas be a pcx képpbôl }
  117. var       count: integer;
  118.           bytes_per_line: integer;
  119. begin     {$I-}
  120.           bytes_per_line := Header.Bytes_per_line_per_plane * Header.Nplanes;
  121.           if Index <> 0 then FillChar (PCXline [0], Index, data);
  122.           while (Index < bytes_per_line) do
  123.              begin
  124.                ReadByte;
  125.                if (data and $C0) = compress_num then
  126.                   begin
  127.                     count := data and $3F;
  128.                     ReadByte;
  129.                     FillChar (PCXline [Index], count, data);
  130.                     inc (Index, count);
  131.                   end
  132.                else
  133.                   begin
  134.                     PCXline [Index] := data;
  135.                     inc (Index);
  136.                   end;
  137.              end;
  138.            Index := Index - bytes_per_line;
  139. {$I+}
  140. end;
  141.  
  142. procedure load_pcx (name:  string);  { az egész pcx képet betölti a memóriába }
  143. var       k:  byte;
  144. begin     {$I-}
  145.           assign (blockfile, name);
  146.           reset (blockFile, 1);
  147.           readheader;
  148.           for k := 0 to 199 do
  149.               begin
  150.                 read_pcx_line;
  151.                 load_mcga_pic (k);
  152.               end;
  153.           close (blockfile);
  154.           {$I+}
  155. end;
  156.  
  157. Procedure SetPalette (Var PalBuf : PaletteType); Assembler; { a palettát teszi aktuálissá }
  158. Asm
  159.     PUSH DS
  160.     XOR AX, AX
  161.     MOV CX, 0300h / 2
  162.     LDS SI, PalBuf
  163.     MOV DX, 03C8h
  164.     OUT DX, AL
  165.     INC DX
  166.     MOV BX, DX
  167.     CLD
  168.     MOV DX, 03DAh
  169.     @VSYNC0:
  170.       IN   AL, DX
  171.       TEST AL, 8
  172.     JZ @VSYNC0
  173.     MOV DX, BX
  174.     REP
  175.        OUTSB
  176.     MOV BX, DX
  177.     MOV DX, 03DAh
  178.     @VSYNC1:
  179.       IN   AL, DX
  180.       TEST AL, 8
  181.     JZ @VSYNC1
  182.     MOV DX, BX
  183.     MOV CX, 0300h / 2
  184.     REP
  185.        OUTSB
  186.     POP DS
  187. End;
  188.  
  189. Procedure GetPalette (Var PalBuf : PaletteType); Assembler; { az aktuális palettát kérdezi le }
  190. Asm
  191.     PUSH DS
  192.     XOR AX, AX
  193.     MOV CX, 0300h
  194.     LES DI, PalBuf
  195.     MOV DX, 03C7h
  196.     OUT DX, AL
  197.     INC DX
  198.     INC DX
  199.     CLD
  200.     REP
  201.        INSB
  202.     POP DS
  203. End;
  204.  
  205. Procedure FadeOutToBlack (Var Palin : PaletteType); { elsötétíti a képernyôt }
  206. Var DAC,
  207.     Intensity : Word;
  208. Begin
  209.      For Intensity := 32 downto 0 do
  210.      Begin
  211.        For DAC := 0 to 255 do
  212.        Begin
  213.           TempPal[DAC].Red   := (Palin[DAC].Red   * Intensity) DIV 32;
  214.           TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
  215.           TempPal[DAC].Blue  := (Palin[DAC].Blue  * Intensity) DIV 32;
  216.        End;
  217.  
  218.        SetPalette (TempPal);
  219.      End;
  220. End;
  221.  
  222. Procedure FadeInFromBlack (Var Palin : PaletteType); { kivilágosítja a képernyôre a megadott palettát }
  223. Var DAC,
  224.     Intensity : Word;
  225. Begin
  226.      For Intensity := 0 to 32 do
  227.      Begin
  228.        For DAC := 0 to 255 do
  229.        Begin
  230.           TempPal[DAC].Red   := (Palin[DAC].Red   * Intensity) DIV 32;
  231.           TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
  232.           TempPal[DAC].Blue  := (Palin[DAC].Blue  * Intensity) DIV 32;
  233.        End;
  234.        SetPalette (TempPal);
  235.      End;
  236. End;
  237.  
  238. procedure turnpal; { a palettát forgatja }
  239. var trgb:  paletterec;
  240. begin
  241.      trgb := pcx_palette[1];
  242.      move (pcx_palette[2],pcx_palette[1],254*3);
  243.      pcx_palette[254] := trgb;
  244. end;
  245.  
  246. procedure turnbackpal; { a palettát visszafelé forgatja }
  247. var trgb:  paletterec;
  248. begin
  249.      trgb := pcx_palette[2];
  250.      move (pcx_palette[1],pcx_palette[2],254*3);
  251.      pcx_palette[254] := trgb;
  252. end;
  253.  
  254. procedure setvideo(mode:  word); assembler; { videó módot kapcsol }
  255. asm
  256.           MOV AX,mode
  257.           INT $10;
  258. end;
  259.  
  260. procedure show_pcx; { a képernyôre másolja a memóriából a pcx-képet }
  261. begin
  262.           move(mem[seg(pcx_picture^):0],mem[$A000:0],64000);
  263. end;
  264.  
  265. procedure drawline(what:byte;towhat:byte); { a memóriából sorokat másol a képernyôre }
  266. begin
  267.           move(mem[seg(pcx_picture^):ofs(pcx_picture^)+320*what],
  268.                mem[$a000:320*towhat],320);
  269. end;
  270.  
  271. procedure roller; { a képet görgeti }
  272. const     rows       =  199;
  273.           size       =   20;
  274. var       hiddenrow  :  byte;
  275.           visiblerow :  byte;
  276.           i          :  byte;
  277. begin
  278.           hiddenrow  := 0;
  279.           visiblerow := size;
  280.           repeat
  281.             for i := 0 to size do
  282.                 if ((visiblerow-i) < rows) and
  283.                    ((hiddenrow+i)  < rows)
  284.                 then drawline(hiddenrow+i,visiblerow-i);
  285.             drawline(hiddenrow,hiddenrow);
  286.             inc(hiddenrow);
  287.             inc(visiblerow);
  288.             delay(100);
  289.           until hiddenrow = rows;
  290. end;
  291.  
  292. procedure show_I; { vízszintessen másolja be az új képet }
  293. var       rows:   array [0..319] of boolean;
  294.           ready:  boolean;
  295.           i:      word;
  296. begin
  297.           for i := 0 to 199 do
  298.               rows[i] := false;
  299.           repeat
  300.                 i := random(200);
  301.                 if rows[i] = false then
  302.                    begin
  303.                          rows[i] := true;
  304.                              move(mem[seg(pcx_picture^) : i*320],
  305.                                   mem[$A000             : i*320],319);
  306.                          ready := true;
  307.                          for i := 0 to 199 do
  308.                              if rows[i] = false then ready := false;
  309.                    end;
  310.                 delay(3); 
  311.           until ready = true;
  312. end;
  313.  
  314. procedure show_II; { függôlegessen másolja be az új képet }
  315. var       rows:   array [0..319] of boolean;
  316.           ready:  boolean;
  317.           y:      word;
  318.           i:      word;
  319. begin
  320.           for i := 0 to 319 do
  321.               rows[i] := false;
  322.           repeat
  323.                 i := random(320);
  324.                 if rows[i] = false then
  325.                    begin
  326.                          rows[i] := true;
  327.                          for y := 0 to 199 do
  328.                              move(mem[seg(pcx_picture^) : y*320+i],
  329.                                   mem[$A000             : y*320+i],1);
  330.                          ready := true;
  331.                          for i := 0 to 319 do
  332.                              if rows[i] = false then ready := false;
  333.                    end;
  334.                 delay(1);
  335.           until ready = true;
  336. end;
  337.  
  338. {$F+}
  339. procedure newint09; interrupt;
  340. begin
  341.           if port[$60] = 1 then begin       { volt ESC? }
  342.              freemem(pcx_picture,64000);    { felszabadítja a memóriát }
  343.              setvideo($03);                 { visszakapcsol text videó módba }
  344.              writeln('coded by Vodkα  & Kool A');
  345.              writeln('GFX   by Kool A & Vodkα');
  346.              inline($9C);
  347.              oldint09;   
  348.              setintvec($09,addr(oldint09));
  349.              halt;
  350.           end;  
  351.           inline($9C);                      { ha nem meghívja a régi keyboard interruptot } 
  352.           oldint09;
  353. end;
  354. {$F-}
  355.  
  356. begin
  357.           getintvec($09,@oldint09);      { a régi keyboard interrupt címét elmenti } 
  358.           setintvec($09,addr(newint09)); { és ráirányítja az újjat }
  359.  
  360.           writeln('CD-X intro...');
  361.  
  362.           getpalette(pcx_palette);    { elmenti az aktuális palettát }
  363.           fadeouttoblack(pcx_palette);{ elsötétít feketébe
  364.                                                                      }
  365.           getmem(pcx_picture,64000);  { helyet foglal a pcx képeknek }
  366.           randomize;
  367.           setvideo($13);              { felkapcsol 320x200x256 MCGA videó módba }
  368.  
  369.           load_pcx('1.pcx');          { betölti a memóriába az 1. képet }
  370.           show_palette;               { a palettát megmutatja }
  371.           roller;                     { legörgeti a képet }
  372.           delay(100);
  373.  
  374.           for i := 1 to 5 do begin 
  375.                
  376.               load_pcx('2.pcx');          { betölti a memóriába a 2. képet }
  377.               show_II;                    { függôleges vonalakkal átmossa a 2. képre }
  378.               delay(2000);
  379.  
  380.               load_pcx('1.pcx');          { betölti a memóriába az 1. képet }
  381.               show_I;                     { vízszintes vonalakkal átmossa az elsô képre }
  382.               delay(2000);          
  383.  
  384.           end;  
  385.  
  386.           getpalette(pcx_palette);    { elmenti az aktuális palettát }
  387.           fadeouttoblack(pcx_palette);{ elsötétíti a képet }
  388.           load_pcx('3.pcx');          { betölti a plasma képet }
  389.           show_palette;
  390.           show_pcx;                   { kirakja a képernyôre az egész képet }
  391.           getpalette(pcx_palette);
  392.  
  393.           repeat
  394.                 turnpal;                 { forgatja a palettát }
  395.                 setpalette(pcx_palette); { megjeleníti a palettát }
  396.           until false;             
  397. end.
  398.