DO NOT USE - THIS FAILS - WORK IN PROGRESS
This commit is contained in:
parent
06ec22d6a5
commit
14053f70cb
|
@ -354,6 +354,7 @@ src/engine/platform/c64.cpp
|
||||||
src/engine/platform/arcade.cpp
|
src/engine/platform/arcade.cpp
|
||||||
src/engine/platform/tx81z.cpp
|
src/engine/platform/tx81z.cpp
|
||||||
src/engine/platform/ym2203.cpp
|
src/engine/platform/ym2203.cpp
|
||||||
|
src/engine/platform/ym2203ext.cpp
|
||||||
src/engine/platform/ym2608.cpp
|
src/engine/platform/ym2608.cpp
|
||||||
src/engine/platform/ym2610.cpp
|
src/engine/platform/ym2610.cpp
|
||||||
src/engine/platform/ym2610ext.cpp
|
src/engine/platform/ym2610ext.cpp
|
||||||
|
|
|
@ -17,20 +17,20 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ym2610bext.h"
|
#include "ym2203ext.h"
|
||||||
#include "../engine.h"
|
#include "../engine.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "ym2610shared.h"
|
#include "ym2610shared.h"
|
||||||
#include "fmshared_OPN.h"
|
#include "fmshared_OPN.h"
|
||||||
|
|
||||||
int DivPlatformYM2610BExt::dispatch(DivCommand c) {
|
int DivPlatformYM2203Ext::dispatch(DivCommand c) {
|
||||||
if (c.chan<2) {
|
if (c.chan<2) {
|
||||||
return DivPlatformYM2610B::dispatch(c);
|
return DivPlatformYM2203::dispatch(c);
|
||||||
}
|
}
|
||||||
if (c.chan>5) {
|
if (c.chan>5) {
|
||||||
c.chan-=3;
|
c.chan-=3;
|
||||||
return DivPlatformYM2610B::dispatch(c);
|
return DivPlatformYM2203::dispatch(c);
|
||||||
}
|
}
|
||||||
int ch=c.chan-2;
|
int ch=c.chan-2;
|
||||||
int ordch=orderedOps[ch];
|
int ordch=orderedOps[ch];
|
||||||
|
@ -384,7 +384,7 @@ static int opChanOffsH[4]={
|
||||||
0xad, 0xae, 0xac, 0xa6
|
0xad, 0xae, 0xac, 0xa6
|
||||||
};
|
};
|
||||||
|
|
||||||
void DivPlatformYM2610BExt::tick(bool sysTick) {
|
void DivPlatformYM2203Ext::tick(bool sysTick) {
|
||||||
if (extMode) {
|
if (extMode) {
|
||||||
bool writeSomething=false;
|
bool writeSomething=false;
|
||||||
unsigned char writeMask=2;
|
unsigned char writeMask=2;
|
||||||
|
@ -401,7 +401,7 @@ void DivPlatformYM2610BExt::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DivPlatformYM2610B::tick(sysTick);
|
DivPlatformYM2203::tick(sysTick);
|
||||||
|
|
||||||
bool writeNoteOn=false;
|
bool writeNoteOn=false;
|
||||||
unsigned char writeMask=2;
|
unsigned char writeMask=2;
|
||||||
|
@ -438,13 +438,13 @@ void DivPlatformYM2610BExt::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformYM2610BExt::muteChannel(int ch, bool mute) {
|
void DivPlatformYM2203Ext::muteChannel(int ch, bool mute) {
|
||||||
if (ch<2) {
|
if (ch<2) {
|
||||||
DivPlatformYM2610B::muteChannel(ch,mute);
|
DivPlatformYM2203::muteChannel(ch,mute);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ch>5) {
|
if (ch>5) {
|
||||||
DivPlatformYM2610B::muteChannel(ch-3,mute);
|
DivPlatformYM2203::muteChannel(ch-3,mute);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
isOpMuted[ch-2]=mute;
|
isOpMuted[ch-2]=mute;
|
||||||
|
@ -462,7 +462,7 @@ void DivPlatformYM2610BExt::muteChannel(int ch, bool mute) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformYM2610BExt::forceIns() {
|
void DivPlatformYM2203Ext::forceIns() {
|
||||||
for (int i=0; i<6; i++) {
|
for (int i=0; i<6; i++) {
|
||||||
for (int j=0; j<4; j++) {
|
for (int j=0; j<4; j++) {
|
||||||
unsigned short baseAddr=chanOffs[i]|opOffs[j];
|
unsigned short baseAddr=chanOffs[i]|opOffs[j];
|
||||||
|
@ -494,7 +494,6 @@ void DivPlatformYM2610BExt::forceIns() {
|
||||||
rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15);
|
rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15);
|
||||||
}
|
}
|
||||||
rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3));
|
rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3));
|
||||||
rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4));
|
|
||||||
if (chan[i].active) {
|
if (chan[i].active) {
|
||||||
chan[i].keyOn=true;
|
chan[i].keyOn=true;
|
||||||
chan[i].freqChanged=true;
|
chan[i].freqChanged=true;
|
||||||
|
@ -518,23 +517,23 @@ void DivPlatformYM2610BExt::forceIns() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void* DivPlatformYM2610BExt::getChanState(int ch) {
|
void* DivPlatformYM2203Ext::getChanState(int ch) {
|
||||||
if (ch>=6) return &chan[ch-3];
|
if (ch>=6) return &chan[ch-3];
|
||||||
if (ch>=2) return &opChan[ch-2];
|
if (ch>=2) return &opChan[ch-2];
|
||||||
return &chan[ch];
|
return &chan[ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
DivDispatchOscBuffer* DivPlatformYM2610BExt::getOscBuffer(int ch) {
|
DivDispatchOscBuffer* DivPlatformYM2203Ext::getOscBuffer(int ch) {
|
||||||
if (ch>=6) return oscBuf[ch-3];
|
if (ch>=6) return oscBuf[ch-3];
|
||||||
if (ch<3) return oscBuf[ch];
|
if (ch<3) return oscBuf[ch];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformYM2610BExt::reset() {
|
void DivPlatformYM2203Ext::reset() {
|
||||||
DivPlatformYM2610B::reset();
|
DivPlatformYM2203::reset();
|
||||||
|
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
opChan[i]=DivPlatformYM2610BExt::OpChannel();
|
opChan[i]=DivPlatformYM2203Ext::OpChannel();
|
||||||
opChan[i].vol=127;
|
opChan[i].vol=127;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -543,12 +542,12 @@ void DivPlatformYM2610BExt::reset() {
|
||||||
extMode=true;
|
extMode=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DivPlatformYM2610BExt::keyOffAffectsArp(int ch) {
|
bool DivPlatformYM2203Ext::keyOffAffectsArp(int ch) {
|
||||||
return (ch>8);
|
return (ch>8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformYM2610BExt::notifyInsChange(int ins) {
|
void DivPlatformYM2203Ext::notifyInsChange(int ins) {
|
||||||
DivPlatformYM2610B::notifyInsChange(ins);
|
DivPlatformYM2203::notifyInsChange(ins);
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
if (opChan[i].ins==ins) {
|
if (opChan[i].ins==ins) {
|
||||||
opChan[i].insChanged=true;
|
opChan[i].insChanged=true;
|
||||||
|
@ -556,8 +555,8 @@ void DivPlatformYM2610BExt::notifyInsChange(int ins) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int DivPlatformYM2610BExt::init(DivEngine* parent, int channels, int sugRate, unsigned int flags) {
|
int DivPlatformYM2203Ext::init(DivEngine* parent, int channels, int sugRate, unsigned int flags) {
|
||||||
DivPlatformYM2610B::init(parent,channels,sugRate,flags);
|
DivPlatformYM2203::init(parent,channels,sugRate,flags);
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
isOpMuted[i]=false;
|
isOpMuted[i]=false;
|
||||||
}
|
}
|
||||||
|
@ -566,9 +565,9 @@ int DivPlatformYM2610BExt::init(DivEngine* parent, int channels, int sugRate, un
|
||||||
return 19;
|
return 19;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformYM2610BExt::quit() {
|
void DivPlatformYM2203Ext::quit() {
|
||||||
DivPlatformYM2610B::quit();
|
DivPlatformYM2203::quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
DivPlatformYM2610BExt::~DivPlatformYM2610BExt() {
|
DivPlatformYM2203Ext::~DivPlatformYM2203Ext() {
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,9 +19,9 @@
|
||||||
|
|
||||||
#include "../dispatch.h"
|
#include "../dispatch.h"
|
||||||
|
|
||||||
#include "ym2610b.h"
|
#include "ym2203.h"
|
||||||
|
|
||||||
class DivPlatformYM2610BExt: public DivPlatformYM2610B {
|
class DivPlatformYM2203Ext: public DivPlatformYM2203 {
|
||||||
struct OpChannel {
|
struct OpChannel {
|
||||||
DivMacroInt std;
|
DivMacroInt std;
|
||||||
unsigned char freqH, freqL;
|
unsigned char freqH, freqL;
|
||||||
|
@ -47,5 +47,5 @@ class DivPlatformYM2610BExt: public DivPlatformYM2610B {
|
||||||
void notifyInsChange(int ins);
|
void notifyInsChange(int ins);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
void quit();
|
void quit();
|
||||||
~DivPlatformYM2610BExt();
|
~DivPlatformYM2203Ext();
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
|
|
||||||
|
DivOrders emptyOrders;
|
||||||
|
|
||||||
void DivSong::clearSongData() {
|
void DivSong::clearSongData() {
|
||||||
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
||||||
pat[i].wipePatterns();
|
pat[i].wipePatterns();
|
||||||
|
|
|
@ -110,6 +110,31 @@ enum DivSystem {
|
||||||
DIV_SYSTEM_DUMMY
|
DIV_SYSTEM_DUMMY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern DivOrders emptyOrders;
|
||||||
|
|
||||||
|
struct DivSubSong {
|
||||||
|
String name, notes;
|
||||||
|
unsigned char hilightA, hilightB;
|
||||||
|
unsigned char timeBase, speed1, speed2, arpLen;
|
||||||
|
bool pal;
|
||||||
|
bool customTempo;
|
||||||
|
float hz;
|
||||||
|
int patLen, ordersLen;
|
||||||
|
|
||||||
|
DivOrders orders;
|
||||||
|
DivChannelData pat[DIV_MAX_CHANS];
|
||||||
|
|
||||||
|
bool chanShow[DIV_MAX_CHANS];
|
||||||
|
unsigned char chanCollapse[DIV_MAX_CHANS];
|
||||||
|
|
||||||
|
DivSubSong() {
|
||||||
|
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
||||||
|
chanShow[i]=true;
|
||||||
|
chanCollapse[i]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct DivSong {
|
struct DivSong {
|
||||||
// version number used for saving the song.
|
// version number used for saving the song.
|
||||||
// Furnace will save using the latest possible version,
|
// Furnace will save using the latest possible version,
|
||||||
|
@ -156,14 +181,21 @@ struct DivSong {
|
||||||
// - introduces Genesis system
|
// - introduces Genesis system
|
||||||
// - introduces system number
|
// - introduces system number
|
||||||
// - patterns now stored in current known format
|
// - patterns now stored in current known format
|
||||||
|
// - 8: ???
|
||||||
|
// - only used in the Medivo YMU cover
|
||||||
// - 7: ???
|
// - 7: ???
|
||||||
|
// - only present in a later version of First.dmf
|
||||||
|
// - pattern format changes: empty field is 0xFF instead of 0x80
|
||||||
|
// - instrument now stored in pattern
|
||||||
// - 5: BETA 3
|
// - 5: BETA 3
|
||||||
// - adds arpeggio tick
|
// - adds arpeggio tick
|
||||||
// - 4: BETA 2
|
// - 4: BETA 2
|
||||||
|
// - possibly adds instrument number (stored in channel)?
|
||||||
|
// - cannot confirm as I don't have any version 4 modules
|
||||||
// - 3: BETA 1
|
// - 3: BETA 1
|
||||||
// - possibly the first version that could save
|
// - possibly the first version that could save
|
||||||
// - basic format, no system number, 16 instruments, one speed, YMU759-only
|
// - basic format, no system number, 16 instruments, one speed, YMU759-only
|
||||||
// - patterns were stored in a different format (chars instead of shorts)
|
// - patterns were stored in a different format (chars instead of shorts) and no instrument
|
||||||
// - if somebody manages to find a version 2 or even 1 module, please tell me as it will be worth more than a luxury vehicle
|
// - if somebody manages to find a version 2 or even 1 module, please tell me as it will be worth more than a luxury vehicle
|
||||||
unsigned short version;
|
unsigned short version;
|
||||||
bool isDMF;
|
bool isDMF;
|
||||||
|
@ -345,14 +377,16 @@ struct DivSong {
|
||||||
bool snDutyReset;
|
bool snDutyReset;
|
||||||
bool pitchMacroIsLinear;
|
bool pitchMacroIsLinear;
|
||||||
|
|
||||||
DivOrders orders;
|
DivOrders* orders;
|
||||||
std::vector<DivInstrument*> ins;
|
std::vector<DivInstrument*> ins;
|
||||||
DivChannelData pat[DIV_MAX_CHANS];
|
DivChannelData* pat;
|
||||||
std::vector<DivWavetable*> wave;
|
std::vector<DivWavetable*> wave;
|
||||||
std::vector<DivSample*> sample;
|
std::vector<DivSample*> sample;
|
||||||
|
|
||||||
bool chanShow[DIV_MAX_CHANS];
|
std::vector<DivSubSong> subsongs;
|
||||||
unsigned char chanCollapse[DIV_MAX_CHANS];
|
|
||||||
|
bool* chanShow;
|
||||||
|
unsigned char* chanCollapse;
|
||||||
|
|
||||||
DivInstrument nullIns, nullInsOPLL, nullInsOPL, nullInsQSound;
|
DivInstrument nullIns, nullInsOPLL, nullInsOPL, nullInsQSound;
|
||||||
DivWavetable nullWave;
|
DivWavetable nullWave;
|
||||||
|
@ -457,10 +491,11 @@ struct DivSong {
|
||||||
systemPan[i]=0;
|
systemPan[i]=0;
|
||||||
systemFlags[i]=0;
|
systemFlags[i]=0;
|
||||||
}
|
}
|
||||||
for (int i=0; i<DIV_MAX_CHANS; i++) {
|
subsongs.push_back(DivSubSong());
|
||||||
chanShow[i]=true;
|
chanShow=subsongs[0].chanShow;
|
||||||
chanCollapse[i]=0;
|
chanCollapse=subsongs[0].chanCollapse;
|
||||||
}
|
orders=&subsongs[0].orders;
|
||||||
|
pat=subsongs[0].pat;
|
||||||
system[0]=DIV_SYSTEM_YM2612;
|
system[0]=DIV_SYSTEM_YM2612;
|
||||||
system[1]=DIV_SYSTEM_SMS;
|
system[1]=DIV_SYSTEM_SMS;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue