Primera nota musical con el YM2151

Después de prepararme para controlar un YM2151 a través de MAME (explicación). Aquí va mi primera nota, no sin esfuerzo. Para ello escribo los siguientes valores en los registros:

Registro Nombre Valor Explicación
Del $60 al $7F Total Level $00 volumen
$20 Connection $C7 $C = Salida por izquierda y derecha
$7 = conexión tipo 7
 $28 Key Code $4A $4 = octava
$A = nota (la)
 $40 Phase Multiplier 1
 $C0 Detune 2 0
 $38 Phase Modulation Sensitivity 0
Del $80 al $83 Attack Rate $10 Comienzo de la envolvente
Del $A0 al $A3 Decay 1 Rate $10 Caída de la envolvente
Del $C0 al $C3 Decay 2 Rate $10 Caída de la envolvente
Del $E0 al $E3 Release Rate $8 Caída de la envolvente
 $78 Key On $78 Comienza la envolvente para todos los operadores del canal 0

Sólo con esto ya se consigue sonido… una vez. Para repetirlo hay que volver a escribir a YM_KEYON ($78), esta vez con un $00 y luego volver a escribir un $78 para que empiece el sonido de nuevo. La repetición la hago en el código usando los temporizadores del YM2151 para esperar aproximadamente medio segundo.

A continuación está el código completo en ensamblador del 6809. Este código lo ensamblo y corro con el MAME.


; YM Registers
YM_KEYON EQU $08
YM_TIMERB EQU $12
YM_TIMER_CTRL EQU $14
YM_CT EQU $1B
YM_CONNECTION EQU $20
YM_KEY_CODE EQU $28
YM_KEY_FRACTION EQU $30
YM_PMS EQU $38
YM_PHASE_MUL EQU $40
YM_DETUNE2 EQU $C0
YM_ATTACK_RATE EQU $80
YM_DECAY1_RATE EQU $A0
YM_DECAY2_RATE EQU $C0
YM_RELEASE_RATE EQU $E0
; YM LOCATION IN THE MEMORY MAP
YM_ADR EQU $2000
YM_DATA EQU $2001
ORG $8000
RESET LDD #$6800
TFR D,S
; SET TOTAL LEVEL TO 00 FOR ALL CHANNELS
LDA #$60
STA $6000
TL_NXT: LDA $6000
CMPA #$80
BEQ PLAY
LDB #$00
JSR WRITE_YM
INC $6000
BRA TL_NXT
PLAY JSR WAIT
LDB #$C7
LDA #YM_CONNECTION
JSR WRITE_YM
LDB #$4A ; A 440Hz
LDA #YM_KEY_CODE
JSR WRITE_YM
LDB #1
LDA #YM_PHASE_MUL
JSR WRITE_YM
CLRB
LDA #YM_DETUNE2
JSR WRITE_YM
CLRB
LDA #YM_PMS
JSR WRITE_YM
; Envelope
CLRA
EG58 STA $6000
LDA #YM_ATTACK_RATE
ADDA $6000
LDB #$10
JSR WRITE_YM
LDA #YM_DECAY1_RATE
ADDA $6000
LDB #$10
JSR WRITE_YM
LDA #YM_DECAY2_RATE
ADDA $6000
LDB #$10
JSR WRITE_YM
LDA #YM_RELEASE_RATE
ADDA $6000
LDB #$8
JSR WRITE_YM
LDA $6000
INCA
CMPA #4
BNE EG58
KEYON:
LDB #$78
LDA #YM_KEYON
JSR WRITE_YM
; Wait for 0.5s before starting again
LDA #7
STA $6000
L59 LDA #YM_TIMERB
LDB 0
JSR WRITE_YM
LDA #YM_TIMER_CTRL
LDB #$2A
JSR WRITE_YM
L60 LDA YM_DATA
ANDA #2
BEQ L60
LDA #YM_TIMER_CTRL
LDB #$30 ; Reset flags
JSR WRITE_YM
DEC $6000
BNE L59
; key off
LDB #$00
LDA #YM_KEYON
JSR WRITE_YM
LBRA PLAY ; play it again, Sam
WAIT LDA #$FF
LOOP DECA
BNE LOOP
RTS
WRITE_YM:
JSR WAIT_YM
STA YM_ADR
JSR WAIT_YM
STB YM_DATA
RTS
WAIT_YM:
PSHS A ;
LDA YM_DATA
ANDA #$80
BNE WAIT_YM
PULS A ;
RTS
IRQ_SER RTI
TopMem EQU $FFF8
FILL $FF,TopMem-*
FDB IRQ_SER ; $FFF8
FDB $FFFF, $FFFF
FDB RESET

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: