📄 sp104.asm
字号:
?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 + -