home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / far096.zip / FARLOAD.CPP < prev    next >
Text File  |  1994-03-05  |  5KB  |  196 lines

  1. // Code fragments taken from the FARLOAD.CPP actually used in Farandole.
  2. // This should allow you to use FAR files in your own programs.
  3. // by Daniel Potter/Digital Infinity
  4.  
  5. void GenLoad(FILE *f,dword len,byte xv,int sn) {
  6.   byte  far *q;
  7.   dword aq,a,ss,so;
  8.  
  9.   for (a=0;a<(len/0xFFFF);a++) {
  10.     q=(char far *)malloc(0xFFFF);
  11.     if (q) {
  12.       aq=fread(q,0xFFFF,1,f);
  13.       for (aq=0;aq<0xFFFF;aq++) q[aq]^=xv;
  14.     }
  15.     ss=HighPtr>>16; so=HighPtr&0xFFFF;
  16.     HighPtr=Music.LoadSample(ss,so,
  17.                              0xFFFF,
  18.                              (char far *)q);
  19.     farfree(q);
  20.   }
  21.   if (len%0xFFFF) {
  22.     q=(char far *)malloc(len%0xFFFF);
  23.     if (q) {
  24.       aq=fread(q,len%0xFFFF,1,f);
  25.       for (aq=0;aq<len%0xFFFF;aq++) q[aq]^=xv;
  26.     }
  27.     ss=HighPtr>>16; so=HighPtr&0xFFFF;
  28.     HighPtr=Music.LoadSample(ss,so,
  29.                              len%0xFFFF,
  30.                              (char far *)q);
  31.     farfree(q);
  32.   }
  33. }
  34.  
  35. void LoadFSM(char *fn,word n) {
  36.   byte far *q;
  37.   char Header[5]={0};
  38.   FILE *f;
  39.  
  40.   Saving=ON;
  41.   StopMusic();
  42.  
  43.   f=fopen(fn,"rb");
  44.   if (!f) {
  45.     Saving=OFF;
  46.     return;
  47.   }
  48.  
  49.   Saved=FALSE;
  50.   fread(&Header,4,1,f);                // Read 'header'
  51.   if (strcmp(Header,"FSM■")) {
  52.     fclose(f);
  53.     Saving=OFF;
  54.     return;
  55.   }
  56.   fread(&Sample[n].Name,32,1,f);       // Read sample name
  57.   fread(&Header,3,1,f);                // Get past junk
  58.   fread(&Sample[n].Len,4,1,f);         // Read sample length
  59.   fread(&Sample[n].FineTune,1,1,f);    // Read finetune byte
  60.   fread(&Sample[n].Volume,1,1,f);      // Read default volume byte
  61.   fread(&Sample[n].Rep,4,1,f);         // Read repeat start
  62.   fread(&Sample[n].RepEnd,4,1,f);      // Read repeat end
  63.   fread(&Sample[n].SType,1,1,f);       // Read sample type byte
  64.   fread(&Sample[n].LoopMode,1,1,f);    // Read loop mode byte
  65.  
  66.   if (Sample[n].RepEnd<5) {
  67.     Sample[n].RepEnd=Sample[n].Len;
  68.     Sample[n].LoopMode=0;
  69.   }
  70.   else
  71.     Sample[n].LoopMode=(1<<3);
  72.  
  73.   if (Sample[n].SType&1) Sample[n].LoopMode|=(1<<2);
  74.  
  75.   if (Sample[n].Len>0) {
  76.     Sample[n].Seg=HighPtr>>16;
  77.     Sample[n].Off=HighPtr&0xFFFF;
  78.     GenLoad(f,Sample[n].Len,0,n);
  79.   }
  80.   else {
  81.     Sample[n].Seg=0;
  82.     Sample[n].Off=0;
  83.   }
  84.   fclose(f);
  85.   Saving=OFF;
  86. }
  87.  
  88. void LoadOneFSM(word n,FILE *i) {
  89.   byte far *q;
  90.  
  91.   fread(&Sample[n].Name,32,1,i);       // Read sample name
  92.   fread(&Sample[n].Len,4,1,i);         // Read sample length
  93.   fread(&Sample[n].FineTune,1,1,i);    // Read finetune byte
  94.   fread(&Sample[n].Volume,1,1,i);      // Read default volume byte
  95.   fread(&Sample[n].Rep,4,1,i);         // Read repeat start
  96.   fread(&Sample[n].RepEnd,4,1,i);      // Read repeat end
  97.   fread(&Sample[n].SType,1,1,i);       // Read sample type byte
  98.   fread(&Sample[n].LoopMode,1,1,i);    // Read loop mode byte
  99.  
  100.   if (Sample[n].RepEnd<5) {
  101.     Sample[n].RepEnd=Sample[n].Len;
  102.     Sample[n].LoopMode=0;
  103.   }
  104.   else
  105.     Sample[n].LoopMode=(1<<3);
  106.  
  107.   if (Sample[n].SType&1) Sample[n].LoopMode|=(1<<2);
  108.  
  109.   if (Sample[n].Len>0) {
  110.     Sample[n].Seg=HighPtr>>16;
  111.     Sample[n].Off=HighPtr&0xFFFF;
  112.     GenLoad(i,Sample[n].Len,0,n);
  113.   }
  114.   else {
  115.     Sample[n].Seg=0;
  116.     Sample[n].Off=0;
  117.   }
  118. }
  119.  
  120. void LoadSong(char *fn) {
  121.   FILE  *i;
  122.   char  Magic1[]="FAR■";
  123.   char  Magic2[]={13,10,26};
  124.   Flag  SMap[256/8]={0};
  125.   word  q,HdrLen;
  126.  
  127.   i=fopen(fn,"rb");
  128.   if (!i) return;
  129.   fread(&Magic1[0],4,1,i);
  130.   if (strcmp(Magic1,"FAR■")) {
  131.     fclose(i);
  132.     return;
  133.   }
  134.   Saving=ON;
  135.   if (Playing) StopMusic();
  136.   FreeSong();
  137.   Saved=TRUE;
  138.   strcpy(DosName,fn);
  139.  
  140.   fread(&SongName[0],40,1,i);
  141.   fread(&Magic2[0],3,1,i);
  142.   fread(&HdrLen,2,1,i);
  143.   fgetc(i);
  144.   fread(&ChanOn[0],16,1,i);
  145.   fread(&CurOct,1,1,i);
  146.   fread(&CurVoice,1,1,i);
  147.   fread(&CurRow,1,1,i);
  148.   fread(&CurPattern,1,1,i);
  149.   fread(&CurOrder,1,1,i);
  150.   fread(&CurSample,1,1,i);
  151.   fread(&CurVol,1,1,i);
  152.   fread(&CurTop,1,1,i);
  153.   fread(&CurArea,1,1,i);
  154.   fread(&CurTempo,1,1,i);
  155.   fread(&CurBalance[0],16,1,i);
  156.   fread(&MarkTop,1,1,i);
  157.   fread(&MarkBot,1,1,i);
  158.   fread(&Grid,1,1,i);
  159.   fread(&EditMode,1,1,i);
  160.   fread(&STLen,2,1,i);
  161.   if (STLen<=5544)
  162.     fread(&SongText[0],STLen,1,i);
  163.   else {
  164.     fread(&SongText[0],5544,1,i);
  165.     fseek(i,STLen-5544,SEEK_CUR);
  166.   }
  167.   fread(&Order[0],256,1,i);
  168.   fread(&NumPatterns,1,1,i);
  169.   fread(&OrdLen,1,1,i);
  170.   fread(&LoopTo,1,1,i);
  171.   fread(&PatSize,sizeof(PatSize),1,i);
  172.   if (HdrLen-(869+STLen))
  173.     fseek(i,HdrLen-(869+STLen),SEEK_CUR);
  174.  
  175.   for (q=0;q<256;q++)
  176.     if (PatSize[q]) {
  177.       PatStore[q]=(char *)malloc(PatSize[q]);
  178.       fread(PatStore[q],PatSize[q],1,i);
  179.     }
  180.  
  181.   fread(&SMap[0],8,1,i);
  182.  
  183.   memset(&Sample[0],0,sizeof(Sample));
  184.   HighPtr=0;
  185.   for (q=0;q<255;q++)
  186.     if (SMap[q/8] & (1<<(q%8)))
  187.       LoadOneFSM(q,i);
  188.  
  189.   fclose(i);
  190.   memset(&Pattern[0],0,sizeof(Pattern));
  191.   GetPat(CurPattern);
  192.   sScreen();
  193.   Saving=OFF;
  194. }
  195.  
  196.