typedef struct emu8k_t
{
        struct
        {
                uint32_t cpf;
                uint32_t ptrx;
                uint32_t cvcf;
                uint32_t vtft;
                uint32_t psst;
                uint32_t csl;
                
                uint32_t ccca;

                uint16_t init1, init2, init3, init4;
                
                uint16_t envvol;
                uint16_t dcysusv;
                uint16_t envval;
                uint16_t dcysus;
                uint16_t atkhldv;
                uint16_t lfo1val, lfo2val;
                uint16_t atkhld;
                uint16_t ip;
                uint16_t ifatn;
                uint16_t pefe;
                uint16_t fmmod;
                uint16_t tremfrq;
                uint16_t fm2frq2;
                
                int voice_on;
                
                uint64_t addr;
                uint64_t loop_start, loop_end;
                
                uint16_t pitch;
                int attenuation;
                int env_state, env_vol;
                int env_attack, env_decay, env_sustain, env_release;

                int menv_state, menv_vol;
                int menv_attack, menv_decay, menv_sustain, menv_release;
                
                int lfo1_count, lfo2_count;
                int8_t lfo1_fmmod, lfo2_fmmod;
                int8_t lfo1_trem;
                int vol_l, vol_r;
                
                int8_t fe_height;
                
                int64_t vlp, vbp, vhp;
                int32_t q;
                
                int filter_offset;
                
/*                float vlp, vbp, vhp;
                float q;*/
                
                int cutoff;
        } voice[32];

        uint32_t hwcf1, hwcf2, hwcf3;
        uint32_t hwcf4, hwcf5, hwcf6;
                
        uint32_t smalr, smarr, smalw, smarw;
        uint16_t smld_buffer, smrd_buffer;

        uint16_t wc;
        
        uint16_t c02_read;

	uint16_t id;
        
        int16_t *ram, *rom;
        
        uint32_t ram_end_addr;
        
        int cur_reg, cur_voice;
        
        int timer_count;
        
        int16_t out_l, out_r;
        
        int pos;
        int32_t buffer[SOUNDBUFLEN * 2];
} emu8k_t;

void emu8k_init(emu8k_t *emu8k, int onboard_ram);
void emu8k_close(emu8k_t *emu8k);

void emu8k_update(emu8k_t *emu8k);
