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

📄 voice.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 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 + -