home *** CD-ROM | disk | FTP | other *** search
- {///////////////////////////////////////////////////////////////////////////}
- { Ca y est... je me suis décidé à mettre le source de PLASMA dans le
- domaine public! A mon point de vue, c'est un petit programme assez peu
- important, mais c'est a priori c'est susceptible d'intéresser quelques uns
- d'entre vous. Ceux-ci sont évidemment curieux de savoir comment "ça"
- marche! Le player AdLib 9 voix (2 pour le morceau ici présent) est
- NonaLiza; pour comprendre son utilisation, le système d'écriture de
- morceaux, doc, etc... se reporter au SBAL_Kit chez DP Tool par exemple, ou
- alors m'envoyer 50F et vous aurez alors toutes les infos nécessaires et
- les divers programmes utilitaires (tous les sources sont fournis). Voilà!,
- sachez donc tirer profit de ce petit cadeau et évitez de faire partie du
- club très large des LAMERS en "pompant" bêtement le code...
-
- Pour de plus amples informations, d'éventuelles suggestions, ou tout
- simplement pour le fun, vous pouvez m'écrire à l'adresse suivante:
-
- Patrick Ruelle
- 43, av. de Grande Bretagne
- 98000 Monaco
- Principauté de Monaco
-
- Evidemment je n'ai pas pris la décision de diffuser ce source dans le
- but de demander de l'argent, mais il va de soit que toutes sortes de dons
- sont acceptés (carte postale, matos, argent, spécialités locales, docs,
- etc...). N'oubliez pas non plus que cette diffusion ne m'enlève nullement
- mes droits d'auteur de cette mmm... de démo; ce petit package peut être
- diffusé librement à condition de rester sous sa forme initiale:
-
- PLASMA .EXE 03/08/94 12624 L'exécutable de la démo
- PLASMA .PAS 03/08/94 8994 Le source de la démo
- NONALIZA.PAS 11/04/94 13108 Le player AdLib au format FM9
- PLASMA01.PAL 03/03/93 768 La palette du fire plasma
- PLASMA02.PAL 03/03/93 768 " " " wave plasma
- PLASMA .FM9 18/05/94 3036 La musique 2 voix FM (de J.S.Bach)
- ------
- TOTAL 39298
-
- La version actuelle est remaniée exprès pour la diffusion de ce package,
- mais en fait ce programme date de début 1993...
-
- Patrick Ruelle (Monac) / GRYPHAEA }
- {///////////////////////////////////////////////////////////////////////////}
- {$M 16000,0,100000}
- {$A-,B-,D-,E-,F+,G+,I-,L-,N-,O-,R-,S-,V-,X-}
- PROGRAM PLASMA;
-
- USES NONALIZA,Crt;
-
- CONST
- ys : BYTE = 0;
- yt : BYTE = 255;
- exactitude = 100;
- vitesse = 1;
- precision = 1.0-(exactitude/100);
- VerticalAmpli = 70;
- HorizAmpli = 90;
- MaxHoriz = 400;
- periode = 320;
-
-
- TYPE
- wavetype = ARRAY[0..(1+periode*3)] OF ShortInt;
- HorizType = ARRAY[0..MaxHoriz] OF Integer;
-
-
- VAR
- ft :ARRAY [0..512] OF BYTE;
- sint :ARRAY [0..256] OF BYTE;
- i1,a,b,d,c,od,color,e,y:BYTE;
- x,k,i :WORD;
- tabl_pal :ARRAY[0..767] OF BYTE;
- sav_adder :Integer;
- refwave :wavetype;
- NbImg :Integer;
- Horiz :horiztype;
- compteur :Integer;
- di_addr :Integer;
- aux :Integer;
- decal_factor :Integer;
- decal_horiz1 :WORD;
- decal_horiz2 :Integer;
- touche :CHAR;
-
-
- PROCEDURE Active_Palette(VAR pal);ASSEMBLER;
- ASM
- push ds
- lds si, pal
- mov dx, $3c8
- cld
- mov cx, 256
- mov bx, 0
- @@1:
- mov al, bl
- out dx, al
- inc dx
- lodsb
- out dx, al
- lodsb
- out dx, al
- lodsb
- out dx, al
- dec dx
- inc bl
- loop @@1
- pop ds
- END;
-
-
- PROCEDURE MakeScreen(VAR onde:ShortInt;adder:Integer;VAR decal:HorizType);ASSEMBLER;
- ASM
- push bp
- mov ax, adder
- sub ax, 2
- mov sav_adder, ax
- lds si, onde
- mov ax, 0A000h
- mov es, ax
- mov compteur, 160
- mov bx, decal_factor
- mov ax, 320
- mul bx
- neg ax
- mov di_addr, ax
- mov dx, 0101h
- mov ax, word ptr decal
- sal bx, 1
- add ax, bx
- mov aux, ax
- mov ah, [si]
- mov al, ah
- @@1:
- mov bp, sav_adder
- lodsw
- add ax, [ds:si+bp]
- mov bp, aux
- mov di, di_addr
- add di_addr, 2
- mov cx, 100
- @@2:
- mov bx, ds:[bp]
- add bp, 2
- mov es:[di+bx], ax
- add ax, dx
- loop @@2
- dec compteur
- jnz @@1
- pop bp
- END;
-
-
- PROCEDURE MakeRefWave;
- BEGIN
- FOR i:=0 TO 1+periode*3 DO
- refwave[i]:=ShortInt(Round(VerticalAmpli*(Sin(i*6.283185/periode))));
- END;
-
-
- FUNCTION Arrondi(a:Real):Integer;
- BEGIN
- IF ABS(2*Round(a/2)-a)<precision THEN
- Arrondi:=2*Round(a/2)
- ELSE
- Arrondi:=Round(a);
- END;
-
-
- PROCEDURE MakeHorizWave;
- BEGIN
- FOR i:=0 TO MaxHoriz DO
- Horiz[i]:=i*320+Arrondi((HorizAmpli*(0.5+0.5*Sin(i*0.0314159))));
- END;
-
-
- PROCEDURE ChargePalette(nomfic:STRING);
- VAR couleur:FILE;
- BEGIN
- {$I-}
- Assign(couleur,nomfic);
- Reset(couleur,1);
- BlockRead(couleur,tabl_pal,768);
- Close(couleur);
- {$I+}
- IF IOResult<>0 THEN
- BEGIN
- TextMode(CO80);
- WriteLn('erreur concernant le fichier ',nomfic);
- Halt;
- END;
- END;
-
-
- PROCEDURE CalculeTables;
- VAR i:WORD;
- BEGIN
- FOR i:=0 TO 512 DO
- ft[i]:=Round(64+63*Sin(i/81.48));
- FOR i:=0 TO 256 DO
- sint[i]:=Round(128+20*Sin(i/10.18));
- END;
-
-
- PROCEDURE Initialisations;
- BEGIN
- MakeRefWave;
- MakeHorizWave;
- CalculeTables;
- WriteLn('Fire Plasma & Wave Plasma...');
- WriteLn('Appuyer sur une touche pour alterner la séquence (ESC=Quitter)');
- Delay(3000);
- ASM
- mov al, ys
- mov y, al
- mov ax, 0013h
- int 10h
- mov dx, 3d4h
- mov al, 9
- out dx, al
- inc dx
- in al, dx
- and al, 0e0h {et oui! on est en 320x100 et en 256 couleurs...}
- add al, 3 {c'est moins gourmant en calculs que le 320x200!}
- out dx, al
- END;
- END;
-
-
- PROCEDURE Plasma_Feu;
- BEGIN
- ChargePalette('PLASMA01.PAL');
- FillChar(MEM[$A000:$0],32000,0);
- Active_Palette(tabl_pal);
- ASM
- @3:
- inc i1
- sub c, 2
- inc od
- mov al, od
- mov d, al
- mov al, ys
- mov ah, yt
- xchg al, ah
- mov ys, al
- mov ah, yt
- mov y, al
- @2:
- mov al, y
- mov bx, 320
- mul bx
- mov bx, ax
- mov al, y
- xor ah, ah
- and al, 1
- add ax, bx
- mov k, ax
- mov al, i1
- xor ah, ah
- and al, 1
- xor ah, ah
- mov bx, 320
- mul bx
- mov bx, k
- sub bx, ax
- mov k, bx
- mov al, d
- inc al
- inc al
- mov d, al
- mov al, c
- add al, y
- and ax, 255
- mov di, offset sint
- add di, ax
- mov al, ds:[di]
- mov a, al
- mov di, offset sint
- mov al, d
- and al, 255
- add di, ax
- mov al, ds:[di]
- mov b, al
- xor ax, ax
- xor bx, bx
- xor cx, cx
- @1:
- mov di, offset ft
- mov al, a
- add al, b
- add di, ax
- mov al, ds:[di]
- mov bx, ax
- inc bx
- mov di, offset ft
- mov al, y
- add al, b
- add di, ax
- mov ax, ds:[di]
- add ax, bx
- mov color, al
- mov bx, 0a000h
- mov es, bx
- mov di, k
- mov es:[di], al
- mov al, b
- inc al
- inc al
- mov b, al
- mov ax, k
- inc ax
- inc ax
- mov k, ax
- xor ah, ah
- mov al, color
- shr al, 7
- inc al
- xor ah, ah
- mov bl, al
- mov al, a
- add al, bl
- mov a, al
- inc cx
- cmp cx, 160
- jnz @1
- inc y
- cmp y, 101
- jnz @2
- mov ah, 01h
- int 16h
- jz @3
- END;
- touche:=ReadKey;
- END;
-
-
- PROCEDURE Plasma_Vague;
- BEGIN
- IF touche<>#27 THEN
- BEGIN
- ChargePalette('PLASMA02.PAL');
- decal_factor:=0;
- decal_horiz1:=0;
- decal_horiz2:=0;
- FillChar(MEM[$A000:$0],32000,0);
- Active_Palette(tabl_pal);
- MemW[$40:$1A]:=MemW[$40:$1C];
- REPEAT
- Inc(decal_horiz1,-1*vitesse);
- WHILE decal_horiz1 > periode DO
- inc(decal_horiz1,periode);
- inc(decal_horiz2,1*vitesse);
- WHILE decal_horiz2 > periode DO
- dec(decal_horiz2,periode);
- inc(decal_factor,1*vitesse);
- WHILE decal_factor > 199 DO
- decal_factor:=decal_factor-200;
- makescreen(refwave[decal_horiz1],decal_horiz2,Horiz);
- UNTIL KeyPressed;
- touche:=ReadKey;
- END;
- END;
-
-
- BEGIN
- IF Load_Music('PLASMA.FM9')=0 THEN;
- Initialisations;
- Start_Music;
- REPEAT
- Plasma_Feu;
- Plasma_Vague;
- UNTIL touche=#27;
- Stop_Music;
- TextMode(CO80);
- END.