| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | 
							- ; 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
 
 
  |