Files
espeak-ng/platforms/riscos/s/assemb
T
jonsd 614e05138f Added makefile and speech.h for DOS build.
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
2007-08-18 00:29:04 +00:00

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