aboutsummaryrefslogtreecommitdiffstats
path: root/lab1/RTDSP/load.asm
blob: 3144acc0461646c4ff03f83b1e8bd442d7f9d39f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
; ***************************************************************************************
;			        DEPARTMENT OF ELECTRICAL AND ELECTRONIC ENGINEERING
;					               IMPERIAL COLLEGE LONDON 
;
; 				       EE 3.19: Real Time Digital Signal Processing
;					         Course  by: Dr Paul Mitcheson
;
;				        LAB 1: Getting Started with the TI C6x DSP 
;
; 				            *********** LOAD.ASM ***********
;
;	Part of the volume example. Demonstrates that assembly code can be called from C.
;		          Puts a dummy load on processor which can be varied
;		                  by modiying the value of processingLoad
;				(Where ProcessingLoad is a variable passed to the function in C).
; ***************************************************************************************
; 				         Modified by D. Harvey: 24 April 2006
;				Modified to include resource references 23 Jan 2008
; ***************************************************************************************
;
; 
        .global _load

        .text

N       .set    1000

;
;  ********************************* _load description **********************************
;  This function simulates a load on the DSP by executing N * processingLoad
;  instructions, where processingLoad is the input parameter to load() from volume.c:
;
;  								load(processingLoad);
;
;  The loop is using 8 instructions. One instruction for sub, nop and b, plus nop 5.
;  (The extra nop added after sub is to make the number of instructions in the loop 8).
;  By dividing  N * processingLoad by 8 and using the result as the loop counter,
;  N * processingLoad = the number of instruction cycles used when the function is called.
;
;  See Real Time Digial signal processing by Nasser Kehtarnavaz (page 146) for more 
;  info on mixing C and Assembly.
; ****************************************************************************************
;
_load:

        mv 		.s2 	a4, b0      ; move parameter (processingLoad) passed from C into b0 
  [!b0] b 		.s2 	lend  		; end code if processingLoad is zero 
        mvk 	.s2  	N,b1		; set b1 to value of N (set above as 1000)
        mpy 	.m2 	b1,b0,b0	; N * processingLoad -> b0
        nop							; stall the pipeline
        shru	.s2 	b0,3,b0    	; Divide b0 by 8 (b0 will be used as the loop counter)

		
loop:					; *************** 8 Instruction Loop ******************
        sub 	.d2 	b0,1,b0		; b0 - 1 -> b0
        nop							; added to make loop code 8 instruction cycles long
   [b0] b 		.s2 	loop		; loop back if b0 is not zero
        nop 			5			; stall the pipeline
						; ******************* End of Loop *********************

lend:   b 		.s2 	b3			; branch to b3 (register b3 holds the return address)
        nop 			5           ; stall the pipeline
        
        .end