📄 2024psg1.asm
字号:
STZ PB
STZ VOL
LDA #01000000B ; PSGCK=SYSCK,PSG Use Of Tone Generator
STA PSGC_BUF
STA PSGC
LDA #09H ; BASE TIMER OSCX/64*256 (0.5 SEC) ##S
STA BTM
LDX #STACK_POINT ; Set STACK Pointer
TXS
LDA #$F8 ; Set Timer1 8 Counters trigger
STA T1C ; Timer1=7.8125 ms
LDA #$1B ; Timer1 Clock Source=OSCX/32
STA T1M ; Counter Has Auto-Reload
LDA #00000100B ; System Clock=OSC,Enable OSC,OSCX.
STA SYS ; WAI-1 mode
;<============= FOR POWER ON RESET ========================================>
LDA #00100000B ; Base Timer Interrupt Enable.
STA IENA
WAI ; Delay 0.5 second
STZ IREQ
WAI ; Delay 0.5 second
STZ IREQ
WAI ; Delay 0.5 second
STZ IREQ
;<============= FOR POWER ON RESET ========================================>
;<============== CLEAR SYSTEM RAM RANGE 80H - FF ==========================>
LDX #$80
CLR_RAM:
STZ $007F,X
DEX
BNE CLR_RAM
LDA #00010100B ; System Clock=OSC,Enable OSC,OSCX.
STA SYS ;
LDA #00001000B ; Set Timer1 Enable
STA IENA
CLI
;<================== DEMO CHANNEL0 MELODY =================================>
DEMO_CH0:
SETB 7,MELODY_FLAG ; Set CH0 Volume Has Change
LDA #01000010B ; PSG Use Of Tone Generator,PSG0 ON
STA PSGC_BUF
STA PSGC
LDA #SONG ; Firts Music Number = 1
STA SOUND_FLAG0
WAIT_CH0_END:
LDA SOUND_FLAG0
BNE WAIT_CH0_END
;<================== DEMO CHANNEL0,CHANNEL1 MELODY ========================>
DEMO_CH0_CH1:
SETB 7,MELODY_FLAG ; Set CH0 Volume Has Change
SETB 3,MELODY_FLAG ; Set CH1 Volume Has Change
LDA #01000110B ; PSG Use Of Tone Generator,PSG0,1 ON
STA PSGC_BUF
STA PSGC
LDA #SONG ; Firts Music Number = 1
STA SOUND_FLAG0
STA SOUND_FLAG1
WAIT_END:
LDA SOUND_FLAG0
ORA SOUND_FLAG1
BNE WAIT_END
LDA #$3F ; PRESCALER : /1
STA PSG1L
LDA #$0F ; SAMPLE RATE ABOUT 16K
STA PSG1H
LDA #01 ; FIRST VOICE
JSR PLAY_V
LDA #02 ; LAST VOICE
JSR PLAY_V
LOOP:
BRA LOOP
PLAY_V: ;
TAX ;
LDA ST_ADRL,X ;
STA AD1_ADRL ;
LDA ST_ADRH,X ;
STA AD1_ADRH ;
LDA ST_BANK,X ;
STA AD1_BANK ;
LDA END_ADRL,X ;
STA END1_ADRL ;
LDA END_ADRH,X ;
STA END1_ADRH ;
LDA END_BANK,X ;
STA END1_BANK ;
;
STZ OUT_DAC1 ;
STZ AD1_INDEX ;
LDA INT_FLAG ;
AND #10011111B ;
STA INT_FLAG ;
;---------------------------------------;;DAC ON
LDA #DAC8_ON ;
STA PSGC ;
STZ DAC ;CLEAR DAC.
RESB 2,IREQ ;
SETB 1,IENA_BUF ;ENABLE DAC
LDA IENA_BUF ;
STA IENA ;
CLI ;
;---------------------------------------;;WAIT
WAIT_ADM1: ;
JBR ADPCM_END,INT_FLAG,WAIT_ADM1
;---------------------------------------;;QUIT PLAY
Q_PLAYV: ;
STZ DAC ;CLEAR DAC.
RESB 1,IENA_BUF ;DISABLE DAC
LDA IENA_BUF ;
STA IENA ;
LDA #DAC8_OFF ;
STA PSGC ;
RTS ;
;<=================== ADPCM REFERENCE TABLE ===============================>
DIFF_TAB:
.DB 0,1,2,3,5,6,7,8
.DB 0,1,3,4,6,7,9,10
.DB 0,1,3,4,7,8,10,11
.DB 1,3,5,7,9,11,13,15
.DB 1,3,5,7,10,12,14,16
.DB 1,3,6,8,11,13,16,18
.DB 1,3,6,8,12,14,17,19
.DB 1,4,7,10,13,16,19,22
.DB 1,4,7,10,14,17,20,23
.DB 1,4,8,11,15,18,22,25
.DB 2,6,10,14,18,22,26,30
.DB 2,6,10,14,19,23,27,31
.DB 2,6,11,15,21,25,30,34
.DB 2,7,12,17,23,28,33,38
.DB 2,7,13,18,25,30,36,41
.DB 3,9,15,21,28,34,40,46
.DB 3,10,17,24,31,38,45,52
.DB 3,10,18,25,34,41,49,56
.DB 4,12,21,29,38,46,55,63
.DB 4,13,22,31,41,50,59,68
.DB 5,15,25,35,46,56,66,76
.DB 5,16,27,38,50,61,72,83
.DB 6,18,31,43,56,68,81,93
.DB 6,19,33,46,61,74,88,101
.DB 7,22,37,52,67,82,97,112
.DB 8,24,41,57,74,90,107,123
.DB 9,27,45,63,82,100,118,127
.DB 10,30,50,70,90,110,127,127
.DB 11,33,55,77,99,121,127,127
.DB 12,36,60,84,109,127,127,127
.DB 13,39,66,92,120,127,127,127
.DB 14,43,73,102,127,127,127,127
INDEX_ADJ_TAB:
.DB $F8,$F8,$F8,$F8,$10,$20,$30,$40
.DB $F8,$F8,$F8,$F8,$10,$20,$30,$40
;<=================== Degree Table For PSG Generator ======================>
NOTE_TAB:
.DB 011H,001H ; DO3 (C3)
.DB 0E8H,001H ; RE3B (Db3)
.DB 0B2H,002H ; RE3 (D3)
.DB 071H,003H ; MI3B (Eb3)
.DB 026H,004H ; MI3 (E3)
.DB 0D0H,004H ; FA3 (F3)
.DB 071H,005H ; FA3K (F#3)
.DB 008H,006H ; SO3 (G3)
.DB 098H,006H ; SO3K (G#3)
.DB 01FH,007H ; LA3 (A3)
.DB 09EH,007H ; SI3B (Bb3)
.DB 017H,008H ; SI3 (B3)
.DB 086H,008H ; DO4
.DB 0F4H,008H ; RE4B
.DB 059H,009H ; RE4
.DB 0B8H,009H ; MI4B
.DB 013H,00AH ; MI4
.DB 068H,00AH ; FA4
.DB 0B8H,00AH ; FA4K
.DB 004H,00BH ; SO4
.DB 04CH,00BH ; SO4K
.DB 08FH,00BH ; LA4
.DB 0CFH,00BH ; SI4B
.DB 00BH,00CH ; SI4
.DB 044H,00CH ; DO5
.DB 07AH,00CH ; RE5B
.DB 0ACH,00CH ; RE5
.DB 0DCH,00CH ; MI5B
.DB 009H,00DH ; MI5
.DB 034H,00DH ; FA5
.DB 05CH,00DH ; FA5K
.DB 082H,00DH ; SO5
.DB 0A6H,00DH ; SO5K
.DB 0C7H,00DH ; LA5
.DB 0E7H,00DH ; SI5B
.DB 005H,00EH ; SI5
.DB 022H,00EH ; DO6
.DB 03DH,00EH ; RE6B
.DB 056H,00EH ; RE6
.DB 06EH,00EH ; MI6B
.DB 084H,00EH ; MI6
.DB 09AH,00EH ; FA6
.DB 0AEH,00EH ; FA6K
.DB 0C1H,00EH ; SO6
.DB 0D3H,00EH ; SO6K
.DB 0E3H,00EH ; LA6
.DB 0F3H,00EH ; SI6B
.DB 002H,00FH ; SI6
.DB 012H,00FH ; DO7
.DB 01FH,00FH ; RE7B
.DB 02CH,00FH ; RE7
.DB 038H,00FH ; MI7B
.DB 043H,00FH ; MI7
.DB 04EH,00FH ; FA7
.DB 058H,00FH ; FA7K
.DB 061H,00FH ; SO7
.DB 06AH,00FH ; SO7K
.DB 072H,00FH ; LA7
.DB 07AH,00FH ; SI7B
.DB 082H,00FH ; SI7
;<============= Music Data Start Address Table ============================>
MUSIC_NUM_TAB:
DW MUSIC1
;<============= Music Repeat Play Times Table =============================>
MUSIC_REPEAT_TAB:
DB 01 ; Music1 Repeat 2 Times
;<============= Music Data Table ==========================================>
;First Byte=Degree,Second Byte=Tempo
MUSIC1: ; For Elise
DB MI5,021H
DB MI5B,021H
DB MI5,021H
DB MI5B,021H
DB MI5,021H
DB SI4,021H
DB RE5,021H
DB DO5,021H
DB LA4,061H
DB DO4,021H
DB MI4,021H
DB LA4,021H
DB SI4,061H
DB MI4,021H
DB SO4K,021H
DB SI4,021H
DB DO5,061H
DB MI4,021H
DB MI5,021H
DB MI5B,021H
DB MI5,021H
DB MI5B,021H
DB MI5,021H
DB SI4,021H
DB RE5,021H
DB DO5,021H
DB LA4,061H
DB DO4,021H
DB MI4,021H
DB LA4,021H
DB SI4,061H
DB MI4,021H
DB DO5,021H
DB SI4,021H
DB LA4,061H
DB ENDC
;<============= ADPCM Data START,END ADDRESS TABLE ========================>
.INCLUDE ADPCM_TB.ASM
;<============= ADPCM Data Table ==========================================>
.ORG $A600
.INCLUDE BLK01.ASM
;<============================ Vector Begin ===============================>
.ORG $FFEE
.WORD BASETIMER_VECT ;BASE TIMER OVERFLOW.
.WORD PORT_VECT ;PORTA[7-0] VECTOR.
.WORD TIMER1_VECT ;TIMER 2 OVERFLOW.
.WORD TIMER0_VECT ;TIMER 1 OVERFLOW.
.WORD DAC_VECT ;RELOAD DAC DATA.
.WORD INTX_VECT ;PORTA[0]/INTX VECTOR.
.WORD NMI_VECT ;NMI VECTOR. (RESERVED)
.WORD RESET_VECT ;RESET VECTOR. (SAME 6502)
.WORD BRK_VECT ;BREAK VECTOR. (SAME 6502)
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -