void opl2_write(uint16_t a, uint8_t v, void *priv) { opl_t *opl = (opl_t *)priv; opl_write(0, a, v); opl_write(1, a, v); }
static void v_setvelvol(hmpopl *h, int v, int subop, int velvol, int nopan, int revpan) { int op = v_op[v][subop]; int volreg = calcvol(h, op, velvol); if (nopan) { opl_write_both(h, 0x40 + op, volreg); } else if ((h->ch_pan[h->v_ch[v]] < 64) ^ revpan) opl_write(h, 0, 0x40 + op, volreg); else opl_write(h, 1, 0x40 + op, volreg); }
void lds_setregs(Uint8 reg, Uint8 val) { if(fmchip[reg] == val) return; fmchip[reg] = val; opl_write(reg, val); }
void opl3_write(uint16_t a, uint8_t v, void *priv) { opl_t *opl = (opl_t *)priv; opl3_update2(opl); opl_write(0, a, v); }
static void v_alloff(hmpopl *h) { int v; opl_write(h, 0, 0xbd, 0); for (v = 0; v < 9; v++) opl_write_both(h, oplri_key + v, h->oplreg_key[v] & 0xdf); for (v = 0; v < 9; v++) opl_write_both(h, oplri_vol + v_op[v][1], 0xff); }
static void opl_clear(hmpopl *h) { int v; for (v = 0; v < 9; v++) { h->oplreg_key[v] = 0; opl_write_both(h, oplri_key + v, h->oplreg_key[v]); } opl_write(h, 0, oplri_drum, 0); }
// stripped down from DOSBOX adlib.cpp: Adlib::Module::PortWrite void dbadlib_PortWrite(AdlibTimer *timer, Bitu port, Bitu val ) { if ( port&1 ) { if ( !AdlibChip__WriteTimer( timer, reg.normal, val ) ) { opl_write( reg.normal, val ); } } else { opl_write_index( port, val ); reg.normal = val & 0x1ff; } }
static void v_setins(hmpopl *h, int v, struct oplins *ins) { int op = v_op[v][0]; int op1 = v_op[v][1]; h->op_sustrel[op] = ins->op0_sustrel; h->op_sustrel[op1] = ins->op1_sustrel; h->op_basevol[op] = ins->op0_vol; h->op_basevol[op1] = ins->op1_vol; opl_write_both(h, oplri_freq + op, ins->op0_freq); opl_write_both(h, oplri_vol + op, ins->op0_vol); opl_write_both(h, oplri_attdec + op, ins->op0_attdec); opl_write_both(h, oplri_sustrel + op, ins->op0_sustrel); opl_write(h, 0, oplri_chfb + v, (ins->chfb & 0x1f) | 0x20); opl_write(h, 1, oplri_chfb + v, (ins->chfb & 0x1f) | 0x10); opl_write_both(h, oplri_ws + op, ins->op0_ws); opl_write_both(h, oplri_freq + op1, ins->op1_freq); opl_write_both(h, oplri_attdec + op1, ins->op1_attdec); opl_write_both(h, oplri_sustrel + op1, ins->op1_sustrel); opl_write_both(h, oplri_ws + op1, ins->op1_ws); }
static void opl_done(hmpopl *h) { opl_write(h, 1, oplri_new, 0); }
static void opl_init(hmpopl *h) { opl_write(h, 1, oplri_new, 1); opl_write(h, 1, oplri_connsel, 0); }
static void opl_write_both_rev(hmpopl *h, int reg, int val) { opl_write(h, 1, reg, val); opl_write(h, 0, reg, val); }
void lds_rewind( void ) { int i; /* init all with 0 */ tempo_now = 3; playing = true; songlooped = false; jumping = fadeonoff = allvolume = hardfade = pattplay = posplay = jumppos = mainvolume = 0; memset(channel, 0, sizeof(channel)); memset(fmchip, 0, sizeof(fmchip)); /* OPL2 init */ opl_init(); /* Reset OPL chip */ opl_write(1, 0x20); opl_write(8, 0); opl_write(0xbd, regbd); for(i = 0; i < 9; i++) { opl_write(0x20 + op_table[i], 0); opl_write(0x23 + op_table[i], 0); opl_write(0x40 + op_table[i], 0x3f); opl_write(0x43 + op_table[i], 0x3f); opl_write(0x60 + op_table[i], 0xff); opl_write(0x63 + op_table[i], 0xff); opl_write(0x80 + op_table[i], 0xff); opl_write(0x83 + op_table[i], 0xff); opl_write(0xe0 + op_table[i], 0); opl_write(0xe3 + op_table[i], 0); opl_write(0xa0 + i, 0); opl_write(0xb0 + i, 0); opl_write(0xc0 + i, 0); } }