#ifndef DOSBOX_ADLIB_H
#define DOSBOX_ADLIB_H
namespace Adlib {
struct Timer {
double start;
double delay;
bool enabled, overflow, masked;
Bit8u counter;
Timer() {
masked = false;
overflow = false;
enabled = false;
counter = 0;
delay = 0;
}
void Update( double time ) {
if ( !enabled || !delay )
return;
double deltaStart = time - start;
if ( deltaStart >= 0 && !masked ) {
overflow = 1;
}
}
void Reset(const double& time ) {
overflow = false;
if ( !delay || !enabled )
return;
double delta = (time - start);
double rem = fmod( delta, delay );
double next = delay - rem;
start = time + next;
}
void Stop( ) {
enabled = false;
}
void Start( const double& time, Bits scale ) {
if ( enabled ) {
return;
}
enabled = true;
delay = 0.001 * (256 - counter ) * scale;
start = time + delay;
}
};
struct Chip {
Timer timer[2];
bool Write( Bit32u addr, Bit8u val );
Bit8u Read( );
};
typedef enum {
MODE_OPL2,
MODE_DUALOPL2,
MODE_OPL3
} Mode;
typedef Bit8u RegisterCache[512];
class Capture;
}
#endif