Last active
April 18, 2025 04:08
-
-
Save sgermain06/18fa9c0e0ff0935f3e21922f78cda9b9 to your computer and use it in GitHub Desktop.
FIRE.C
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
/** | |
* Turbo C implementation of https://gist.github.com/specht/7c3fd49400643d923c66de88a272f5e5 | |
*/ | |
#include <conio.h> | |
#include <math.h> | |
#include <stdlib.h> | |
#include "vga.h" | |
void fire(int x1, int y1, int x2, int y2) { | |
int x, y, z; | |
for (y = y1; y <= y2; y++) { | |
for (x = x1; x <= x2; x++) { | |
z = getPixel(x, y + 1) * 2 + | |
getPixel(x + 1, y) + | |
getPixel(x - 1, y); | |
z = (int)floor(z / 4); | |
// Add random noise | |
if (z > 0) z = z + random(7) - 3; | |
// Clipping | |
if (z < 0) z = 0; | |
if (z > 63) z = 63; | |
setPixel(x, y, z); | |
} | |
} | |
} | |
void main() { | |
int i = 0; | |
int heat = 10; | |
char quit = 0; | |
char c; | |
setMode(0x13); | |
clear(); | |
for (i = 0; i <= 15; i++) { | |
setPalette(i, i * 2, 0, 0); | |
setPalette(i + 16, (i + 16) * 2, 0, 0); | |
setPalette(i + 32, 63, i * 4, 0); | |
setPalette(i + 48, 63, 63, i * 4); | |
} | |
do { | |
drawLine(80, 199, 240, 199, heat); | |
fire(75, 100, 245, 198); | |
if (kbhit()) { | |
c = getch(); | |
if (c == 27) quit = 1; | |
if (c == '-' && heat > 0) heat--; | |
if (c == '+' && heat < 63) heat++; | |
if (c >= '0' && c <= '9') heat = (c - '0') * 7; | |
} | |
} while quit == 0; | |
setMode(3); | |
} |
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
In order for this to compile properly, you need to have all 3 files in the same directory. | |
In Turbo C, under Project, select "Open Project" | |
Type in a name like "FIRE.PRJ" and hit OK | |
Go back to the Project menu and select "Add Item..." | |
In the name box, type "*.C" | |
In the files box, select both FIRE.C and VGA.C and hit "Add" | |
Once both files are included, hit "Done" | |
Hit Ctrl-F9 and off you go! |
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 "vga.h" | |
void setMode(int mode) { | |
asm { | |
mov ax, mode | |
int 0x10 | |
} | |
} | |
void clear() { | |
asm { | |
push 0xA000 | |
pop es | |
xor di, di | |
mov cx, 16000 | |
db 0x66 | |
xor ax, ax | |
db 0x66 | |
rep stosw | |
} | |
} | |
void setPixel(int x, int y, char color) { | |
asm { | |
mov di, y | |
mov bx, di | |
shl di, 6 | |
shl bx, 8 | |
add di, bx | |
add di, x | |
mov al, color | |
push 0xA000 | |
pop es | |
stosb | |
} | |
} | |
char getPixel(int x, int y) { | |
asm { | |
mov di, y | |
mob bx, di | |
shl di, 6 | |
shl bx, 8 | |
add di, bx | |
add di, x | |
push 0xA000 | |
pop es | |
mov al, es:[di] | |
} | |
return (_AL); | |
} | |
void setPalette(char num, char r, char g, char b) { | |
asm { | |
mov dx, 0x3C8 | |
mov al, num | |
out dx, al | |
cli | |
mov dx, 0x3C9 | |
mov al, r | |
out dx, al | |
mov al, g | |
out dx, al | |
mov al, b | |
out dx, al | |
sti | |
} | |
} | |
void swap(int *x, int *y) { | |
int t = *x; | |
*x = *y; | |
*y = t; | |
} | |
void drawLine(int x1, int y1, int x2, int y2, char col) { | |
int dx, dy, dab, inca, incb, x, y, h1, h2; | |
if (x1 == x2 && y1 == y1) { | |
setPixel(x1, y1, col); | |
} | |
else { | |
if (x1 > x2) { | |
swap(&x1, &x2); | |
swap(&y1, &y2); | |
} | |
dx = x2 - x1; | |
dy = y2 - y1; | |
h1 = dx; | |
h2 = dy; | |
if (dx < -dy && dy < 0) { | |
y1 = -y1; | |
y2 = -y2; | |
swap(&x1, &y1); | |
swap(&x2, &y2); | |
} | |
if (dx >= -dy && dy < 0) { | |
y1 = -y1; | |
y2 = -y2; | |
} | |
if (dx <= dy && dy > 0) { | |
swap(&x1, &y1); | |
swap(&x2, &y2); | |
} | |
dx = x2 - x1; | |
dy = y2 - y1; | |
dab = 2 * dy - dx; | |
inca = 2 * (dy - dx); | |
incb = 2 * dy; | |
x = x1; | |
y = y1; | |
if (h1 < -h2 && h2 < 0) setPixel(y, -x, col); | |
if (h1 >= -h2 && h2 < 0) setPixel(x, -y, col); | |
if (h1 > h2 && h2 >= 0) setPixel(x, y, col); | |
if (h1 <= h2 && h2 > 0) setPixel(y, x, col); | |
for (x = x1 + 1; x <= x2; x++) { | |
if (dab < 0) { | |
dab += incb; | |
} | |
else { | |
dab += inca; | |
y++; | |
} | |
if (h1 < -h2 && h2 < 0) setPixel(y, -x, col); | |
if (h1 >= -h2 && h2 < 0) setPixel(x, -y, col); | |
if (h1 > h2 && h2 >= 0) setPixel(x, y, col); | |
if (h1 <= h2 && h2 > 0) setPixel(y, x, col); | |
} | |
} | |
} |
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
#ifndef VGA_H | |
#define VGA_H | |
void setMode(int mode); | |
void clear(); | |
void setPixel(int x, int y, char color); | |
char getPixel(int x, int y); | |
void setPalette(char num, char r, char g, char b); | |
void drawLine(int x1, int y1, int x2, int y2, char col); | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In order to compile the VGA library, you will need to enable the 80286 instruction set in the compiler options.
In Turbo C, go to Options -> Compiler -> Advanced code generation and select the 80286 option under Instruction Set.