blob: c35db9c9a3b86e21cf9f9d1cc946f1bee38b9a92 (
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
;;
;; This file verifies the compliance with the Motorola specification:
;;
;; MOTOROLA STANDARDS
;; Document #1001, Version 1.0
;; SPECIFICATION FOR Motorola 8- and 16-Bit ASSEMBLY LANGUAGE INPUT STANDARD
;; 26, October 1999
;;
;; Available at:
;;
;; http://www.mcu.motsps.com/dev_tools/hc12/eabi/m8-16alis.pdf
;;
;; Lines starting with '#' represent instructions that fail in GAS.
;;
;;
;; Section 8.2 INPUTS
;; Validated within the whole file
;; Section 8.2.1 Character Set
;; TBD
;; Section 8.2.2 Assembly Language Statement
;; Validated within the whole file
;; Section 8.2.3 Comments
; Motorola comment
;; This file is full of comments
;; Section 8.2.5 Location Counter
section .text
_start:
L0: * ; L0 set to 0 (relative to text)
ldaa 1,x
L1: equ * ; L1 set to 2 (relative to text)
;; Section 8.2.6 Sections
section .data
section .text
section empty
section .text
;; Section 8.2.7 Expressions
L2: equ 23 ; Absolute = 0x17
L3: equ L0-23 ; Simple relocatable
;; Section 8.2.7.1 Primary Expression
L4: equ 45 ; Numeric = 0x2d
L5: equ L0 ; Symbolic
;; Section 8.2.7.2 Absolute Expression
L_txt: ldaa #44
L_txt2:
L6: equ -L4 ; unary expr 0xffffffd3
L7: equ L6+1000 ; binary expr 0x03bb
L8: equ L6-12 ; 0xffffffc7
L9: equ L_txt2-L_txt ; reloc - reloc 2 = sizeof(ldaa #44)
;; Section 8.2.7.3 Simple Relocatable Expressions
L10: equ _start ; symbol 0 + text
L11: equ L10+23 ; reloc+abs 0x17 + text
L12: equ L11-4 ; reloc-abs 0x13 + text
L13: equ L12+L9 ; reloc+abs 0x15 + text
;; Section 8.2.8 Symbols
section .text
Text_Symbol:
ldx #Data_Symbol
section .data
Data_Symbol:
;; Section 8.2.8.1 Labels
L_label_shall_be_significant_to_at_least_32_chars:
dc.b 1
L_label_lower: ; Labels are case sensitive
dc.b 2
L_Label_Lower:
dc.b 3
;; Section 8.2.9 Constants
;
; Section 8.2.9.1 Decimal Constants
section .text
L_constant:
ldaa #123 ; -> ldaa #0x7b
ldaa #-23 ; -> ldaa #0xe9
;; Section 8.2.9.2 Binary Constants
ldab #%10001010 ; -> ldab #0x8A
ldab #%0111 ; -> ldab #0x07
;; Section 8.2.9.3 Octal Constants
ldaa #@74 ; -> ldaa 0x3c
ldaa #@377 ; -> ldaa 0xff
;; Section 8.2.9.4 Hexadecimal Constants
ldaa #$ae ; -> ldaa 0xae
ldaa #$B2 ; -> ldaa 0xb2
;; Section 8.2.9.5 String Constants
section .data
# ascii '"Single quote string"'
ascii "'Double quote string'"
;; Section 8.2.9.6 Floating Point Constants
;; No specification
L_float: float 3.241592e-2
;; Section 8.2.10 Operators
section .text
L_operator:
ldx #(((1<<3)&(1<<3)|2)<<4)+(4*4-1)
ldx #(L2>=23)&1-(L2<=23)&1+(L2==23)&1 ; -> ldx #1
ldx #(L2>23)&1-(L2<23)&1+(L2==23)&1 ; -> ldx #0
ldx #1-1+1-1+1-1
ldab #~L4 ; -> ldab #0xd2
# ldab #<_start ; force to 8-bit
# ldx #>_start ; force to 16-bit
# ldab #page(_start) ; 68HC12 page number of symbol
;; Section 8.2.11 Instructions
;; Defined by other tests
;; Section 8.2.12 Assembler Directives
;;
;; Section 8.2.12.1 Conditional Directives
;;
# The specification says we are allowed to have spaces in expressions.
# This does not work with GAS in mri mode, the instruction 'if L2 < 24'
# is in fact treated as 'if L2'.
L_if:
if L2<24 ; true
ldx #1 ; -> ldx #1
else
ldx #2
endif
if L2<23||L2>23||L2==22+1 ; true
if L2<23 ; false
ldaa #0
endif
if L2>23 ; false
ldaa #1
endif
if L2 == 23 ; true
ldaa #L2+8 ; -> ldaa #31
endif
if L2+2<23+2 ; false
if L2+4>23+4
ldaa #1
elseif L2==23
ldaa #2
else
ldaa #3
endif
elseif L2==23 ; true
ldaa #4 ; -> ldaa #4
else
ldaa #5
endif
endif
ifdef L1 ; true
ldx #23 ; -> ldx #0x17
endif
ifndef L_undef ; true
ldx #4 ; -> ldx #4
endif
;; Section 8.2.12.2 Define Constant -dc
section .data
L_const_data:
dc.b (1<<3)|2 ; 0x0a
dc.w (1<<9)+2 ; 0x02 0x02
dc.l $12345678
dc.b 10
dc.l (1<<9)*(3<<12)
# dc.b "Hello"
# dc.w "World"
# dc.l "!!!"
;; Section 8.2.12.3 Define Constant Block -dcb
dcb.b 3,2
dcb.w 2,$55AA
dcb.l 2,$12345678
dcb.b 10,2
dcb.w 5,$55AA
dcb.l 2,$12345678
# dcb.b 4, 12 ; Fails in GAS due to space
;; Section 8.2.12.4 Define Storage - ds
ds.b 4
ds.w 2
ds.l 1
ds 2
;; Section 8.2.12.5 Equate Symbol Value - equ
L_equ1: equ (1<<8)+3
L_equ2: equ L_equ1*3
L_equ3: equ L_equ2-L_equ1
;; Section 8.2.12.6 Include File - include
# include 'malis-include.s'
# include "malis-include.s"
include malis-include.s
include malis-include.s
;; Section 8.2.12.7 Origin - org
section .text
# org $100
ldaa #23
# org $200
staa 24
# org $0
rts
;; Section 8.2.12.8 Define Section - section
section .text
ldaa 23
section .data
dc.b 23
;; Section 8.2.12.9 Set Value of Symbol - set
s1: set 3
s1: set 4
s2: set s1+2
s3: set s2+4
;; Section 8.2.12.10 External Symbol Definition - xdef
xdef s1
xdef s2
xdef entry
;; Section 8.2.12.11 External Symbol Reference - xref
section .text
xref printf
xrefb write
entry:
rts
|