MAKEBED.C
C source for Bedlam, 191 lines. Raw file
#include <dos.h>
#include <stdio.h>
union REGS regs;
unsigned char (far *screen)[320] = MK_FP(0xA000, 0);
unsigned long (far *lscreen)[80] = MK_FP(0xA000, 0);
struct _pal {
char r, g, b;
} p[256];
void main(void)
{
FILE *in, *out, *out2;
int i, j, k, l, m, q, r, s, d;
int bat[4] = {320, 1, -320, -1};
int spirit[4] = {320, -1, -320, 1};
in = fopen("sprites.bmp", "rb");
out = fopen("bedlam.bed", "wb");
out2 = fopen("bedigits.inc", "wt");
regs.x.ax = 0x13;
int86(0x10, ®s, ®s);
fseek(in, 0x36, SEEK_SET);
for(i = 0; i < 256; i ++)
{
p[i].b = fgetc(in) >> 2;
p[i].g = fgetc(in) >> 2;
p[i].r = fgetc(in) >> 2;
fgetc(in);
}
regs.x.ax = 0x1012;
regs.x.bx = 0;
regs.x.cx = 256;
regs.x.dx = FP_OFF(p);
_ES = FP_SEG(p);
int86(0x10, ®s, ®s);
fseek(in, 0x436, SEEK_SET);
fwrite(p, 256, 3, out);
for(j = 199; j >= 0; j --)
for(i = 0; i < 320; i ++)
screen[j][i] = fgetc(in);
for(k = 0; k < 16; k ++)
for(j = 0; j < 128; j ++)
for(i = 0; i < 16; i ++)
{
fputc(screen[j][i+k*16], out);
screen[j][i+k*16] ^= 255;
}
for(k = 0; k < 26; k ++)
for(j = 0; j < 10; j += 2)
{
fprintf(out2, " dd 0%lXh, 0%lXh, 0%lXh, 0%lXh\n",
lscreen[128+j][2*k],
lscreen[128+j][2*k+1],
lscreen[129+j][2*k],
lscreen[129+j][2*k+1]);
lscreen[128+j][2*k] ^=-1;
lscreen[128+j][2*k+1] ^=-1;
lscreen[129+j][2*k] ^=-1;
lscreen[129+j][2*k+1] ^=-1;
};
fprintf(out2, "\n\n\nNEXT:\n");
for(j = 0; j < 32; j ++)
for(i = 0; i < 8; i += 4)
{
fprintf(out2, " dd 0%lXh, 0%lXh, 0%lXh, 0%lXh\n",
lscreen[j][64+i],
lscreen[j][64+i+1],
lscreen[j][64+i+2],
lscreen[j][64+i+3]);
lscreen[j][64+i] ^=-1;
lscreen[j][64+i+1] ^=-1;
lscreen[j][64+i+2] ^=-1;
lscreen[j][64+i+3] ^=-1;
};
fclose(in);
in = fopen("levels1.bmp", "rb");
fseek(in, 0x436, SEEK_SET);
for(j = 199; j >= 0; j --)
for(i = 0; i < 320; i ++)
screen[j][i] = fgetc(in);
for(q = 0; q < 2; q ++)
for(s = 0; s < 4; s ++)
for(j = 0; j < 64; j ++, l^=inp(0x40)+k)
for(i = 0; i < 64; i ++)
{
l += (89*j-k)^(8-i)+1-inp(0x40);
k ^= l-(i+6)*(j+5)+k-261;
m = 0;
if(screen[j+80*q][i+80*s] == 1 || screen[j+80*q][i+80*s] == 6)
m = (l^i-k^j)&7;
if(screen[j+80*q][i+80*s] > 15)
{
m = screen[j+80*q][i+80*s]-8;
screen[j+80*q][i+80*s] = 7;
};
if(screen[j+80*q][i+80*s] == 4)
{
m = 0;
for(d = 0; d < 4; d ++)
if (screen[j+80*q][i+80*s+bat[d]] != 0) m = d;
m = (m+1)&3;
};
if(screen[j+80*q][i+80*s] == 5)
{
m = 0;
for(d = 0; d < 4; d ++)
if (screen[j+80*q][i+80*s+spirit[d]] != 0) m = d;
m = (m+1)&3;
};
fputc(screen[j+80*q][i+80*s]*16+m, out);
//don't do this because of spirit directions:screen[j+80*q][i+80*s] ^= 255;
}
fclose(in);
in = fopen("levels2.bmp", "rb");
fseek(in, 0x436, SEEK_SET);
for(j = 199; j >= 0; j --)
for(i = 0; i < 320; i ++)
screen[j][i] = fgetc(in);
for(q = 0; q < 2; q ++)
for(s = 0; s < 4; s ++)
for(j = 0; j < 64; j ++, l^=inp(0x40)+k)
for(i = 0; i < 64; i ++)
{
l += (89*j-k)^(8-i)+1-inp(0x40);
k ^= l-(i+6)*(j+5)+k-261;
m = 0;
if(screen[j+80*q][i+80*s] == 1 || screen[j+80*q][i+80*s] == 6)
m = (l^i-k^j)&7;
if(screen[j+80*q][i+80*s] > 15)
{
m = screen[j+80*q][i+80*s]-8;
screen[j+80*q][i+80*s] = 7;
};
if(screen[j+80*q][i+80*s] == 4)
{
m = 0;
for(d = 0; d < 4; d ++)
if (screen[j+80*q][i+80*s+bat[d]] != 0) m = d;
m = (m+1)&3;
};
if(screen[j+80*q][i+80*s] == 5)
{
m = 0;
for(d = 0; d < 4; d ++)
if (screen[j+80*q][i+80*s+spirit[d]] != 0) m = d;
m = (m+1)&3;
};
fputc(screen[j+80*q][i+80*s]*16+m, out);
//don't do this because of spirit directions:screen[j+80*q][i+80*s] ^= 255;
}
}