📄 2024psg1.asm
字号:
CHIP W65C02S
;<============== Control Register and RAM Define ===========>
.INCLUDE ST2024.INC
;<============== Constant Define Area ======================>
STACK_POINT .EQU $7F ; STACK POINT.
SONG .EQU 001H ;
HI0 .EQU 00FH ; CH0 Volume = Maximum.
MID0 .EQU 008H ; CH0 Volume = 1/2.
LO0 .EQU 004H ; CH0 Volume = 1/4.
OFF0 .EQU 000H ; CH0 Voulme = No Sound.
HI1 .EQU 0F0H ; CH1 Volume = Maximum.
MID1 .EQU 080H ; CH1 Volume = 1/2.
LO1 .EQU 040H ; CH1 Volume = 1/4.
OFF1 .EQU 000H ; CH1 Voulme = No Sound.
MUTE_END .EQU 03DH ; PSG Sound Pause Sign.
MUTE .EQU 03EH ; PSG Sound Pause Sign.
ENDC .EQU 0FFH ; PSG Sound End Sign.
DAC8_OFF .EQU 01001111B ; B6..4(SYSCK) , B32=11(8BIT)
DAC8_ON .EQU 01001101B ; B6..4(SYSCK) , B32=11(8BIT)
AD1_HINB .EQU 05 ;INT_FLAG BIT5=1 : ADPCM1 HI NIBLE
ADPCM_END .EQU 06 ;INT_FLAG BIT6=1 : ADPCM END
;
DO3 .EQU 000H ; 011H,001H
RE3B .EQU 001H ; 0E8H,001H
RE3 .EQU 002H ; 0B2H,002H
MI3B .EQU 003H ; 071H,003H
MI3 .EQU 004H ; 026H,004H
FA3 .EQU 005H ; 0D0H,004H
FA3K .EQU 006H ; 071H,005H
SO3 .EQU 007H ; 008H,006H
SO3K .EQU 008H ; 098H,006H
LA3 .EQU 009H ; 01FH,007H
SI3B .EQU 00AH ; 09EH,007H
SI3 .EQU 00BH ; 017H,008H
DO4 .EQU 00CH ; 086H,008H
RE4B .EQU 00DH ; 0F4H,008H
RE4 .EQU 00EH ; 059H,009H
MI4B .EQU 00FH ; 0B8H,009H
MI4 .EQU 010H ; 013H,00AH
FA4 .EQU 011H ; 068H,00AH
FA4K .EQU 012H ; 0B8H,00AH
SO4 .EQU 013H ; 004H,00BH
SO4K .EQU 014H ; 04CH,00BH
LA4 .EQU 015H ; 08FH,00BH
SI4B .EQU 016H ; 0CFH,00BH
SI4 .EQU 017H ; 00BH,00CH
DO5 .EQU 018H ; 044H,00CH
RE5B .EQU 019H ; 07AH,00CH
RE5 .EQU 01AH ; 0ACH,00CH
MI5B .EQU 01BH ; 0DCH,00CH
MI5 .EQU 01CH ; 009H,00DH
FA5 .EQU 01DH ; 034H,00DH
FA5K .EQU 01EH ; 05CH,00DH
SO5 .EQU 01FH ; 082H,00DH
SO5K .EQU 020H ; 0A6H,00DH
LA5 .EQU 021H ; 0C7H,00DH
SI5B .EQU 022H ; 0E7H,00DH
SI5 .EQU 023H ; 005H,00EH
DO6 .EQU 024H ; 022H,00EH
RE6B .EQU 025H ; 03DH,00EH
RE6 .EQU 026H ; 056H,00EH
MI6B .EQU 027H ; 06EH,00EH
MI6 .EQU 028H ; 084H,00EH
FA6 .EQU 029H ; 09AH,00EH
FA6K .EQU 02AH ; 0AEH,00EH
SO6 .EQU 02BH ; 0C1H,00EH
SO6K .EQU 02CH ; 0D3H,00EH
LA6 .EQU 02DH ; 0E3H,00EH
SI6B .EQU 02EH ; 0F3H,00EH
SI6 .EQU 02FH ; 002H,00FH
DO7 .EQU 030H ; 012H,00FH
RE7B .EQU 031H ; 01FH,00FH
RE7 .EQU 032H ; 02CH,00FH
MI7B .EQU 033H ; 038H,00FH
MI7 .EQU 034H ; 043H,00FH
FA7 .EQU 035H ; 04EH,00FH
FA7K .EQU 036H ; 058H,00FH
SO7 .EQU 037H ; 061H,00FH
SO7K .EQU 038H ; 06AH,00FH
LA7 .EQU 039H ; 072H,00FH
SI7B .EQU 03AH ; 07AH,00FH
SI7 .EQU 03BH ; 082H,00FH
;<======================== Macro Define Area ==============================>
SETB: .MACRO BITN,ADDR
.IF BITN=0
SMB0 <ADDR
.ENDIF
.IF BITN=1
SMB1 <ADDR
.ENDIF
.IF BITN=2
SMB2 <ADDR
.ENDIF
.IF BITN=3
SMB3 <ADDR
.ENDIF
.IF BITN=4
SMB4 <ADDR
.ENDIF
.IF BITN=5
SMB5 <ADDR
.ENDIF
.IF BITN=6
SMB6 <ADDR
.ENDIF
.IF BITN=7
SMB7 <ADDR
.ENDIF
.ENDM
RESB: .MACRO BITN,ADDR
.IF BITN=0
RMB0 <ADDR
.ENDIF
.IF BITN=1
RMB1 <ADDR
.ENDIF
.IF BITN=2
RMB2 <ADDR
.ENDIF
.IF BITN=3
RMB3 <ADDR
.ENDIF
.IF BITN=4
RMB4 <ADDR
.ENDIF
.IF BITN=5
RMB5 <ADDR
.ENDIF
.IF BITN=6
RMB6 <ADDR
.ENDIF
.IF BITN=7
RMB7 <ADDR
.ENDIF
.ENDM
JBS: .MACRO BITN,ADDR,LAB
.IF BITN=0
BBS0 <ADDR,LAB
.ENDIF
.IF BITN=1
BBS1 <ADDR,LAB
.ENDIF
.IF BITN=2
BBS2 <ADDR,LAB
.ENDIF
.IF BITN=3
BBS3 <ADDR,LAB
.ENDIF
.IF BITN=4
BBS4 <ADDR,LAB
.ENDIF
.IF BITN=5
BBS5 <ADDR,LAB
.ENDIF
.IF BITN=6
BBS6 <ADDR,LAB
.ENDIF
.IF BITN=7
BBS7 <ADDR,LAB
.ENDIF
.ENDM
JBR: .MACRO BITN,ADDR,LAB
.IF BITN=0
BBR0 <ADDR,LAB
.ENDIF
.IF BITN=1
BBR1 <ADDR,LAB
.ENDIF
.IF BITN=2
BBR2 <ADDR,LAB
.ENDIF
.IF BITN=3
BBR3 <ADDR,LAB
.ENDIF
.IF BITN=4
BBR4 <ADDR,LAB
.ENDIF
.IF BITN=5
BBR5 <ADDR,LAB
.ENDIF
.IF BITN=6
BBR6 <ADDR,LAB
.ENDIF
.IF BITN=7
BBR7 <ADDR,LAB
.ENDIF
.ENDM
MAC_VOLUME .MACRO VOLUME,CHANNEL
.IF CHANNEL=0
LDA VOL_BUF
AND #$F0 ; CHANNEL 0 USE VOL BIT3-0
ORA VOLUME
STA VOL
STA VOL_BUF
.ENDIF
.IF CHANNEL=1
LDA VOL_BUF
AND #$0F ; CHANNEL 1 USE VOL BIT7-4
ORA VOLUME
STA VOL
STA VOL_BUF
.ENDIF
.ENDM
SIGN_LIMIT: .MACRO
BVC NO_OVERFS# ;
BMI P_OVER# ;
LDA #$80 ;MIN
BRA NO_OVERFS# ;
P_OVER# LDA #$7F ;MAX
NO_OVERFS# ;
.ENDM
;<======================= ROM Area (24K BYTES) ============================>
.ORG $A000
BASETIMER_VECT: JMP BASETIMER_VT
PORT_VECT: JMP PORT_VT
TIMER1_VECT: JMP TIMER1_VT
TIMER0_VECT: JMP TIMER0_VT
DAC_VECT: JMP DAC_VT
INTX_VECT: JMP INTX_VT
NMI_VECT: JMP NMI_VT
RESET_VECT: JMP RESET_VT
BRK_VECT: JMP BRK_VT
BASETIMER_VT:
RTI
PORT_VT:
RTI
;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;;% Function : TIMER1 INTERRUPT(7.8125 ms) %
;;% Note : MELODY_FLAG BIT7==0 ==>CH0 VOLUME EFFECT OFF %
;;% : MELODY_FLAG BIT7==1 ==>CH0 VOLUME EFFECT ON %
;;% : MELODY_FLAG BIT6==0 ==>CH0 DATA START ADDRESS NOT LOAD %
;;% : MELODY_FLAG BIT6==1 ==>CH0 DATA START ADDRESS ALREADY LOAD%
;;% : MELODY_FLAG BIT5==1 ==>CH0 NOW SOUND DATA LENGTH >=20 %
;;% : MELODY_FLAG BIT5==1 ==>CH0 NOW SOUND DATA LENGTH < 20 %
;;% : MELODY_FLAG BIT3==0 ==>CH1 VOLUME EFFECT OFF %
;;% : MELODY_FLAG BIT3==1 ==>CH1 VOLUME EFFECT ON %
;;% : MELODY_FLAG BIT2==0 ==>CH1 DATA START ADDRESS NOT LOAD %
;;% : MELODY_FLAG BIT2==1 ==>CH1 DATA START ADDRESS ALREADY LOAD%
;;% : MELODY_FLAG BIT1==1 ==>CH1 NOW SOUND DATA LENGTH >=20 %
;;% : MELODY_FLAG BIT1==1 ==>CH1 NOW SOUND DATA LENGTH < 20 %
;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TIMER1_VT:
PHA
PHX
PHY
LDA SOUND_FLAG0
BNE GET_CHANNEL0_DATA
JMP EXIT_CHANNEL0_MELODY
GET_CHANNEL0_DATA:
JBS 6,MELODY_FLAG,OUT_CHANNEL0_SOUND
TAX
LDY MUSIC_REPEAT_TAB-1,X
STY REPEAT_TIMES0
SETB 6,MELODY_FLAG ; DATA START ADDRESS ALREADY LOAD
LOAD_CHANNEL0_DATA:
ASL A
TAX
LDA MUSIC_NUM_TAB-2,X ; GET MUSIC TABLE HI ADDRESS
STA MUSIC_POINTER0 ;
LDA MUSIC_NUM_TAB-1,X ; GET MUSIC TABLE LO ADDRESS
STA MUSIC_POINTER1
GET_NEXT_DEGREE:
LDY #$00
LDA (MUSIC_POINTER0),Y ; GET DEGREE
CMP #ENDC
BEQ CHECK_REPEAT_TIMES
CMP #MUTE
BEQ IS_CHANNEL0_MUTE
CMP #MUTE_END
BNE CHANNEL0_NOT_MUTE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -