Created
November 15, 2014 13:06
-
-
Save javiercampos/4f7cabad0de55fe7181a to your computer and use it in GitHub Desktop.
1997's Anal Raid
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <math.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <conio.h> | |
#include <malloc.h> | |
#include <mem.h> | |
typedef unsigned char byte; | |
typedef unsigned int word; | |
typedef unsigned long dword; | |
extern byte tunnel[]; | |
extern byte image[]; | |
extern byte image_pal[]; | |
extern byte image_tt[]; | |
byte *vga=(byte *)0xA0000; | |
void vgaSetMode(int mode); | |
#pragma aux vgaSetMode = \ | |
"xor ah,ah" \ | |
"int 10h" \ | |
parm [eax] \ | |
modify exact [eax]; | |
void vgaClearScreen(byte *buffer); | |
#pragma aux vgaClearScreen = \ | |
"mov ecx,16000" \ | |
"cld" \ | |
"xor eax,eax" \ | |
"rep stosd" \ | |
parm [edi] \ | |
modify exact [eax ecx edi]; | |
void vgaCopyScreen(byte *buffer, byte *dest); | |
#pragma aux vgaCopyScreen = \ | |
"mov ecx,16000" \ | |
"cld" \ | |
"rep movsd" \ | |
parm [esi] [edi] \ | |
modify exact [ecx esi edi]; | |
void vgaWaitVR(void); | |
#pragma aux vgaWaitVR = \ | |
"mov dx,03DAh" \ | |
"vr:" \ | |
"in al,dx" \ | |
"test al,8" \ | |
"jz vr" \ | |
modify exact [eax edx]; | |
void vgaWaitNoVR(void); | |
#pragma aux vgaWaitNoVR = \ | |
"mov dx,03DAh" \ | |
"nvr:" \ | |
"in al,dx" \ | |
"test al,8" \ | |
"jnz nvr" \ | |
modify exact [eax edx]; | |
void vgaSetPalette(byte *palette); | |
#pragma aux vgaSetPalette = \ | |
"xor al,al" \ | |
"mov dx,03C8h" \ | |
"out dx,al" \ | |
"inc dx" \ | |
"mov ecx,768" \ | |
"rep outsb" \ | |
parm [esi] \ | |
modify exact [eax ecx edx]; | |
void vgaSetRGB(int color, int r, int g, int b); | |
#pragma aux vgaSetRGB = \ | |
"mov dx,03C8h" \ | |
"out dx,al" \ | |
"inc dx" \ | |
"mov al,bl" \ | |
"out dx,al" \ | |
"mov al,cl" \ | |
"out dx,al" \ | |
"mov eax,esi" \ | |
"out dx,al" \ | |
parm [eax] [ebx] [ecx] [esi] \ | |
modify exact [eax edx]; | |
/* | |
void draw_image_tunnel(byte offs1,byte offs2,byte *buffer,byte *tuntab,byte *texture); | |
#pragma aux draw_image_tunnel=\ | |
"mov ecx,64000"\ | |
"mov ebp,ebx"\ | |
"xor ebx,ebx"\ | |
"_loop:"\ | |
"mov bx,[esi]"\ | |
"add bl,dl"\ | |
"add bh,dh"\ | |
"mov al,[edi+ebx]"\ | |
"mov bl,al"\ | |
"mov bh,[ebp]"\ | |
"mov al,image_tt[ebx]"\ | |
"mov [ebp],al"\ | |
"add ebp,1"\ | |
"add esi,2"\ | |
"dec ecx"\ | |
"jnz _loop"\ | |
parm [dh] [dl] [ebx] [esi] [edi]\ | |
modify [eax ebx ecx edx]; | |
*/ | |
void draw_image_tunnel(byte offs1,byte offs2,byte *buffer,byte *tuntab,byte *texture); | |
#pragma aux draw_image_tunnel=\ | |
"mov ecx,64000"\ | |
"mov ebp,ebx"\ | |
"ror edx,16"\ | |
"xor dx,dx"\ | |
"ror edx,16"\ | |
"xor ebx,ebx"\ | |
"_loop:"\ | |
"mov bx,[esi]"\ | |
"shr bx,8"\ | |
"mov bx,[esi]"\ | |
"add bl,dl"\ | |
"add bh,dh"\ | |
"mov al,[edi+ebx]"\ | |
"mov [ebp],al"\ | |
"add ebp,1"\ | |
"add esi,2"\ | |
"dec ecx"\ | |
"jnz _loop"\ | |
parm [dh] [dl] [ebx] [esi] [edi]\ | |
modify [eax ebx ecx edx]; | |
void CalcRadiusTable_Perspect(void) { | |
long i,j,rad; | |
for (j=-100;j<100;j++) { | |
for (i=-160;i<160;i+=2) { | |
rad=sqrt((i*i)+(j*j)); | |
rad=1*32*pow((float)(256*1024*rad), 0.1); | |
tunnel[801+(j+100)*320+((i+160)/2)*2]=rad & 255; | |
} | |
} | |
} | |
void CalcRadiusTable_Freaky(void) { | |
long i,j,rad; | |
for (j=-100;j<100;j++) { | |
for (i=-160;i<160;i+=2) { | |
rad=sqrt((i*i)+(j*j)); | |
rad=1*32*pow((float) (256*1024*rad), 0.1); | |
rad+=48*2*sin(tunnel[800+(j+100)*320+((i+160)/2)*2]*6.284/(256/1.0)); | |
tunnel[801+(j+100)*320+((i+160)/2)*2]=rad & 255; | |
} | |
} | |
} | |
void CalcRadiusTable_Freaky2(void) { | |
long i,j,rad; | |
for (j=-100;j<100;j++) { | |
for (i=-160;i<160;i+=2) { | |
rad=sqrt((i*i)+(j*j)); | |
rad=1*32*pow((float) (256*1024*rad), 0.1); | |
rad+=32*sin(rad*6.284/64); | |
tunnel[801+(j+100)*320+((i+160)/2)*2]=rad & 255; | |
} | |
} | |
} | |
/*---------------------------------------------------------------------------*/ | |
void CalcAngleTable(void) { | |
float x,y, angle; | |
long i,j; | |
for (j=-100;j<100;j++) { | |
for (i=-160;i<160;i+=2) { | |
x=i; | |
y=j; | |
angle=atan2(y,x); | |
angle*=128/3.141592654; | |
tunnel[800+(j+100)*320+((i+160)/2)*2]=((long) angle) & 255; | |
} | |
} | |
} | |
void CalcAngleTable_Twist(void) { | |
float x,y, angle; | |
long i,j; | |
for (j=-100;j<100;j++) { | |
for (i=-160;i<160;i+=2) { | |
x=i; | |
y=j; | |
angle=atan2(y,x); | |
angle*=(256/6.284); | |
tunnel[800+(j+100)*320+((i+160)/2)*2]=(tunnel[801+(j+100)*320+((i+160)/2)*2]/3+((long) angle)) & 255; | |
} | |
} | |
} | |
void main(void) { | |
byte offs1=0; | |
byte offs2=0; | |
int spd=1; | |
byte key=0; | |
vgaSetMode(0x13); | |
// CalcAngleTable(); | |
// CalcRadiusTable_Perspect(); | |
vgaCopyScreen(&tunnel[0],vga); | |
getch(); | |
vgaSetPalette(&image_pal[0]); | |
while (key!=27) { | |
key=0; | |
if (kbhit()) { | |
key=getch(); | |
if (!key) getch(); | |
if (key=='+') spd++; | |
if (key=='-') spd--; | |
} | |
draw_image_tunnel(offs1,offs2,vga,&tunnel[0],&image[0]); | |
offs1+=spd; | |
// offs2+=spd; | |
// vgaSetRGB(0,0,0,0); | |
vgaWaitNoVR(); | |
vgaWaitVR(); | |
// vgaSetRGB(0,26,0,0); | |
} | |
vgaSetMode(0x3); | |
while (kbhit()) getch(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment