mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-11-01 05:46:19 +00:00
Moved the Windows build files together with DOS and others into a new directory: "platforms". git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@76 d46cf337-b52f-0410-862d-fd96e6ae7743
128 lines
2.3 KiB
Plaintext
128 lines
2.3 KiB
Plaintext
; 32 bit version
|
|
|
|
; SWI numbers
|
|
OS_File * &8
|
|
OS_Module * &1e
|
|
XOS_AddCallBack * &20054
|
|
XOS_RemoveCallBack * &2005f
|
|
|
|
|
|
|
|
GET h.RegNames
|
|
EXPORT DMA_Handler
|
|
EXPORT AddSineWaves
|
|
|
|
IMPORT |callback_entry|
|
|
IMPORT |sound_entry|
|
|
IMPORT |sin_tab|
|
|
|
|
|
|
AREA Assemb , CODE, READONLY
|
|
|
|
|
|
; pointers to data items
|
|
ADR_callback_entry
|
|
DCD callback_entry
|
|
ADR_sound_entry
|
|
DCD sound_entry
|
|
ADR_sin_tab
|
|
DCD sin_tab
|
|
|
|
|
|
|
|
|
|
|
|
DMA_Handler
|
|
;**********
|
|
; fill the sound buffer of the linear sound handler
|
|
; preserve r11,r12,r13 (fp,ip,sp)
|
|
|
|
MOV r5,ip ; need to save ip
|
|
MOV ip,sp ;set up a stack
|
|
STMFD sp!, {fp,ip,lr}
|
|
STMFD sp!, {r5}
|
|
|
|
MOV r12,r0 ; put the module_data word in r12
|
|
BL sound_entry ; call C function through veneer in CMHG
|
|
|
|
; returns with r0=1 set callback, r1=module_data address
|
|
CMP r0,#1
|
|
BNE DMA_return
|
|
|
|
;---------
|
|
TEQ pc,pc
|
|
MRSEQ r8, CPSR ; 32bit version of call SWI from IRQ mode
|
|
MOVNE r8,pc
|
|
ORR r9,r8,#3
|
|
MSREQ CPSR_c, r9
|
|
TEQNEP r9,#0
|
|
NOP
|
|
STR r14, [r13,#-4]!
|
|
;---------
|
|
|
|
; r1=module_data address
|
|
LDR r0,ADR_callback_entry ; call C function through CMHG veneer
|
|
SWI XOS_AddCallBack
|
|
|
|
;---------
|
|
LDR r14, [r13],#4 ; 32bit version of 'reenter original processor mode'
|
|
TEQ pc,pc
|
|
MSREQ CPSR_c, r8
|
|
TEQNEP r8,#0
|
|
NOP
|
|
;---------
|
|
|
|
DMA_return
|
|
LDMFD sp!,{ip}
|
|
LDMFD sp, {fp,sp,pc}
|
|
|
|
|
|
AddSineWaves
|
|
;total += AddSineWaves(waveph, h_switch_sign, maxh, harmspect);
|
|
; using this assembler routine increases overall speed by about 7.5%
|
|
; define the USE_ASSEMBLER_1 macro in speech.h to enable this routine
|
|
|
|
; input: r0=waveph r1=h_switch_sign r2=maxh r3=harmspect
|
|
; local: r5=sin_tab r6=total r7=h r8=theta
|
|
; return(total)
|
|
MOV ip,sp
|
|
STMFD sp!, {r5-r9,ip,lr}
|
|
LDR r5,ADR_sin_tab
|
|
MOV r6,#0 ; total = 0
|
|
MOV r0,r0,LSL #16
|
|
MOV r8,r0 ; theta = waveph
|
|
|
|
MOV r7,#1
|
|
|
|
as1
|
|
MOV ip,r8,LSR #21
|
|
LDR r9,[r5,ip,LSL #1] ; sin_tab[theta >> 5]
|
|
MOV r9,r9,LSL #16
|
|
MOV r9,r9,ASR #16
|
|
LDR ip,[r3,r7,LSL #2] ; harmspect[h]
|
|
MLA r6,r9,ip,r6
|
|
|
|
ADD r8,r8,r0 ; theta += waveph
|
|
ADD r7,r7,#1 ; h++
|
|
CMP r7,r1
|
|
BLE as1
|
|
|
|
RSB r6,r6,#0 ; change sign
|
|
|
|
as2
|
|
MOV ip,r8,LSR #21
|
|
LDR r9,[r5,ip,LSL #1] ; sin_tab[theta >> 5]
|
|
MOV r9,r9,LSL #16
|
|
MOV r9,r9,ASR #16
|
|
LDR ip,[r3,r7,LSL #2] ; harmspect[h]
|
|
MLA r6,r9,ip,r6
|
|
|
|
ADD r8,r8,r0 ; theta += waveph
|
|
ADD r7,r7,#1 ; h++
|
|
CMP r7,r2
|
|
BLE as2
|
|
|
|
MOV r0,r6
|
|
LDMFD sp, {r5-r9,sp,pc}
|
|
END
|