diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 8a78748e..0cc37f58 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -2,6 +2,7 @@ #define _DISPATCH_H #include +#include #define ONE_SEMITONE 2200 @@ -98,15 +99,27 @@ struct DivDelayedCommand { DivCommand cmd; }; +struct DivRegWrite { + /** + * an address of 0xffffff00 indicates a Furnace specific command. + * the following addresses are available: + * - 0xffffff00: start sample playback + * - data is the sample number + */ + unsigned int addr; + unsigned char val; +}; + class DivEngine; class DivDispatch { protected: DivEngine* parent; + std::vector regWrites; /** - * please honor this variable if needed. + * please honor these variables if needed. */ - bool skipRegisterWrites; + bool skipRegisterWrites, dumpWrites; public: /** * the rate the samples are provided. @@ -208,6 +221,16 @@ class DivDispatch { */ virtual void forceIns(); + /** + * enable register dumping. + */ + void toggleRegisterDump(bool enable); + + /** + * get register writes. + */ + std::vector& getRegisterWrites(); + /** * initialize this DivDispatch. * @param parent the parent DivEngine. diff --git a/src/engine/engine.h b/src/engine/engine.h index 0acbab4c..322026a8 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -189,6 +189,11 @@ class DivEngine { SafeWriter* saveDMF(); // save as .fur. SafeWriter* saveFur(); + // build a ROM file (TODO). + // specify system to build ROM for. + SafeWriter* buildROM(int sys); + // dump to VGM (TODO). + SafeWriter* saveVGM(); // save config bool saveConf(); diff --git a/src/engine/pattern.cpp b/src/engine/pattern.cpp index 29a8a439..9ef90756 100644 --- a/src/engine/pattern.cpp +++ b/src/engine/pattern.cpp @@ -30,6 +30,81 @@ void DivChannelData::wipePatterns() { } } +SafeReader* DivPattern::compile(int len, int fxRows) { + SafeWriter w; + w.init(); + short lastNote, lastOctave, lastInstr, lastVolume, lastEffect[8], lastEffectVal[8]; + unsigned char rows=0; + + lastNote=0; + lastOctave=0; + lastInstr=-1; + lastVolume=-1; + memset(lastEffect,-1,8*sizeof(short)); + memset(lastEffectVal,-1,8*sizeof(short)); + + for (int i=0; i& DivDispatch::getRegisterWrites() { + return regWrites; +} + int DivDispatch::init(DivEngine* p, int channels, int sugRate, bool pal) { return 0; } diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 539bb6ac..7900e682 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -227,6 +227,7 @@ void DivPlatformAmiga::setPAL(bool pal) { int DivPlatformAmiga::init(DivEngine* p, int channels, int sugRate, bool pal) { parent=p; + dumpWrites=false; skipRegisterWrites=false; for (int i=0; i<4; i++) { isMuted[i]=false; diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 4cd663d1..245775bc 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -473,6 +473,7 @@ void DivPlatformArcade::setYMFM(bool use) { int DivPlatformArcade::init(DivEngine* p, int channels, int sugRate, bool pal) { parent=p; + dumpWrites=false; skipRegisterWrites=false; for (int i=0; i<13; i++) { isMuted[i]=false; diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index 9b2b557d..d42ed6e8 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -318,6 +318,7 @@ void DivPlatformAY8910::setPAL(bool pal) { int DivPlatformAY8910::init(DivEngine* p, int channels, int sugRate, bool pal) { parent=p; + dumpWrites=false; skipRegisterWrites=false; for (int i=0; i<3; i++) { isMuted[i]=false; diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index a4c81b56..abbcdb74 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -356,6 +356,7 @@ void DivPlatformAY8930::setPAL(bool pal) { int DivPlatformAY8930::init(DivEngine* p, int channels, int sugRate, bool pal) { parent=p; + dumpWrites=false; skipRegisterWrites=false; for (int i=0; i<3; i++) { isMuted[i]=false; diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 6265cacb..b930100d 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -351,6 +351,7 @@ void DivPlatformC64::setPAL(bool pal) { int DivPlatformC64::init(DivEngine* p, int channels, int sugRate, bool pal) { parent=p; + dumpWrites=false; skipRegisterWrites=false; for (int i=0; i<3; i++) { isMuted[i]=false; diff --git a/src/engine/platform/dummy.cpp b/src/engine/platform/dummy.cpp index 47a855a1..bd008215 100644 --- a/src/engine/platform/dummy.cpp +++ b/src/engine/platform/dummy.cpp @@ -75,6 +75,7 @@ void DivPlatformDummy::reset() { int DivPlatformDummy::init(DivEngine* p, int channels, int sugRate, bool pal) { parent=p; + dumpWrites=false; skipRegisterWrites=false; for (int i=0; i #include #include +#include "safeReader.h" #include "../ta-utils.h" class SafeWriter { @@ -38,6 +39,7 @@ class SafeWriter { int writeString(String val, bool pascal); void init(); + SafeReader* toReader(); void finish(); SafeWriter():