1;;
2;; This file verifies the compliance with the Motorola specification:
3;;
4;; MOTOROLA STANDARDS
5;; Document #1001, Version 1.0
6;; SPECIFICATION FOR Motorola 8- and 16-Bit ASSEMBLY LANGUAGE INPUT STANDARD
7;; 26, October 1999
8;;
9;; Available at:
10;;
11;; http://www.mcu.motsps.com/dev_tools/hc12/eabi/m8-16alis.pdf
12;;
13;; Lines starting with '#' represent instructions that fail in GAS.
14;;
15;;
16;; Section 8.2 INPUTS
17	;; Validated within the whole file
18
19;; Section 8.2.1 Character Set
20	;; TBD
21
22;; Section 8.2.2 Assembly Language Statement
23	;; Validated within the whole file
24
25;; Section 8.2.3 Comments
26	; Motorola comment
27	;; This file is full of comments
28
29;; Section 8.2.5 Location Counter
30	section .text
31
32_start:
33L0:	*			; L0 set to 0 (relative to text)
34	ldaa	1,x
35L1:	equ	*		; L1 set to 2 (relative to text)
36
37;; Section 8.2.6 Sections
38	section .data
39	section .text
40	section empty
41	section .text
42
43;; Section 8.2.7 Expressions
44L2:	equ	23		; Absolute = 0x17
45L3:	equ	L0-23		; Simple relocatable
46
47;; Section 8.2.7.1 Primary Expression
48L4:	equ	45		; Numeric  = 0x2d
49L5:	equ	L0		; Symbolic
50
51;; Section 8.2.7.2 Absolute Expression
52L_txt:	ldaa	#44
53L_txt2:
54L6:	equ	-L4		; unary expr		0xffffffd3
55L7:	equ	L6+1000		; binary expr		0x03bb
56L8:	equ	L6-12		;			0xffffffc7
57L9:	equ	L_txt2-L_txt	; reloc - reloc		2 = sizeof(ldaa #44)
58
59;; Section 8.2.7.3 Simple Relocatable Expressions
60L10:	equ	_start		; symbol		0 + text
61L11:	equ	L10+23		; reloc+abs		0x17 + text
62L12:	equ	L11-4		; reloc-abs		0x13 + text
63L13:	equ	L12+L9		; reloc+abs		0x15 + text
64
65;; Section 8.2.8 Symbols
66	section .text
67Text_Symbol:
68	ldx	#Data_Symbol
69
70	section .data
71Data_Symbol:
72
73;; Section 8.2.8.1 Labels
74L_label_shall_be_significant_to_at_least_32_chars:
75	dc.b	1
76L_label_lower:			; Labels are case sensitive
77	dc.b	2
78L_Label_Lower:
79	dc.b	3
80
81;; Section 8.2.9 Constants
82;
83;	Section 8.2.9.1	Decimal Constants
84	section .text
85L_constant:
86	ldaa	#123		; -> ldaa #0x7b
87	ldaa	#-23		; -> ldaa #0xe9
88
89;;	Section 8.2.9.2	Binary Constants
90	ldab	#%10001010	; -> ldab #0x8A
91	ldab	#%0111		; -> ldab #0x07
92
93;;	Section 8.2.9.3	Octal Constants
94	ldaa	#@74		; -> ldaa 0x3c
95	ldaa	#@377		; -> ldaa 0xff
96
97;;	Section 8.2.9.4	Hexadecimal Constants
98	ldaa	#$ae		; -> ldaa 0xae
99	ldaa	#$B2		; -> ldaa 0xb2
100
101;;	Section 8.2.9.5	String Constants
102	section	.data
103#	ascii	'"Single quote string"'
104	ascii	"'Double quote string'"
105
106;;	Section 8.2.9.6 Floating Point Constants
107;;	No specification
108L_float:	float	3.241592e-2
109
110;;	Section 8.2.10	Operators
111	section .text
112L_operator:
113	ldx	#(((1<<3)&(1<<3)|2)<<4)+(4*4-1)
114	ldx	#(L2>=23)&1-(L2<=23)&1+(L2==23)&1 ; -> ldx #1
115	ldx	#(L2>23)&1-(L2<23)&1+(L2==23)&1   ; -> ldx #0
116	ldx	#1-1+1-1+1-1
117	ldab	#~L4		; -> ldab #0xd2
118#	ldab	#<_start	; force to 8-bit
119#	ldx	#>_start	; force to 16-bit
120#	ldab	#page(_start)	; 68HC12 page number of symbol
121
122;; Section 8.2.11 Instructions
123;;	Defined by other tests
124
125;; Section 8.2.12 Assembler Directives
126;;
127;; Section 8.2.12.1 Conditional Directives
128;;
129# The specification says we are allowed to have spaces in expressions.
130# This does not work with GAS in mri mode, the instruction 'if L2 < 24'
131# is in fact treated as 'if L2'.
132L_if:
133	if L2<24		; true
134	ldx	#1		; -> ldx #1
135	else
136	ldx	#2
137	endif
138	if L2<23||L2>23||L2==22+1 ; true
139	if L2<23		; false
140	ldaa	#0
141	endif
142	if L2>23		; false
143	ldaa	#1
144	endif
145	if L2 == 23		; true
146	ldaa	#L2+8		; -> ldaa #31
147	endif
148	if L2+2<23+2		; false
149	if L2+4>23+4
150	ldaa	#1
151	elseif L2==23
152	ldaa	#2
153	else
154	ldaa	#3
155	endif
156	elseif L2==23		; true
157	ldaa	#4		; -> ldaa #4
158	else
159	ldaa	#5
160	endif
161	endif
162	ifdef L1		; true
163	ldx	#23		; -> ldx #0x17
164	endif
165	ifndef L_undef		; true
166	ldx	#4		; -> ldx #4
167	endif
168
169;;	Section 8.2.12.2 Define Constant -dc
170	section	.data
171L_const_data:
172	dc.b	(1<<3)|2	; 0x0a
173	dc.w	(1<<9)+2	; 0x02 0x02
174	dc.l	$12345678
175	dc.b	10
176	dc.l	(1<<9)*(3<<12)
177#	dc.b	"Hello"
178#	dc.w	"World"
179#	dc.l	"!!!"
180
181;;	Section 8.2.12.3 Define Constant Block -dcb
182	dcb.b	3,2
183	dcb.w	2,$55AA
184	dcb.l	2,$12345678
185	dcb.b	10,2
186	dcb.w	5,$55AA
187	dcb.l	2,$12345678
188#	dcb.b	4, 12		; Fails in GAS due to space
189
190;;	Section 8.2.12.4 Define Storage - ds
191	ds.b	4
192	ds.w	2
193	ds.l	1
194	ds	2
195
196;;	Section 8.2.12.5 Equate Symbol Value - equ
197L_equ1:	equ	(1<<8)+3
198L_equ2:	equ	L_equ1*3
199L_equ3:	equ	L_equ2-L_equ1
200
201;;	Section 8.2.12.6 Include File - include
202#	include 'malis-include.s'
203#	include "malis-include.s"
204	include malis-include.s
205	include malis-include.s
206
207;;	Section 8.2.12.7 Origin - org
208	section .text
209#	org	$100
210	ldaa	#23
211#	org	$200
212	staa	24
213#	org	$0
214	rts
215
216;;	Section 8.2.12.8 Define Section - section
217	section .text
218	ldaa	23
219
220	section .data
221	dc.b	23
222
223;;	Section 8.2.12.9 Set Value of Symbol - set
224s1:	set	3
225s1:	set	4
226s2:	set	s1+2
227s3:	set	s2+4
228
229;; Section 8.2.12.10 External Symbol Definition - xdef
230	xdef	s1
231	xdef	s2
232	xdef	entry
233
234;; Section 8.2.12.11 External Symbol Reference - xref
235	section	.text
236	xref	printf
237	xrefb	write
238entry:
239	rts
240
241