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, &regs, &regs);

    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, &regs, &regs);

    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;
	      }


 }