📄 sp104.asm
字号:
; ***************************************************************************
; * Project : Electronic Dictionary *
; * Date : 2004.4 *
; * File Name : SP104.ASM *
; * Author : Ji Ang *
; ***************************************************************************
pw 128
case off
externs on
INCLUDE ST2202.DEF
INCLUDE DATA.DEF
INCLUDE XYHADDR.H
;INCLUDE GRAPH.DEF
include keydef.def
; ***************************************************************************
.ifdef TTS1_ADDR
; ***************************************************************************
Edata equ 800h
; ***************************************************************************
INCLUDE TALKWORD.DEF
; ***************************************************************************
.ifndef LSL_W
INCLUDE ST2202.MAC
chip w65c02s
.endif
; ***************************************************************************
DEBUGGING EQU 0
PUTSIODATA
MACRO
sta <UDATA ;
lda #00000011b ;
ora <USTR
sta <USTR ;
bbs1 <USTR,$
ENDM
; ***************************************************************************
; ***************************************************************************
SP104_BANK EQU 0300H
SP104_REG_00 EQU 8000H
SP104_REG_02 EQU 8002H
SP104_REG_03 EQU 8003H
; ***************************************************************************
PS7 .SECTION
BankNo equ CardBank ;; For check only.
; ***************************************************************************
PUBLIC RESET_SP104
PUBLIC SP140_Sleep
PUBLIC SP140_WakeUp
PUBLIC PLAY_SPEECH
PUBLIC PLAY_PHRASE
PUBLIC PLAY_ADPCM
; ***************************************************************************
SP140_Sleep:
_PUSH_DRR
JMP L_WriteSleepCommand
; ***************************************************************************
;------------------------
;data convert
;use Register:
; R_Temp1,R_Temp2,R_Temp3,R_Temp4
;input:
; R_DataRamAddr
; ds 18
;output:
; Speech words
;-----------------------
F_DataConvert: ;data convert and output
MOVW_C <DRRL,SP104_BANK
JSR FETCH_ONE_BYTE ;load byte 1
sta R_Temp1
and #0fh
sta R_Temp4
JSR FETCH_ONE_BYTE_I ;load byte 2
pha
JSR FETCH_ONE_BYTE_I ;load byte 3
sta R_Temp2
tay
pla
asl a
rol R_Temp2
asl a
rol R_Temp3
asl a
rol R_Temp3
asl a
rol R_Temp3
ora R_Temp4
?L_WaitPackage0Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage1Busy
sta SP104_REG_02 ;send package 0
nop
lda R_Temp3
and #00000111b
sta SP104_REG_03
nop
?L_WaitPackage1Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage1Busy
lda R_Temp2
sta SP104_REG_02
JSR FETCH_ONE_BYTE_I ;load byte 4
sta R_Temp3
sta R_Temp4
tya
asl a
rol R_Temp3
lda R_Temp3
and #00000111b
ora #10h
sta SP104_REG_03 ;send package 1
JSR FETCH_ONE_BYTE_I ;load byte 5
sta R_Temp2
lsr a
ror R_Temp4
lsr a
ror R_Temp4
sta R_Temp3
lda R_Temp4
?L_WaitPackage2Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage2Busy
sta SP104_REG_02
lda R_Temp3
and #0fh
ora #20h
sta SP104_REG_03 ;send package 2
JSR FETCH_ONE_BYTE_I ;load byte 6
sta R_Temp3
rol R_Temp2
rol a
rol R_Temp2
rol a
?L_WaitPackage3Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage3Busy
sta SP104_REG_02
lda R_Temp1
lsr a
lsr a
lsr a
lsr a
ora #30h
sta SP104_REG_03 ;send package 3
JSR FETCH_ONE_BYTE_I ;load byte 7
rol R_Temp3
rol a
rol R_Temp4
rol R_Temp3
rol a
rol R_Temp4
?L_WaitPackage4Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage4Busy
sta SP104_REG_02
lda R_Temp4
and #00000011b
ora #40h
sta SP104_REG_03 ;send package 4
JSR FETCH_ONE_BYTE_I ;load byte 8
?L_WaitPackage5Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage5Busy
sta SP104_REG_02
JSR FETCH_ONE_BYTE_I ;load byte 9
sta R_Temp3
and #00000011b
ora #50h
sta SP104_REG_03 ;send package 5
lda R_Temp3
lsr a
lsr a
and #00011111b
?L_WaitPackage6Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage6Busy
sta SP104_REG_02
nop
lda #30h
sta SP104_REG_03 ;send package 6
JSR FETCH_ONE_BYTE_I ;load byte 10
pha
JSR FETCH_ONE_BYTE_I ;load byte 11
sta R_Temp4
sta R_Temp2
pla
rol R_Temp3
rol a
rol R_Temp4
?L_WaitPackage7Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage7Busy
sta SP104_REG_02
lda R_Temp4
and #00000011b
ora #40h
sta SP104_REG_03 ;send package 7
JSR FETCH_ONE_BYTE_I ;load byte 12
sta R_Temp4
lsr a
sta R_Temp3
ror R_Temp2
lda R_Temp2
?L_WaitPackage8Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage8Busy
sta SP104_REG_02
lda R_Temp3
and #00000011b
ora #50h
sta SP104_REG_03 ;send package 8
JSR FETCH_ONE_BYTE_I ;load byte 13
sta R_Temp3
JSR FETCH_ONE_BYTE_I ;load byte 14
sta R_Temp2
lsr a
ror R_Temp3
ror R_Temp4
lsr a
ror R_Temp3
ror R_Temp4
lsr a
ror R_Temp3
ror R_Temp4
and #00000011b
sta R_Temp1
lda R_Temp4
?L_WaitPackage9Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage9Busy
sta SP104_REG_02
nop
lda #30h
sta SP104_REG_03 ;send package 9
nop
lda R_Temp3
?L_WaitPackage10Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage10Busy
sta SP104_REG_02
lda R_Temp1
ora #40h
sta SP104_REG_03 ;send package 10
JSR FETCH_ONE_BYTE_I ;load byte 15
sta R_Temp4
JSR FETCH_ONE_BYTE_I ;load byte 16
rol R_Temp2
rol R_Temp4
rol a
sta R_Temp3
rol R_Temp2
rol R_Temp4
rol R_Temp1
rol R_Temp2
rol R_Temp4
rol R_Temp1
lda R_Temp4
?L_WaitPackage11Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage11Busy
sta SP104_REG_02
lda R_Temp1
and #00000011b
ora #50h
sta SP104_REG_03 ;send package 11
lda R_Temp3
and #00011111b
?L_WaitPackage12Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage12Busy
sta SP104_REG_02
nop
nop
lda #30h
sta SP104_REG_03 ;send package 12
JSR FETCH_ONE_BYTE ;load byte 16
sta R_Temp4
JSR FETCH_ONE_BYTE_I ;load byte 17
sta R_Temp3
lsr a
ror R_Temp4
lsr a
ror R_Temp4
lsr a
ror R_Temp4
lsr a
ror R_Temp4
sta R_Temp2
lda R_Temp4
?L_WaitPackage13Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage13Busy
sta SP104_REG_02
lda R_Temp2
and #00000011b
ora #40h
sta SP104_REG_03 ;send package 13
JSR FETCH_ONE_BYTE_I ;load byte 18
rol R_Temp3
rol a
rol R_Temp4
rol R_Temp3
rol a
rol R_Temp4
?L_WaitPackage14Busy:
jsr F_TestDataPort
bcs ?L_WaitPackage14Busy
sta SP104_REG_02
lda R_Temp4
and #00000011b
ora #50h
sta SP104_REG_03 ;send package 14
INC <R_Tts1DataRomLowAddr
BNE ?F_DataConvert_X
INC <R_Tts1DataRomLowAddr+1
BNE ?F_DataConvert_X
SMB7 <R_Tts1DataRomLowAddr+1
INC <R_Tts1DataRomLowAddr+2
BNE ?F_DataConvert_X
INC <R_Tts1DataRomLowAddr+3
?F_DataConvert_X:
RTS
; ***************************************************************************
FETCH_ONE_BYTE:
LDX <DRRL
PHX
LDX <DRRH
PHX
FETCH_ONE_BYTE_GO:
LDA <R_Tts1DataRomLowAddr+2
STA <DRRL
LDA <R_Tts1DataRomLowAddr+3
STA <DRRH
LDA (<R_Tts1DataRomLowAddr)
;PHA
;PUTSIODATA
;PLA
PLX
STX <DRRH
PLX
STX <DRRL
RTS
; ***************************************************************************
FETCH_ONE_BYTE_I:
LDX <DRRL
PHX
LDX <DRRH
PHX
INC <R_Tts1DataRomLowAddr
BNE FETCH_ONE_BYTE_GO
INC <R_Tts1DataRomLowAddr+1
BNE FETCH_ONE_BYTE_GO
SMB7 <R_Tts1DataRomLowAddr+1
INC <R_Tts1DataRomLowAddr+2
BNE FETCH_ONE_BYTE_GO
INC <R_Tts1DataRomLowAddr+3
BRA FETCH_ONE_BYTE_GO
; ***************************************************************************
; ***************************************************************************
F_PlaySpeech:
MACRO
ldx #00
lda R_Tts2AddrRam,x ;tts2 byte 1
sta <R_Tts1DataRomLowAddr ;segment start point address low byte
sta R_Temp1
inx
lda R_Tts2AddrRam,x ;tts2 byte 2
sta <R_Tts1DataRomHighAddr ;segment start point address middle byte
sta R_Temp2
inx
lda R_Tts2AddrRam,x ;tts2 byte 3
tay
and #01h
sta R_Temp3 ;segment start point address high byte
sta R_TempX
tya
lsr a
sta R_Tts1DataLength ;segment length
inx
lda R_Tts2AddrRam,x ;tts2 byte 4
sta R_Tts1DataParameter1 ;segment parameter1
inx
lda R_Tts2AddrRam,x ;tts2 byte 5
sta R_Tts1DataParameter2 ;segment parameter2
lda R_Tts1DataParameter2 ;if parameter2 is not 0,read(segment length+1)*18 bytes
eor #0
beq ?L_Calculate_SegmentStartAddr ;if parameter2 is 0,read(segment length*18) bytes
clc
lda #1
adc R_Tts1DataLength
sta R_Tts1DataLength
?L_Calculate_SegmentStartAddr:
STZ R_Temp4
.if (DEBUGGING=1)
PUTSIODATA R_Tts1DataLength
PUTSIODATA R_Tts1DataParameter1
PUTSIODATA R_Tts1DataParameter2
PUTSIODATA R_Temp1
PUTSIODATA R_Temp2
PUTSIODATA R_Temp3
PUTSIODATA R_Temp4
.endif
ldx #3
?L_SegmentStartAddr_Mul_Nine:
ASL R_Temp1
ROL R_Temp2
ROL R_Temp3
ROL R_Temp4
dex
bne ?L_SegmentStartAddr_Mul_Nine
clc
lda R_Temp1
adc <R_Tts1DataRomLowAddr
sta R_Temp1
lda R_Temp2
adc <R_Tts1DataRomHighAddr
sta R_Temp2
lda R_Temp3
adc R_TempX
sta R_Temp3
lda R_Temp4
adc #0
sta R_Temp4
ASL R_Temp1
ROL R_Temp2
ROL R_Temp3
ROL R_Temp4
.if (DEBUGGING=1)
PUTSIODATA R_Temp1
PUTSIODATA R_Temp2
PUTSIODATA R_Temp3
PUTSIODATA R_Temp4
.endif
ADDL_C R_Temp1,TTS1_ADDR
LONG_2_DDR_REG R_Temp1
MOVW_W <R_Tts1DataRomLowAddr,R_Temp1
;------------------------------------
;Fetch Speech Data from tts1.bin and convert to tts format,then send to spds104
;----------------------------
MOVW_C <DRRL,SP104_BANK
?L_WriteParameter1:
jsr F_TestDataPort
bcs ?L_WriteParameter1
lda R_Tts1DataParameter1 ;Write Parameter1
sta SP104_REG_02
lda #c2h
sta SP104_REG_03
?L_WriteParameter2: ;Write Parameter2
jsr F_TestDataPort
bcs ?L_WriteParameter2
lda R_Tts1DataParameter2
sta SP104_REG_02
lda #c4h
sta SP104_REG_03
?L_WriteSegmentLength: ;;Write Segment length
jsr F_TestDataPort
bcs ?L_WriteSegmentLength
lda R_Tts1DataLength
sta SP104_REG_02
lda #c8h
sta SP104_REG_03
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
;********************************************************************
dec R_Tts1DataLength
bne ?L_FetchSpeechData
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -