Advertisement
DimkaM

fdi baltik

Jun 30th, 2021
1,037
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.44 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. FILE * fi;
  6. FILE * fo;
  7.  
  8. typedef char                s8;
  9. typedef unsigned char       u8;
  10. typedef unsigned short int  u16;
  11. typedef unsigned long int   u32;
  12.  
  13. typedef struct {
  14.     s8 fdi[3];
  15.     u8 ro;
  16.     u16 c;
  17.     u16 h;
  18.     u16 txt;
  19.     u16 data;
  20.     u16 ext_size;
  21. }FDIHEAD;
  22.  
  23. struct FDISECTOR{
  24.     u8 c;
  25.     u8 h;
  26.     u8 s;
  27.     u8 n;
  28.     u8 flag;
  29.     u16 offs;
  30. } __attribute__((packed));
  31.  
  32. // __attribute__((packed))
  33. struct FDITRACK{
  34.     u32 offs;
  35.     u16 dump;
  36.     u8 secs;
  37. } __attribute__((packed));
  38.  
  39. FDIHEAD fdihead;
  40. //FDITRACK * ts[160];
  41. long int ss[80 * 2 * 5];
  42. u8 fdi[42 * 160];
  43.  
  44. u8 regs[1024];
  45. u8 buf[48 * 1024 + 27];
  46. s8 fname[256];
  47. const long int s_inc[]={-0x00001000L, 0x00000400, 0x00000400, 0x00000400, 0x00000400};
  48.  
  49. int main (int argc, char *argv[]){
  50.     int len;
  51.     u32 sh = 1;
  52.     if(argc < 2){
  53.         puts("Wrong parameters");
  54.         return 1;
  55.     }
  56.     u8 * p = strrchr(argv[1],'.');
  57.     if(!p){
  58.         puts("Support only FDI file");
  59.         return 1;
  60.     }
  61.     if((p[1]&0xdf)){
  62.         puts("Support only FDI file");
  63.         return 1;
  64.     }
  65.    
  66.     puts("Baltik fdi extractor");
  67.     if((fi=fopen(argv[1],"rb"))==NULL) {
  68.         printf("\nImage file %s not open.\n",argv[1]);
  69.         return 1;
  70.     }
  71.     fread((char*)(&fdihead), 1, sizeof(fdihead), fi);
  72.     //printf("start data %d\n",fdihead.data);
  73.     if(fdihead.c > 80) fdihead.c = 80;
  74.     if(fdihead.h > 2) fdihead.h = 2;
  75.     len = fread(fdi, 1, sizeof(fdi), fi);
  76.     //printf("len %d\n", len);
  77.    
  78.     memset(ss, 0x0000, sizeof(ss));
  79.    
  80.     fseek(fi, fdihead.data, SEEK_SET);
  81.     p = fdi;
  82.     for(int i = 0; i < (fdihead.c * fdihead.h); i++){
  83.         struct FDITRACK * t = (struct FDITRACK*)p;
  84.         p += 7;
  85.         //printf("t %x\n", t->offs);
  86.         for(int j = 1; j <= t->secs; j++){
  87.             struct FDISECTOR * s = (struct FDISECTOR*) p;
  88.             p += 7;
  89.             ss[s->s - 1 + s->h * 5 + s->c * 5 * 2] = fdihead.data + t->offs + s->offs;
  90.             //printf("%d %x\n", s->s - 1 + s->h * 5 + s->c * 5 * 2, fdihead.data + t->offs + s->offs);
  91.         }
  92.     }
  93.     for(int k = 1; k < 17; k++){
  94.         fseek(fi, ss[(k - 1) * 50],SEEK_SET);
  95.         //printf("%x ", ftell(fi));
  96.         sprintf(fname, "%02d.sna", k);
  97.         putchar('\n');
  98.         puts(fname);
  99.         fread(regs, 1, sizeof(regs), fi);
  100.         //puts(regs + 0x0313);
  101.         fseek(fi,0x00000c00L,SEEK_CUR);
  102.        
  103.         for(int i = 0, j = 0; i < 48; i++, j++){
  104.             if(j == 5) j = 0;
  105.             len = fread(buf + i * 1024 + 27, 1, 1024, fi);
  106.             fseek(fi, s_inc[j], SEEK_CUR);
  107.         }
  108.         buf[0] = regs[0x0396];  //i
  109.         buf[1] = regs[0x0366];  //hl'
  110.         buf[2] = regs[0x0367];
  111.         buf[3] = regs[0x0364];  //de'
  112.         buf[4] = regs[0x0365];
  113.         buf[5] = regs[0x0362];  //bc'
  114.         buf[6] = regs[0x0363];
  115.         buf[7] = regs[0x0368];  //af'
  116.         buf[8] = regs[0x0369];
  117.         buf[9] = regs[0x0372];  //hl
  118.         buf[10] = regs[0x0373];
  119.         buf[11] = regs[0x0370]; //de
  120.         buf[12] = regs[0x0371];
  121.         buf[13] = regs[0x036E]; //bc
  122.         buf[14] = regs[0x036f];
  123.         buf[15] = regs[0x036A]; //iy
  124.         buf[16] = regs[0x036b];
  125.         buf[17] = regs[0x036C]; //ix
  126.         buf[18] = regs[0x036d];
  127.         buf[19] = 0x04;         //iff2
  128.         buf[20] = 0x00;         //R
  129.         buf[21] = regs[0x0374]; //af
  130.         buf[22] = regs[0x0375];
  131.         unsigned short int sp = *((short int*)(regs + 0x0376)) - 2;
  132.         buf[23] = sp & 0xff;    //sp
  133.         buf[24] = (sp >> 8) & 0xff;
  134.         buf[25] = (regs[0x0395] & 0x80) ? 2 : 1;            //IM
  135.         buf[26] = 0x00;         //border
  136.         buf[sp - 0x4000 + 27] =     regs[0x0378];   //PC
  137.         buf[sp - 0x4000 + 1 + 27] = regs[0x0379];
  138.        
  139.         if((fo=fopen(fname,"wb"))==NULL) {
  140.             printf("file 03.sna not create.\n",fname);
  141.             return 1;
  142.         }
  143.         fwrite(buf, 1, sizeof(buf), fo);       
  144.         fclose(fo);
  145.     }
  146.     fclose(fi);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement