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

📄 sp104.asm

📁 辞典 dict3.asm.grammar.asm,newword.asm 学习 learn.asm 名片 userinf.asm 备忘 userinf.asm 提醒 userinf
💻 ASM
📖 第 1 页 / 共 2 页
字号:
?L_PlaySegmentEnd:
        MOVW_C  <DRRL,SP104_BANK
?L_WriteSegmentEndBusy:			;set data segment end
	jsr 	F_TestDataPort
	bcs	?L_WriteSegmentEndBusy
	lda	#00h
        sta     SP104_REG_02
	lda	#c1h
        sta     SP104_REG_03
        ENDM

; ***************************************************************************
SP140_WakeUp:
        _PUSH_DRR
        MOVW_C  <DRRL,SP104_BANK
	lda	SP104_REG_00
	and	#10000000B
	beq	?L_AlreadyWakeUp
	lda	#10000000B
	sta	SP104_REG_00
	nop
	nop
	nop
?L_WaitUntilWakeUp:
	lda	SP104_REG_00
	and	#10000000B
	bne	?L_WaitUntilWakeUp
?L_AlreadyWakeUp:
        POP_DRR
	RTS

; ***************************************************************************
PLAY_SPEECH:
        ;STARTUART
        _PUSH_DRR
        MOVW_C  <DRRL,SP104_BANK
?L_WriteModeBusy:				;set spds104 operation mode command
	jsr 	F_TestDataPort
	bcs	?L_WriteModeBusy
        lda     #$02                            ;R_SynthesisModeLowByte          ;Synthesis mode
        sta     SP104_REG_02
        NOP
        lda     #$A0                            ;R_SynthesisModeHighByte
        sta     SP104_REG_03
?L_WriteVolume:					;Write Volume
	jsr	F_TestDataPort
	bcs	?L_WriteVolume
        lda     #$7F                            ;R_VolumeLowByte
        sta     SP104_REG_02
        lda     #$01                            ;R_VolumeHighByte
	ora	#90h
        sta     SP104_REG_03

     ;   MOVL_3B R_Temp1,VoiceNoL
     ;   STZ     R_Temp4

        .if (DEBUGGING=1)
        PUTSIODATA R_Temp1
        PUTSIODATA R_Temp2
        PUTSIODATA R_Temp3
        PUTSIODATA R_Temp4
        .endif

        MOVW_W  <R_Word_No_LowAddr,<VoiceNo0
        MOVW_W  <DRRL,<VoiceNo0+2

        lda     (R_Word_No_LowAddr)
	sta	R_Tts2Segment_Number	;segment number

        INC_DRR_PTR <R_Word_No_LowAddr

	ldx	#0
L_FetchSegmentInformation:
        lda     (R_Word_No_LowAddr)           ;segment information
	sta	R_Tts2AddrRam,x		;

        .if (DEBUGGING=1)
        phx
        phy
        sta     R_TempX
        PUTSIODATA R_TempX
        ply
        plx
        .endif

        INC_DRR_PTR <R_Word_No_LowAddr

	inx
	cpx	#5
        bne     L_FetchSegmentInformation

;******************************JSR Play Speech Module
        _PUSH_DRR
        F_PlaySpeech                   ;play speech
        POP_DRR
;***********************************************************

	dec	R_Tts2Segment_Number
        beq     L_PlaySpeechEnd
	ldx	#0
        jmp     L_FetchSegmentInformation
;-------------------------------------------------------------

L_PlaySpeechEnd:
        MOVW_C  <DRRL,SP104_BANK
L_WriteWordEndBusy:			;set data word end
	jsr 	F_TestDataPort
	bcs	L_WriteWordEndBusy
	lda	#00h
        sta     SP104_REG_02
	lda	#c3h
        sta     SP104_REG_03
L_WriteSpeechEndBusy:			;set speech end
	jsr 	F_TestDataPort
	bcs	L_WriteSpeechEndBusy
	lda	#ffh
        sta     SP104_REG_02
	lda	#ffh
        sta     SP104_REG_03

L_WriteSleepCommand:
        MOVW_C  <DRRL,SP104_BANK
        lda     SP104_REG_00
	and	#10000000b
        bne     ?L_ItIsSleepping
?L_WriteSleepCommand0:
	jsr	F_TestDataPort
        bcs     ?L_WriteSleepCommand0
	lda	#00h
        sta     SP104_REG_02
	lda	#80h
        sta     SP104_REG_03
?L_WriteSleepCommandBusy:
	jsr	F_TestDataPort
        bcs     ?L_WriteSleepCommandBusy
?L_WaitUntilSleep:
        lda     SP104_REG_00
	and	#10000000b
        beq     ?L_WaitUntilSleep
?L_ItIsSleepping:
        POP_DRR
        RTS

; ***************************************************************************


; ***************************************************************************
F_LongDelay:
	sta	R_DelayHighByte
L_Longdellop2?
	sta	R_DelayLowByte
L_Longdellop1?
	dec	R_DelayLowByte
	bne	L_Longdellop1?
	dec	R_DelayHighByte
	bne	L_Longdellop2?
	rts

; ***************************************************************************
F_TestDataPort:
	pha
	sec
	lda	SP104_REG_00
	and	#30h
	bne	?L_DataPortBusy
	clc
?L_DataPortBusy:
	pla
	RTS

; ***************************************************************************
PLAY_PHRASE:
        _PUSH_DRR
        MOVW_C  <DRRL,SP104_BANK
?L_WriteModeBusy:                       ; set spds104 operation mode command
	jsr 	F_TestDataPort
	bcs	?L_WriteModeBusy
        lda     #$01                    ; Synthesis mode
        sta     SP104_REG_02
        NOP
        lda     #$A0
        sta     SP104_REG_03
;?L_WriteVolume:                        ; Write Volume
;        jsr     F_TestDataPort
;        bcs     ?L_WriteVolume
;        lda     R_VolumeLowByte
;        sta     SP104_REG_02
;        lda     R_VolumeHighByte
;        ora     #90h
;        sta     SP104_REG_03

        .if (DEBUGGING=1)
        ;putsio  #$ff
        ;putsio     R_Tts1DataLength+1
        ;putsio     R_Tts1DataLength
        .endif

        MOVL_3B R_Temp1,VoiceNoL
        STZ     R_Temp4
;        ADDL_C  R_Temp1,DIALOG_ADDR
        LONG_2_DDR_REG R_Temp1

        MOVW_W  <R_Tts1DataRomLowAddr,R_Temp1
        MOVW_W  <R_Tts1DataRomLowAddr+2,R_Temp3

?L_FetchSpeechData:
	lda	#25
	jsr	F_LongDelay
;*************************************** JSR Data Convert and send to SPDS104 Procedure
        JSR     F_DataConvert           ;jsr data convert procedure
;********************************************************************
        DECW    R_Tts1DataLength
        lda     R_Tts1DataLength+1
        ora     R_Tts1DataLength
        bne     ?L_FetchSpeechData

?L_PlaySegmentEnd:
        MOVW_C  <DRRL,SP104_BANK
        JMP     L_WriteSpeechEndBusy

; ***************************************************************************
RESET_SP104:
        RMB5	<portc_bak
        LDA     <portc_bak
        STA     <PC
        SMB5	<portc_bak
        SMB5	<portc_bak
        SMB5	<portc_bak
        SMB5	<portc_bak
        LDA     <portc_bak
        STA     <PC
        RTS

; ***************************************************************************
indexTable:
        DB      -1,-1,-1,-1,2,4,6,8
        DB      -1,-1,-1,-1,2,4,6,8

stepsizeTable:
        DW      7,8,9,10,11,12,13,14,16,17
        DW      19,21,23,25,28,31,34,37,41,45
        DW      50,55,60,66,73,80,88,97,107,118
        DW      130,143,157,173,190,209,230,253,279,307
        DW      337,371,408,449,494,544,598,658,724,796
        DW      876,963,1060,1166,1282,1411,1552,1707,1878,2066
        DW      2272,2499,2749,3024,3327,3660,4026,4428,4871,5358
        DW      5894,6484,7132,7845,8630,9493,10442,11487,12635,13899
        DW      15289,16818,18500,20350,22385,24623,27086,29794,32767

; ***************************************************************************
; INPUT  : A
; OUTPUT : A
; ***************************************************************************
DECODE_ADPCM:
        STA     delta                   ; delta = A;
        TAY                             ; Y = A;

        LDA     index                   ; step = stepsizeTable[index];
        ASL     A
        TAX
        LDA     stepsizeTable,X
        STA     step
        LDA     stepsizeTable+1,X
        STA     step+1

        LDA     indexTable,Y            ;
        CLC                             ; index += indexTable[delta];
        ADC     index                   ;
        BPL     ?CompIndex0             ;
        LDA     #0                      ;
        BRA     ?CompIndexEnd           ; if (index < 0) index = 0;
?CompIndex0:                            ;
        CMP     #89                     ;
        BCC     ?CompIndexEnd           ;
        LDA     #88                     ; if (index > 88) index = 88;
?CompIndexEnd:                          ;
        STA     index                   ;

        LDA     step                    ;
        STA     vpdiff                  ;
        LDA     step+1                  ;
        STA     vpdiff+1                ; vpdiff = step;

        LSR     vpdiff+1                ;
        ROR     vpdiff                  ;
        LSR     vpdiff+1                ;
        ROR     vpdiff                  ;
        LSR     vpdiff+1                ;
        ROR     vpdiff                  ; vpdiff >>= 3;

        LDA     delta                   ;
        AND     #4                      ;
        BEQ     ?delta0                 ;
        ADDW_W  vpdiff,step
?delta0:
        LSR     step+1                  ;
        ROR     step                    ; step >>= 1;
        LDA     delta                   ;
        AND     #2                      ;
        BEQ     ?delta1                 ;
        ADDW_W  vpdiff,step
?delta1:
        LSR     step+1                  ;
        ROR     step                    ; step >>= 1;
        LDA     delta                   ;
        AND     #1                      ;
        BEQ     ?delta2                 ;
        ADDW_W  vpdiff,step
?delta2:

        LDA     delta
        AND     #8
        BEQ     ?vpdiff1
        SUBW_W  valpred,vpdiff
        LDA     valpred+2
        SBC     #0
        STA     valpred+2
        BPL     ?vpdiffx
        LDA     valpred+1
        BMI     ?vpdiffx
        LDA     #$80
        STA     valpred+1
        STZ     valpred
        BRA     ?vpdiffx
?vpdiff1:
        ADDW_W  valpred,vpdiff
        LDA     valpred+2
        ADC     #0
        STA     valpred+2
        BMI     ?vpdiffx
        LDA     valpred+1
        BPL     ?vpdiffx
        LDA     #$7F
        STA     valpred+1
        LDA     #$FF
        STA     valpred
?vpdiffx:
        LDA     valpred+1
        EOR     #$80

        RTS

; ***************************************************************************
PLAY_ADPCM:
        _PUSH_DRR
        MOVW_C  <DRRL,SP104_BANK
?L_WriteModeBusy:                       ; set spds104 operation mode command
	jsr 	F_TestDataPort
	bcs	?L_WriteModeBusy
        lda     #$04                    ; Synthesis mode
        sta     SP104_REG_02
        lda     #$A0
        sta     SP104_REG_03

;?L_WriteSCode:                          ;Write Volume
;        jsr     F_TestDataPort
;        bcs     ?L_WriteSCode
;        lda     #$02                            ;R_VolumeLowByte
;        sta     SP104_REG_02
;        lda     #$04                            ;R_VolumeHighByte
;        sta     SP104_REG_03

        MOVL_3B R_Temp1,VoiceNoL
        STZ     R_Temp4
        LONG_2_DDR_REG R_Temp1
        MOVW_W  <R_Tts1DataRomLowAddr,R_Temp1

        STZ     index
        STZ     valpred
        STZ     valpred+1
        STZ     valpred+2

?L_FetchSpeechData:
        MOVW_W  <DRRL,R_Temp3
        lda     (R_Tts1DataRomLowAddr)          ; fetch data from tts1.bin
        AND     #$F0
        LSR     A
        LSR     A
        LSR     A
        LSR     A
        JSR     DECODE_ADPCM

        CMP     #$F0
        BCC     ?here0
        LDA     #$EF
?here0:
        STA     pcmdata

        lda     #2
        jsr     shortdelay

        MOVW_C  <DRRL,SP104_BANK
?L_FetchSpeechData0:
	lda	SP104_REG_00
	and	#30h
        bne     ?L_FetchSpeechData0
        LDA     #0
        STA     SP104_REG_02
        LDA     pcmdata
        STA     SP104_REG_03

        MOVW_W  <DRRL,R_Temp3
        lda     (R_Tts1DataRomLowAddr)          ; fetch data from tts1.bin
        AND     #$0F
        JSR     DECODE_ADPCM

        CMP     #$F0
        BCC     ?here1
        LDA     #$EF
?here1:
        STA     pcmdata

        lda     #4
        jsr     shortdelay

        MOVW_C  <DRRL,SP104_BANK
?L_FetchSpeechData1:
	lda	SP104_REG_00
	and	#30h
        bne     ?L_FetchSpeechData1
        LDA     #0
        STA     SP104_REG_02
        LDA     pcmdata
        STA     SP104_REG_03

        INC     <R_Tts1DataRomLowAddr
        BNE     ?INCWX
        INC     <R_Tts1DataRomLowAddr+1
        BNE     ?INCWX
        SMB7    <R_Tts1DataRomLowAddr+1
        INC     R_Temp3
        BNE     ?INCWX
        INC     R_Temp3+1
?INCWX:
        BBR3    <EFlag,?INCWX0		;; Branch if not Key down event.
        LDA     <KeyNo
        cmp     #TALK_KEY
        BNE     ?INCWX0
	RMB3	<EFlag
	BRA	?L_PlaySegmentEnd

?INCWX0:
        SEC
        LDA     R_Tts1DataLength
        SBC     #1
        STA     R_Tts1DataLength
        LDA     R_Tts1DataLength+1
        SBC     #0
        STA     R_Tts1DataLength+1
        LDA     R_Tts1DataLength+2
        SBC     #0
        STA     R_Tts1DataLength+2

        lda     R_Tts1DataLength+2
        ora     R_Tts1DataLength+1
        ora     R_Tts1DataLength
        beq     ?L_PlaySegmentEnd
        JMP     ?L_FetchSpeechData

?L_PlaySegmentEnd:
        MOVW_C  <DRRL,SP104_BANK
        JMP     L_WriteSpeechEndBusy

; ***************************************************************************
shortdelay:
        sta     R_DelayLowByte
L_Longdellop1?
	dec	R_DelayLowByte
	bne	L_Longdellop1?
        rts

; ***************************************************************************
        .endif  ;ifdef TTS1_ADDR
; ***************************************************************************
        END
; ***************************************************************************

;?L_WriteModeBusy0:                       ; set spds104 operation mode command
;        jsr     F_TestDataPort
;        bcs     ?L_WriteModeBusy0
;        lda     #$00                    ; Synthesis mode
;        sta     SP104_REG_02
;        lda     #$60
;        sta     SP104_REG_03

;?L_WriteVolume:                                 ;Write Volume
;        jsr     F_TestDataPort
;        bcs     ?L_WriteVolume
;        lda     #$7F                            ;R_VolumeLowByte
;        sta     SP104_REG_02
;        lda     #$01                            ;R_VolumeHighByte
;        ora     #90h
;        sta     SP104_REG_03


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -