📄 voice.asm
字号:
; ***************************************************************************
; * Project : Electronic Dictionary *
; * Date : 2004.4 *
; * File Name : voice.ASM *
; * Author : Ji Ang *
; ***************************************************************************
pw 128
case off
externs on
INCLUDE ST2202.DEF
INCLUDE DATA.DEF
INCLUDE XYHADDR.H
.ifdef WORDMRC_ADDR
; ***************************************************************************
; ST2202 SN725
; ***************************************************************************
; PC5 ----> RESET P1.2 ; Wake Up SONIX
; PC4(44) LDV
; PC3 ----> P1.0 ; DR
; PE ----> P0.0~P0.7 ; DATA
; PC0 <---- P0.15 ; ACK
; ***************************************************************************
; ***************************************************************************
Edata equ 800h
; ***************************************************************************
INCLUDE VOICE.DEF
INCLUDE ST2202.REG
INCLUDE ST2202.MAC
;INCLUDE ST2202.VAR
;INCLUDE BANK.DEF
;INCLUDE 0201.ADR
;INCLUDE 0201DAT.ADR
; ***************************************************************************
PS7 .SECTION
BankNo equ CardBank ;; For check only.
; ***************************************************************************
; ***************************************************************************
SN_ICE EQU 0
DEBUGGING EQU 0
; ***************************************************************************
INC_VOICE_PTR:
MACRO
INC <_VOICE_DAT_PTR
BNE ?INCVP_X#
INC <_VOICE_DAT_PTR+1
BNE ?INCVP_X#
STZ <_VOICE_DAT_PTR
LDA #$80
STA <_VOICE_DAT_PTR+1
INC VOICE_DAT_BANK
BNE ?INCVP_X#
INC VOICE_DAT_BANK+1
?INCVP_X#
ENDM
; ***************************************************************************
PUBLIC EXT_INT_INIT
EXT_INT_INIT: ;
LDA <_PFC ;+-7-6-5-4-3-2-1-0-+
AND #11000000B ;| I I I I I I |
; ORA #00000001B ;| X X / / / / / N |
ORA #11000001B ;| X X / / / / / N |
STA <_PFC ;| O O O O O T |
;+-----------------+
LDA <_PCC ;
AND #11000000B ;+-7-6-5-4-3-2-1-0-+
ORA #00101000B ;| X X O I O I I I |
STA <_PCC ;+-----------------+
;
RMB5 <_PMCR ; Falling edge.
LDA #$FF ;
STA <_PCE ; Output mode of PE.
STA <_PC ; Output 1, pull up
STA <_PE ; Output 1
LDA <_PC ;
AND #%11011111 ; RMB5 <_PC
STA <_PC ;
.if SN_ICE=1 ;
LDA <_PC ;
AND #%11110111 ; RMB3 <_PC
STA <_PC ;
.endif ;
STZ VOICE_INT_CMD ;
STZ VOICE_TEMP
STZ VOICE_NUMBER
STZ VOICE_NUMBER+1
;LDA #084H
STZ VOICE_AMPFLAG
LDA #30
STA MUSIC_VOL
STA MUSIC_VOL+1
STA MUSIC_VOL+2
STA MUSIC_VOL+3
LDA #1
STA MUSIC_INS
STA MUSIC_INS+1
STA MUSIC_INS+2
STA MUSIC_INS+3
LDA #5
STA MUSIC_TEMPO
.ifdef _IREQ
RMB0 <_IREQ ; Clear IRQ flag.
SMB0 <_IENA ; Enable INTX interrupt.
.else
RMB0 <IREQ ; Clear IRQ flag.
SMB0 <IENA ; Enable INTX interrupt.
.endif
RTS ;
; ***************************************************************************
PUBLIC TEST_SN
TEST_SN:
LDA <_PC ;
AND #%11011111 ; RMB5 <_PC
STA <_PC ;
NOP
NOP
LDA <_PC ;
AND #%11110111 ; RMB3 <_PC
STA <_PC ;
NOP
LDA <_PC ;
ORA #%00100000 ; SMB5 <_PC
STA <_PC ;
RTS
; ***************************************************************************
PUBLIC PLAY_SN_VOICE
PLAY_SN_VOICE:
LDA #2
STA VOICE_NUMBER
STZ VOICE_NUMBER+1
LDA #1
STA VOICE_INT_CMD
PLAY_SN_VOICE_P:
STZ VOICE_TEMP
LDA <_PC ;
AND #%11011111 ; RMB5 <_PC
STA <_PC ;
STA <_PC ;
STA <_PC ;
STA <_PC ;
STA <_PC ;
STA <_PC ;
STA <_PC ;
NOP
NOP
NOP
LDA <_PC ;
ORA #%00100000 ; SMB5 <_PC
STA <_PC ;
RTS
; ***************************************************************************
;abate_ADDR equ charl2_ADDR
PUBLIC PLAY_ST_VOICE
PLAY_ST_VOICE:
MOVW_W <_VOICE_DAT_PTR,<VoiceNoL
MOVB_B <_VOICE_DAT_PTR+2,<VoiceNoL+2
ADDL_C <_VOICE_DAT_PTR,WORDMRC_ADDR
MOVW_W VOICE_DAT_BANK,<_VOICE_DAT_PTR+2
LONG_2_DDR_REG_ <_VOICE_DAT_PTR,VOICE_DAT_BANK
LDA #084H
STA VOICE_DAT_SIZE
LDA #0
STA VOICE_DAT_SIZE+1
LDA #4
STA VOICE_INT_CMD
JMP PLAY_SN_VOICE_P
; ***************************************************************************
PUBLIC PLAY_ST_W4
PLAY_ST_W4:
; MOVL_C_ _VOICE_DAT_PTR,VOICE_DAT_BANK,TURKEY_ADDR
LONG_2_DDR_REG_ _VOICE_DAT_PTR,VOICE_DAT_BANK
LDA #10
STA VOICE_INT_CMD
JMP PLAY_SN_VOICE_P
; ***************************************************************************
PS0 .SECTION
; ***************************************************************************
VOICE_INT: ;
.if DEBUGGING=1
LDA #$AA ;
STA $987 ;
LDA VOICE_INT_CMD ;
STA $987+20 ;
.endif
LDA VOICE_INT_CMD ;
ASL A ;
TAX ;
JMP (?VoiceIntFuncTbl,X) ; goto VoiceIntFuncTbl[X];
; ***************************************************************************
?VoiceIntFuncTbl: ;
DW ?VoiceStop ;0
DW ?VoiceNumCmd ;1
DW ?VoiceNoL ;2
DW ?VoiceNoH ;3
DW ?VoiceDatCmd ;4
DW ?VoiceAmpFL ;5
DW ?VoiceAmpFH ;6
DW ?VoiceData ;7
DW ?VoiceAmpFLi ;8
DW ?VoiceAmpFHi ;9
DW ?MusicW4 ;10
DW ?MusicVol0 ;10
DW ?MusicVol1 ;11
DW ?MusicVol2 ;12
DW ?MusicVol3 ;13
DW ?MusicIns0 ;14
DW ?MusicIns1 ;15
DW ?MusicIns2 ;16
DW ?MusicIns3 ;17
DW ?MusicTempo ;18
; ***************************************************************************
?VoiceStop:
LDA #$FF ;
JMP VOICE_WR_BYTE ;
?VoiceNumCmd: ;
INC VOICE_INT_CMD ;
LDA #0 ;
JMP VOICE_WR_BYTE ;
; ***************************************************************************
?VoiceNoL: ;
INC VOICE_INT_CMD ;
LDA VOICE_NUMBER ;
JMP VOICE_WR_BYTE ;
; ***************************************************************************
?VoiceNoH: ;
LDA #8
STA VOICE_INT_CMD ;
LDA VOICE_NUMBER+1 ;
JMP VOICE_WR_BYTE ;
; ***************************************************************************
?VoiceAmpFLi:
INC VOICE_INT_CMD ;
LDA VOICE_AMPFLAG ;
JMP VOICE_WR_BYTE ;
; ***************************************************************************
?VoiceAmpFHi:
STZ VOICE_INT_CMD ;
LDA #0 ;
JSR VOICE_WR_BYTE ;
JMP VOICE_RD_BYTE ;
; ***************************************************************************
?VoiceDatCmd: ;
INC VOICE_INT_CMD ;
LDA #1 ;
JMP VOICE_WR_BYTE ;
; ***************************************************************************
?VoiceAmpFL: ;
INC VOICE_INT_CMD ;
LDA VOICE_AMPFLAG ;
JMP VOICE_WR_BYTE ;
; ***************************************************************************
?VoiceAmpFH: ;
INC VOICE_INT_CMD ;
LDA #0 ;
JSR VOICE_WR_BYTE ;
JMP VOICE_RD_BYTE ;
; ***************************************************************************
?MusicW4:
INC VOICE_INT_CMD ;
LDA #3
JMP VOICE_WR_BYTE ;
?MusicVol0:
INC VOICE_INT_CMD
LDA MUSIC_VOL
JMP VOICE_WR_BYTE
?MusicVol1:
INC VOICE_INT_CMD
LDA MUSIC_VOL+1
JMP VOICE_WR_BYTE
?MusicVol2:
INC VOICE_INT_CMD
LDA MUSIC_VOL+2
JMP VOICE_WR_BYTE
?MusicVol3:
INC VOICE_INT_CMD
LDA MUSIC_VOL+3
JMP VOICE_WR_BYTE
?MusicIns0:
INC VOICE_INT_CMD
LDA MUSIC_INS
JMP VOICE_WR_BYTE
?MusicIns1:
INC VOICE_INT_CMD
LDA MUSIC_INS+1
JMP VOICE_WR_BYTE
?MusicIns2:
INC VOICE_INT_CMD
LDA MUSIC_INS+2
JMP VOICE_WR_BYTE
?MusicIns3:
INC VOICE_INT_CMD
LDA MUSIC_INS+3
JMP VOICE_WR_BYTE
?MusicTempo:
LDA #7
STA VOICE_INT_CMD
LDA MUSIC_TEMPO
JSR VOICE_WR_BYTE
JMP VOICE_RD_BYTE ;
; ***************************************************************************
?VoiceData: ;
LDA VOICE_INT_DATA ;
JSR VOICE_WR_BYTE ;
JMP VOICE_RD_BYTE ;
; ***************************************************************************
VOICE_WR_BYTE: ;
.if SN_ICE=1 ;
EOR #$FF ;
.endif ;
STA <_PE ;
.if DEBUGGING=1
STA $987+40 ;
STZ $987+60 ;
STZ $987+80 ;
.endif
.if SN_ICE=1 ;
LDA <_PC ;
ORA #%00001000 ; SMB3 <_PC
STA <_PC ;
.else ;
LDA <_PC ;
AND #%11110111 ; RMB3 <_PC
STA <_PC ;
.endif ;
.if DEBUGGING=1
LDA VOICE_TEMP
STA $987+60 ;
.endif
?VOICE_WR_BYTE0: ;
LDA <_PC ;
AND #1 ;
BEQ ?VOICE_WR_BYTE0 ;
LDA <_PC ;
AND #1 ;
BEQ ?VOICE_WR_BYTE0 ;
.if DEBUGGING=1
INC VOICE_TEMP
LDA VOICE_TEMP
STA $987+80 ;
STZ $987+100 ;
.endif
.if SN_ICE=1 ;
LDA <_PC ;
AND #%11110111 ; RMB3 <_PC
STA <_PC ;
.else ;
LDA <_PC ;
ORA #%00001000 ; SMB3 <_PC
STA <_PC ;
.endif ;
RTS ;
; ***************************************************************************
VOICE_RD_BYTE:
MOVW_W <_DRRL,VOICE_DAT_BANK
LDA (_VOICE_DAT_PTR)
STA VOICE_INT_DATA
INC_VOICE_PTR
DECW VOICE_DAT_SIZE
; RTS
.if DEBUGGING=1
LDA #$AA
STA $985
LDA VOICE_DAT_SIZE+1
STA $985+20
LDA VOICE_DAT_SIZE
STA $985+40
STZ $985+60
.endif
RTS
; LDA VOICE_DAT_SIZE
; CMP #80
; BCC ?VOICE_RD_BYTEX
; BRA $
;?VOICE_RD_BYTEX:
; RTS
; ***************************************************************************
PUBLIC EXT_INT_ISR
EXT_INT_ISR:
PUSH_AXY
.ifdef _IREQ
RMB0 <_IREQ ; Clear IRQ flag.
.else
RMB0 <IREQ ; Clear IRQ flag.
.endif
.if DEBUGGING=1
LDA <_PC ;
AND #1 ;
BNE ?EXT_INT_ISR_X ;
.endif
; LDA #$AA
; STA $980
JSR VOICE_INT ;
; LDA #$55
; STA $980+20
; bra $
POP_AXY
RTI ;
.if DEBUGGING=1
?EXT_INT_ISR_X:
LDA #$55
STA $987+20
LDA <_PC
STA $987+40
STZ $987+60
STZ $987+80
POP_AXY
RTI ;
.endif
.endif ; .ifdef WORDMRC_ADDR
; ***************************************************************************
END
; ***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -