1" Vim syntax file
2" Language:	Motorola 68000 Assembler
3" Maintainer:	Steve Wall
4" Last change:	2001 May 01
5"
6" This is incomplete.  In particular, support for 68020 and
7" up and 68851/68881 co-processors is partial or non-existant.
8" Feel free to contribute...
9"
10
11" For version 5.x: Clear all syntax items
12" For version 6.x: Quit when a syntax file was already loaded
13if version < 600
14  syntax clear
15elseif exists("b:current_syntax")
16  finish
17endif
18
19syn case ignore
20
21" Partial list of register symbols
22syn keyword asm68kReg	a0 a1 a2 a3 a4 a5 a6 a7 d0 d1 d2 d3 d4 d5 d6 d7
23syn keyword asm68kReg	pc sr ccr sp usp ssp
24
25" MC68010
26syn keyword asm68kReg	vbr sfc sfcr dfc dfcr
27
28" MC68020
29syn keyword asm68kReg	msp isp zpc cacr caar
30syn keyword asm68kReg	za0 za1 za2 za3 za4 za5 za6 za7
31syn keyword asm68kReg	zd0 zd1 zd2 zd3 zd4 zd5 zd6 zd7
32
33" MC68030
34syn keyword asm68kReg	crp srp tc ac0 ac1 acusr tt0 tt1 mmusr
35
36" MC68040
37syn keyword asm68kReg	dtt0 dtt1 itt0 itt1 urp
38
39" MC68851 registers
40syn keyword asm68kReg	cal val scc crp srp drp tc ac psr pcsr
41syn keyword asm68kReg	bac0 bac1 bac2 bac3 bac4 bac5 bac6 bac7
42syn keyword asm68kReg	bad0 bad1 bad2 bad3 bad4 bad5 bad6 bad7
43
44" MC68881/82 registers
45syn keyword asm68kReg	fp0 fp1 fp2 fp3 fp4 fp5 fp6 fp7
46syn keyword asm68kReg	control status iaddr fpcr fpsr fpiar
47
48" M68000 opcodes - order is important!
49syn match asm68kOpcode "\<abcd\(\.b\)\=\s"
50syn match asm68kOpcode "\<adda\(\.[wl]\)\=\s"
51syn match asm68kOpcode "\<addi\(\.[bwl]\)\=\s"
52syn match asm68kOpcode "\<addq\(\.[bwl]\)\=\s"
53syn match asm68kOpcode "\<addx\(\.[bwl]\)\=\s"
54syn match asm68kOpcode "\<add\(\.[bwl]\)\=\s"
55syn match asm68kOpcode "\<andi\(\.[bwl]\)\=\s"
56syn match asm68kOpcode "\<and\(\.[bwl]\)\=\s"
57syn match asm68kOpcode "\<as[lr]\(\.[bwl]\)\=\s"
58syn match asm68kOpcode "\<b[vc][cs]\(\.[bwls]\)\=\s"
59syn match asm68kOpcode "\<beq\(\.[bwls]\)\=\s"
60syn match asm68kOpcode "\<bg[et]\(\.[bwls]\)\=\s"
61syn match asm68kOpcode "\<b[hm]i\(\.[bwls]\)\=\s"
62syn match asm68kOpcode "\<bl[est]\(\.[bwls]\)\=\s"
63syn match asm68kOpcode "\<bne\(\.[bwls]\)\=\s"
64syn match asm68kOpcode "\<bpl\(\.[bwls]\)\=\s"
65syn match asm68kOpcode "\<bchg\(\.[bl]\)\=\s"
66syn match asm68kOpcode "\<bclr\(\.[bl]\)\=\s"
67syn match asm68kOpcode "\<bfchg\s"
68syn match asm68kOpcode "\<bfclr\s"
69syn match asm68kOpcode "\<bfexts\s"
70syn match asm68kOpcode "\<bfextu\s"
71syn match asm68kOpcode "\<bfffo\s"
72syn match asm68kOpcode "\<bfins\s"
73syn match asm68kOpcode "\<bfset\s"
74syn match asm68kOpcode "\<bftst\s"
75syn match asm68kOpcode "\<bkpt\s"
76syn match asm68kOpcode "\<bra\(\.[bwls]\)\=\s"
77syn match asm68kOpcode "\<bset\(\.[bl]\)\=\s"
78syn match asm68kOpcode "\<bsr\(\.[bwl]\)\=\s"
79syn match asm68kOpcode "\<btst\(\.[bl]\)\=\s"
80syn match asm68kOpcode "\<callm\s"
81syn match asm68kOpcode "\<cas2\(\.[wl]\)\=\s"
82syn match asm68kOpcode "\<cas\(\.[bwl]\)\=\s"
83syn match asm68kOpcode "\<chk2\(\.[bwl]\)\=\s"
84syn match asm68kOpcode "\<chk\(\.[wl]\)\=\s"
85syn match asm68kOpcode "\<clr\(\.[bwl]\)\=\s"
86syn match asm68kOpcode "\<cmpa\(\.[wl]\)\=\s"
87syn match asm68kOpcode "\<cmpi\(\.[bwl]\)\=\s"
88syn match asm68kOpcode "\<cmpm\(\.[bwl]\)\=\s"
89syn match asm68kOpcode "\<cmp2\(\.[bwl]\)\=\s"
90syn match asm68kOpcode "\<cmp\(\.[bwl]\)\=\s"
91syn match asm68kOpcode "\<db[cv][cs]\(\.w\)\=\s"
92syn match asm68kOpcode "\<dbeq\(\.w\)\=\s"
93syn match asm68kOpcode "\<db[ft]\(\.w\)\=\s"
94syn match asm68kOpcode "\<dbg[et]\(\.w\)\=\s"
95syn match asm68kOpcode "\<db[hm]i\(\.w\)\=\s"
96syn match asm68kOpcode "\<dbl[est]\(\.w\)\=\s"
97syn match asm68kOpcode "\<dbne\(\.w\)\=\s"
98syn match asm68kOpcode "\<dbpl\(\.w\)\=\s"
99syn match asm68kOpcode "\<dbra\(\.w\)\=\s"
100syn match asm68kOpcode "\<div[su]\(\.[wl]\)\=\s"
101syn match asm68kOpcode "\<div[su]l\(\.l\)\=\s"
102syn match asm68kOpcode "\<eori\(\.[bwl]\)\=\s"
103syn match asm68kOpcode "\<eor\(\.[bwl]\)\=\s"
104syn match asm68kOpcode "\<exg\(\.l\)\=\s"
105syn match asm68kOpcode "\<extb\(\.l\)\=\s"
106syn match asm68kOpcode "\<ext\(\.[wl]\)\=\s"
107syn match asm68kOpcode "\<illegal\>"
108syn match asm68kOpcode "\<jmp\(\.[ls]\)\=\s"
109syn match asm68kOpcode "\<jsr\(\.[ls]\)\=\s"
110syn match asm68kOpcode "\<lea\(\.l\)\=\s"
111syn match asm68kOpcode "\<link\(\.[wl]\)\=\s"
112syn match asm68kOpcode "\<ls[lr]\(\.[bwl]\)\=\s"
113syn match asm68kOpcode "\<movea\(\.[wl]\)\=\s"
114syn match asm68kOpcode "\<movec\(\.l\)\=\s"
115syn match asm68kOpcode "\<movem\(\.[wl]\)\=\s"
116syn match asm68kOpcode "\<movep\(\.[wl]\)\=\s"
117syn match asm68kOpcode "\<moveq\(\.l\)\=\s"
118syn match asm68kOpcode "\<moves\(\.[bwl]\)\=\s"
119syn match asm68kOpcode "\<move\(\.[bwl]\)\=\s"
120syn match asm68kOpcode "\<mul[su]\(\.[wl]\)\=\s"
121syn match asm68kOpcode "\<nbcd\(\.b\)\=\s"
122syn match asm68kOpcode "\<negx\(\.[bwl]\)\=\s"
123syn match asm68kOpcode "\<neg\(\.[bwl]\)\=\s"
124syn match asm68kOpcode "\<nop\>"
125syn match asm68kOpcode "\<not\(\.[bwl]\)\=\s"
126syn match asm68kOpcode "\<ori\(\.[bwl]\)\=\s"
127syn match asm68kOpcode "\<or\(\.[bwl]\)\=\s"
128syn match asm68kOpcode "\<pack\s"
129syn match asm68kOpcode "\<pea\(\.l\)\=\s"
130syn match asm68kOpcode "\<reset\>"
131syn match asm68kOpcode "\<ro[lr]\(\.[bwl]\)\=\s"
132syn match asm68kOpcode "\<rox[lr]\(\.[bwl]\)\=\s"
133syn match asm68kOpcode "\<rt[dm]\s"
134syn match asm68kOpcode "\<rt[ers]\>"
135syn match asm68kOpcode "\<sbcd\(\.b\)\=\s"
136syn match asm68kOpcode "\<s[cv][cs]\(\.b\)\=\s"
137syn match asm68kOpcode "\<seq\(\.b\)\=\s"
138syn match asm68kOpcode "\<s[ft]\(\.b\)\=\s"
139syn match asm68kOpcode "\<sg[et]\(\.b\)\=\s"
140syn match asm68kOpcode "\<s[hm]i\(\.b\)\=\s"
141syn match asm68kOpcode "\<sl[est]\(\.b\)\=\s"
142syn match asm68kOpcode "\<sne\(\.b\)\=\s"
143syn match asm68kOpcode "\<spl\(\.b\)\=\s"
144syn match asm68kOpcode "\<suba\(\.[wl]\)\=\s"
145syn match asm68kOpcode "\<subi\(\.[bwl]\)\=\s"
146syn match asm68kOpcode "\<subq\(\.[bwl]\)\=\s"
147syn match asm68kOpcode "\<subx\(\.[bwl]\)\=\s"
148syn match asm68kOpcode "\<sub\(\.[bwl]\)\=\s"
149syn match asm68kOpcode "\<swap\(\.w\)\=\s"
150syn match asm68kOpcode "\<tas\(\.b\)\=\s"
151syn match asm68kOpcode "\<tdiv[su]\(\.l\)\=\s"
152syn match asm68kOpcode "\<t\(rap\)\=[cv][cs]\(\.[wl]\)\=\s"
153syn match asm68kOpcode "\<t\(rap\)\=eq\(\.[wl]\)\=\s"
154syn match asm68kOpcode "\<t\(rap\)\=[ft]\(\.[wl]\)\=\s"
155syn match asm68kOpcode "\<t\(rap\)\=g[et]\(\.[wl]\)\=\s"
156syn match asm68kOpcode "\<t\(rap\)\=[hm]i\(\.[wl]\)\=\s"
157syn match asm68kOpcode "\<t\(rap\)\=l[est]\(\.[wl]\)\=\s"
158syn match asm68kOpcode "\<t\(rap\)\=ne\(\.[wl]\)\=\s"
159syn match asm68kOpcode "\<t\(rap\)\=pl\(\.[wl]\)\=\s"
160syn match asm68kOpcode "\<t\(rap\)\=v\>"
161syn match asm68kOpcode "\<t\(rap\)\=[cv][cs]\>"
162syn match asm68kOpcode "\<t\(rap\)\=eq\>"
163syn match asm68kOpcode "\<t\(rap\)\=[ft]\>"
164syn match asm68kOpcode "\<t\(rap\)\=g[et]\>"
165syn match asm68kOpcode "\<t\(rap\)\=[hm]i\>"
166syn match asm68kOpcode "\<t\(rap\)\=l[est]\>"
167syn match asm68kOpcode "\<t\(rap\)\=ne\>"
168syn match asm68kOpcode "\<t\(rap\)\=pl\>"
169syn match asm68kOpcode "\<trap\s"
170syn match asm68kOpcode "\<tst\(\.[bwl]\)\=\s"
171syn match asm68kOpcode "\<unlk\s"
172syn match asm68kOpcode "\<unpk\s"
173
174" Valid labels
175syn match asm68kLabel		"^[a-z_?.][a-z0-9_?.$]*$"
176syn match asm68kLabel		"^[a-z_?.][a-z0-9_?.$]*\s"he=e-1
177syn match asm68kLabel		"^\s*[a-z_?.][a-z0-9_?.$]*:"he=e-1
178
179" Various number formats
180syn match hexNumber		"\$[0-9a-fA-F]\+\>"
181syn match hexNumber		"\<[0-9][0-9a-fA-F]*H\>"
182syn match octNumber		"@[0-7]\+\>"
183syn match octNumber		"\<[0-7]\+[QO]\>"
184syn match binNumber		"%[01]\+\>"
185syn match binNumber		"\<[01]\+B\>"
186syn match decNumber		"\<[0-9]\+D\=\>"
187syn match floatE		"_*E_*" contained
188syn match floatExponent		"_*E_*[-+]\=[0-9]\+" contained contains=floatE
189syn match floatNumber		"[-+]\=[0-9]\+_*E_*[-+]\=[0-9]\+" contains=floatExponent
190syn match floatNumber		"[-+]\=[0-9]\+\.[0-9]\+\(E[-+]\=[0-9]\+\)\=" contains=floatExponent
191syn match floatNumber		":\([0-9a-f]\+_*\)\+"
192
193" Character string constants
194syn match asm68kStringError	"'[ -~]*'"
195syn match asm68kStringError	"'[ -~]*$"
196syn region asm68kString		start="'" skip="''" end="'" oneline contains=asm68kCharError
197syn match asm68kCharError	"[^ -~]" contained
198
199" Immediate data
200syn match asm68kImmediate	"#\$[0-9a-fA-F]\+" contains=hexNumber
201syn match asm68kImmediate	"#[0-9][0-9a-fA-F]*H" contains=hexNumber
202syn match asm68kImmediate	"#@[0-7]\+" contains=octNumber
203syn match asm68kImmediate	"#[0-7]\+[QO]" contains=octNumber
204syn match asm68kImmediate	"#%[01]\+" contains=binNumber
205syn match asm68kImmediate	"#[01]\+B" contains=binNumber
206syn match asm68kImmediate	"#[0-9]\+D\=" contains=decNumber
207syn match asm68kSymbol		"[a-z_?.][a-z0-9_?.$]*" contained
208syn match asm68kImmediate	"#[a-z_?.][a-z0-9_?.]*" contains=asm68kSymbol
209
210" Special items for comments
211syn keyword asm68kTodo		contained TODO
212
213" Operators
214syn match asm68kOperator	"[-+*/]"	" Must occur before Comments
215syn match asm68kOperator	"\.SIZEOF\."
216syn match asm68kOperator	"\.STARTOF\."
217syn match asm68kOperator	"<<"		" shift left
218syn match asm68kOperator	">>"		" shift right
219syn match asm68kOperator	"&"		" bit-wise logical and
220syn match asm68kOperator	"!"		" bit-wise logical or
221syn match asm68kOperator	"!!"		" exclusive or
222syn match asm68kOperator	"<>"		" inequality
223syn match asm68kOperator	"="		" must be before other ops containing '='
224syn match asm68kOperator	">="
225syn match asm68kOperator	"<="
226syn match asm68kOperator	"=="		" operand existance - used in macro definitions
227
228" Condition code style operators
229syn match asm68kOperator	"<[CV][CS]>"
230syn match asm68kOperator	"<EQ>"
231syn match asm68kOperator	"<G[TE]>"
232syn match asm68kOperator	"<[HM]I>"
233syn match asm68kOperator	"<L[SET]>"
234syn match asm68kOperator	"<NE>"
235syn match asm68kOperator	"<PL>"
236
237" Comments
238syn match asm68kComment		";.*" contains=asm68kTodo
239syn match asm68kComment		"\s!.*"ms=s+1 contains=asm68kTodo
240syn match asm68kComment		"^\s*[*!].*" contains=asm68kTodo
241
242" Include
243syn match asm68kInclude		"\<INCLUDE\s"
244
245" Standard macros
246syn match asm68kCond		"\<IF\(\.[BWL]\)\=\s"
247syn match asm68kCond		"\<THEN\(\.[SL]\)\=\>"
248syn match asm68kCond		"\<ELSE\(\.[SL]\)\=\>"
249syn match asm68kCond		"\<ENDI\>"
250syn match asm68kCond		"\<BREAK\(\.[SL]\)\=\>"
251syn match asm68kRepeat		"\<FOR\(\.[BWL]\)\=\s"
252syn match asm68kRepeat		"\<DOWNTO\s"
253syn match asm68kRepeat		"\<TO\s"
254syn match asm68kRepeat		"\<BY\s"
255syn match asm68kRepeat		"\<DO\(\.[SL]\)\=\>"
256syn match asm68kRepeat		"\<ENDF\>"
257syn match asm68kRepeat		"\<NEXT\(\.[SL]\)\=\>"
258syn match asm68kRepeat		"\<REPEAT\>"
259syn match asm68kRepeat		"\<UNTIL\(\.[BWL]\)\=\s"
260syn match asm68kRepeat		"\<WHILE\(\.[BWL]\)\=\s"
261syn match asm68kRepeat		"\<ENDW\>"
262
263" Macro definition
264syn match asm68kMacro		"\<MACRO\>"
265syn match asm68kMacro		"\<LOCAL\s"
266syn match asm68kMacro		"\<MEXIT\>"
267syn match asm68kMacro		"\<ENDM\>"
268syn match asm68kMacroParam	"\\[0-9]"
269
270" Conditional assembly
271syn match asm68kPreCond		"\<IFC\s"
272syn match asm68kPreCond		"\<IFDEF\s"
273syn match asm68kPreCond		"\<IFEQ\s"
274syn match asm68kPreCond		"\<IFGE\s"
275syn match asm68kPreCond		"\<IFGT\s"
276syn match asm68kPreCond		"\<IFLE\s"
277syn match asm68kPreCond		"\<IFLT\s"
278syn match asm68kPreCond		"\<IFNC\>"
279syn match asm68kPreCond		"\<IFNDEF\s"
280syn match asm68kPreCond		"\<IFNE\s"
281syn match asm68kPreCond		"\<ELSEC\>"
282syn match asm68kPreCond		"\<ENDC\>"
283
284" Loop control
285syn match asm68kPreCond		"\<REPT\s"
286syn match asm68kPreCond		"\<IRP\s"
287syn match asm68kPreCond		"\<IRPC\s"
288syn match asm68kPreCond		"\<ENDR\>"
289
290" Directives
291syn match asm68kDirective	"\<ALIGN\s"
292syn match asm68kDirective	"\<CHIP\s"
293syn match asm68kDirective	"\<COMLINE\s"
294syn match asm68kDirective	"\<COMMON\(\.S\)\=\s"
295syn match asm68kDirective	"\<DC\(\.[BWLSDXP]\)\=\s"
296syn match asm68kDirective	"\<DC\.\\[0-9]\s"me=e-3	" Special use in a macro def
297syn match asm68kDirective	"\<DCB\(\.[BWLSDXP]\)\=\s"
298syn match asm68kDirective	"\<DS\(\.[BWLSDXP]\)\=\s"
299syn match asm68kDirective	"\<END\>"
300syn match asm68kDirective	"\<EQU\s"
301syn match asm68kDirective	"\<FEQU\(\.[SDXP]\)\=\s"
302syn match asm68kDirective	"\<FAIL\>"
303syn match asm68kDirective	"\<FOPT\s"
304syn match asm68kDirective	"\<\(NO\)\=FORMAT\>"
305syn match asm68kDirective	"\<IDNT\>"
306syn match asm68kDirective	"\<\(NO\)\=LIST\>"
307syn match asm68kDirective	"\<LLEN\s"
308syn match asm68kDirective	"\<MASK2\>"
309syn match asm68kDirective	"\<NAME\s"
310syn match asm68kDirective	"\<NOOBJ\>"
311syn match asm68kDirective	"\<OFFSET\s"
312syn match asm68kDirective	"\<OPT\>"
313syn match asm68kDirective	"\<ORG\(\.[SL]\)\=\>"
314syn match asm68kDirective	"\<\(NO\)\=PAGE\>"
315syn match asm68kDirective	"\<PLEN\s"
316syn match asm68kDirective	"\<REG\s"
317syn match asm68kDirective	"\<RESTORE\>"
318syn match asm68kDirective	"\<SAVE\>"
319syn match asm68kDirective	"\<SECT\(\.S\)\=\s"
320syn match asm68kDirective	"\<SECTION\(\.S\)\=\s"
321syn match asm68kDirective	"\<SET\s"
322syn match asm68kDirective	"\<SPC\s"
323syn match asm68kDirective	"\<TTL\s"
324syn match asm68kDirective	"\<XCOM\s"
325syn match asm68kDirective	"\<XDEF\s"
326syn match asm68kDirective	"\<XREF\(\.S\)\=\s"
327
328syn case match
329
330" Define the default highlighting.
331" For version 5.7 and earlier: only when not done already
332" For version 5.8 and later: only when an item doesn't have highlighting yet
333if version >= 508 || !exists("did_asm68k_syntax_inits")
334  if version < 508
335    let did_asm68k_syntax_inits = 1
336    command -nargs=+ HiLink hi link <args>
337  else
338    command -nargs=+ HiLink hi def link <args>
339  endif
340
341  " The default methods for highlighting.  Can be overridden later
342  " Comment Constant Error Identifier PreProc Special Statement Todo Type
343  "
344  " Constant		Boolean Character Number String
345  " Identifier		Function
346  " PreProc		Define Include Macro PreCondit
347  " Special		Debug Delimiter SpecialChar SpecialComment Tag
348  " Statement		Conditional Exception Keyword Label Operator Repeat
349  " Type		StorageClass Structure Typedef
350
351  HiLink asm68kComment		Comment
352  HiLink asm68kTodo		Todo
353
354  HiLink hexNumber		Number		" Constant
355  HiLink octNumber		Number		" Constant
356  HiLink binNumber		Number		" Constant
357  HiLink decNumber		Number		" Constant
358  HiLink floatNumber		Number		" Constant
359  HiLink floatExponent		Number		" Constant
360  HiLink floatE			SpecialChar	" Statement
361  "HiLink floatE		Number		" Constant
362
363  HiLink asm68kImmediate	SpecialChar	" Statement
364  "HiLink asm68kSymbol		Constant
365
366  HiLink asm68kString		String		" Constant
367  HiLink asm68kCharError	Error
368  HiLink asm68kStringError	Error
369
370  HiLink asm68kReg		Identifier
371  HiLink asm68kOperator		Identifier
372
373  HiLink asm68kInclude		Include		" PreProc
374  HiLink asm68kMacro		Macro		" PreProc
375  HiLink asm68kMacroParam	Keyword		" Statement
376
377  HiLink asm68kDirective	Special
378  HiLink asm68kPreCond		Special
379
380
381  HiLink asm68kOpcode		Statement
382  HiLink asm68kCond		Conditional	" Statement
383  HiLink asm68kRepeat		Repeat		" Statement
384
385  HiLink asm68kLabel		Type
386  delcommand HiLink
387endif
388
389let b:current_syntax = "asm68k"
390
391" vim: ts=8 sw=2
392