Soundchip YM2149

De Wiki LOGre
Aller à : navigation, rechercher


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" :

  1. postionner les données sur le bus DA0-DA7 (données = valeur d'un registre ou adresse d'un registre)
  2. 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 :

  1. Mettre le Bus Control Decoder à Inactif
  2. Mettre l'adresse du registre FreqA sur le bus
  3. Mettre le Bus Control Decoder à Address (Address = FreqA)
  4. Mettre le Bus Control Decoder à Inactif
  5. Mettre la valeur de la frequence sur le bus
  6. Mettre le Bus Control Decoder à Read

la on a mis la frequence du signal carré

  1. Mettre le Bus Control Decoder à Inactif
  2. Mettre l'adresse du registre Mixer sur le bus
  3. Mettre le Bus Control Decoder à Address (Address = Mixer)
  4. Mettre le Bus Control Decoder à Inactif
  5. Mettre la valeur : mixer = canal A sur le bus
  6. Mettre le Bus Control Decoder à Read

la on a activé la voix A

  1. Mettre le Bus Control Decoder à Inactif
  2. Mettre l'adresse du registre Channel A Level sur le bus
  3. Mettre le Bus Control Decoder à Address (Address = Channel A Level)
  4. Mettre le Bus Control Decoder à Inactif
  5. Mettre la valeur max du level sur le bus
  6. 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