OPN(A/B/2/B-B): fix absolutely everything
This commit is contained in:
		
							parent
							
								
									3d4f2cfa13
								
							
						
					
					
						commit
						2fa51e482a
					
				| 
						 | 
				
			
			@ -32,4 +32,65 @@
 | 
			
		|||
#define ADDR_FB_ALG 0xb0
 | 
			
		||||
#define ADDR_LRAF 0xb4
 | 
			
		||||
 | 
			
		||||
#define PLEASE_HELP_ME(_targetChan) \
 | 
			
		||||
  int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); \
 | 
			
		||||
  int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false); \
 | 
			
		||||
  int destFreq=NOTE_FNUM_BLOCK(c.value2,11); \
 | 
			
		||||
  int newFreq; \
 | 
			
		||||
  bool return2=false; \
 | 
			
		||||
  if (_targetChan.portaPause) { \
 | 
			
		||||
    if (parent->song.oldOctaveBoundary) { \
 | 
			
		||||
      if ((_targetChan.portaPauseFreq&0xf800)>(_targetChan.baseFreq&0xf800)) { \
 | 
			
		||||
        _targetChan.baseFreq=((_targetChan.baseFreq&0x7ff)>>1)|(_targetChan.portaPauseFreq&0xf800); \
 | 
			
		||||
      } else { \
 | 
			
		||||
        _targetChan.baseFreq=((_targetChan.baseFreq&0x7ff)<<1)|(_targetChan.portaPauseFreq&0xf800); \
 | 
			
		||||
      } \
 | 
			
		||||
      c.value*=2; \
 | 
			
		||||
    } else { \
 | 
			
		||||
      _targetChan.baseFreq=_targetChan.portaPauseFreq; \
 | 
			
		||||
    } \
 | 
			
		||||
  } \
 | 
			
		||||
  if (destFreq>_targetChan.baseFreq) { \
 | 
			
		||||
    newFreq=_targetChan.baseFreq+c.value; \
 | 
			
		||||
    if (newFreq>=destFreq) { \
 | 
			
		||||
      newFreq=destFreq; \
 | 
			
		||||
      return2=true; \
 | 
			
		||||
    } \
 | 
			
		||||
  } else { \
 | 
			
		||||
    newFreq=_targetChan.baseFreq-c.value; \
 | 
			
		||||
    if (newFreq<=destFreq) { \
 | 
			
		||||
      newFreq=destFreq; \
 | 
			
		||||
      return2=true; \
 | 
			
		||||
    } \
 | 
			
		||||
  } \
 | 
			
		||||
  /* check for octave boundary */ \
 | 
			
		||||
  /* what the heck! */ \
 | 
			
		||||
  if (!_targetChan.portaPause) { \
 | 
			
		||||
    if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) { \
 | 
			
		||||
      if (parent->song.fbPortaPause) { \
 | 
			
		||||
        _targetChan.portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800); \
 | 
			
		||||
        _targetChan.portaPause=true; \
 | 
			
		||||
        break; \
 | 
			
		||||
      } else { \
 | 
			
		||||
        newFreq=((newFreq&0x7ff)>>1)|((newFreq+0x800)&0xf800); \
 | 
			
		||||
      } \
 | 
			
		||||
    } \
 | 
			
		||||
    if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) { \
 | 
			
		||||
      if (parent->song.fbPortaPause) { \
 | 
			
		||||
        _targetChan.portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800); \
 | 
			
		||||
        _targetChan.portaPause=true; \
 | 
			
		||||
        break; \
 | 
			
		||||
      } else { \
 | 
			
		||||
        newFreq=((newFreq&0x7ff)<<1)|((newFreq-0x800)&0xf800); \
 | 
			
		||||
      } \
 | 
			
		||||
    } \
 | 
			
		||||
  } \
 | 
			
		||||
  _targetChan.portaPause=false; \
 | 
			
		||||
  _targetChan.freqChanged=true; \
 | 
			
		||||
  _targetChan.baseFreq=newFreq; \
 | 
			
		||||
  if (return2) { \
 | 
			
		||||
    _targetChan.inPorta=false; \
 | 
			
		||||
    return 2; \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -756,56 +756,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (chan[c.chan].portaPause) {
 | 
			
		||||
        chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>chan[c.chan].baseFreq) {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // check for octave boundary
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!chan[c.chan].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      chan[c.chan].portaPause=false;
 | 
			
		||||
      chan[c.chan].freqChanged=true;
 | 
			
		||||
      chan[c.chan].baseFreq=newFreq;
 | 
			
		||||
      if (return2) {
 | 
			
		||||
        chan[c.chan].inPorta=false;
 | 
			
		||||
        return 2;
 | 
			
		||||
      }
 | 
			
		||||
      PLEASE_HELP_ME(chan[c.chan]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_SAMPLE_MODE: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,52 +150,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (opChan[ch].portaPause) {
 | 
			
		||||
        opChan[ch].baseFreq=opChan[ch].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>opChan[ch].baseFreq) {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!opChan[ch].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      opChan[ch].portaPause=false;
 | 
			
		||||
      opChan[ch].freqChanged=true;
 | 
			
		||||
      opChan[ch].baseFreq=newFreq;
 | 
			
		||||
      if (return2) return 2;
 | 
			
		||||
      PLEASE_HELP_ME(opChan[ch]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_SAMPLE_MODE: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis {
 | 
			
		|||
    unsigned char freqH, freqL;
 | 
			
		||||
    int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
 | 
			
		||||
    signed char konCycles;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
 | 
			
		||||
    int vol;
 | 
			
		||||
    unsigned char pan;
 | 
			
		||||
    OpChannel():
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +45,7 @@ class DivPlatformGenesisExt: public DivPlatformGenesis {
 | 
			
		|||
      keyOn(false),
 | 
			
		||||
      keyOff(false),
 | 
			
		||||
      portaPause(false),
 | 
			
		||||
      inPorta(false),
 | 
			
		||||
      vol(0),
 | 
			
		||||
      pan(3) {}
 | 
			
		||||
  };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -659,56 +659,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (chan[c.chan].portaPause) {
 | 
			
		||||
        chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>chan[c.chan].baseFreq) {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // check for octave boundary
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!chan[c.chan].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      chan[c.chan].portaPause=false;
 | 
			
		||||
      chan[c.chan].freqChanged=true;
 | 
			
		||||
      chan[c.chan].baseFreq=newFreq;
 | 
			
		||||
      if (return2) {
 | 
			
		||||
        chan[c.chan].inPorta=false;
 | 
			
		||||
        return 2;
 | 
			
		||||
      }
 | 
			
		||||
      PLEASE_HELP_ME(chan[c.chan]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_LEGATO: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,52 +143,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (opChan[ch].portaPause) {
 | 
			
		||||
        opChan[ch].baseFreq=opChan[ch].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>opChan[ch].baseFreq) {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!opChan[ch].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      opChan[ch].portaPause=false;
 | 
			
		||||
      opChan[ch].freqChanged=true;
 | 
			
		||||
      opChan[ch].baseFreq=newFreq;
 | 
			
		||||
      if (return2) return 2;
 | 
			
		||||
      PLEASE_HELP_ME(opChan[ch]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_LEGATO: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,10 +27,12 @@ class DivPlatformYM2203Ext: public DivPlatformYM2203 {
 | 
			
		|||
    unsigned char freqH, freqL;
 | 
			
		||||
    int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
 | 
			
		||||
    signed char konCycles;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
 | 
			
		||||
    int vol;
 | 
			
		||||
    unsigned char pan;
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {}
 | 
			
		||||
    // UGLY
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
 | 
			
		||||
     inPorta(false), vol(0), pan(3) {}
 | 
			
		||||
  };
 | 
			
		||||
  OpChannel opChan[4];
 | 
			
		||||
  bool isOpMuted[4];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -980,56 +980,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (chan[c.chan].portaPause) {
 | 
			
		||||
        chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>chan[c.chan].baseFreq) {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // check for octave boundary
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!chan[c.chan].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      chan[c.chan].portaPause=false;
 | 
			
		||||
      chan[c.chan].freqChanged=true;
 | 
			
		||||
      chan[c.chan].baseFreq=newFreq;
 | 
			
		||||
      if (return2) {
 | 
			
		||||
        chan[c.chan].inPorta=false;
 | 
			
		||||
        return 2;
 | 
			
		||||
      }
 | 
			
		||||
      PLEASE_HELP_ME(chan[c.chan]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_SAMPLE_BANK:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,52 +143,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (opChan[ch].portaPause) {
 | 
			
		||||
        opChan[ch].baseFreq=opChan[ch].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>opChan[ch].baseFreq) {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!opChan[ch].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      opChan[ch].portaPause=false;
 | 
			
		||||
      opChan[ch].freqChanged=true;
 | 
			
		||||
      opChan[ch].baseFreq=newFreq;
 | 
			
		||||
      if (return2) return 2;
 | 
			
		||||
      PLEASE_HELP_ME(opChan[ch]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_LEGATO: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,10 +27,12 @@ class DivPlatformYM2608Ext: public DivPlatformYM2608 {
 | 
			
		|||
    unsigned char freqH, freqL;
 | 
			
		||||
    int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
 | 
			
		||||
    signed char konCycles;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
 | 
			
		||||
    int vol;
 | 
			
		||||
    unsigned char pan;
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {}
 | 
			
		||||
    // UGLY
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
 | 
			
		||||
    inPorta(false), vol(0), pan(3) {}
 | 
			
		||||
  };
 | 
			
		||||
  OpChannel opChan[4];
 | 
			
		||||
  bool isOpMuted[4];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1027,56 +1027,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (chan[c.chan].portaPause) {
 | 
			
		||||
        chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>chan[c.chan].baseFreq) {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // check for octave boundary
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!chan[c.chan].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      chan[c.chan].portaPause=false;
 | 
			
		||||
      chan[c.chan].freqChanged=true;
 | 
			
		||||
      chan[c.chan].baseFreq=newFreq;
 | 
			
		||||
      if (return2) {
 | 
			
		||||
        chan[c.chan].inPorta=false;
 | 
			
		||||
        return 2;
 | 
			
		||||
      }
 | 
			
		||||
      PLEASE_HELP_ME(chan[c.chan]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_SAMPLE_BANK:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1005,56 +1005,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (chan[c.chan].portaPause) {
 | 
			
		||||
        chan[c.chan].baseFreq=chan[c.chan].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>chan[c.chan].baseFreq) {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=chan[c.chan].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // check for octave boundary
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!chan[c.chan].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=(parent->song.oldOctaveBoundary?(newFreq>>1):boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            chan[c.chan].portaPauseFreq=newFreq=(parent->song.oldOctaveBoundary?(newFreq<<1):(boundaryTop-1))|((newFreq-0x800)&0xf800);
 | 
			
		||||
            chan[c.chan].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      chan[c.chan].portaPause=false;
 | 
			
		||||
      chan[c.chan].freqChanged=true;
 | 
			
		||||
      chan[c.chan].baseFreq=newFreq;
 | 
			
		||||
      if (return2) {
 | 
			
		||||
        chan[c.chan].inPorta=false;
 | 
			
		||||
        return 2;
 | 
			
		||||
      }
 | 
			
		||||
      PLEASE_HELP_ME(chan[c.chan]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_SAMPLE_BANK:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,52 +143,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (opChan[ch].portaPause) {
 | 
			
		||||
        opChan[ch].baseFreq=opChan[ch].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>opChan[ch].baseFreq) {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!opChan[ch].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      opChan[ch].portaPause=false;
 | 
			
		||||
      opChan[ch].freqChanged=true;
 | 
			
		||||
      opChan[ch].baseFreq=newFreq;
 | 
			
		||||
      if (return2) return 2;
 | 
			
		||||
      PLEASE_HELP_ME(opChan[ch]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_LEGATO: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,10 +27,12 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B {
 | 
			
		|||
    unsigned char freqH, freqL;
 | 
			
		||||
    int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
 | 
			
		||||
    signed char konCycles;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
 | 
			
		||||
    int vol;
 | 
			
		||||
    unsigned char pan;
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {}
 | 
			
		||||
    // UGLY
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
 | 
			
		||||
    inPorta(false), vol(0), pan(3) {}
 | 
			
		||||
  };
 | 
			
		||||
  OpChannel opChan[4];
 | 
			
		||||
  bool isOpMuted[4];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,52 +143,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) {
 | 
			
		|||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false);
 | 
			
		||||
      int boundaryTop=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,12,false);
 | 
			
		||||
      int destFreq=NOTE_FNUM_BLOCK(c.value2,11);
 | 
			
		||||
      int newFreq;
 | 
			
		||||
      bool return2=false;
 | 
			
		||||
      if (opChan[ch].portaPause) {
 | 
			
		||||
        opChan[ch].baseFreq=opChan[ch].portaPauseFreq;
 | 
			
		||||
      }
 | 
			
		||||
      if (destFreq>opChan[ch].baseFreq) {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq+c.value;
 | 
			
		||||
        if (newFreq>=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        newFreq=opChan[ch].baseFreq-c.value;
 | 
			
		||||
        if (newFreq<=destFreq) {
 | 
			
		||||
          newFreq=destFreq;
 | 
			
		||||
          return2=true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      // what the heck!
 | 
			
		||||
      if (!opChan[ch].portaPause) {
 | 
			
		||||
        if ((newFreq&0x7ff)>boundaryTop && (newFreq&0xf800)<0x3800) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=(boundaryBottom)|((newFreq+0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq>>1)|((newFreq+0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if ((newFreq&0x7ff)<boundaryBottom && (newFreq&0xf800)>0) {
 | 
			
		||||
          if (parent->song.fbPortaPause) {
 | 
			
		||||
            opChan[ch].portaPauseFreq=newFreq=(boundaryTop-1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
            opChan[ch].portaPause=true;
 | 
			
		||||
            break;
 | 
			
		||||
          } else {
 | 
			
		||||
            newFreq=(newFreq<<1)|((newFreq-0x800)&0xf800);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      opChan[ch].portaPause=false;
 | 
			
		||||
      opChan[ch].freqChanged=true;
 | 
			
		||||
      opChan[ch].baseFreq=newFreq;
 | 
			
		||||
      if (return2) return 2;
 | 
			
		||||
      PLEASE_HELP_ME(opChan[ch]);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    case DIV_CMD_LEGATO: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,10 +27,12 @@ class DivPlatformYM2610Ext: public DivPlatformYM2610 {
 | 
			
		|||
    unsigned char freqH, freqL;
 | 
			
		||||
    int freq, baseFreq, pitch, pitch2, portaPauseFreq, ins;
 | 
			
		||||
    signed char konCycles;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause;
 | 
			
		||||
    bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta;
 | 
			
		||||
    int vol;
 | 
			
		||||
    unsigned char pan;
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {}
 | 
			
		||||
    // UGLY
 | 
			
		||||
    OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), pitch2(0), portaPauseFreq(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false),
 | 
			
		||||
    inPorta(false), vol(0), pan(3) {}
 | 
			
		||||
  };
 | 
			
		||||
  OpChannel opChan[4];
 | 
			
		||||
  bool isOpMuted[4];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue