331 lines
7.6 KiB
Plaintext
331 lines
7.6 KiB
Plaintext
#include <dos.h>
|
||
#include <conio.h>
|
||
#include <stdio.h>
|
||
#include <alloc.h>
|
||
#include <math.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <time.h>
|
||
|
||
char far *VidRam = MK_FP( 0xA000, 0);
|
||
|
||
typedef struct
|
||
{
|
||
int x, y;
|
||
char ndigitos;
|
||
char AX, AY;
|
||
unsigned char C1, C2, C3;
|
||
} p_graphics;
|
||
|
||
char Reverse = 0;
|
||
|
||
void Letras_en_espiral( char *Frase, p_graphics *FA );
|
||
void writepixel( int x, int y, char color );
|
||
void asigna_modo_video(char modo); /* asigna el modo de v¡deo indicado */
|
||
void LeeFuentes(char *file);
|
||
|
||
char *ptr_char;
|
||
double grad, pi;
|
||
double ia=3; /*incremento ngulo*/
|
||
double ir=0.3; /*incremento radio*/
|
||
int key;
|
||
|
||
void main( int argc, char *argv[] )
|
||
{
|
||
clock_t tiempo;
|
||
char up_down = 1;
|
||
|
||
char Texto[255];
|
||
/* .. */
|
||
p_graphics Text1 = { 0, 84, 48, 1, 1, 0, 15, 15 };
|
||
|
||
pi = 4.0*atan(1.0);
|
||
grad = pi/180.0;
|
||
|
||
if( argc != 2 )
|
||
strcpy( Texto, "<-- ESPIRAL --><-- ESPIRAL --><-- ESPIRAL --><-- ESPIRAL --><-- ESPIRAL -->" );
|
||
else
|
||
strcpy( Texto, argv[2] );
|
||
|
||
if( argc != 3 ) LeeFuentes("comix.fnt"); else LeeFuentes(argv[1]);
|
||
|
||
|
||
/* Load Mod, and begin to play... */
|
||
|
||
|
||
/* While Sound up, J&D down and up until BOOM!! */
|
||
|
||
|
||
/* When 2nd BOOM!! will sound, J&D was join and change VidMode */
|
||
|
||
asigna_modo_video(0x13);
|
||
/* Swap to graphic mode and show TextSpiral while background is flicking */
|
||
/*
|
||
tiempo = clock() / CLK_TCK;
|
||
while( ( (clock()/CLK_TCK) - tiempo) <= 15 && !kbhit())
|
||
Letras_en_espiral( Texto, &Text1 );
|
||
*/
|
||
ia += 30;
|
||
|
||
while( 1 )
|
||
{
|
||
delay(50);
|
||
|
||
if ( kbhit() )
|
||
{
|
||
|
||
if( (key=getch()) == 27 ) break;
|
||
else
|
||
{
|
||
/* memset( VidRam, 0, 64000);*/
|
||
Text1.C1 = 255;
|
||
Letras_en_espiral( Texto, &Text1 );
|
||
Text1.C1 = 0;
|
||
switch( key )
|
||
{
|
||
case 'r':
|
||
case 'R':
|
||
Reverse = !Reverse;
|
||
break;
|
||
case 'a':
|
||
case 'A':
|
||
ia += 0.5;
|
||
break;
|
||
case 's':
|
||
case 'S':
|
||
ia -=0.5;
|
||
break;
|
||
case 'z':
|
||
case 'Z':
|
||
ir +=0.5;
|
||
break;
|
||
case 'x':
|
||
case 'X':
|
||
ir -=0.5;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
Text1.C1 = 255;
|
||
Letras_en_espiral( Texto, &Text1 );
|
||
Text1.C1 = 0;
|
||
/* ia 3 __ -3.5 */
|
||
if ( up_down==1 ) ia -= 0.1;
|
||
else ia += 0.1;
|
||
if ( ia <= -3.5 ) up_down = 0;
|
||
if ( ia >= 3 ) up_down = 1;
|
||
|
||
|
||
/* Letras_en_espiral( "abcdefghijklmn¤opqrstuvwxyz ABCDEFGHIJKLMN¥OPQRSTU... 0123456789", &Text1 );*/
|
||
Letras_en_espiral( Texto, &Text1 );
|
||
}
|
||
|
||
asigna_modo_video(0x3);
|
||
printf("La fuente utilizada fue: %s\n", argv[2]);
|
||
getch();
|
||
free(ptr_char);
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
void Letras_en_espiral( char *Frase, p_graphics *FA )
|
||
{
|
||
static char vez_ptr = 0;
|
||
|
||
static char FraseBit[110][16];
|
||
static char Frase1[100];
|
||
static unsigned int Flen;
|
||
static char Flen1;
|
||
static char RLen;
|
||
|
||
char cont;
|
||
int i;
|
||
char j, j1;
|
||
|
||
char c_elec;
|
||
char bit_s;
|
||
char *Frase_seg;
|
||
|
||
char FrBit_tmp[16];
|
||
unsigned seg, off;
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
double r; /*radio*/
|
||
/* double ia; */ /*incremento ngulo*/
|
||
/* double ir;*/ /*incremento radio*/
|
||
double s,c; /*seno y coseno actuales <2>*/
|
||
double ca; /*coseno anterior*/
|
||
double isin,icos; /*incremento seno y coseno*/
|
||
int x,y;
|
||
/*
|
||
ia = 3;
|
||
ir = 0.3;
|
||
*/
|
||
isin = sin(ia*grad);
|
||
icos = cos(ia*grad);
|
||
r = 0.0; /*parte del centro*/
|
||
s = sin(0.0); /*con ngulo 0 grados*/
|
||
c = cos(0.0);
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
|
||
Frase_seg = Frase1;
|
||
|
||
if ( !vez_ptr )
|
||
{
|
||
vez_ptr = 1;
|
||
/* Now, we going to get 8x8 Font dir. */
|
||
/*
|
||
asm mov AH, 0x11
|
||
asm mov AL, 0x30
|
||
asm mov BH, 0x03
|
||
asm int 0x10
|
||
asm mov seg, ES
|
||
asm mov off, BP
|
||
*/
|
||
}
|
||
|
||
if ( strcmp( Frase1, Frase ) != 0 )
|
||
{
|
||
strncpy( Frase1, Frase, 99 );
|
||
Frase1[99] = '\0';
|
||
j = i = strlen( Frase );
|
||
Flen = i * 8;
|
||
cont = 0;
|
||
|
||
if ( i < FA -> ndigitos )
|
||
i += FA -> ndigitos - i;
|
||
else
|
||
i += 5;
|
||
|
||
Flen1 = i;
|
||
|
||
/* // Almacenamos en la Frase a Bit's la FRASE A BIT'S */
|
||
while( cont <= i )
|
||
{
|
||
/* // Descomponemos cada caracter en un patron de BIT's */
|
||
if ( (cont - j) > 0 )
|
||
{
|
||
FraseBit[cont][0] = 0x00; FraseBit[cont][1] = 0x00;
|
||
FraseBit[cont][2] = 0x00; FraseBit[cont][3] = 0x00;
|
||
FraseBit[cont][4] = 0x00; FraseBit[cont][5] = 0x00;
|
||
FraseBit[cont][6] = 0x00; FraseBit[cont][7] = 0x00;
|
||
} else {
|
||
for( j1=0; j1<16; j1++)
|
||
FraseBit[cont][j1]= ptr_char[ ( *Frase_seg ) * 16 + j1 ];
|
||
}
|
||
cont++;
|
||
Frase_seg++;
|
||
}
|
||
} else {
|
||
/*
|
||
// Rotamos la frase
|
||
// Almacenamos el 1er bit que vamos a perder...
|
||
*/
|
||
for ( j1=0; j1<16; j1++ )
|
||
FrBit_tmp[j1] = 0x01 & ( FraseBit[0][j1] >> 7 );
|
||
|
||
for ( j=0; j<Flen1; j++ )
|
||
{
|
||
for ( j1=0; j1<16; j1++ )
|
||
FraseBit[j][j1] = FraseBit[j][j1] << 1;
|
||
|
||
for ( j1=0; j1<16; j1++ )
|
||
FraseBit[j][j1] = ( FraseBit[j][j1] & 0xFE ) | (0x01 & (FraseBit[j+1][j1] >> 7 ) );
|
||
}
|
||
for ( j1=0; j1<16; j1++ )
|
||
FraseBit[Flen1-1][j1] = ( FraseBit[Flen1-1][j1] & 0xFE ) | FrBit_tmp[j1];
|
||
}
|
||
|
||
/*// ndigitos --> m x. = 40*/
|
||
for ( i=0; i < FA->ndigitos; i ++ )
|
||
{
|
||
for ( j=0, j1=0; j1<8; j+=2*FA->AX, j1++ )
|
||
{
|
||
/*
|
||
// Analizamos el patron de BIT's y lo imprimimos
|
||
// FraseBit[cont][0]
|
||
// ^ ^----- N£mero de byte del digito ( 8x8 )
|
||
// |_________ N£mero de digito alfa-numerico
|
||
*/
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
if( r < 250 )
|
||
{
|
||
ca = c;
|
||
|
||
c = c*icos-s*isin;
|
||
s = s*icos+ca*isin;
|
||
x = 160+(int)(floor(r*c*1.2+0.5));
|
||
y = 100+(int)(floor(r*s+0.5));
|
||
|
||
r += ir;
|
||
}
|
||
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
/*ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ*/
|
||
for ( bit_s = 0; bit_s < 16; bit_s++ )
|
||
{
|
||
if ( FraseBit[i][bit_s] & ( (char)0x01 << (7-j1) ) ) c_elec = FA->C2; else c_elec = FA->C1;
|
||
/* writepixel( ( FA->x + j + i*8*2*FA->AX ), ( FA->y + 2*bit_s*FA->AY ), c_elec );*/
|
||
|
||
if( !Reverse )
|
||
{
|
||
if ( c_elec == FA->C2 ) c_elec = r;
|
||
} else {
|
||
if ( c_elec == FA->C1 ) c_elec = r;
|
||
else
|
||
c_elec = FA->C1;
|
||
}
|
||
if ( FA->C1==255 ) c_elec=0;
|
||
/* writepixel( x,y+bit_s*2, c_elec ); */writepixel( x, y+bit_s*2, c_elec );
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
void writepixel( int x, int y, char color )
|
||
{
|
||
if ( x>=0 && x<320 && y>=0 && y<200 )
|
||
*(VidRam + (x + y*320) ) = color;
|
||
}
|
||
|
||
void asigna_modo_video(char modo) /* asigna el modo de v¡deo indicado */
|
||
{ /* en la variable "modo" */
|
||
union REGS ent, sal;
|
||
|
||
ent.h.al = modo;
|
||
ent.h.ah = 0;
|
||
int86(16, &ent, &sal); /* funci¢n para asignar el modo de video */
|
||
}
|
||
|
||
void LeeFuentes(char *file)
|
||
{
|
||
FILE *fich;
|
||
/* Reservamos 4 Kb. para cargar la fuente en memoria */
|
||
|
||
if((ptr_char=(char *)malloc(4096))==NULL) {
|
||
printf(" No hay suficiente memoria !!\n");
|
||
exit (1);
|
||
}
|
||
|
||
/* Abrimos el fichero de la fuente */
|
||
|
||
if ((fich=fopen(file,"rb"))==NULL) {
|
||
printf("\a\nArchivo %s no encontrado.\n",file);
|
||
free(ptr_char);
|
||
exit(1);
|
||
}
|
||
|
||
fseek(fich, SEEK_SET, 0); /* Nos colocamos al principio del fichero */
|
||
fread(ptr_char,1,4096,fich); /* Cargamos en memoria 4096 bytes del fichero */
|
||
fclose(fich); /* Cerramos el fichero */
|
||
}
|
||
|
||
|
||
|