Mercurial > ~darius > hgwebdir.cgi > mikmod
diff playercode/s3m_it.c @ 6:d14fd386d182
Initial entry of mikmod into the CVS tree.
author | darius |
---|---|
date | Fri, 23 Jan 1998 16:05:09 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/playercode/s3m_it.c Fri Jan 23 16:05:09 1998 +0000 @@ -0,0 +1,187 @@ +/* + +Name: +S3M_IT.C + +Description: +Commonfunctions between S3Ms and ITs (smaller .EXE! :) + +Portability: +All systems - all compilers (hopefully) + +*/ + +#include "mikmod.h" + +UBYTE *poslookup=NULL;// S3M/IT fix - removing blank patterns needs a + // lookup table to fix position-jump commands +SBYTE remap[64]; // for removing empty channels +SBYTE isused[64]; // for removing empty channels + + +void S3MIT_ProcessCmd(UBYTE cmd,UBYTE inf,BOOL oldeffect) +{ + UBYTE hi,lo; + + lo=inf&0xf; + hi=inf>>4; + + // process S3M / IT specific command structure + + if(cmd!=255) + { switch(cmd) + { case 1: // Axx set speed to xx + UniWrite(UNI_S3MEFFECTA); + UniWrite(inf); + break; + + case 2: // Bxx position jump + UniPTEffect(0xb,poslookup[inf]); + break; + + case 3: // Cxx patternbreak to row xx + if(oldeffect & 1) + UniPTEffect(0xd,(((inf&0xf0)>>4)*10)+(inf&0xf)); + else + UniPTEffect(0xd,inf); + break; + + case 4: // Dxy volumeslide + UniWrite(UNI_S3MEFFECTD); + UniWrite(inf); + break; + + case 5: // Exy toneslide down + UniWrite(UNI_S3MEFFECTE); + UniWrite(inf); + break; + + case 6: // Fxy toneslide up + UniWrite(UNI_S3MEFFECTF); + UniWrite(inf); + break; + + case 7: // Gxx Tone portamento, speed xx + UniWrite(UNI_ITEFFECTG); + UniWrite(inf); + break; + + case 8: // Hxy vibrato + if(oldeffect & 1) + UniPTEffect(0x4,inf); + else + { UniWrite(UNI_ITEFFECTH); + UniWrite(inf); + } + break; + + case 9: // Ixy tremor, ontime x, offtime y + if(oldeffect & 1) + UniWrite(UNI_S3MEFFECTI); + else + UniWrite(UNI_ITEFFECTI); + UniWrite(inf); + break; + + case 0xa: // Jxy arpeggio + UniPTEffect(0x0,inf); + break; + + case 0xb: // Kxy Dual command H00 & Dxy + if(oldeffect & 1) + UniPTEffect(0x4,0); + else + { UniWrite(UNI_ITEFFECTH); + UniWrite(0); + } + UniWrite(UNI_S3MEFFECTD); + UniWrite(inf); + break; + + case 0xc: // Lxy Dual command G00 & Dxy + if(oldeffect & 1) + UniPTEffect(0x3,0); + else + { UniWrite(UNI_ITEFFECTG); + UniWrite(0); + } + UniWrite(UNI_S3MEFFECTD); + UniWrite(inf); + break; + + case 0xd: // Mxx Set Channel Volume + UniWrite(UNI_ITEFFECTM); + UniWrite(inf); + break; + + case 0xe: // Nxy Slide Channel Volume + UniWrite(UNI_ITEFFECTN); + UniWrite(inf); + break; + + case 0xf: // Oxx set sampleoffset xx00h + UniPTEffect(0x9,inf); + break; + + case 0x10: // Pxy Slide Panning Commands + UniWrite(UNI_ITEFFECTP); + UniWrite(inf); + break; + + case 0x11: // Qxy Retrig (+volumeslide) + UniWrite(UNI_S3MEFFECTQ); + if((inf!=0) && (lo==0) && !(oldeffect & 1)) + UniWrite(1); + else + UniWrite(inf); + break; + + case 0x12: // Rxy tremolo speed x, depth y + UniWrite(UNI_S3MEFFECTR); + UniWrite(inf); + break; + + case 0x13: // Sxx special commands + UniWrite(UNI_ITEFFECTS0); + UniWrite(inf); + break; + + case 0x14: // Txx tempo + if(inf>0x20) + { UniWrite(UNI_S3MEFFECTT); + UniWrite(inf); + } + break; + + case 0x15: // Uxy Fine Vibrato speed x, depth y + if(oldeffect & 1) + UniWrite(UNI_S3MEFFECTU); + else + UniWrite(UNI_ITEFFECTU); + UniWrite(inf); + break; + + case 0x16: // Vxx Set Global Volume + UniWrite(UNI_XMEFFECTG); + UniWrite(inf); + break; + + case 0x17: // Wxy Global Volume Slide + UniWrite(UNI_ITEFFECTW); + UniWrite(inf); + break; + + case 0x18: // Xxx amiga command 8xx + if(oldeffect & 1) + UniPTEffect(0x8,((inf<<1) == 256) ? 255 : (inf<<1)); + else + UniPTEffect(0x8,inf); + break; + + case 0x19: // Yxy Panbrello speed x, depth y + UniWrite(UNI_ITEFFECTY); + UniWrite(inf); + break; + } + } +}