📄 2024psg1.asm
字号:
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 + -