home *** CD-ROM | disk | FTP | other *** search
- {///////////////////////////////////////////////////////////////////////////}
- { Ca y est... je me suis décidé à mettre le source de HEADACHE 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! En fait, c'est relativement simple (une fois que l'on a visualisé
- le fichier PCX), sauf peut-être en ce qui concerne la partie graphique en
- BASM. J'ai fait un effort violent en réécrivant les routines SB pour le
- DMA entièrement en TP (à l'origine c'est en BASM et pour toute ligne IRQ
- et canal DMA, et avec une réelle détection automatique du port). 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 et en changeant les
- textes des messages...
-
- ATTENTION! le numéro de téléphone dans la démo n'est plus valable!!!...
- 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:
-
- HEADACHE.EXE 01/08/94 13264 L'exécutable utilisant HEADIMG et les HEADSEQ
- HEADACHE.PAS 01/08/94 17253 Le source principal de la démo
- SB_DMA .PAS 01/08/94 9170 Le source des routines DMA pour la SB
- HEADACHE.PCX 25/04/93 8471 L'image des sprites au format PCX
- HEADIMG .RAW 25/07/94 64768 " " " en format brut (img+pal)
- HEADSEQ .1 25/07/94 20040 Le 1er pattern digital de musique
- HEADSEQ .2 25/07/94 20168 " 2e " " " "
- HEADSEQ .3 25/07/94 20040 " 3e " " " "
- HEADSEQ .4 25/07/94 20168 " 4e " " " "
- HEADSEQ .5 25/07/94 20168 " 5e " " " "
- HEADSEQ .6 25/07/94 20168 " 6e " " " "
- HEADSEQ .7 25/07/94 20104 " 7e " " " "
- ------
- TOTAL 253782
-
- 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 }
- {///////////////////////////////////////////////////////////////////////////}
- {$R-} {$V-} {$G+}
- {$M 8000,0,270000}
- PROGRAM HEADACHE; {Le programme principal de la démo avec toutes les}
- {routines graphiques nécessaires et l'utilisation}
- {de l'unité SB_DMA pour le son digital }
-
- USES SB_DMA;
-
-
- CONST
- Taille_Seq:ARRAY[1..7] OF WORD=(19976,20104,19976,20104,20104,20104,20040);
-
- Rebond :ARRAY[1..8] OF WORD=(15,3,15,13,273,3,273,15);
-
- Palette2 :ARRAY[0..53] OF BYTE=
- (21,21,63,21,30,63,21,39,63,21,48,63,21,57,63,21,63,57,21,63,48,
- 21,63,39,21,63,30,21,63,21,21,63,30,21,63,39,21,63,48,21,63,57,
- 21,57,63,21,48,63,21,39,63,21,30,63);
-
- Trace :ARRAY[1..180] OF BYTE=
- (8,6,4,3,2,1,1,1,2,3,4,6,8,9,11,13,14,15,15,15,14,13,11,9,8,6,4,
- 3,2,2,2,3,4,6,8,9,11,13,14,14,14,13,11,9,8,6,4,3,3,3,4,6,8,9,11,
- 13,13,13,11,9,8,6,5,4,4,5,6,8,9,11,12,12,11,9,8,6,5,5,6,8,9,11,
- 11,9,8,7,6,6,7,8,9,10,10,9,8,7,7,8,9,9,8,7,8,9,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8);
-
- Trace2 :ARRAY[1..105] OF BYTE=
- (11,13,15,17,20,23,26,29,33,37,41,37,33,30,27,25,23,22,23,25,27,
- 30,33,37,41,37,35,32,30,28,27,28,30,32,35,37,41,38,35,33,32,33,
- 35,38,41,39,37,36,37,39,41,39,38,39,41,40,41,41,41,41,41,41,41,
- 41,41,41,41,41,41,41,41,41,41,41,41,41,40,39,38,37,36,35,34,33,
- 32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12);
-
- Texte :ARRAY[1..18] OF ARRAY[1..30] OF BYTE=
- ((27,27,27,27,23,5,12,3,15,13,5,27,20,15,27,1,27,14,5,23,27,9,14,
- 20,18,15,27,27,27,27),(27,27,27,6,18,15,13,27,20,8,5,27,7,18,25,
- 16,8,1,5,1,27,7,18,15,21,16,38,27,27,27),(27,20,8,9,19,27,16,9,
- 5,3,5,27,15,6,27,1,18,20,27,9,19,27,3,1,12,12,5,4,27,27),(27,50,
- 27,50,27,50,27,8,27,5,27,1,27,4,27,1,27,3,27,8,27,5,38,27,50,27,
- 50,27,50,27),(27,27,20,8,5,27,13,1,9,14,27,16,1,18,20,27,15,6,
- 27,20,8,5,27,9,14,20,18,15,27,27),(27,9,19,27,3,15,4,5,4,27,9,
- 14,27,20,21,18,2,15,27,16,1,19,3,1,12,27,35,52,28,27),(27,1,14,
- 4,27,16,1,18,20,19,27,14,5,5,4,9,14,7,27,19,15,13,5,27,19,16,5,
- 5,4,27),(27,1,18,5,27,3,15,4,5,4,27,9,14,27,1,19,13,27,42,31,28,
- 28,27,12,9,14,5,19,43,27),(20,8,5,27,9,14,20,18,15,27,8,1,19,27,
- 2,5,5,14,27,20,5,19,20,5,4,27,15,14,27,1),(27,32,36,34,4,24,31,
- 31,27,46,27,19,31,27,19,22,7,1,27,46,27,19,2,16,18,15,27,9,9,27),
- (27,27,1,14,4,27,14,15,23,27,19,15,13,5,27,7,18,5,5,20,9,14,7,
- 19,27,20,15,51,27,27),(27,27,27,27,27,27,40,40,27,6,21,20,21,18,
- 5,27,3,18,5,23,27,41,41,27,27,27,27,27,27,27),(27,27,27,27,27,
- 27,40,40,27,18,5,14,1,9,19,19,1,14,3,5,27,41,41,27,27,27,27,27,
- 27,27),(27,27,27,40,40,27,20,8,5,27,2,18,1,9,14,27,19,12,1,25,5,
- 18,19,27,41,41,27,27,27,27),(27,27,27,27,27,27,27,40,40,27,21,
- 12,20,18,1,6,15,18,3,5,27,41,41,27,27,27,27,27,27,27),(27,1,14,
- 4,27,1,12,19,15,27,20,15,27,1,12,12,27,20,8,5,27,15,20,8,5,18,
- 19,38,38,27),(15,21,18,27,16,8,15,14,5,51,27,42,31,31,47,29,43,
- 27,32,31,47,35,28,47,35,29,47,29,35,27),(27,27,27,27,27,27,27,
- 27,50,27,18,5,19,20,1,18,20,9,14,7,27,50,27,27,27,27,27,27,27,
- 27));
-
- Texte2 :ARRAY[1..245] OF BYTE=
- (224,224,224,224,224,224,224,224,224,224,184,187,180,180,177,224,
- 185,171,167,173,223,223,223,210,210,210,224,224,224,224,224,224,
- 224,224,224,224,167,187,172,224,191,178,177,172,184,187,174,224,
- 185,174,167,176,184,191,187,191,224,183,178,172,174,177,210,210,
- 210,224,224,224,224,224,224,224,224,224,224,183,172,217,173,224,
- 189,191,180,180,187,188,224,196,196,224,184,187,191,188,191,189,
- 184,187,224,194,194,224,224,224,224,224,224,224,224,224,224,189,
- 177,188,187,224,218,224,185,186,168,224,218,224,179,171,173,183,
- 189,224,190,167,224,179,177,178,191,189,210,210,210,224,224,224,
- 224,224,224,224,224,224,224,172,177,224,189,177,178,172,191,189,
- 172,224,171,173,224,216,186,174,191,178,189,187,215,198,224,216,
- 205,205,211,207,215,224,204,205,211,201,208,211,201,207,211,207,
- 201,210,210,210,224,224,224,224,224,224,224,224,224,224,173,187,
- 187,224,167,177,171,224,173,177,177,178,224,186,177,174,224,191,
- 224,178,187,169,224,173,172,171,186,186,223,223,223,224,190,167,
- 187,210,210,210,224);
-
- Taille_Txt2 = 245;
- Taille_Car = 8;
- Nbre_Cars = 256;
- Seg_Police =$0F000;
- Ofs_Police =$0FA6E;
- Seg_VGA =$0A000;
- Pos_ScrollY = 115;
- Rayon = 20;
- Parties = 45;
- Inc_Angle = 2*Pi/Parties;
- Espacement = 4;
- Nbre_CoordsX= 320 DIV Espacement;
-
-
- TYPE
- UnCar=ARRAY[1..Taille_Car] OF BYTE;
- Imptr=^img;
- img =ARRAY[0..64767] Of BYTE;
-
-
- VAR
- Chaine :STRING;
- CheminEcran :ARRAY[1..8*80] OF WORD;
- LigneCour,
- TabPosCour :Integer;
- CarsEcrits :ARRAY[1..Taille_Txt2*64] OF BYTE;
- Police :ARRAY[1..Nbre_Cars] OF UnCar;
- Secoue :BOOLEAN;
- i,j,k :WORD;
- Incr :Real;
- txt,cptxt,k1 :BYTE;
- Fic :FILE;
- img1 :imptr;
- palette :ARRAY[0..767] OF BYTE;
- res :BYTE;
- Blaster,
- ToucheAppuyee :BOOLEAN;
- Int9Vec :LongInt;
- Tmp :Pointer;
-
-
- PROCEDURE ModeVideo(Mode:BYTE);ASSEMBLER;
- ASM
- mov AH, 0
- mov AL, Mode
- int 10h
- mov AH, 15
- int 10h
- mov res, al
- END;
-
-
- PROCEDURE ActivePalette(VAR Pal; Deb,Nbre:WORD);
- BEGIN
- ASM
- push ds
- lds si, Pal
- mov dx, $3c8
- cld
- mov cx, Nbre
- mov bx, Deb
- @@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;
- END;
-
-
- PROCEDURE SynchroVert;ASSEMBLER;
- ASM
- mov dx, 03DAh
- @deb1:
- in al, dx
- test al, 08
- jne @deb1
- @deb2:
- in al, dx
- test al, 08
- je @deb2
- END;
-
-
- PROCEDURE SpriteEcran(x1,y1,larg:WORD;haut:BYTE;x2,y2,Orig:Word);ASSEMBLER;
- ASM
- push ds
- mov ds, Orig
- mov ax, 0A000h
- mov es, ax
- mov bx, x1
- mov ax, y1
- xchg ah, al
- add bx, ax
- shr ax, 2
- add bx, ax
- mov si, bx
- mov bx, x2
- mov ax, y2
- xchg ah, al
- add bx, ax
- shr ax, 2
- add bx, ax
- mov di, bx
- xor dl, dl
- mov dh, haut
- mov ax, larg
- mov bx, 320
- sub bx, ax
- shr ax, 1
- cld
- @boucle:
- inc dl
- mov cx, ax
- rep movsw
- add si, bx
- add di, bx
- cmp dl, dh
- jne @boucle
- pop ds
- END;
-
-
- PROCEDURE SpriteGeneral(x1,y1,larg:WORD;haut:BYTE;x2,y2,Orig,Dest:WORD);ASSEMBLER;
- ASM
- push ds
- mov ds, Orig
- mov es, Dest
- mov bx, x1
- mov ax, y1
- xchg ah, al
- add bx, ax
- shr ax, 2
- add bx, ax
- mov si, bx
- mov bx, x2
- mov ax, y2
- xchg ah, al
- add bx, ax
- shr ax, 2
- add bx, ax
- mov di, bx
- xor dl, dl
- mov dh, haut
- mov ax, larg
- mov bx, 320
- sub bx, ax
- shr ax, 1
- cld
- @boucle:
- inc dl
- mov cx, ax
- rep movsw
- add si, bx
- add di, bx
- cmp dl, dh
- jne @boucle
- pop ds
- END;
-
-
- PROCEDURE TexteSinus;
- LABEL Attente,Boucle1,Boucle2,Continue1,Continue2,
- Continue3,Continue4,Continue5;
- BEGIN
- ASM
- mov ax, Seg_VGA
- mov es, ax
- mov di, (Pos_ScrollY-Rayon)*320
- mov cx, 320*Rayon+320
- mov dx, 3DAh
- Attente:
- in al, dx
- test al, 08h
- jz Attente
- xor ax, ax
- rep stosw
- mov bx, LigneCour
- mov cl, 3
- shl bx, cl
- mov dx, bx
- mov ax, Nbre_CoordsX
- Boucle1:
- mov cx, 8
- Boucle2:
- cmp Byte Ptr CarsEcrits[bx], 0
- je Continue2
- push bx
- sub bx, dx
- shl bx, 1
- mov di, Word Ptr CheminEcran[bx]
- mov Byte Ptr es:[di], 243
- mov Byte Ptr es:[di+1], 245
- mov Byte Ptr es:[di+320], 245
- mov Byte Ptr es:[di+321], 243
- pop bx
- Continue2:
- inc bx
- cmp bx, (Taille_Txt2-1)*64
- jng Continue3
- xor bx, bx
- xor dx, dx
- Continue3:
- loop Boucle2
- dec ax
- jnz Boucle1
- inc LigneCour
- cmp LigneCour, (Taille_Txt2-1)*8
- jng Continue4
- mov LigneCour, 0
- Continue4:
- inc TabPosCour
- cmp TabPosCour, 245
- jng Continue5
- mov TabPosCour, 0
- Continue5:
- END;
- END;
-
-
- PROCEDURE ChangeInt9(I9Seg,I9Ofs:WORD);
- BEGIN
- ASM
- push ds
- mov ah, 35h
- mov al, 09h
- int 21h
- mov Word Ptr Int9Vec, bx
- mov Word Ptr Int9Vec[2], es
- mov ax, I9Seg
- mov ds, ax
- mov dx, I9Ofs
- mov ah, 25h
- mov al, 09h
- int 21h
- pop ds
- END;
- END;
-
-
- PROCEDURE RestaureInt9;
- BEGIN
- ASM
- push ds
- mov dx, Word Ptr Int9Vec
- mov ax, Word Ptr Int9Vec[2]
- mov ds, ax
- mov ah, 25h
- mov al, 09h
- int 21h
- pop ds
- END;
- END;
-
-
- PROCEDURE NouveauInt9;INTERRUPT;
- BEGIN
- ASM
- pushf
- call Int9Vec
- inc ToucheAppuyee
- END;
- END;
-
-
- PROCEDURE Abandon(chaine:STRING; ok:BYTE);
- BEGIN
- IF OK=1 THEN
- Close(Fic);
- ModeVideo(3);
- WriteLn(chaine);
- Halt;
- END;
-
-
- PROCEDURE RecuperePolice;
- VAR CptrNum,
- CptrByte,
- CptrMem :Integer;
- BEGIN
- CptrMem:=0;
- FOR CptrNum:=1 TO Nbre_Cars DO
- FOR CptrByte:=1 TO Taille_Car DO
- BEGIN
- Police[CptrNum][CptrByte]:=Mem[Seg_Police:Ofs_Police+CptrMem];
- Inc(CptrMem);
- END;
- END;
-
-
- PROCEDURE ConstruitTrace;
- VAR CptrY,
- CptrX,
- PtrTab :Integer;
- AngleCour:Real;
- BEGIN
- AngleCour:=Pi;
- PtrTab :=1;
- FOR CptrX:=1 TO Nbre_CoordsX DO
- BEGIN
- FOR CptrY:=1 TO 8 DO
- BEGIN
- CheminEcran[PtrTab]:=(Pos_ScrollY+Round(Rayon*sin(AngleCour)))*320
- +(CptrX-1)*Espacement+1;
- AngleCour:=AngleCour+Inc_Angle;
- Inc(PtrTab);
- END;
- AngleCour:=AngleCour-7*Inc_Angle;
- END;
- END;
-
-
- PROCEDURE ConstruitTableau;
- VAR YSCptr,XSCptr,
- Cptr,PtrTab :Integer;
- ByteTemp :BYTE;
- BEGIN
- PtrTab:=1;
- FOR Cptr:=1 TO Taille_Txt2 DO
- BEGIN
- ByteTemp:=256-Texte2[Cptr];
- FOR XSCptr:=1 TO 8 DO
- FOR YSCptr:=1 TO 8 DO
- BEGIN
- IF Mem[Seg_Police:Ofs_Police+ByteTemp*8+YSCptr-1] AND
- ($80 SHR (XSCptr-1))=0
- THEN CarsEcrits[PtrTab]:=0
- ELSE CarsEcrits[PtrTab]:=1;
- Inc(PtrTab);
- END;
- END;
- END;
-
-
- PROCEDURE Initialisations;
- BEGIN
- ModeVideo($13);
- IF res<>$13 THEN
- Abandon('Wrong video type, VGA needed!',1);
- Blaster :=True;
- RecuperePolice;
- ConstruitTableau;
- ConstruitTrace;
- LigneCour :=0;
- TabPosCour:=0;
- Assign(Fic,'HEADIMG.RAW');
- {$I-}
- Reset(Fic,1);
- {$I+}
- IF ((IOResult<>0) OR (FileSize(fic)<>64768)) THEN
- Abandon('HEADIMG.RAW is missing or corrupted!',0);
- {$I-}
- New(img1);
- {$I+}
- IF IOResult<>0 THEN
- Abandon('Not enough memory!',1);
- BlockRead(Fic,img1^,64768);
- Close(Fic);
- i:=1;
- {$I-}
- REPEAT
- Str(i,Chaine);
- Assign(Fic,'HEADSEQ.'+Chaine);
- Reset(Fic,1);
- GetMem(s[i],Taille_Seq[i]);
- WHILE ((Seg(s[i]^) SHL 4 +Ofs(s[i]^))>44500) DO {Les séquences sonores}
- BEGIN {ne doivent pas se}
- FreeMem(s[i],Taille_Seq[i]); {chevaucher sur +sieurs}
- GetMem(tmp,1); {segments! Le DMA n'aime}
- GetMem(s[i],Taille_Seq[i]); {pas vraiment ça... }
- END;
- BlockRead(Fic,s[i]^,Taille_Seq[i]);
- Close(Fic);
- Inc(i);
- UNTIL ((i>7) OR (IOResult<>0));
- {$I+}
- IF IOResult<>0 THEN Blaster:=False;
- {Affichage du titre}
- FOR i:=0 TO 767 DO
- palette[i]:=0;
- ActivePalette(palette[0],0,255);
- SpriteEcran(0,2,196,46,62,15,Seg(img1^)+Ofs(img1^));
- SpriteEcran(204,21,40,13,269,33,Seg(img1^)+Ofs(img1^));
- Move(img1^[64000],palette[0],768);
- ActivePalette(palette[0],0,255);
- END;
-
-
- PROCEDURE ApparitionBarres;
- BEGIN
- FOR i:=199 DOWNTO 193 DO
- BEGIN
- SynchroVert;
- SpriteEcran(0,176,320,200-i,0,i,Seg(img1^)+Ofs(img1^));
- END;
- i:=192;
- WHILE i>=86 DO
- BEGIN
- SynchroVert;
- SpriteEcran(0,176,320,10,0,i,Seg(img1^)+Ofs(img1^));
- Dec(i,2);
- END;
- FOR i:=199 DOWNTO 193 DO
- BEGIN
- SynchroVert;
- SpriteEcran(0,186,320,200-i,0,i,Seg(img1^)+Ofs(img1^));
- END;
- i:=192;
- WHILE i>=137 DO
- BEGIN
- SynchroVert;
- SpriteEcran(0,186,320,10,0,i,Seg(img1^)+Ofs(img1^));
- Dec(i,2);
- END;
- END;
-
-
- PROCEDURE AnimEtSon;
- BEGIN
- i :=0;
- j :=0;
- k1 :=0;
- txt :=1;
- cptxt :=0;
- secoue:=False;
- REPEAT
- Inc(i);
- UNTIL ((InitDSP(i)=True) OR (i>6));
- IF i>6 THEN Blaster:=False;
- i:=0;
- ChangeInt9(Seg(NouveauInt9),Ofs(NouveauInt9));
- IF Blaster THEN InitPlayBack(s[1],19976,11000);
- ToucheAppuyee:=False;
- REPEAT
- TexteSinus;
- Inc(k1);
- IF k1>105 THEN k1:=1;
- SpriteEcran(208,3,32,13,15,trace2[k1]+10,Seg(img1^)+Ofs(img1^));
- Inc(i);
- IF secoue=True THEN Inc(j);
- IF i=18 THEN i:=0;
- IF ((j=173) AND (secoue=True)) THEN
- BEGIN
- Inc(txt);
- IF txt>18 THEN txt:=1;
- cptxt:=0;
- secoue:=False;
- j:=0;
- END;
- k:=i*3;
- IF secoue=True THEN
- BEGIN
- FOR k:=1 TO 8 DO
- SpriteEcran(51,59+k,230,1,37+trace[k+j-1],169+k,Seg(img1^)+Ofs(img1^));
- END
- ELSE
- BEGIN
- Inc(cptxt);
- IF cptxt>30 THEN secoue:=True
- ELSE SpriteGeneral((texte[txt,cptxt]-1)*6,51,6,8,54+cptxt*7,60,
- Seg(img1^)+Ofs(img1^),Seg(img1^)+Ofs(img1^));
- END;
- UNTIL ToucheAppuyee;
- IF Blaster THEN FinPlayBack;
- Dispose(img1);
- ModeVideo($3);
- RestaureInt9;
- WriteLn('Thanks for running Headache from GRYPHAEA!');
- END;
-
-
- BEGIN
- Initialisations;
- ApparitionBarres;
- AnimEtSon;
- END.
-