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
|
# Write ch to the standard output
.macro outch ch
ldk $r0,\ch
sta 0x10000,$r0
.endm
# End the test with return code c
.macro exit c
ldk $r0,\c
sta 0x1fffc,$r0
.endm
# All assembler tests should start with this macro "start"
.macro start
.text
jmp __start
jmp __start
reti
.data
ccsave: .long 0
.text
# Fiddling to load $cc from the following word in program memory
loadcc:
exi $r29,$sp,0
lpmi $cc,$r29,0
add $r29,$r29,4
exi $r29,$sp,0
return
failcase:
outch 'f'
outch 'a'
outch 'i'
outch 'l'
outch '\n'
exit 1
__start:
.endm
# At the end of the test, the code should reach this macro PASS
.macro PASS
outch 'p'
outch 'a'
outch 's'
outch 's'
outch '\n'
exit 0
.endm
# Confirm that reg has value, and fail immediately if not
# Preserves all registers
.macro EXPECT reg,value
sta ccsave,$cc
call loadcc
.long \value
cmp \reg,$cc
jmpc nz,failcase
lda $cc,ccsave
.endm
|