Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- FILE * fi;
- FILE * fo;
- typedef char s8;
- typedef unsigned char u8;
- typedef unsigned short int u16;
- typedef unsigned long int u32;
- typedef struct {
- s8 fdi[3];
- u8 ro;
- u16 c;
- u16 h;
- u16 txt;
- u16 data;
- u16 ext_size;
- }FDIHEAD;
- struct FDISECTOR{
- u8 c;
- u8 h;
- u8 s;
- u8 n;
- u8 flag;
- u16 offs;
- } __attribute__((packed));
- // __attribute__((packed))
- struct FDITRACK{
- u32 offs;
- u16 dump;
- u8 secs;
- } __attribute__((packed));
- FDIHEAD fdihead;
- //FDITRACK * ts[160];
- long int ss[80 * 2 * 5];
- u8 fdi[42 * 160];
- u8 regs[1024];
- u8 buf[48 * 1024 + 27];
- s8 fname[256];
- const long int s_inc[]={-0x00001000L, 0x00000400, 0x00000400, 0x00000400, 0x00000400};
- int main (int argc, char *argv[]){
- int len;
- u32 sh = 1;
- if(argc < 2){
- puts("Wrong parameters");
- return 1;
- }
- u8 * p = strrchr(argv[1],'.');
- if(!p){
- puts("Support only FDI file");
- return 1;
- }
- if((p[1]&0xdf)){
- puts("Support only FDI file");
- return 1;
- }
- puts("Baltik fdi extractor");
- if((fi=fopen(argv[1],"rb"))==NULL) {
- printf("\nImage file %s not open.\n",argv[1]);
- return 1;
- }
- fread((char*)(&fdihead), 1, sizeof(fdihead), fi);
- //printf("start data %d\n",fdihead.data);
- if(fdihead.c > 80) fdihead.c = 80;
- if(fdihead.h > 2) fdihead.h = 2;
- len = fread(fdi, 1, sizeof(fdi), fi);
- //printf("len %d\n", len);
- memset(ss, 0x0000, sizeof(ss));
- fseek(fi, fdihead.data, SEEK_SET);
- p = fdi;
- for(int i = 0; i < (fdihead.c * fdihead.h); i++){
- struct FDITRACK * t = (struct FDITRACK*)p;
- p += 7;
- //printf("t %x\n", t->offs);
- for(int j = 1; j <= t->secs; j++){
- struct FDISECTOR * s = (struct FDISECTOR*) p;
- p += 7;
- ss[s->s - 1 + s->h * 5 + s->c * 5 * 2] = fdihead.data + t->offs + s->offs;
- //printf("%d %x\n", s->s - 1 + s->h * 5 + s->c * 5 * 2, fdihead.data + t->offs + s->offs);
- }
- }
- for(int k = 1; k < 17; k++){
- fseek(fi, ss[(k - 1) * 50],SEEK_SET);
- //printf("%x ", ftell(fi));
- sprintf(fname, "%02d.sna", k);
- putchar('\n');
- puts(fname);
- fread(regs, 1, sizeof(regs), fi);
- //puts(regs + 0x0313);
- fseek(fi,0x00000c00L,SEEK_CUR);
- for(int i = 0, j = 0; i < 48; i++, j++){
- if(j == 5) j = 0;
- len = fread(buf + i * 1024 + 27, 1, 1024, fi);
- fseek(fi, s_inc[j], SEEK_CUR);
- }
- buf[0] = regs[0x0396]; //i
- buf[1] = regs[0x0366]; //hl'
- buf[2] = regs[0x0367];
- buf[3] = regs[0x0364]; //de'
- buf[4] = regs[0x0365];
- buf[5] = regs[0x0362]; //bc'
- buf[6] = regs[0x0363];
- buf[7] = regs[0x0368]; //af'
- buf[8] = regs[0x0369];
- buf[9] = regs[0x0372]; //hl
- buf[10] = regs[0x0373];
- buf[11] = regs[0x0370]; //de
- buf[12] = regs[0x0371];
- buf[13] = regs[0x036E]; //bc
- buf[14] = regs[0x036f];
- buf[15] = regs[0x036A]; //iy
- buf[16] = regs[0x036b];
- buf[17] = regs[0x036C]; //ix
- buf[18] = regs[0x036d];
- buf[19] = 0x04; //iff2
- buf[20] = 0x00; //R
- buf[21] = regs[0x0374]; //af
- buf[22] = regs[0x0375];
- unsigned short int sp = *((short int*)(regs + 0x0376)) - 2;
- buf[23] = sp & 0xff; //sp
- buf[24] = (sp >> 8) & 0xff;
- buf[25] = (regs[0x0395] & 0x80) ? 2 : 1; //IM
- buf[26] = 0x00; //border
- buf[sp - 0x4000 + 27] = regs[0x0378]; //PC
- buf[sp - 0x4000 + 1 + 27] = regs[0x0379];
- if((fo=fopen(fname,"wb"))==NULL) {
- printf("file 03.sna not create.\n",fname);
- return 1;
- }
- fwrite(buf, 1, sizeof(buf), fo);
- fclose(fo);
- }
- fclose(fi);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement