Skip to content

Instantly share code, notes, and snippets.

@javiercampos
Created November 15, 2014 13:06
Show Gist options
  • Save javiercampos/4f7cabad0de55fe7181a to your computer and use it in GitHub Desktop.
Save javiercampos/4f7cabad0de55fe7181a to your computer and use it in GitHub Desktop.
1997's Anal Raid
#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