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

📄 2024psg1.asm

📁 关于利用ST2024进行的PSG原DEMO程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
                LDA     REPEAT_TIMES0
                CMP     #01
                BEQ     CHECK_REPEAT_TIMES
IS_CHANNEL0_MUTE:
                MAC_VOLUME      #OFF0,0         ; Close CHANNEL0 Volume
                INY
                LDA     (MUSIC_POINTER0),Y      ; GET SOUND LENGTH
                STA     SOUND_LEN0
                BRA     OUT_CHANNEL0_SOUND
CHANNEL0_NOT_MUTE:
                ASL     A
                TAX
                LDA     NOTE_TAB,X
                STA     PSG0L
                LDA     NOTE_TAB+1,X
                STA     PSG0H                   ; MUSIC DATA
                INY
                LDA     (MUSIC_POINTER0),Y      ; GET SOUND LENGTH
                STA     SOUND_LEN0
                RESB    5,MELODY_FLAG           ; SOUND LENGTH > 20 FLAG
                CMP     #20
                BCC     CH0_SOUND_LEN_LESS20
                SETB    5,MELODY_FLAG
CH0_SOUND_LEN_LESS20:
                MAC_VOLUME      #HI0,0          ; OUT CHANNEL0 HI Volume
OUT_CHANNEL0_SOUND:
                LDX     SOUND_LEN0
                BEQ     GET_NEXT_NOTE
                DEC     SOUND_LEN0

                JBR     7,MELODY_FLAG,EXIT_CHANNEL0_MELODY
                JBR     5,MELODY_FLAG,EXIT_CHANNEL0_MELODY

                LDA     SOUND_LEN0
                CMP     #20
                BNE     OUT_CH0_VOL_LO
                MAC_VOLUME      #MID0,0         ; OUT CHANNEL0 MID Volume
                BRA     EXIT_CHANNEL0_MELODY
OUT_CH0_VOL_LO:
                CMP     #07
                BNE     EXIT_CHANNEL0_MELODY
                MAC_VOLUME      #LO0,0          ; OUT CHANNEL0 LO Volume
                BRA     EXIT_CHANNEL0_MELODY
CHECK_REPEAT_TIMES:
                DEC     REPEAT_TIMES0
                BEQ     CH0_PLAY_END
                LDA     SOUND_FLAG0
                JMP     LOAD_CHANNEL0_DATA
GET_NEXT_NOTE:
                INC     MUSIC_POINTER0
                BNE     POINTER0_NOT_CARRY
                INC     MUSIC_POINTER1
POINTER0_NOT_CARRY:
                INC     MUSIC_POINTER0
                BNE     POINTER0_NOT_CARRY1
                INC     MUSIC_POINTER1
POINTER0_NOT_CARRY1:
                JMP     GET_NEXT_DEGREE
CH0_PLAY_END:
                STZ     SOUND_FLAG0
                RESB    7,MELODY_FLAG
                RESB    6,MELODY_FLAG
                RESB    1,PSGC_BUF              ; DISABLE PSG0 SOUND OUT
                LDA     PSGC_BUF
                STA     PSGC
                MAC_VOLUME      #OFF0,0         ; OUT CHANNEL0 OFF Volume
EXIT_CHANNEL0_MELODY:
;<------------------------ CHANNEL1 MELODY -------------------------------->
                LDA     SOUND_FLAG1
                BNE     GET_CHANNEL1_DATA
                JMP     EXIT_CHANNEL1_MELODY
GET_CHANNEL1_DATA:
                JBS     2,MELODY_FLAG,OUT_CHANNEL1_SOUND
                TAX
                LDY     MUSIC_REPEAT_TAB-1,X
                STY     REPEAT_TIMES1
                SETB    2,MELODY_FLAG           ; DATA START ADDRESS ALREADY LOAD
LOAD_CHANNEL1_DATA:
                ASL     A
                TAX
                LDA     MUSIC_NUM_TAB-2,X       ; GET MUSIC TABLE HI ADDRESS
                STA     MUSIC_POINTER2          ;
                LDA     MUSIC_NUM_TAB-1,X       ; GET MUSIC TABLE LO ADDRESS
                STA     MUSIC_POINTER3
GET_NEXT_DEGREE1:
                LDY     #$00
                LDA     (MUSIC_POINTER2),Y      ; GET DEGREE
                CMP     #ENDC
                BEQ     CHECK_REPEAT_TIMES1
                CMP     #MUTE
                BEQ     IS_CHANNEL1_MUTE
                CMP     #MUTE_END
                BNE     CHANNEL1_NOT_MUTE
                LDA     REPEAT_TIMES1
                CMP     #01
                BEQ     CHECK_REPEAT_TIMES1
IS_CHANNEL1_MUTE:
                MAC_VOLUME      #OFF1,1         ; Close CHANNEL1 Volume
                INY
                LDA     (MUSIC_POINTER2),Y      ; GET SOUND LENGTH
                STA     SOUND_LEN1
                BRA     OUT_CHANNEL1_SOUND
CHANNEL1_NOT_MUTE:
                ASL     A
                TAX
                LDA     NOTE_TAB,X
                STA     PSG1L
                LDA     NOTE_TAB+1,X
                STA     PSG1H                   ; MUSIC DATA
                INY
                LDA     (MUSIC_POINTER2),Y      ; GET SOUND LENGTH
                STA     SOUND_LEN1
                RESB    1,MELODY_FLAG           ; SOUND LENGTH > 20 FLAG
                CMP     #20
                BCC     CH1_SOUND_LEN_LESS20
                SETB    1,MELODY_FLAG
CH1_SOUND_LEN_LESS20:
                MAC_VOLUME      #HI1,1          ; OUT CHANNEL1 HI Volume
OUT_CHANNEL1_SOUND:
                LDX     SOUND_LEN1
                BEQ     GET_NEXT_NOTE1
                DEC     SOUND_LEN1

                JBR     3,MELODY_FLAG,EXIT_CHANNEL1_MELODY
                JBR     1,MELODY_FLAG,EXIT_CHANNEL1_MELODY

                LDA     SOUND_LEN1
                CMP     #20
                BNE     OUT_CH1_VOL_LO
                MAC_VOLUME      #MID1,1         ; OUT CHANNEL1 MID Volume
                BRA     EXIT_CHANNEL1_MELODY
OUT_CH1_VOL_LO:
                CMP     #07
                BNE     EXIT_CHANNEL1_MELODY
                MAC_VOLUME      #LO1,1          ; OUT CHANNEL1 LO Volume
                BRA     EXIT_CHANNEL1_MELODY
CHECK_REPEAT_TIMES1:
                DEC     REPEAT_TIMES1
                BEQ     CH1_PLAY_END
                LDA     SOUND_FLAG1
                JMP     LOAD_CHANNEL1_DATA
GET_NEXT_NOTE1:
                INC     MUSIC_POINTER2
                BNE     POINTER2_NOT_CARRY
                INC     MUSIC_POINTER3
POINTER2_NOT_CARRY:
                INC     MUSIC_POINTER2
                BNE     POINTER2_NOT_CARRY1
                INC     MUSIC_POINTER3
POINTER2_NOT_CARRY1:
                JMP     GET_NEXT_DEGREE1
CH1_PLAY_END:
                STZ     SOUND_FLAG1
                RESB    3,MELODY_FLAG
                RESB    2,MELODY_FLAG
                RESB    2,PSGC_BUF              ; DISABLE PSG1 SOUND OUT
                LDA     PSGC_BUF
                STA     PSGC
                MAC_VOLUME      #OFF1,1         ; OUT CHANNEL1 OFF Volume
EXIT_CHANNEL1_MELODY:
                PLY
                PLX
                PLA
                RTI

DAC_VT:
                PHA                     ;
                PHY                     ;
;---------------------------------------;;CHANNEL 1 ADPCM
                LDA     AD1_BANK        ;=0 SAMPLE END !
                BNE     D_ADPCM1        ;
                JMP     Q_ADPCM1        ;
D_ADPCM1:                               ;
                JBS     AD1_HINB,INT_FLAG,HI_BN1
                SETB    AD1_HINB,INT_FLAG
                LDA     (AD1_ADRL)      ;
                AND     #$0F            ;
                STA     ADPCM1          ;
                AND     #$07            ;
                ORA     AD1_INDEX       ;
                TAY                     ;
                JBS     3,ADPCM1,NEG_S1 ;=1 : NEG
                LDA     OUT_DAC1        ;
                CLC                     ;
                ADC     DIFF_TAB,Y      ;
                SIGN_LIMIT              ;
                STA     OUT_DAC1        ;
                BRA     DO_INX1         ;
;------------------------------------   ;
NEG_S1:                                 ;
                LDA     OUT_DAC1        ;
                SEC                     ;
                SBC     DIFF_TAB,Y      ;
                SIGN_LIMIT              ;
                STA     OUT_DAC1        ;
                BRA     DO_INX1         ;
;---------------------------------------;
HI_BN1:                                 ;
                RESB    AD1_HINB,INT_FLAG
                LDA     (AD1_ADRL)      ;
                LSR     A               ;
                LSR     A               ;
                LSR     A               ;
                LSR     A               ;
                STA     ADPCM1          ;
                AND     #$07            ;
                ORA     AD1_INDEX       ;
                TAY                     ;
                JBS     3,ADPCM1,NEG_H1 ;=1 : NEG
                LDA     OUT_DAC1        ;
                CLC                     ;
                ADC     DIFF_TAB,Y      ;
                SIGN_LIMIT              ;
                STA     OUT_DAC1        ;
                BRA     INC_ADH1        ;
;------------------------------------   ;
NEG_H1:                                 ;
                LDA     OUT_DAC1        ;
                SEC                     ;
                SBC     DIFF_TAB,Y      ;
                SIGN_LIMIT              ;
                STA     OUT_DAC1        ;
;---------------------------------------;
INC_ADH1:                               ;
                INC     AD1_ADRL        ;
                BNE     NO_HIA1         ;
                INC     AD1_ADRH        ;
                BNE     NO_HIA1         ;
                LDA     #$80            ; START =$8000
                STA     AD1_ADRH        ;
                INC     AD1_BANK        ;
NO_HIA1:                                ;
;---------------------------------------;+1
                LDA     AD1_ADRL        ;
                CMP     END1_ADRL       ;
                BNE     DO_INX1         ;
                LDA     AD1_ADRH        ;
                CMP     END1_ADRH       ;
                BNE     DO_INX1         ;
                LDA     AD1_BANK        ;
                CMP     END1_BANK       ;
                BCC     DO_INX1         ;
QUT_ADPCM:                              ;
                STZ     AD1_BANK        ;
                SETB    ADPCM_END,INT_FLAG
;---------------------------------------;
DO_INX1:                                ;
                LDY     ADPCM1          ;
                LDA     INDEX_ADJ_TAB,Y ;
                CMP     #$F8            ;-8
                BNE     TO_AINX1        ;
                LDA     AD1_INDEX       ;
                SEC                     ;
                SBC     #$8             ;
                BCS     SET_INX         ;
                LDA     #0              ; MIN
                BRA     SET_INX         ;
TO_AINX1:                               ;
                CLC                     ;
                ADC     AD1_INDEX       ;
                BCC     SET_INX         ;
                LDA     #$F8            ; MAX
SET_INX:        STA     AD1_INDEX       ;
Q_ADPCM1:                               ;
;---------------------------------------;
                LDA     OUT_DAC1        ;
                STA     DAC             ;
                PLY                     ;
                PLA                     ;

TIMER0_VT:
INTX_VT:
NMI_VT:
BRK_VT:
                RTI
;<==================== Main Program Begin =================================>
RESET_VT:            
                SEI
                STZ     IENA            ; Disable Interrupt
                STZ     IREQ
;<====================== Initial Port =====================================>
                LDA     #$83            ; Enable Pull-up
                STA     PMCR            ; PB0,PB1 SET PSG Data Output Pin
                LDA     #$03
                STA     PCB             ; Port B Output mode

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -