summaryrefslogtreecommitdiffstats
path: root/Bachelor/Mikroprozessorsysteme2/ARM202U/EXAMPLES/EXPLASM/RANDOM.S
blob: 67aacdfb427622fe9bffb3ea858dc3c8ec92c715 (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
; Random number generator
;
; This uses a 33-bit feedback shift register to generate a pseudo-randomly
; ordered sequence of numbers which repeats in a cycle of length 2^33 - 1
; NOTE: randomseed should not be set to 0, otherwise a zero will be generated
; continuously (not particularly random!).
;
; This is a good application of direct ARM assembler, because the 33-bit
; shift register can be implemented using RRX (which uses reg + carry).
; An ANSI C version would be less efficient as the compiler would not use RRX.

	AREA 	|Random$$code|, CODE, READONLY

	EXPORT	randomnumber

randomnumber
; on exit:
;	a1 = low 32-bits of pseudo-random number
;	a2 = high bit (if you want to know it)
	LDR	ip, |seedpointer|
	LDMIA	ip, {a1, a2}
	TST	a2, a2, LSR#1		; to bit into carry
	MOVS	a3, a1, RRX		; 33-bit rotate right
	ADC	a2, a2, a2		; carry into LSB of a2
	EOR	a3, a3, a1, LSL#12	; (involved!)
	EOR	a1, a3, a3, LSR#20	; (similarly involved!)
	STMIA	ip, {a1, a2}

	MOV	pc, lr

|seedpointer|
	DCD	seed


	AREA	|Random$$data|, DATA

	EXPORT	seed
seed
	DCD	&55555555
	DCD	&55555555

	END