auto PSG::write(uint8 data) -> void { bool l = data.bit(7); if(l) select = data.bits(4,6); switch(select) { case 0: { if(l) tone0.pitch.bits(0,3) = data.bits(0,3); else tone0.pitch.bits(4,9) = data.bits(0,5); break; } case 1: { tone0.volume = data.bits(0,3); break; } case 2: { if(l) tone1.pitch.bits(0,3) = data.bits(0,3); else tone1.pitch.bits(4,9) = data.bits(0,5); break; } case 3: { tone1.volume = data.bits(0,3); break; } case 4: { if(l) tone2.pitch.bits(0,3) = data.bits(0,3); else tone2.pitch.bits(4,9) = data.bits(0,5); noise.pitch = tone2.pitch; break; } case 5: { tone2.volume = data.bits(0,3); break; } case 6: { noise.rate = data.bits(0,1); noise.enable = data.bit(2); noise.lfsr = 0x8000; break; } case 7: { noise.volume = data.bits(0,3); break; } } } //Game Gear only auto PSG::balance(uint8 data) -> void { tone0.right = data.bit(0); tone1.right = data.bit(1); tone2.right = data.bit(2); noise.right = data.bit(3); tone0.left = data.bit(4); tone1.left = data.bit(5); tone2.left = data.bit(6); noise.left = data.bit(7); }