un Tweak de la carte VGA pour produire des flammes inspiré d'un code en assembleur par DenthoRof Asphyxia
Source / Exemple :
#include <dos.h>
#include <mem.h>
#include <alloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "320x200p.c"
extern FirePal[];
extern firerandom();
ouports();
void grtwfire(unsigned char *reals,unsigned char *virts,int virtl)
{
unsigned char * realscrn ;
unsigned char * virtscrn ;
realscrn = reals;
virtscrn = virts;
int x,y,z,v,I, lastMode;
int itmp;
regptr rarray;
rarray = Mode320x200 ;
memset(virtscrn,0,virtl);
memset(realscrn,0,32767);
_AH = 0x0f;
geninterrupt(0x10);
lastMode = _AL;
_AX = 0x13;
geninterrupt(0x10);
/////////////////////////
outportb(0x3D4,0x11) ; //Enable Vga Mode
v=inportb(0x3D5)&0x7f;
outportb(0x3d4,0x11) ;
outportb(0x3d5,v);
for (int i = 0;i<25;i++)
{
outports((*rarray++));
}
outpw (0x3C4,0x0F02); // Enable all plane
////////////////////////
/* outpw (0x3C4,0x0604);// //unchained mode
outpw (0x3C4,0x0F02); // Enable all plane
outpw (0x3D4,0x0014);// Disable Dword Mode
outpw (0x3D4,0xE317); //enable byte mode
outpw (0x3D4,0x0409); //set cell height */
///////////////////////////////////////////
outp(0x3c8, 0); // start with color 0
for (y = 0; y<768; y++)
{
outp(0x3c9, FirePal[y] );
}
///////////////////////////////////////////
//mainloop
do
{
I = virtl-80;
//nouvell ligne
for (int i =0;i<80;i++) {
virtscrn[I+i]=firerandom();}
//average moyenne
I = 80;
for (i=0 ;i< virtl-80;i++)
{
itmp = virtscrn[I+i] ;
itmp+=virtscrn[I+i+1];
itmp+=virtscrn[I+i-1] ;
itmp+=virtscrn[I+i+80];
unsigned char itmpc = itmp>>2 ;
if(!(itmpc)==0)itmpc--;
virtscrn[I+i-80] = itmpc;
}
//affichage
do {}
while(inportb(0x3DA)&0x08);
do {}
while(!inportb(0x3DA)&0x08);
delay(18);
memcpy(realscrn,virtscrn,virtl);
}while (!kbhit());
getch();
_AX = lastMode;
geninterrupt(0x10);
//delete rarray;
return ;
}
//outports function
outports (regstrc r)
{
switch (r.regp)
{
case 0x3c0: //Attribut Controller
inportb(0x3da);
outportb(0x3c0,r.regi|0x20);
outportb(0x3c0,r.regv);
break;
case 0x3c2: //Miscellaneous reg
outportb(r.regp,r.regv);
break; //3c2
default: //0x3c4,0x3d4,0x3ce
outportb(r.regp,r.regi);
outportb(r.regp+1,r.regv);
break;
}
}
Conclusion :
elboré sous turbo C ++ 3.00,pour carte VGA
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.