📄 melody.asm
字号:
;/**************************************************************************/
;/* Sunplus SPL Music Modules
;/* Library Name: Melody.asm
;/* Ver : v1.5 (Mini Version)
;/* Release Date: June, 2000
;/**************************************************************************/
;/**************************************************************************/
;/**************************************************************************/
F_MelodyInitial:
LDX #D_RampDownValue
STX P_DacCh1
STX P_DacCh2
LDX #0
STX R_QIndexCh1
STX R_QIndexCh2
STX R_StatusCh1
STX R_StatusCh2
STX R_MelodyStatus
INX
STX R_TempoCnt
;; STX DisableNmi
%SetTimerStop
LDX #9
STX R_TempoDataIndex
JSR F_SetUpTempo
;; LDA R_IntFlags
;; ORA #D_TBHIEnable
;; STA R_IntFlags
RTS
;/**************************************************************************/
;/* Melody Module */
;/* Service routine part */
;/**************************************************************************/
F_ServiceMelody:
LDA R_MelodyStatus
BPL L_ExitServiceMelody
;; AND #D_MelodyEnable
;; BEQ L_ExitServiceMelody
LDA R_StatusCh1
AND #D_ChPlayTone
BEQ L_Ch1NotInToneUpdateStatus
LDX #0
LDA (R_DataDPTRCh1,X)
CMP #FFH
BEQ L_EndPlayToneInstCh1
STA P_DacCh1
INC R_DataDPTRCh1
BNE L_Ch1NotInToneUpdateStatus
INC R_DataDPTRCh1+1
JMP L_Ch1NotInToneUpdateStatus
L_EndPlayToneInstCh1:
JSR F_StopCh1
L_Ch1NotInToneUpdateStatus:
LDA R_StatusCh2
AND #D_ChPlayTone
BEQ L_Ch2NotInToneUpdateStatus
LDX #0
LDA (R_DataDPTRCh2,X)
CMP #FFH
BEQ L_EndPlayToneInstCh2
STA P_DacCh2
INC R_DataDPTRCh2
BNE L_Ch2NotInToneUpdateStatus
INC R_DataDPTRCh2+1
JMP L_Ch2NotInToneUpdateStatus
L_EndPlayToneInstCh2:
JSR F_StopCh2
L_Ch2NotInToneUpdateStatus:
DEC R_TempoCnt
BNE L_ExitServiceMelody
LDA R_TempoPreLoad
STA R_TempoCnt
LDA R_BeatCnt
BEQ L_ServiceMelodyActive
DEC R_BeatCnt
BEQ L_ServiceMelodyActive
L_ExitServiceMelody:
RTS
L_ServiceMelodyActive:
L_DataFetchLoop:
JSR F_GetMelodyData
STA R_Temp
CMP #C0H
BCS F_InstrumentSelectCMD
CMP #80H
BCS F_AllSongEndedCMD
CMP #40H
BCS F_PlayDataCMD
CMP #20H
BCS F_TempoSelectCMD
CMP #10H
AND #07H
STA R_Temp
BCC L_CH1OctaveSelect
LDA R_StatusCh2
AND #.NOT.D_Octave
ORA R_Temp
STA R_StatusCh2
JMP L_DataFetchLoop
L_CH1OctaveSelect:
LDA R_StatusCh1
AND #.NOT.D_Octave
ORA R_Temp
STA R_StatusCh1
JMP L_DataFetchLoop
F_AllSongEndedCMD:
JMP F_StopPlayInIRQ
F_TempoSelectCMD:
AND #%00011111
STA R_TempoDataIndex
JSR F_SetUpTempo
JMP L_DataFetchLoop
F_InstrumentSelectCMD:
AND #%00010000
BNE L_CH2InstrumentSelectCMD
LDA R_Temp
AND #%00001111
STA R_InstCh1
JMP L_DataFetchLoop
L_CH2InstrumentSelectCMD:
LDA R_Temp
AND #%00001111
STA R_InstCh2
JMP L_DataFetchLoop
F_PlayDataCMD:
AND #%11011111
CMP #50H
BCS L_PlayCh2Data?
AND #%00001111
BNE L_NormalPlayCh1?
JSR F_StopCh1
JMP L_GetNextData
L_NormalPlayCh1?:
TAX
DEX
STX R_Temp
LDA R_StatusCh1
AND #D_Octave ;Get Ch1 Octave
TAX
LDA T_MultiBy12Table,X
CLC
ADC R_Temp
ASL A
TAX
LDY R_InstCh1
LDA T_ToneInstTable,Y
STA R_DataDPTRCh1 ;Clear Length Counter
LDA T_ToneInstTable+1,Y
STA R_DataDPTRCh1+1 ;Save the Instrument index
LDA T_ToneFreqTable,X
STA P_TimerCh0L ;Setup sample frequency & type
LDA T_ToneFreqTable+1,X
STA P_TimerCh0H
LDA R_StatusCh1
ORA #D_ChPlayTone
STA R_StatusCh1
JMP L_GetNextData
L_PlayCh2Data?:
AND #%00001111
BNE L_NormalPlayCh2?
JSR F_StopCh2
JMP L_GetNextData
L_NormalPlayCh2?:
TAX
DEX
STX R_Temp
LDA R_StatusCh2
AND #D_Octave
TAX
LDA T_MultiBy12Table,X
CLC
ADC R_Temp
ASL A
TAX ;Get frequency index
LDY R_InstCh2
LDA T_ToneInstTable,Y
STA R_DataDPTRCh2 ;Save the Instrument index
LDA T_ToneInstTable+1,Y
STA R_DataDPTRCh2+1
LDA T_ToneFreqTable,X
STA P_TimerCh1L ;Setup sample frequency & type
LDA T_ToneFreqTable+1,X
STA P_TimerCh1H
LDA R_StatusCh2
ORA #D_ChPlayTone
STA R_StatusCh2
L_GetNextData:
JSR F_GetMelodyData
STA R_Temp
BIT R_Temp
BMI F_SetUpDelay
JMP F_PlayDataCMD
F_SetUpDelay:
AND #%01111111
STA R_BeatCnt
RTS
;/**********************************************************************/
;/* F_SetupTempo: */
;/**********************************************************************/
F_SetUpTempo:
LDX R_TempoDataIndex
LDA T_TempoTable,X
STA R_TempoPreLoad
RTS
;/**************************************************************************/
F_GetMelodyData:
%ReadMelodyData
INC R_MelodyDPTR
BNE L_NotOverFlow?
INC R_MelodyDPTR+1
L_NotOverFlow?:
RTS
;/**************************************************************************/
;/* Melody Module */
;/* Function call part */
;/**************************************************************************/
;/* F_PlayMelody: */
;/* X: music number */
;/**************************************************************************/
F_PlayKeyTone:
LDA R_MelodyStatus
AND #D_KeyToneMute
BNE L_NotPlay
LDX #0
LDA #1
JMP F_PlayMelodyOn
F_PlayKeyTone2:
LDA R_MelodyStatus
AND #D_KeyToneMute
BNE L_NotPlay
LDX #1
LDA #1
JMP F_PlayMelodyOn
F_PlayMelody:
sta R_Tmp0
LDA R_MelodyStatus
AND #D_Mute
BNE L_NotPlay
lda R_Tmp0
F_PlayMelodyOn:
sta R_MelodyDPTR+2
lda R_MelodyStatus
and #D_MelodyEnable
bne L_NotPlay
lda P_BankSwitch00
pha
stx R_Tmp0
ldx R_MelodyDPTR+2
jsr F_SetBank
ldx R_Tmp0
lda $4000,x
sta R_MelodyDPTR
lda $4020,x
sta R_MelodyDPTR+1
LDX #0
STX R_BeatCnt
STX R_InstCh1
STX R_InstCh2
INX
STX R_TempoCnt
LDX #9 ;Default tempo = 120
STX R_TempoDataIndex
JSR F_SetUpTempo
%SetPWMToneCh1On
%SetPWMToneCh2On
%SetTimerStart
SEI
LDA R_MelodyStatus
ORA #D_MelodyEnable
STA R_MelodyStatus
CLI
pla
tax
jsr F_SetBank
L_NotPlay:
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -