967 lines
34 KiB
C
967 lines
34 KiB
C
|
#include "stdio.h"
|
||
|
|
||
|
unsigned short header[0x36];
|
||
|
unsigned char palette[256*4];
|
||
|
unsigned char proppal[256];
|
||
|
|
||
|
unsigned char charcell[8*8];
|
||
|
unsigned char convchar[8*8];
|
||
|
unsigned short currentattr;
|
||
|
|
||
|
unsigned short currentblock;
|
||
|
unsigned short blockcell[4];
|
||
|
unsigned short blockmap[10240*10240];
|
||
|
unsigned short blocks[40960*64];
|
||
|
unsigned short charmap[5120*5120];
|
||
|
unsigned char chars[20480*64];
|
||
|
unsigned int charnum;
|
||
|
unsigned int blocknum;
|
||
|
unsigned int blockmapsize=1;
|
||
|
unsigned int blocksize=1;
|
||
|
int yfirst=0;
|
||
|
int justcharmap=0;
|
||
|
int invx=0;
|
||
|
int nopalette=0;
|
||
|
int pal16=0;
|
||
|
int getting_2600=0;
|
||
|
|
||
|
#define bitmap2 0
|
||
|
#define bitmap4 1
|
||
|
#define bitmap16 2
|
||
|
#define bitmap256 3
|
||
|
#define C64bitmap2 4
|
||
|
#define C64bitmap4 5
|
||
|
#define AMSbitmap4 6
|
||
|
#define AMSbitmap16 7
|
||
|
#define charmap2 8
|
||
|
#define charmap4 9
|
||
|
#define charmap16 10
|
||
|
#define charmap256 11
|
||
|
#define C64sprites 12
|
||
|
#define VGAchars4x8 13
|
||
|
|
||
|
int charand=0x03;
|
||
|
int paland=0xfc;
|
||
|
int palshift=2;
|
||
|
int mode=charmap4;
|
||
|
int fat=0;
|
||
|
|
||
|
int repeatable=0;
|
||
|
int flipable=0;
|
||
|
|
||
|
char extjcs[]="JCS"; //c64 mode sprites
|
||
|
char extcb2[]="CB2"; //c64 mode bitmap2col
|
||
|
char extcb4[]="CB4"; //c64 mode bitmap4col
|
||
|
char extjcc[]="JCC"; //c64 mode characters
|
||
|
|
||
|
char extab4[]="AB4"; //Ams mode 4colour bitmap
|
||
|
char exta16[]="A16"; //Ams mode 16colour fat bitmap
|
||
|
char extas4[]="AS4"; //Ams mode 4colour sprite
|
||
|
char extas6[]="AS6"; //Ams mode 16colour fat sprite
|
||
|
|
||
|
char extjb2[]="JB2";
|
||
|
char extjb4[]="JB4";
|
||
|
char extj16[]="J16";
|
||
|
char extj8b[]="J8B";
|
||
|
char extbm2[]="BM2";
|
||
|
char extbm4[]="BM4";
|
||
|
char extb16[]="B16";
|
||
|
char extb8b[]="B8B";
|
||
|
char extvga[]="VGA";
|
||
|
char *ext=extjb4;
|
||
|
|
||
|
char fname[1024];
|
||
|
unsigned char screen[4096*4096];
|
||
|
|
||
|
unsigned int scrwidth;
|
||
|
unsigned int scrheight;
|
||
|
|
||
|
int doingvga;
|
||
|
|
||
|
unsigned char PropRGBs[256*4]={
|
||
|
0x04,0x05,0x05,0x00, 0x02,0x04,0x04,0x00, 0x04,0x06,0x06,0x00, 0x31,0x34,0x33,0x00, 0x64,0x66,0x66,0x00, 0x97,0x9b,0x9b,0x00, 0xcf,0xd0,0xd0,0x00, 0xf0,0xf9,0xfa,0x00, 0x29,0x8c,0xa1,0x00, 0x44,0x0a,0x0e,0x00, 0x75,0x00,0x00,0x00, 0x9f,0x2c,0x26,0x00, 0xd4,0x63,0x5c,0x00, 0xfb,0x97,0x90,0x00, 0xf4,0xc5,0xbe,0x00, 0x23,0x5e,0x72,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x99,0x99,0x00, 0xcd,0xce,0xcd,0x00, 0xef,0xf7,0xfb,0x00, 0x21,0x7b,0xd7,0x00, 0x3c,0x07,0x19,0x00, 0x6f,0x06,0x00,0x00, 0x97,0x33,0x11,0x00, 0xcc,0x69,0x43,0x00, 0xfe,0x9e,0x75,0x00, 0xf6,0xc9,0xa8,0x00, 0x1e,0x4c,0xa9,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x66,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xcd,0xcf,0xcd,0x00, 0xf1,0xf6,0xfd,0x00, 0x25,0x66,0xf4,0x00, 0x21,0x04,0x21,0x00, 0x4b,0x0e,0x00,0x00, 0x77,0x3d,0x02,0x00, 0xac,0x73,0x2d,0x00, 0xe3,0xa9,0x5e,0x00, 0xf3,0xd1,0x95,0x00, 0x1f,0x36,0xdc,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x04,0x00, 0x30,0x33,0x33,0x00, 0x62,0x66,0x65,0x00, 0x95,0x99,0x99,0x00, 0xcc,0xcf,0xcd,0x00, 0xf4,0xf5,0xfd,0x00, 0x47,0x54,0xf7,0x00, 0x08,0x03,0x22,0x00, 0x1d,0x16,0x00,0x00, 0x4c,0x45,0x01,0x00, 0x80,0x7b,0x23,0x00, 0xb8,0xb1,0x51,0x00, 0xe0,0xd8,0x8a,0x00, 0x23,0x24,0xef,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x04,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x99,0x99,0x00, 0xca,0xcf,0xcc,0x00, 0xf9,0xf4,0xfd,0x00, 0xad,0x47,0xf7,0x00, 0x14,0x05,0x23,0x00, 0x02,0x1c,0x00,0x00, 0x1e,0x4a,0x01,0x00, 0x52,0x80,0x22,0x00, 0x85,0xb7,0x50,0x00, 0xb8,0xdd,0x88,0x00, 0x7c,0x1d,0xf0,0x00,
|
||
|
0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x63,0x66,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xc9,0xd0,0xcc,0x00, 0xfc,0xf3,0xfc,0x00, 0xf4,0x41,0xf7,0x00, 0x24,0x05,0x23,0x00, 0x00,0x1e,0x00,0x00, 0x02,0x4c,0x01,0x00, 0x28,0x82,0x2a,0x00, 0x55,0xb9,0x5a,0x00, 0x90,0xdd,0x90,0x00, 0xe6,0x1c,0xdf,0x00,
|
||
|
0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x63,0x66,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xca,0xd0,0xcd,0x00, 0xfc,0xf3,0xfa,0x00, 0xfd,0x49,0xe3,0x00, 0x28,0x06,0x20,0x00, 0x00,0x1b,0x00,0x00, 0x00,0x4a,0x0c,0x00, 0x09,0x7f,0x3d,0x00, 0x31,0xb6,0x6f,0x00, 0x70,0xdb,0xa1,0x00, 0xf6,0x1c,0xb2,0x00,
|
||
|
0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x99,0x99,0x00, 0xca,0xcf,0xce,0x00, 0xfc,0xf3,0xf6,0x00, 0xfb,0x5b,0xa8,0x00, 0x29,0x06,0x15,0x00, 0x00,0x15,0x00,0x00, 0x00,0x44,0x21,0x00, 0x00,0x79,0x57,0x00, 0x1d,0xb0,0x8a,0x00, 0x5e,0xd5,0xb6,0x00, 0xf2,0x28,0x72,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x99,0x99,0x00, 0xc9,0xcf,0xcf,0x00, 0xfc,0xf4,0xf4,0x00, 0xfb,0x6f,0x63,0x00, 0x29,0x09,0x07,0x00, 0x00,0x0d,0x0e,0x00, 0x00,0x3c,0x3d,0x00, 0x00,0x72,0x73,0x00, 0x1b,0xa7,0xaa,0x00, 0x5d,0xce,0xd0,0x00, 0xf2,0x3c,0x2f,0x00,
|
||
|
0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x04,0x00, 0x30,0x33,0x33,0x00, 0x63,0x65,0x65,0x00, 0x96,0x99,0x99,0x00, 0xca,0xcf,0xd0,0x00, 0xfc,0xf6,0xf1,0x00, 0xfc,0x83,0x29,0x00, 0x28,0x0d,0x0a,0x00, 0x00,0x03,0x2a,0x00, 0x00,0x32,0x58,0x00, 0x06,0x68,0x8e,0x00, 0x2b,0x9d,0xc4,0x00, 0x6c,0xc6,0xe8,0x00, 0xf4,0x50,0x1c,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x02,0x05,0x04,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xca,0xce,0xd0,0x00, 0xfc,0xf7,0xf0,0x00, 0xfa,0x98,0x20,0x00, 0x26,0x10,0x19,0x00, 0x00,0x00,0x41,0x00, 0x00,0x29,0x6d,0x00, 0x20,0x5e,0xa2,0x00, 0x4d,0x93,0xd9,0x00, 0x89,0xbe,0xef,0x00, 0xf0,0x65,0x1c,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xca,0xce,0xd0,0x00, 0xfa,0xf8,0xf0,0x00, 0xc3,0xa9,0x21,0x00, 0x18,0x12,0x23,0x00, 0x00,0x00,0x4e,0x00, 0x17,0x22,0x79,0x00, 0x48,0x57,0xae,0x00, 0x7b,0x8b,0xe5,0x00, 0xb0,0xb8,0xf1,0x00, 0x96,0x78,0x1c,0x00,
|
||
|
0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xcc,0xce,0xd0,0x00, 0xf5,0xf9,0xf0,0x00, 0x57,0xb5,0x21,0x00, 0x07,0x14,0x22,0x00, 0x15,0x00,0x4f,0x00, 0x41,0x1d,0x7a,0x00, 0x78,0x52,0xaf,0x00, 0xad,0x85,0xe6,0x00, 0xd9,0xb4,0xf2,0x00, 0x2e,0x85,0x1d,0x00,
|
||
|
0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xcd,0xce,0xd0,0x00, 0xf1,0xfa,0xf1,0x00, 0x27,0xba,0x22,0x00, 0x1b,0x14,0x1a,0x00, 0x41,0x00,0x45,0x00, 0x6d,0x1c,0x6f,0x00, 0xa3,0x50,0xa5,0x00, 0xdb,0x83,0xdb,0x00, 0xf1,0xb3,0xf1,0x00, 0x1e,0x8a,0x1f,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x96,0x9a,0x99,0x00, 0xcd,0xce,0xd0,0x00, 0xef,0xfa,0xf3,0x00, 0x22,0xb3,0x28,0x00, 0x36,0x12,0x0b,0x00, 0x67,0x00,0x30,0x00, 0x91,0x1e,0x5c,0x00, 0xc5,0x53,0x92,0x00, 0xfa,0x86,0xc8,0x00, 0xf6,0xb5,0xed,0x00, 0x1f,0x83,0x21,0x00,
|
||
|
0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x03,0x05,0x05,0x00, 0x30,0x33,0x33,0x00, 0x62,0x65,0x65,0x00, 0x95,0x9a,0x99,0x00, 0xcd,0xce,0xcf,0x00, 0xef,0xf9,0xf6,0x00, 0x22,0xa1,0x56,0x00, 0x46,0x0e,0x02,0x00, 0x7b,0x00,0x15,0x00, 0xa3,0x23,0x43,0x00, 0xd7,0x58,0x78,0x00, 0xff,0x8b,0xaf,0x00, 0xf5,0xba,0xd8,0x00, 0x1f,0x74,0x2c,0x00,
|
||
|
};
|
||
|
|
||
|
unsigned char colours_bmp[86*3]={
|
||
|
0x78,0x02,0x2a,0x83,0x0b,0x09,0x6e,0x39,0x1a,0x3b,0x2b,0x13,0x2c,0x29,0x1d,0x27,0x30,0x20,0x15,0x3f,0x11,0x14,0x35,0x1c,0x11,0x36,0x2f,0x13,0x3a,0x48,0x0e,0x37,0x58,0x07,0x22,0x73,0x1f,0x14,0x67,0x48,0x1e,0x74,0x45,0x11,0x4f,0x65,0x0f,0x42,
|
||
|
0xb7,0x09,0x45,0xa8,0x13,0x12,0xa1,0x54,0x25,0x79,0x57,0x22,0x6b,0x62,0x41,0x57,0x6b,0x44,0x27,0x7b,0x1c,0x24,0x69,0x37,0x1f,0x68,0x5a,0x20,0x5e,0x72,0x14,0x4f,0x7b,0x0e,0x33,0xa1,0x32,0x25,0x9c,0x60,0x2b,0x98,0x6c,0x1a,0x79,0x96,0x1a,0x66,
|
||
|
0xcf,0x4a,0x79,0xc0,0x4f,0x4d,0xc0,0x72,0x40,0xac,0x7c,0x2e,0xa0,0x8f,0x4f,0x85,0x9c,0x6d,0x3a,0xa2,0x32,0x42,0xa6,0x69,0x4c,0xa5,0x94,0x42,0x84,0x9f,0x37,0x76,0xa3,0x4c,0x6e,0xb8,0x7f,0x73,0xbc,0x91,0x68,0xb8,0x9d,0x43,0xac,0xc9,0x5a,0x9f,
|
||
|
0xcb,0x8b,0xa3,0xbe,0x81,0x7e,0xc0,0x8d,0x6d,0xbe,0x9f,0x6c,0xbb,0xae,0x7f,0xa2,0xb4,0x8e,0x7b,0xb8,0x78,0x75,0xbd,0x92,0x86,0xb6,0xad,0x72,0xa0,0xb6,0x7b,0xa0,0xbc,0x91,0xa0,0xc0,0x9e,0x97,0xbb,0xa7,0x8d,0xbe,0xb5,0x85,0xbc,0xcb,0x85,0xb0,
|
||
|
0xd7,0xb3,0xc0,0xca,0xa8,0xa8,0xcc,0xb4,0xa5,0xcc,0xbb,0xa2,0xc9,0xc3,0xaf,0xbf,0xca,0xb2,0xb5,0xcb,0xb3,0xb3,0xcc,0xbe,0xb0,0xcb,0xc8,0xa8,0xc0,0xcb,0xa5,0xba,0xca,0xb2,0xba,0xcc,0xb9,0xb4,0xcb,0xbd,0xaf,0xca,0xc5,0xb2,0xc8,0xd6,0xb7,0xcb,
|
||
|
0x00,0x00,0x00,0x33,0x33,0x33,0x77,0x77,0x77,0xaa,0xaa,0xaa,0xee,0xee,0xee,0xff,0xff,0xff,
|
||
|
};
|
||
|
|
||
|
unsigned char colours_idx[86]={
|
||
|
0x0a,0x1a,0x2a,0x3a,0x4a,0x5a,0x6a,0x7a,0x8a,0x9a,0xaa,0xba,0xca,0xda,0xea,0xfa,
|
||
|
0x0b,0x1b,0x2b,0x3b,0x4b,0x5b,0x6b,0x7b,0x8b,0x9b,0xab,0xbb,0xcb,0xdb,0xeb,0xfb,
|
||
|
0x0c,0x1c,0x2c,0x3c,0x4c,0x5c,0x6c,0x7c,0x8c,0x9c,0xac,0xbc,0xcc,0xdc,0xec,0xfc,
|
||
|
0x0d,0x1d,0x2d,0x3d,0x4d,0x5d,0x6d,0x7d,0x8d,0x9d,0xad,0xbd,0xcd,0xdd,0xed,0xfd,
|
||
|
0x0e,0x1e,0x2e,0x3e,0x4e,0x5e,0x6e,0x7e,0x8e,0x9e,0xae,0xbe,0xce,0xde,0xee,0xfe,
|
||
|
0x02,0x03,0x04,0x05,0x06,0x07
|
||
|
};
|
||
|
unsigned char propcolours[256];
|
||
|
|
||
|
unsigned char getpixelcolour(int r,int g,int b)
|
||
|
{
|
||
|
int tr,tg,tb;
|
||
|
int i,d,t;
|
||
|
unsigned char c;
|
||
|
if(doingvga)
|
||
|
if(r==255 && g==0 && b==255) return 0;
|
||
|
return ((r>>6)<<2)+((g>>6)<<4)+((b>>6)<<6)+3;
|
||
|
c=80;
|
||
|
d=10000;
|
||
|
|
||
|
for(i=0;i<256;i++)
|
||
|
{
|
||
|
tr=PropRGBs[i*4+0]-r;
|
||
|
tg=PropRGBs[i*4+1]-g;
|
||
|
tb=PropRGBs[i*4+2]-b;
|
||
|
tr=abs(tr);
|
||
|
tg=abs(tg);
|
||
|
tb=abs(tb);
|
||
|
t=tr;
|
||
|
if(tg>t) t=tg;
|
||
|
if(tb>t) t=tb;
|
||
|
|
||
|
if (t<d)
|
||
|
{
|
||
|
d=t;
|
||
|
c=i;
|
||
|
}
|
||
|
}
|
||
|
if(c&15<7) c=c&15;
|
||
|
if(c<2) c=2;
|
||
|
return c;
|
||
|
|
||
|
|
||
|
for(i=0;i<86;i++)
|
||
|
{
|
||
|
tr=colours_bmp[i*3+0]-r;
|
||
|
tg=colours_bmp[i*3+1]-g;
|
||
|
tb=colours_bmp[i*3+2]-b;
|
||
|
tr=abs(tr);
|
||
|
tg=abs(tg);
|
||
|
tb=abs(tb);
|
||
|
t=tr;
|
||
|
if(tg>t) t=tg;
|
||
|
if(tb>t) t=tb;
|
||
|
|
||
|
if (t<d)
|
||
|
{
|
||
|
d=t;
|
||
|
c=i;
|
||
|
}
|
||
|
}
|
||
|
return colours_idx[c];
|
||
|
}
|
||
|
|
||
|
void setuppropcolours(void)
|
||
|
{
|
||
|
FILE *f;
|
||
|
int x,y;
|
||
|
f=fopen("propcolours.bmp","rb");
|
||
|
if(f)
|
||
|
{
|
||
|
fseek(f,0x36,SEEK_SET);
|
||
|
fread(colours_bmp,86,3,f);
|
||
|
fclose(f);
|
||
|
}
|
||
|
for(x=2;x<=7;x++) propcolours[x]=x;
|
||
|
for(x=11;x<=14;x++)
|
||
|
{
|
||
|
for(y=0;y<16;y++)
|
||
|
{
|
||
|
propcolours[x*16+y]=y*16+x;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void convcharto1bit(int chr)
|
||
|
{
|
||
|
unsigned char *src=&chars[chr*64];
|
||
|
unsigned char *dst=&convchar[0];
|
||
|
int i;
|
||
|
for(i=0;i<64;i++)
|
||
|
{
|
||
|
if((i&7)==0) dst[i>>3] =((src[i]&1)<<0);
|
||
|
if((i&7)==1) dst[i>>3]|=((src[i]&1)<<1);
|
||
|
if((i&7)==2) dst[i>>3]|=((src[i]&1)<<2);
|
||
|
if((i&7)==3) dst[i>>3]|=((src[i]&1)<<3);
|
||
|
if((i&7)==4) dst[i>>3]|=((src[i]&1)<<4);
|
||
|
if((i&7)==5) dst[i>>3]|=((src[i]&1)<<5);
|
||
|
if((i&7)==6) dst[i>>3]|=((src[i]&1)<<6);
|
||
|
if((i&7)==7) dst[i>>3]|=((src[i]&1)<<7);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void convcharto2bit(int chr)
|
||
|
{
|
||
|
unsigned char *src=&chars[chr*64];
|
||
|
unsigned char *dst=&convchar[0];
|
||
|
int i;
|
||
|
if(fat)
|
||
|
{
|
||
|
for(i=0;i<64;i++)
|
||
|
{
|
||
|
if((i&7)==0) dst[i>>3] =((src[i]&3)<<0);
|
||
|
if((i&7)==2) dst[i>>3]|=((src[i]&3)<<2);
|
||
|
if((i&7)==4) dst[i>>3]|=((src[i]&3)<<4);
|
||
|
if((i&7)==6) dst[i>>3]|=((src[i]&3)<<6);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(i=0;i<64;i++)
|
||
|
{
|
||
|
if((i&3)==0) dst[i>>2] =((src[i]&3)<<0);
|
||
|
if((i&3)==1) dst[i>>2]|=((src[i]&3)<<2);
|
||
|
if((i&3)==2) dst[i>>2]|=((src[i]&3)<<4);
|
||
|
if((i&3)==3) dst[i>>2]|=((src[i]&3)<<6);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void convcharto4bit(int chr)
|
||
|
{
|
||
|
unsigned char *src=&chars[chr*64];
|
||
|
unsigned char *dst=&convchar[0];
|
||
|
int i;
|
||
|
if(fat)
|
||
|
{
|
||
|
for(i=0;i<64;i++)
|
||
|
{
|
||
|
if((i&3)==0) dst[i>>2] =((src[i]&15)<<0);
|
||
|
if((i&3)==2) dst[i>>2]|=((src[i]&15)<<4);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(i=0;i<64;i++)
|
||
|
{
|
||
|
if((i&1)==0) dst[i>>1] =((src[i]&15)<<0);
|
||
|
if((i&1)==1) dst[i>>1]|=((src[i]&15)<<4);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void convcharto8bit(int chr)
|
||
|
{
|
||
|
unsigned char *src=&chars[chr*64];
|
||
|
unsigned char *dst=&convchar[0];
|
||
|
int i;
|
||
|
for(i=0;i<64;i++)
|
||
|
{
|
||
|
dst[i]=src[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void getcharacter(int x,int y)
|
||
|
{
|
||
|
int xx,yy,i,j;
|
||
|
currentattr=0;
|
||
|
for(yy=0;yy<8;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<8;xx++)
|
||
|
{
|
||
|
charcell[yy*8+xx]=screen[(((y*8)+yy)*scrwidth)+((x*8)+xx)];
|
||
|
if(charcell[yy*8+xx]&paland)
|
||
|
{
|
||
|
currentattr=( ( charcell[yy*8+xx] & paland ) >> palshift );
|
||
|
}
|
||
|
charcell[yy*8+xx]&=charand;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(repeatable)
|
||
|
{
|
||
|
j=0;
|
||
|
for(i=0;i<charnum;i++)
|
||
|
{
|
||
|
j=1;
|
||
|
currentattr=(currentattr&0x3c00)+i;
|
||
|
for(xx=0;xx<64;xx++)
|
||
|
{
|
||
|
if(chars[(i*64)+xx]!=charcell[xx]) {xx=64;j=0;}
|
||
|
}
|
||
|
if(flipable)
|
||
|
{
|
||
|
if(j==0)
|
||
|
{
|
||
|
j=1;
|
||
|
currentattr=(currentattr&0x3fff)|0x8000;
|
||
|
for(yy=0;yy<8;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<8;xx++)
|
||
|
{
|
||
|
if(chars[(i*64)+(yy*8)+xx]!=charcell[(yy*8)+(7-xx)]) {xx=8;yy=8;j=0;}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(j==0)
|
||
|
{
|
||
|
j=1;
|
||
|
currentattr=(currentattr&0x3fff)|0x4000;
|
||
|
for(yy=0;yy<8;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<8;xx++)
|
||
|
{
|
||
|
if(chars[(i*64)+(yy*8)+xx]!=charcell[((7-yy)*8)+xx]) {xx=8;yy=8;j=0;}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(j==0)
|
||
|
{
|
||
|
j=1;
|
||
|
currentattr=(currentattr&0x3fff)|0xc000;
|
||
|
for(yy=0;yy<8;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<8;xx++)
|
||
|
{
|
||
|
if(chars[(i*64)+(yy*8)+xx]!=charcell[((7-yy)*8)+(7-xx)]) {xx=8;yy=8;j=0;}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(j==1)
|
||
|
{
|
||
|
i=charnum;
|
||
|
}
|
||
|
}
|
||
|
if(j==0)
|
||
|
{
|
||
|
currentattr=(currentattr&0x3c00)+charnum;
|
||
|
for(i=0;i<64;i++) chars[(charnum*64)+i]=charcell[i];
|
||
|
charnum++;
|
||
|
}
|
||
|
// charmap[(y*(scrwidth>>3))+x]=currentattr;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(i=0;i<64;i++) chars[(charnum*64)+i]=charcell[i];
|
||
|
currentattr=(currentattr&0x3c00)+charnum;
|
||
|
charnum++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void get4x8character(int x,int y)
|
||
|
{
|
||
|
int xx,yy,i,j;
|
||
|
currentattr=0;
|
||
|
for(yy=0;yy<8;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<4;xx++)
|
||
|
{
|
||
|
charcell[yy*8+xx]=proppal[screen[(((y*8)+yy)*scrwidth)+((x*4)+xx)]];
|
||
|
if(charcell[yy*8+xx]&paland)
|
||
|
{
|
||
|
currentattr=( ( charcell[yy*8+xx] & paland ) >> palshift );
|
||
|
}
|
||
|
charcell[yy*8+xx]&=charand;
|
||
|
charcell[yy*8+xx+4]=0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(repeatable)
|
||
|
{
|
||
|
j=0;
|
||
|
for(i=0;i<charnum;i++)
|
||
|
{
|
||
|
j=1;
|
||
|
currentattr=(currentattr&0x3c00)+i;
|
||
|
for(xx=0;xx<64;xx++)
|
||
|
{
|
||
|
if(chars[(i*64)+xx]!=charcell[xx]) {xx=64;j=0;}
|
||
|
}
|
||
|
if(j==1)
|
||
|
{
|
||
|
i=charnum;
|
||
|
}
|
||
|
}
|
||
|
if(j==0)
|
||
|
{
|
||
|
currentattr=(currentattr&0x3c00)+charnum;
|
||
|
for(i=0;i<64;i++) chars[(charnum*64)+i]=charcell[i];
|
||
|
charnum++;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(i=0;i<64;i++) chars[(charnum*64)+i]=charcell[i];
|
||
|
currentattr=(currentattr&0x3c00)+charnum;
|
||
|
charnum++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void getblock(int x,int y)
|
||
|
{
|
||
|
int i,j,xx,yy;
|
||
|
for(yy=0;yy<blockmapsize;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<blockmapsize;xx++)
|
||
|
{
|
||
|
getcharacter(x*blockmapsize+xx,y*blockmapsize+yy);
|
||
|
blockcell[yy*blockmapsize+xx]=currentattr;
|
||
|
}
|
||
|
}
|
||
|
currentblock=blocknum;
|
||
|
for(i=0;i<blocknum;i++)
|
||
|
{
|
||
|
j=1;
|
||
|
for(xx=0;xx<blocksize;xx++)
|
||
|
{
|
||
|
if(blocks[i*blocksize+xx]!=blockcell[xx])
|
||
|
j=0;
|
||
|
}
|
||
|
if(j==1)
|
||
|
{
|
||
|
currentblock=i;
|
||
|
i=blocknum;
|
||
|
}
|
||
|
}
|
||
|
if(currentblock==blocknum)
|
||
|
{
|
||
|
for(xx=0;xx<blocksize;xx++)
|
||
|
{
|
||
|
blocks[blocknum*blocksize+xx]=blockcell[xx];
|
||
|
}
|
||
|
blocknum++;
|
||
|
}
|
||
|
blockmap[y*(scrwidth/(blockmapsize*8))+x]=currentblock;
|
||
|
}
|
||
|
|
||
|
int jcmp(char *s1,char *s2)
|
||
|
{
|
||
|
while(*s1 && *s2)
|
||
|
{
|
||
|
if(*s1 != *s2) return 0;
|
||
|
s1++;
|
||
|
s2++;
|
||
|
}
|
||
|
if(*s1==0 && *s2==0) return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void getcharfile(char *file)
|
||
|
{
|
||
|
unsigned char buf[64];
|
||
|
unsigned char pix;
|
||
|
int i,x,y;
|
||
|
FILE *f;
|
||
|
unsigned int div;
|
||
|
unsigned int len;
|
||
|
unsigned int xwidth;
|
||
|
printf("Opening File '%s'\n",file);
|
||
|
f=fopen(file,"rb");
|
||
|
if(f==NULL) {printf("Can't open '%s'\n",file);return;}
|
||
|
fseek(f,0,SEEK_END);
|
||
|
len=ftell(f);
|
||
|
fseek(f,0,SEEK_SET);
|
||
|
div=0;
|
||
|
if(mode==charmap2) {div=8;}
|
||
|
if(mode==charmap4) {div=16;}
|
||
|
if(mode==charmap16) {div=32;}
|
||
|
if(mode==charmap256) {div=64;}
|
||
|
if(mode==VGAchars4x8) {div=64;}
|
||
|
if(fat) div=div/2;
|
||
|
xwidth=8;
|
||
|
if(fat) xwidth=4;
|
||
|
if(div==0) {fclose(f);return;}
|
||
|
printf("Reading %d Chars\n",len/div);
|
||
|
charnum=len/div;
|
||
|
for(i=0;i<charnum;i++)
|
||
|
{
|
||
|
fread(buf,1,div,f);
|
||
|
for(y=0;y<8;y++)
|
||
|
{
|
||
|
for(x=0;x<xwidth;x++)
|
||
|
{
|
||
|
if(mode==charmap2)
|
||
|
{
|
||
|
pix=(buf[y]>>(7-x))&1;
|
||
|
}
|
||
|
if(mode==charmap4)
|
||
|
{
|
||
|
if(fat)
|
||
|
pix=(buf[y]>>(6-((x&3)*2)))&3;
|
||
|
else
|
||
|
pix=(buf[y*2+1-(x>>2)]>>(6-((x&3)*2)))&3;
|
||
|
}
|
||
|
if(mode==charmap16)
|
||
|
{
|
||
|
if(fat)
|
||
|
pix=(buf[y*2+1-(x>>1)]>>(4-((x&1)*4)))&15;
|
||
|
else
|
||
|
pix=(buf[y*4+3-(x>>1)]>>(4-((x&1)*4)))&15;
|
||
|
}
|
||
|
if(mode==charmap256)
|
||
|
{
|
||
|
pix=buf[y*8+x];
|
||
|
}
|
||
|
if(mode==VGAchars4x8)
|
||
|
{
|
||
|
pix=buf[y*4+x];
|
||
|
}
|
||
|
chars[i*64+y*8+7-x]=pix;
|
||
|
}
|
||
|
if(fat)
|
||
|
{
|
||
|
chars[i*64+y*8+0]=chars[i*64+y*8+4];
|
||
|
chars[i*64+y*8+1]=chars[i*64+y*8+4];
|
||
|
chars[i*64+y*8+2]=chars[i*64+y*8+5];
|
||
|
chars[i*64+y*8+3]=chars[i*64+y*8+5];
|
||
|
chars[i*64+y*8+4]=chars[i*64+y*8+6];
|
||
|
chars[i*64+y*8+5]=chars[i*64+y*8+6];
|
||
|
chars[i*64+y*8+6]=chars[i*64+y*8+7];
|
||
|
chars[i*64+y*8+7]=chars[i*64+y*8+7];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
fclose(f);
|
||
|
}
|
||
|
int main(int c,char **s)
|
||
|
{
|
||
|
unsigned char palbuf[256*4];
|
||
|
int i,j,x,y,w,h,xx,yy;
|
||
|
int bytesize,byteand,byteshift,byteout;
|
||
|
FILE *f;
|
||
|
int getcharfileindex=0;
|
||
|
|
||
|
doingvga=0;
|
||
|
justcharmap=0;
|
||
|
blocknum=0;
|
||
|
charnum=0;
|
||
|
blocksize=1;
|
||
|
blockmapsize=1;
|
||
|
charnum=0;
|
||
|
blocknum=0;
|
||
|
yfirst=0;
|
||
|
fat=0;
|
||
|
|
||
|
if(c<2)
|
||
|
{
|
||
|
printf("bmp8toLite.exe (C) 2009 Jim Bagley\n");
|
||
|
printf("usage :-\n");
|
||
|
printf("bmp8toLite.exe Filename <-options>\n");
|
||
|
printf("Filename is without the '.bmp' extension\n");
|
||
|
printf("-vga use VGA colours for the palette\n");
|
||
|
printf("-c64s Grab C64 sprites, C64 sprites are 24x21, it will grab the size of the bmp\n");
|
||
|
printf(" C64 sprites can be either fat pixel(4colour) or fine pixel(2colour)\n");
|
||
|
printf("-c64bitmap2 Grab a C64 2 colour mode bitmap image\n");
|
||
|
printf("-c64bitmap4 Grab a C64 4 colour mode bitmap image ( fat pixels )\n");
|
||
|
printf("-amsbitmap4 Grab Amstrad 4 colour bitmap mode ( fine pixels )\n");
|
||
|
printf("-amsbitmap16 Grab Amstrad 16 colour bitmap mode ( fat pixels )\n");
|
||
|
printf("-bitmap2 Grab screen as 1bit ( 2 colour with attributes ) bitmap\n");
|
||
|
printf("-bitmap4 Grab screen as 2bit ( 4 colour with attributes ) bitmap\n");
|
||
|
printf("-bitmap16 Grab screen as 4bit ( 16 colour with attributes ) bitmap\n");
|
||
|
printf("-bitmap256 Grab screen as 8bit ( 256 colour ) bitmap\n");
|
||
|
printf("-charmap2 Grab screen as 1bit ( 2 colour with attributes ) character map\n");
|
||
|
printf("-charmap4 Grab screen as 2bit ( 4 colour with attributes ) character map\n");
|
||
|
printf("-charmap16 Grab screen as 4bit ( 16 colour with attributes ) character map\n");
|
||
|
printf("-charmap256 Grab screen as 8bit ( 256 colour ) character map\n");
|
||
|
printf("-c64charmap4 Grab screen as 2bit fat pixel ( 4 colour with attributes ) character map\n");
|
||
|
printf("-amscharmap16 Grab screen as 4bit fat pixel ( 16 colour with attributes ) character map\n");
|
||
|
printf("-invx Invert X pixel order per byte\n");
|
||
|
// printf("-flip Turns on Character repeat check and flip checking for X and Y flippable characters\n");
|
||
|
printf("-rpt Turns on Character repeat check, for maps, ie doesn't store same character twice.\n");
|
||
|
printf("-repeat same as -rpt.\n");
|
||
|
printf("-repeatable same as -rpt.\n");
|
||
|
printf("-1x1 Sets blocks to 1x1 (8x8 pixels) for charmap grabbing.\n");
|
||
|
printf("-2x2 Sets blocks to 2x2 (16x16 pixels) for charmap grabbing.\n");
|
||
|
printf("-4x4 Sets blocks to 4x4 (32x32 pixels) for charmap grabbing.\n");
|
||
|
printf("-8x8 Sets blocks to 8x8 (64x64 pixels) for charmap grabbing.\n");
|
||
|
printf("-yfirst Sets Y grab first for map layout\n");
|
||
|
printf("-xfirst Sets X grab first for map layout (default)\n");
|
||
|
printf("-invx inverts the pixel order in a byte for spectrum and fast spectrum\n");
|
||
|
printf("-nopal Don't save palette in 8bit mode, use real colour values\n");
|
||
|
printf("-2600 Grab a 2600 style background\n");
|
||
|
printf("-using grab chars from screen, but using a file as a base font\n");
|
||
|
}
|
||
|
|
||
|
while(c>2)
|
||
|
{
|
||
|
if(jcmp(s[c-1],"-vga")) {doingvga=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-c64s")) {mode=C64sprites;ext=extjcs;charand=1;paland=0xfe;palshift=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-c64bitmap2")) {mode=C64bitmap2;ext=extcb2;charand=1;paland=0xfe;palshift=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-c64bitmap4")) {mode=C64bitmap4;ext=extcb4;charand=3;paland=0xfc;palshift=2;c--;}
|
||
|
else if(jcmp(s[c-1],"-amsbitmap4")) {mode=AMSbitmap4;ext=extab4;charand=3;paland=0xfc;palshift=2;c--;}
|
||
|
else if(jcmp(s[c-1],"-amsbitmap16")) {mode=AMSbitmap16;ext=exta16;charand=15;paland=0xf0;palshift=4;c--;}
|
||
|
else if(jcmp(s[c-1],"-bitmap2")) {mode=bitmap2;ext=extbm2;charand=1;paland=0xfe;palshift=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-bitmap4")) {mode=bitmap4;ext=extbm4;charand=3;paland=0xfc;palshift=2;c--;}
|
||
|
else if(jcmp(s[c-1],"-bitmap16")) {mode=bitmap16;ext=extb16;charand=15;paland=0xfe;palshift=4;c--;}
|
||
|
else if(jcmp(s[c-1],"-bitmap256")) {mode=bitmap256;ext=extb8b;charand=255;paland=0;palshift=0;c--;}
|
||
|
else if(jcmp(s[c-1],"-charmap2")) {mode=charmap2;ext=extjb2;charand=1;paland=0xfe;palshift=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-charmap4")) {mode=charmap4;ext=extjb4;charand=3;paland=0xfc;palshift=2;c--;}
|
||
|
else if(jcmp(s[c-1],"-charmap16")) {mode=charmap16;ext=extj16;charand=15;paland=0xf0;palshift=4;c--;}
|
||
|
else if(jcmp(s[c-1],"-charmap256")) {mode=charmap256;ext=extj8b;charand=255;paland=0;palshift=0;c--;}
|
||
|
else if(jcmp(s[c-1],"-vga4x8")) {mode=VGAchars4x8;ext=extj8b;charand=255;paland=0;palshift=0;c--;fat=1;doingvga=1;repeatable=1;nopalette=1;justcharmap=1;blockmapsize=1;blocksize=1;}
|
||
|
else if(jcmp(s[c-1],"-c64charmap4")) {mode=charmap4;ext=extjb4;charand=3;paland=0xfc;palshift=2;c--;fat=1;}
|
||
|
else if(jcmp(s[c-1],"-amscharmap16")){mode=charmap16;ext=extj16;charand=15;paland=0xf0;palshift=4;c--;fat=1;}
|
||
|
else if(jcmp(s[c-1],"-flip")) {repeatable=1;flipable=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-flipable")) {repeatable=1;flipable=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-norpt")) {repeatable=0;c--;}
|
||
|
else if(jcmp(s[c-1],"-norepeat")) {repeatable=0;c--;}
|
||
|
else if(jcmp(s[c-1],"-notrepeatable")) {repeatable=0;c--;}
|
||
|
else if(jcmp(s[c-1],"-rpt")) {repeatable=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-repeat")) {repeatable=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-repeatable")) {repeatable=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-1x1")) {justcharmap=1;blockmapsize=1;blocksize=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-2x2")) {justcharmap=0;blockmapsize=2;blocksize=4;c--;}
|
||
|
else if(jcmp(s[c-1],"-4x4")) {justcharmap=0;blockmapsize=4;blocksize=16;c--;}
|
||
|
else if(jcmp(s[c-1],"-8x8")) {justcharmap=0;blockmapsize=8;blocksize=64;c--;}
|
||
|
else if(jcmp(s[c-1],"-yfirst")) {yfirst=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-xfirst")) {yfirst=0;c--;}
|
||
|
else if(jcmp(s[c-1],"-invx")) {invx=(1-invx)&1;c--;}
|
||
|
else if(jcmp(s[c-1],"-nopal")) {nopalette=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-pal16")) {pal16=1;c--;}
|
||
|
else if(jcmp(s[c-1],"-2600")) {getting_2600=1;c--;}
|
||
|
else if(jcmp(s[c-2],"-using")) {getcharfileindex=c-1;c-=2;}
|
||
|
else if(jcmp(s[c-2],"-fat")) {fat=1;}
|
||
|
else {printf("Unknown option '%s'\n",s[c-1]);exit(1);}
|
||
|
}
|
||
|
if(c!=2)
|
||
|
{
|
||
|
printf("exename filename\n");
|
||
|
exit(0);
|
||
|
}
|
||
|
if(getcharfileindex)
|
||
|
{
|
||
|
getcharfile(s[getcharfileindex]);
|
||
|
}
|
||
|
setuppropcolours();
|
||
|
|
||
|
sprintf(fname,"%s.bmp",s[1]);
|
||
|
f=fopen(fname,"rb");
|
||
|
if(f!=NULL)
|
||
|
{
|
||
|
fread(header,0x36,1,f);
|
||
|
scrwidth=header[9];
|
||
|
scrheight=header[11];
|
||
|
printf("w=%d\nh=%d\n",scrwidth,scrheight);
|
||
|
fread(palbuf,256,4,f);
|
||
|
for(i=0;i<256;i++)
|
||
|
{
|
||
|
proppal[i]=getpixelcolour(palbuf[i*4+0],palbuf[i*4+1],palbuf[i*4+2]);
|
||
|
}
|
||
|
|
||
|
fseek(f,header[5],SEEK_SET);
|
||
|
for(i=0;i<scrheight;i++)
|
||
|
{
|
||
|
fread(&screen[((scrheight-1)-i)*scrwidth],scrwidth,1,f);
|
||
|
}
|
||
|
fclose(f);
|
||
|
|
||
|
if(getting_2600)
|
||
|
{
|
||
|
sprintf(fname,"%s.VCS",s[1]);
|
||
|
f=fopen(fname,"wb");
|
||
|
if(f!=NULL)
|
||
|
{
|
||
|
int xstp=scrwidth/40;
|
||
|
int border=0;
|
||
|
for(y=0;y<scrheight;y++)
|
||
|
{
|
||
|
int background=screen[y*scrwidth];
|
||
|
int foreground=0;
|
||
|
byteout=0;
|
||
|
for(xx=x=0;x<scrwidth;x+=xstp,xx++)
|
||
|
{
|
||
|
byteout<<=1;
|
||
|
if(screen[y*scrwidth+x]!=background) {byteout+=1;foreground=screen[y*scrwidth+x];}
|
||
|
if((xx&7)==7)
|
||
|
fwrite(&byteout,1,1,f);
|
||
|
}
|
||
|
if(palbuf[background*4+0]==255 && palbuf[background*4+1]==0 && palbuf[background*4+2]==255)
|
||
|
{
|
||
|
background=0;
|
||
|
fwrite(&background,1,1,f);
|
||
|
fwrite(&background,1,1,f);
|
||
|
fwrite(&proppal[border],1,1,f);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fwrite(&proppal[background],1,1,f);
|
||
|
fwrite(&proppal[foreground],1,1,f);
|
||
|
fwrite(&proppal[border],1,1,f);
|
||
|
}
|
||
|
}
|
||
|
fclose(f);
|
||
|
}
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
if(justcharmap==0)
|
||
|
{
|
||
|
for(y=0;y<(scrheight/(blockmapsize*8));y++)
|
||
|
{
|
||
|
for(x=0;x<(scrwidth/(blockmapsize*8));x++)
|
||
|
{
|
||
|
getblock(x,y);
|
||
|
}
|
||
|
}
|
||
|
printf("block map size = ( %d,%d )\nBlocks Used = %d\nChars Used = %d\n",scrwidth/(blockmapsize*8),scrheight/(blockmapsize*8),blocknum,charnum);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(mode==VGAchars4x8)
|
||
|
{
|
||
|
for(y=0;y<(scrheight/8);y++)
|
||
|
{
|
||
|
for(x=0;x<(scrwidth/4);x++)
|
||
|
{
|
||
|
get4x8character(x,y);
|
||
|
charmap[(y*(scrwidth/4))+x]=currentattr;
|
||
|
// printf("%02x,",currentattr);
|
||
|
}
|
||
|
// printf("\n");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(y=0;y<(scrheight/8);y++)
|
||
|
{
|
||
|
for(x=0;x<(scrwidth/8);x++)
|
||
|
{
|
||
|
getcharacter(x,y);
|
||
|
charmap[(y*(scrwidth/8))+x]=currentattr;
|
||
|
// printf("%02x,",currentattr);
|
||
|
}
|
||
|
// printf("\n");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if( mode>=charmap2 && mode<=charmap256 )
|
||
|
printf("Char map size = ( %d,%d )\nChars Used = %d\n",scrwidth/8,scrheight/8,charnum);
|
||
|
if( mode==VGAchars4x8 )
|
||
|
printf("Char map size = ( %d,%d )\nChars Used = %d\n",scrwidth/4,scrheight/8,charnum);
|
||
|
|
||
|
if(nopalette==0)
|
||
|
{
|
||
|
sprintf(fname,"%s.pal",s[1]);
|
||
|
f=fopen(fname,"wb");
|
||
|
if(f!=NULL)
|
||
|
{
|
||
|
if(pal16)
|
||
|
fwrite(proppal,16,1,f);
|
||
|
else
|
||
|
fwrite(proppal,256,1,f);
|
||
|
fclose(f);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(mode!=C64sprites && repeatable!=0)
|
||
|
{
|
||
|
if(justcharmap)
|
||
|
{
|
||
|
sprintf(fname,"%s.map",s[1]);
|
||
|
f=fopen(fname,"wb");
|
||
|
if(f!=NULL)
|
||
|
{
|
||
|
if(mode==VGAchars4x8)
|
||
|
{
|
||
|
if(yfirst==0)
|
||
|
{
|
||
|
fwrite(charmap,scrheight/8,(scrwidth/4)*2,f);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(x=0;x<(scrwidth/(blockmapsize*4));x++)
|
||
|
{
|
||
|
for(y=0;y<(scrheight/(blockmapsize*8));y++)
|
||
|
{
|
||
|
fwrite(&charmap[y*(scrwidth/(blockmapsize*4))+x],1,2,f);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(yfirst==0)
|
||
|
{
|
||
|
fwrite(charmap,scrheight/8,(scrwidth/8)*2,f);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(x=0;x<(scrwidth/(blockmapsize*8));x++)
|
||
|
{
|
||
|
for(y=0;y<(scrheight/(blockmapsize*8));y++)
|
||
|
{
|
||
|
fwrite(&charmap[y*(scrwidth/(blockmapsize*8))+x],1,2,f);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
fclose(f);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sprintf(fname,"%s.mpb",s[1]);
|
||
|
f=fopen(fname,"wb");
|
||
|
if(f!=NULL)
|
||
|
{
|
||
|
if(yfirst==0)
|
||
|
{
|
||
|
fwrite(blockmap,scrheight/(blockmapsize*8),(scrwidth/(blockmapsize*8))*2,f);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(x=0;x<(scrwidth/(blockmapsize*8));x++)
|
||
|
{
|
||
|
for(y=0;y<(scrheight/(blockmapsize*8));y++)
|
||
|
{
|
||
|
fwrite(&blockmap[y*(scrwidth/(blockmapsize*8))+x],1,2,f);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
fclose(f);
|
||
|
}
|
||
|
|
||
|
sprintf(fname,"%s.blx",s[1]);
|
||
|
f=fopen(fname,"wb");
|
||
|
if(f!=NULL)
|
||
|
{
|
||
|
fwrite(blocks,blocknum,blocksize*2,f);
|
||
|
fclose(f);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// sprintf(fname,"%s.%s",s[1],ext);
|
||
|
if( (mode>=charmap2 && mode<=charmap256 ) || mode==VGAchars4x8)
|
||
|
{
|
||
|
sprintf(fname,"%s.chr",s[1]);
|
||
|
}
|
||
|
else if(mode==C64sprites)
|
||
|
{
|
||
|
sprintf(fname,"%s.JCS",s[1]);
|
||
|
}
|
||
|
else if( (mode>=bitmap2 && mode<=AMSbitmap16 ) )
|
||
|
{
|
||
|
sprintf(fname,"%s.bit",s[1]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Don't know Graphics mode :(\n");
|
||
|
return 0;
|
||
|
}
|
||
|
f=fopen(fname,"wb");
|
||
|
if(f!=NULL)
|
||
|
{
|
||
|
if( (mode>=charmap2 && mode<=charmap256) || mode==VGAchars4x8 )
|
||
|
{
|
||
|
for(i=0;i<charnum;i++)
|
||
|
{
|
||
|
if(mode==charmap2) {convcharto1bit(i);fwrite(convchar,1,fat?4:8,f);}
|
||
|
if(mode==charmap4) {convcharto2bit(i);fwrite(convchar,2,fat?4:8,f);}
|
||
|
if(mode==charmap16) {convcharto4bit(i);fwrite(convchar,4,fat?4:8,f);}
|
||
|
if(mode==charmap256) {convcharto8bit(i);fwrite(convchar,8,fat?4:8,f);}
|
||
|
if(mode==VGAchars4x8)
|
||
|
{
|
||
|
convcharto8bit(i);
|
||
|
for(y=0;y<8;y++)
|
||
|
for(x=0;x<4;x++)
|
||
|
fwrite(&convchar[y*8+x],1,1,f);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if( (mode>=bitmap2 && mode<=AMSbitmap16 ) )
|
||
|
{
|
||
|
if(mode==C64bitmap2) {bytesize=8;byteand= 1;byteshift=1;fat=0;}
|
||
|
if(mode==C64bitmap4) {bytesize=4;byteand= 3;byteshift=2;fat=1;}
|
||
|
if(mode==AMSbitmap4) {bytesize=4;byteand= 3;byteshift=2;fat=0;}
|
||
|
if(mode==AMSbitmap16){bytesize=2;byteand= 15;byteshift=4;fat=1;}
|
||
|
if(mode==bitmap2) {bytesize=8;byteand= 1;byteshift=1;fat=0;}
|
||
|
if(mode==bitmap4) {bytesize=4;byteand= 3;byteshift=2;fat=0;}
|
||
|
if(mode==bitmap16) {bytesize=2;byteand= 15;byteshift=4;fat=0;}
|
||
|
if(mode==bitmap256) {bytesize=1;byteand=255;byteshift=0;fat=0;}
|
||
|
for(y=0;y<scrheight;y++)
|
||
|
{
|
||
|
for(x=0;x<scrwidth/(bytesize*(1+fat));x++)
|
||
|
{
|
||
|
byteout=0;
|
||
|
for(xx=0;xx<bytesize;xx++)
|
||
|
{
|
||
|
if(invx)
|
||
|
{
|
||
|
byteout+=(screen[(y*scrwidth)+(((x*bytesize)+xx)*(1+fat))]&byteand)<<(xx*byteshift);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
byteout+=(screen[(y*scrwidth)+(((x*bytesize)+xx)*(1+fat))]&byteand)<<(((bytesize-1)-xx)*byteshift);
|
||
|
}
|
||
|
}
|
||
|
if(nopalette) byteout=proppal[byteout];
|
||
|
fwrite(&byteout,1,1,f);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(mode==C64sprites)
|
||
|
{
|
||
|
for(y=0;y<scrheight;y+=21)
|
||
|
{
|
||
|
for(x=0;x<scrwidth;x+=24)
|
||
|
{
|
||
|
byteand=1;byteshift=1;
|
||
|
j=0;
|
||
|
for(yy=0;yy<21;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<24;xx++)
|
||
|
{
|
||
|
if((screen[((y+yy)*scrwidth)+(x+xx)]&3)>1)
|
||
|
{
|
||
|
byteand=3;byteshift=2;
|
||
|
j=1;
|
||
|
xx=24;yy=21;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
for(yy=0;yy<21;yy++)
|
||
|
{
|
||
|
for(xx=0;xx<24;xx+=byteshift)
|
||
|
{
|
||
|
if((xx&7)==0) byteout=0;
|
||
|
byteout+=((screen[((y+yy)*scrwidth)+(x+xx)]&byteand)<<((8-byteshift)-(xx&7)));
|
||
|
if((xx&7)==(8-(byteshift)))
|
||
|
{
|
||
|
fwrite(&byteout,1,1,f);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
byteout=0;
|
||
|
fwrite(&byteout,1,1,f); // to keep nice round 64bytes per sprite :)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fclose(f);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Error Creating '%s'\n",fname);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Error Opening '%s'\n",fname);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|