summaryrefslogtreecommitdiff
path: root/Source/DSPSpy/tests/srs_test.ds
blob: 38febf7f1a287650fd8d29a52236483ea507ba15 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
incdir "tests"
include "dsp_base.inc"

test_main:
; Test registers used by LRS and SRS
	LRI $CR, #0x0000
	CALL clear_regs
	CALL store_mem_sr

	; Write with SR, read with LR
	LRI $AR0, #0xA00A
	CALL create_pattern
	CALL store_mem_sr
	CALL send_back
	CALL clear_regs
	CALL read_mem_lr
	CALL send_back

	; Write with SR, read with LRS
	LRI $AR0, #0xB00B
	CALL create_pattern
	CALL store_mem_sr
	CALL send_back
	CALL clear_regs
	CALL read_mem_lrs
	CALL send_back

	; Write with SRS, read with LR
	LRI $AR0, #0xC00C
	CALL create_pattern
	CALL store_mem_srs
	CALL send_back
	CALL clear_regs
	CALL read_mem_lr
	CALL send_back

	; Write with SR, read with LRS
	LRI $AR0, #0xD00D
	CALL create_pattern
	CALL store_mem_srs
	CALL send_back
	CALL clear_regs
	CALL read_mem_lrs
	CALL send_back

; We're done, DO NOT DELETE THIS LINE
	JMP end_of_test

create_pattern:
	LRI $IX0, #0x0110
	MRR $AX0.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AX1.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AX0.H, $AR0
	ADDARN $AR0, $IX0
	MRR $AX1.H, $AR0
	ADDARN $AR0, $IX0
	MRR $AC0.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AC1.L, $AR0
	ADDARN $AR0, $IX0
	MRR $AC0.M, $AR0
	ADDARN $AR0, $IX0
	MRR $AC1.M, $AR0
	ADDARN $AR0, $IX0
	; AC0.H and AC1.H have odd results since they're 8-bit sign-extended, but that's fine.
	MRR $AC0.H, $AR0
	ADDARN $AR0, $IX0
	MRR $AC1.H, $AR0
	RET

clear_regs:
	LRI $AX0.L, #0x0000
	LRI $AX1.L, #0x0000
	LRI $AX0.H, #0x0000
	LRI $AX1.H, #0x0000
	LRI $AC0.L, #0x0000
	LRI $AC1.L, #0x0000
	LRI $AC0.M, #0x0000
	LRI $AC1.M, #0x0000
	LRI $AC0.H, #0x0000
	LRI $AC1.H, #0x0000
	RET

read_mem_lr:
	LR $AX0.L, @0x0000
	LR $AX1.L, @0x0001
	LR $AX0.H, @0x0002
	LR $AX1.H, @0x0003
	LR $AC0.L, @0x0004
	LR $AC1.L, @0x0005
	LR $AC0.M, @0x0006
	LR $AC1.M, @0x0007
	RET

read_mem_lrs:
	LRS $AX0.L, @0x00
	LRS $AX1.L, @0x01
	LRS $AX0.H, @0x02
	LRS $AX1.H, @0x03
	LRS $AC0.L, @0x04
	LRS $AC1.L, @0x05
	LRS $AC0.M, @0x06
	LRS $AC1.M, @0x07
	RET

store_mem_sr:
	SR @0x0000, $AX0.L
	SR @0x0001, $AX1.L
	SR @0x0002, $AX0.H
	SR @0x0003, $AX1.H
	SR @0x0004, $AC0.L
	SR @0x0005, $AC1.L
	SR @0x0006, $AC0.M
	SR @0x0007, $AC1.M
	RET

store_mem_srs:
	; For future compatibility these have been changed to cw.
	; The way the instructions were originally encoded is commented,
	; but this does not match their behavior.
	cw 0x2800 ; SRS @0x00, $AX0.L - actually SRSH @0x00, $AC0.H
	cw 0x2901 ; SRS @0x01, $AX1.L - actually SRSH @0x01, $AC1.H
	cw 0x2A02 ; SRS @0x02, $AX0.H - actually unknown, no store performed
	cw 0x2B03 ; SRS @0x03, $AX1.H - actually unknown, no store performed
	cw 0x2C04 ; SRS @0x04, $AC0.L
	cw 0x2D05 ; SRS @0x05, $AC1.L
	cw 0x2E06 ; SRS @0x06, $AC0.M
	cw 0x2F07 ; SRS @0x07, $AC1.M
	RET