Soundchip YM2149
Datasheet
lien : http://www.ym2149.com/ym2149.pdf
Résumé
- Bus Control Decoder :
BC2 BDIR BC1 Mode 0 0 0 Inactive 0 0 1 Address 0 1 0 Address 0 1 1 Inactive -------------------------------- 1 0 0 Inactive 1 0 1 Read 1 1 0 Write 1 1 1 Address
- YM Regs
0x00 : Channel A freq (8bits fine) 0x01 : Channel A freq (4bits rough) 0x02 : Channel B freq (8bits fine) 0x03 : Channel B freq (4bits rough) 0x04 : Channel C freq (8bits fine) 0x05 : Channel C freq (4bits rough) 0x06 : Noise freq (5bits) 0x07 : I/O & Mixer settings (Noise, Tone) 0x08 : Channel A level 0x09 : Channel B level 0x0A : Channel C level 0x0B : Enveloppe freq (8bits fine) 0x0C : Enveloppe freq (8bits rough) 0x0D : Enveloppe Shape (Cont, att, alt, hold)
Exemple
En gros, c'est tjs la meme "histoire" :
- postionner les données sur le bus DA0-DA7 (données = valeur d'un registre ou adresse d'un registre)
- positionner les registres de control du BUS pour specifier ce que l'on veut faire (et respecter les timings) : rien, lire, ecrire, positionner l'adresse
c'est tout !
Ex, donc pour jouer un son sur le canal A ca donne :
- Mettre le Bus Control Decoder à Inactif
- Mettre l'adresse du registre FreqA sur le bus
- Mettre le Bus Control Decoder à Address (Address = FreqA)
- Mettre le Bus Control Decoder à Inactif
- Mettre la valeur de la frequence sur le bus
- Mettre le Bus Control Decoder à Read
la on a mis la frequence du signal carré
- Mettre le Bus Control Decoder à Inactif
- Mettre l'adresse du registre Mixer sur le bus
- Mettre le Bus Control Decoder à Address (Address = Mixer)
- Mettre le Bus Control Decoder à Inactif
- Mettre la valeur : mixer = canal A sur le bus
- Mettre le Bus Control Decoder à Read
la on a activé la voix A
- Mettre le Bus Control Decoder à Inactif
- Mettre l'adresse du registre Channel A Level sur le bus
- Mettre le Bus Control Decoder à Address (Address = Channel A Level)
- Mettre le Bus Control Decoder à Inactif
- Mettre la valeur max du level sur le bus
- Mettre le Bus Control Decoder à Read
la on a setté la voix A a son niveau max
That's all ! (au timing pret entre chaque step, voir le pdf)
- pseudo code (si µproc)
PORTD0-7 outputs to the PSG data ports DA0-DA7. PORTC0 = BDIR PORTC1 = BC1 (BC2 is tied to 5+v) void send_ym(int reg, int data) { PORTC = 0x00; // send 'inactive', logical 0 to BDIR/BC1 (BC2 is always 1) PORTD = reg; // put register number on data port PORTC = 0x03; // (%11) send 1 to BDIR/BC1 to latch register address PORTC = 0x00; // send 'inactive', logical 0 to BDIR/BC1 PORTD = data; // data to send to previously selected register PORTC = 0x01; // send 1 to BDIR, 0 to BC1 to latch data to register } Test sound: Output tone on all channels send_ym(0x00,0xFE);//Set Channel A Tone Period send_ym(0x01,0x00); send_ym(0x02,0xFE);//Set Channel B Tone Period send_ym(0x03,0x00); send_ym(0x04,0xFE);//Set Channel C Tone Period send_ym(0x05,0x00); send_ym(0x07,0xF8); //Output on channels ABC send_ym(0x08,0x0F);//Channel A Amplitude send_ym(0x09,0x0F);//Channel B Amplitude send_ym(0x0A,0x0F);//Channel C Amplitude