⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 melody.asm

📁 asm.rar 拉斯维加丝盘源代码 ASM51
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;/**************************************************************************/
;/*   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 + -