home *** CD-ROM | disk | FTP | other *** search
- {$G+} {286-os utasítások használatának engedélyezése}
- program Plazma2b;
-
- uses Crt;
-
- procedure SetRGB(colnum, Red, Green, Blue: Byte); Assembler;
- asm {Egy szín RGB összetevôinek beállítása}
- mov dx, $3C8
- mov al, colnum
- out dx, al
- inc dx
- mov al, Red
- out dx, al
- mov al, Green
- out dx, al
- mov al, Blue
- out dx, al
- end;
-
- procedure Graph; Assembler; {Váltás 320x200x256 módba}
- asm
- mov ax, $13
- int $10
- end;
-
- procedure BackToText; Assembler; {Visszaváltás szöveges módba}
- asm
- mov ax, $3
- int $10
- end;
-
- var
- Paletta: Array[0..764] of Byte;
- Buff : Array[0..2] of Byte;
-
- procedure Palanim; { A paletta mozgatása }
- begin
- Move(Paletta, Buff, 3);
- Move(Paletta[3], Paletta, 762);
- Move(Buff, Paletta[762], 3);
- asm
- cld
- mov dx, $3C8
- mov al, 1
- out dx, al
- lea si, Paletta
- inc dx
- mov cx, 255*3
- rep outsb
- end;
- end;
-
- procedure Plasma; external; {$L plasma.obj}
-
- var Screen: Array[1..64000] of Byte Absolute $0A000:$0000;
-
- BEGIN
- Graph;
-
- Move(Addr(Plasma)^, Screen, SizeOf(Screen));
- Move(Ptr(Seg(Plasma), Ofs(Plasma)+SizeOf(Screen))^, Paletta, SizeOf(Paletta));
-
- repeat { Palettaanimáció }
- Palanim;
- Delay(10);
- until KeyPressed;
-
- Readkey;
- BackToText;
- END.
- (*
- Nasszóval: A PLASMA2.pas-t kicsit átírtam, hogy észrevegyük magunkat NEM
- muszály állandóan magunkkal cipelni a PLASMA.DAT-ot !!!
- Sokkal egyszerûbb, ha beépítjük azt az EXE-énkbe.
- Ezt abszolút egyszerû módon megtehetjük:
- - adott a PLASMA.DAT
- - konvertáljuk a PLASMA.DAT-ot a Pascal BINOBJ segédprogramjával olyan OBJ
- file-lá, hogy azt beszúrhassuk programunkba:
- - :\path\BINOBJ plasma.dat plasma.obj Plasma
- ^a bináris file ^ az object file ^ ilyen néven használjuk majd
- - Idáig megvolnánk, most szúrjuk be programunkba mint egy külsô procedure-át:
- procedure Plasma; external; {$L plasma.obj}
- (FIGYELEM: a plasma2b.pas befordításakor jelen KELL lennie a PLASMA.OBJ
- file-nak, viszont a PLASMA2b.EXE futtása során már NEM !
- - Most már bent van EXE-nkben a PLASMA.DAT (object -OBJ- formájában).
- A PLASMA.DAT memóriacíme = a Plasma procedure címével (Addr(Plasma))
- - Errôl a memóriacímrôl kell átmásolnunk a Screen tömbbe az adatokat.
- (Az azért még fontos, hogy a PLASMA.DAT felépítése (így a procedure Plasma
- memóriacímen elérhetô adatoknak is !) a következô:
- 64000 Byte a kép ami a képernyôre kerül és
- 765 Byte a kép palettájának hossza
- Továbbá: A Screen tömb nem más mint a video-memóriára rádeklarált változó,
- tehát ha a Screen tömbbe írunk akkor az megjelenik a képernyôn.
- - Ismerve az Addr(Plasma) címen lévô adatok sorrendjét simán átmásoljuk a
- Screen tömbbe (az-az képernyô-memóriába) a képet:
- Move(Addr(Plasma)^, Screen, SizeOf(Screen));
- ^ honnan ^ hová ^ hány Byte-ot
- A Plasma procedure címét lekérdezzük, és ezt a Pointer-t típus nélküli
- ún. buffer változóvá alakítjuk. A második paraméter: a Screen tömbbe
- akarjuk átmásolni az adatokat. Annyi Byte-ot másolunk a Screen tömbbe
- amilyen hosszú az - Byte-ban - .
- - A képpel meglennénk, már csak a paletta kell. Ezt is átmásoljuk az adott
- címrôl a Paletta változóba.
-
- Move(Ptr(Seg(Plasma), Ofs(Plasma)+SizeOf(Screen))^, Paletta, SizeOf(Paletta));
-
- Itt kicsit komplikáltabb a helyzet, hisz nekünk csak a PLASMA.DAT memória
- beli címe van meg, és tudjuk azt, hogy itt elôszôr a kép ÉS azután van
- letárolva a Paletta. No akkor számoljunk:
- Ez egyszerû lekérdezzük a Plasma procedure címét, és hozzáadjuk az offszet-
- hez a Screen változó hosszát, hiszen csak ezután következik a paletta.
- (Ugyanúgy Pointer-bôl típus nélküli változót, s annyi Byte-ot mozgatunk
- amilyen hosszú a Paletta változó.)
- - No nesze: kész is, minden változóban ott van a megfelelô adat:
- - a Screen-ben a kép
- - a Paletta-ban pedig a paletta.
- Ez olyan, mintha Blockread-del beolvasuk volna az adatot a változókba
- DE NEM kell magunkkal cipelni a PLASMA.DAT-ot, hisz ez az EXE-nkben van !
- - És még egy dolog NEHOGY valaki meghívja a:
- Plasma;
- procedure-át mert akkor meglehetôsen gyorsan lefagy, hiszen ehhez a procedure-
- ához nem utasítások, hanem adatok tartoznak a memória megfelelô címén !
-
- No ennyit a GYORS plasma-effektrôl annélkül,
- hogy magunkkal kellene cipelni a PLASMA.DAT-ot:
-
-
- eMail: R4s@CRNL-GIMN.CRNL.HU
-
- (Én -R4s- csak a PLASMA.DAT OBJ-s beszúrását írtam, a PLASMA2.pas-t pedig
- Kimmel@CRNL-GIMN.CRNL.HU irta !)
- *)