home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 March / pcx08_9703.iso / melyviz / pcx-user / demo / demo1 / no_dat / plasma2b.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-02-07  |  4.6 KB  |  132 lines

  1. {$G+} {286-os utasítások használatának engedélyezése}
  2. program Plazma2b;
  3.  
  4. uses Crt;
  5.  
  6. procedure SetRGB(colnum, Red, Green, Blue: Byte); Assembler;
  7. asm {Egy szín RGB összetevôinek beállítása}
  8.   mov  dx, $3C8
  9.   mov  al, colnum
  10.   out  dx, al
  11.   inc  dx
  12.   mov  al, Red
  13.   out  dx, al
  14.   mov  al, Green
  15.   out  dx, al
  16.   mov  al, Blue
  17.   out  dx, al
  18. end;
  19.  
  20. procedure Graph; Assembler; {Váltás 320x200x256 módba}
  21. asm
  22.   mov  ax, $13
  23.   int  $10
  24. end;
  25.  
  26. procedure BackToText; Assembler; {Visszaváltás szöveges módba}
  27. asm
  28.   mov  ax, $3
  29.   int  $10
  30. end;
  31.  
  32. var
  33.   Paletta: Array[0..764] of Byte;
  34.   Buff   : Array[0..2] of Byte;
  35.  
  36. procedure Palanim; { A paletta mozgatása }
  37. begin
  38.   Move(Paletta, Buff, 3);
  39.   Move(Paletta[3], Paletta, 762);
  40.   Move(Buff, Paletta[762], 3);
  41.   asm
  42.     cld
  43.     mov  dx, $3C8
  44.     mov  al, 1
  45.     out  dx, al
  46.     lea  si, Paletta
  47.     inc  dx
  48.     mov  cx, 255*3
  49.     rep  outsb
  50.   end;
  51. end;
  52.  
  53. procedure Plasma; external; {$L plasma.obj}
  54.  
  55. var Screen: Array[1..64000] of Byte Absolute $0A000:$0000;
  56.  
  57. BEGIN
  58.   Graph;
  59.  
  60.   Move(Addr(Plasma)^, Screen, SizeOf(Screen));
  61.   Move(Ptr(Seg(Plasma), Ofs(Plasma)+SizeOf(Screen))^, Paletta, SizeOf(Paletta));
  62.  
  63.   repeat        { Palettaanimáció }
  64.     Palanim;
  65.     Delay(10);
  66.   until KeyPressed;
  67.  
  68.   Readkey;
  69.   BackToText;
  70. END.
  71. (*
  72.  Nasszóval: A PLASMA2.pas-t kicsit átírtam, hogy észrevegyük magunkat NEM
  73.   muszály állandóan magunkkal cipelni a PLASMA.DAT-ot !!!
  74.  Sokkal egyszerûbb, ha beépítjük azt az EXE-énkbe.
  75.   Ezt abszolút egyszerû módon megtehetjük:
  76.  - adott a PLASMA.DAT
  77.  - konvertáljuk a PLASMA.DAT-ot a Pascal BINOBJ segédprogramjával olyan OBJ
  78.     file-lá, hogy azt beszúrhassuk programunkba:
  79.  - :\path\BINOBJ plasma.dat        plasma.obj         Plasma
  80.                  ^a bináris file   ^ az object file   ^ ilyen néven használjuk majd
  81.  - Idáig megvolnánk, most szúrjuk be programunkba mint egy külsô procedure-át:
  82.                 procedure Plasma; external; {$L plasma.obj}
  83.     (FIGYELEM: a plasma2b.pas befordításakor jelen KELL lennie a PLASMA.OBJ
  84.      file-nak, viszont a PLASMA2b.EXE futtása során már NEM !
  85.  - Most már bent van EXE-nkben a PLASMA.DAT (object -OBJ- formájában).
  86.    A PLASMA.DAT memóriacíme = a Plasma procedure címével (Addr(Plasma))
  87.  - Errôl a memóriacímrôl kell átmásolnunk a Screen tömbbe az adatokat.
  88.    (Az azért még fontos, hogy a PLASMA.DAT felépítése (így a procedure Plasma
  89.     memóriacímen elérhetô adatoknak is !) a következô:
  90.     64000 Byte a kép ami a képernyôre kerül és
  91.     765   Byte a kép palettájának hossza
  92.    Továbbá: A Screen tömb nem más mint a video-memóriára rádeklarált változó,
  93.     tehát ha a Screen tömbbe írunk akkor az megjelenik a képernyôn.
  94.  - Ismerve az Addr(Plasma) címen lévô adatok sorrendjét simán átmásoljuk a
  95.     Screen tömbbe (az-az képernyô-memóriába) a képet:
  96.          Move(Addr(Plasma)^, Screen, SizeOf(Screen));
  97.               ^ honnan       ^ hová  ^ hány Byte-ot
  98.    A Plasma procedure címét lekérdezzük, és ezt a Pointer-t típus nélküli
  99.     ún. buffer változóvá alakítjuk. A második paraméter: a Screen tömbbe
  100.     akarjuk átmásolni az adatokat. Annyi Byte-ot másolunk a Screen tömbbe
  101.     amilyen hosszú az - Byte-ban - .
  102.  - A képpel meglennénk, már csak a paletta kell. Ezt is átmásoljuk az adott
  103.     címrôl a Paletta változóba.
  104.  
  105.  Move(Ptr(Seg(Plasma), Ofs(Plasma)+SizeOf(Screen))^, Paletta, SizeOf(Paletta));
  106.  
  107.    Itt kicsit komplikáltabb a helyzet, hisz nekünk csak a PLASMA.DAT memória
  108.     beli címe van meg, és tudjuk azt, hogy itt elôszôr a kép ÉS azután van
  109.     letárolva a Paletta. No akkor számoljunk:
  110.    Ez egyszerû lekérdezzük a Plasma procedure címét, és hozzáadjuk az offszet-
  111.     hez a Screen változó hosszát, hiszen csak ezután következik a paletta.
  112.    (Ugyanúgy Pointer-bôl típus nélküli változót, s annyi Byte-ot mozgatunk
  113.     amilyen hosszú a Paletta változó.)
  114.  - No nesze: kész is, minden változóban ott van a megfelelô adat:
  115.    - a Screen-ben a kép
  116.    - a Paletta-ban pedig a paletta.
  117.    Ez olyan, mintha Blockread-del beolvasuk volna az adatot a változókba
  118.     DE NEM kell magunkkal cipelni a PLASMA.DAT-ot, hisz ez az EXE-nkben van !
  119.  - És még egy dolog NEHOGY valaki meghívja a:
  120.      Plasma;
  121.    procedure-át mert akkor meglehetôsen gyorsan lefagy, hiszen ehhez a procedure-
  122.    ához nem utasítások, hanem adatok tartoznak a memória megfelelô címén !
  123.  
  124.    No ennyit a GYORS plasma-effektrôl annélkül,
  125.     hogy magunkkal kellene cipelni a PLASMA.DAT-ot:
  126.  
  127.  
  128.                                                  eMail: R4s@CRNL-GIMN.CRNL.HU
  129.  
  130.    (Én -R4s- csak a PLASMA.DAT OBJ-s beszúrását írtam, a PLASMA2.pas-t pedig
  131.    Kimmel@CRNL-GIMN.CRNL.HU irta !)
  132. *)