ecb /* Include file for loading an IFF/LBM compressed picture */ #include #include union REGS regs; #define FORM 0x464f524dL #define ILBM 0x494c424dL #define BMHD 0x424d4844L #define CMAP 0x434d4150L #define BODY 0x424f4459L unsigned char palbuf[768]; long read32bit(); long to32bit(); load_iff(unsigned char *fname,unsigned char far *dest) { FILE* f; unsigned char trash[10]; unsigned long id,length; unsigned char red,green,blue; unsigned char planes,compress; int width,height; unsigned int i,plane; unsigned int addr,scan,nextline; unsigned char byte,b; f = fopen(fname,"rb"); if(f == NULL) error("File not found!"); id = read32bit(f); if(id != FORM) error("Not an IFF/LBM file!"); length = read32bit(f); id = read32bit(f); if(id != ILBM) error("Not an IFF/LBM file!"); while(1) { id = read32bit(f); length = read32bit(f); if(id == BMHD) break; fseek(f,length,SEEK_CUR); } width = read16bit(f); height = read16bit(f); fseek(f,4L,SEEK_CUR); planes = (unsigned char)getc(f); /* no of bitplanes */ getc(f); compress = (unsigned char)getc(f); /* compress flag */ if(compress == 0) error("Not a compressed picture!"); fseek(f,9L,SEEK_CUR); while(1) { id = read32bit(f); length = read32bit(f); if(id == CMAP) break; fseek(f,length,SEEK_CUR); } fread(palbuf,768,1,f); for (i=0;i<768;i++) palbuf[i] >>= 2; regs.h.ah = 0x10; regs.h.al = 0x12; regs.x.bx = 0; regs.x.cx = 256; regs.x.dx = (unsigned)palbuf; int86(0x10,®s,®s); while(1) { id = read32bit(f); length = read32bit(f); if(id == BODY) break; fseek(f,length,SEEK_CUR); } for(scan=0;scan < height;scan++) { for(plane=0;plane < planes; plane++) /* 8 bitplanes */ { addr = 320*scan; nextline = addr + width; do { byte = (unsigned char)getc(f); if(byte < 128) { for(i=0;i < byte+1; i++) { b = (unsigned char)getc(f); dest[addr++] |= (b >> 7 & 1) << plane; dest[addr++] |= (b >> 6 & 1) << plane; dest[addr++] |= (b >> 5 & 1) << plane; dest[addr++] |= (b >> 4 & 1) << plane; dest[addr++] |= (b >> 3 & 1) << plane; dest[addr++] |= (b >> 2 & 1) << plane; dest[addr++] |= (b >> 1 & 1) << plane; dest[addr++] |= (b & 1) << plane; } } else if(byte > 128) { b = (unsigned char)getc(f); for(i=0;i < (256-byte)+1; i++) { dest[addr++] |= (b >> 7 & 1) << plane; dest[addr++] |= (b >> 6 & 1) << plane; dest[addr++] |= (b >> 5 & 1) << plane; dest[addr++] |= (b >> 4 & 1) << plane; dest[addr++] |= (b >> 3 & 1) << plane; dest[addr++] |= (b >> 2 & 1) << plane; dest[addr++] |= (b >> 1 & 1) << plane; dest[addr++] |= (b & 1) << plane; } } } while(addr < nextline); } } fclose(f); } error(char *errmsg) { printf("Error: %s\n",errmsg); exit(1); } int read16bit(FILE* f) { int c1, c2; c1 = getc(f); c2 = getc(f); return to16bit(c1,c2); } int to16bit(c1,c2) int c1, c2; { return ((c1 & 0xff ) << 8) + (c2 & 0xff); } long read32bit(FILE* f) { int c1, c2, c3, c4; c1 = getc(f); c2 = getc(f); c3 = getc(f); c4 = getc(f); return to32bit(c1,c2,c3,c4); } long to32bit(c1,c2,c3,c4) { long value = 0L; value = (c1 & 0xff); value = (value<<8) + (c2 & 0xff); value = (value<<8) + (c3 & 0xff); value = (value<<8) + (c4 & 0xff); return (value); } set_mcga() { regs.h.ah = 0; regs.h.al = 0x13; int86(0x10,®s,®s); } set_text() { regs.h.ah = 0; regs.h.al = 3; int86(0x10,®s,®s); } . 0