# Define SciTE settings for Assembler files (IA32 MASM and NASM)
# Originally by Black Horus blackhorus@gmx.net 2002
# Updated by Kein-Hong Man mkh@pl.jaring.my 2003-10

# Masm files
file.patterns.asm=*.asm
filter.asm=Assembler (asm)|$(file.patterns.asm)|

lexer.$(file.patterns.asm)=asm

# these keywords are taken from the masm book (v6.13)
# updated with Intel Pentium 4, MMX, SSE, SSE2 instructions from NASM
# 	(note that some are undocumented instructions)

cpu_instruction=aaa aad aam aas adc add and call cbw \
	clc cld cli cmc cmp cmps cmpsb cmpsw cwd daa das dec div esc hlt \
	idiv imul in inc int into iret ja jae jb jbe jc jcxz je jg jge jl \
	jle jmp jna jnae jnb jnbe jnc jne jng jnge jnl jnle jno jnp jns \
	jnz jo jp jpe jpo js jz lahf lds lea les lods lodsb lodsw loop \
	loope loopew loopne loopnew loopnz loopnzw loopw loopz loopzw \
	mov movs movsb movsw mul neg nop not or out pop popf push pushf \
	rcl rcr ret retf retn rol ror sahf sal sar sbb scas scasb scasw \
	shl shr stc std sti stos stosb stosw sub test wait xchg xlat \
	xlatb xor \
	bound enter ins insb insw leave outs outsb outsw popa pusha pushw \
	arpl lar lsl sgdt sidt sldt smsw str verr verw clts lgdt lidt lldt lmsw ltr \
	bsf bsr bt btc btr bts cdq cmpsd cwde insd iretd iretdf  iretf \
	jecxz lfs lgs lodsd loopd  looped  loopned  loopnzd  loopzd  lss \
	movsd movsx movzx outsd popad popfd pushad pushd  pushfd scasd seta \
	setae setb setbe setc sete setg setge setl setle setna setnae setnb \
	setnbe setnc setne setng setnge setnl setnle setno setnp setns \
	setnz seto setp setpe setpo sets setz shld shrd stosd \
	bswap cmpxchg invd  invlpg  wbinvd  xadd \
	lock rep repe repne repnz repz

# these are mostly non-MMX/SSE/SSE2 486+ instructions

cpu_instruction2=cflush cpuid emms femms \
	cmovo cmovno cmovb cmovc cmovnae cmovae cmovnb cmovnc \
	cmove cmovz cmovne cmovnz cmovbe cmovna cmova cmovnbe \
	cmovs cmovns cmovp cmovpe cmovnp cmovpo cmovl cmovnge \
	cmovge cmovnl cmovle cmovng cmovg cmovnle \
	cmpxchg486 cmpxchg8b  \
	loadall loadall286 ibts icebp int1 int3 int01 int03 iretw \
	popaw popfw pushaw pushfw rdmsr rdpmc rdshr rdtsc \
	rsdc rsldt rsm rsts salc smi smint smintold svdc svldt svts \
	syscall sysenter sysexit sysret ud0 ud1 ud2 umov xbts wrmsr wrshr

# fpu instructions, updated for 486+

fpu_instruction=f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcom fcomp fcompp fdecstp \
	fdisi fdiv fdivp fdivr fdivrp feni ffree fiadd ficom ficomp fidiv \
	fidivr fild fimul fincstp finit fist fistp fisub fisubr fld fld1 \
	fldcw fldenv fldenvw fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul \
	fmulp fnclex fndisi fneni fninit fnop fnsave fnsavew fnstcw fnstenv \
	fnstenvw fnstsw fpatan fprem fptan frndint frstor frstorw fsave \
	fsavew fscale fsqrt fst fstcw fstenv fstenvw fstp fstsw fsub fsubp \
	fsubr fsubrp ftst fwait fxam fxch fxtract fyl2x fyl2xp1 \
	fsetpm fcos fldenvd fnsaved fnstenvd fprem1 frstord fsaved fsin fsincos \
	fstenvd fucom fucomp fucompp fcomi fcomip ffreep \
	fcmovb fcmove fcmovbe fcmovu fcmovnb fcmovne fcmovnbe fcmovnu

# these are MMX, SSE, SSE2 instructions

ext_instruction=addpd addps addsd addss andpd andps andnpd andnps \
	cmpeqpd cmpltpd cmplepd cmpunordpd cmpnepd cmpnltpd cmpnlepd cmpordpd \
	cmpeqps cmpltps cmpleps cmpunordps cmpneps cmpnltps cmpnleps cmpordps \
	cmpeqsd cmpltsd cmplesd cmpunordsd cmpnesd cmpnltsd cmpnlesd cmpordsd \
	cmpeqss cmpltss cmpless cmpunordss cmpness cmpnltss cmpnless cmpordss \
	comisd comiss cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps \
	cvtpi2pd cvtpi2ps cvtps2dq cvtps2pd cvtps2pi cvtss2sd cvtss2si \
	cvtsd2si cvtsd2ss cvtsi2sd cvtsi2ss \
	cvttpd2dq cvttpd2pi cvttps2dq cvttps2pi cvttsd2si cvttss2si \
	divpd divps divsd divss fxrstor fxsave ldmxscr lfence mfence \
	maskmovdqu maskmovdq maxpd maxps paxsd maxss minpd minps minsd minss \
	movapd movaps movdq2q movdqa movdqu movhlps movhpd movhps movd movq \
	movlhps movlpd movlps movmskpd movmskps movntdq movnti movntpd movntps \
	movntq movq2dq movsd movss movupd movups mulpd mulps mulsd mulss \
	orpd orps packssdw packsswb packuswb paddb paddsb paddw paddsw \
	paddd paddsiw paddq paddusb paddusw pand pandn pause paveb pavgb pavgw \
	pavgusb pdistib pextrw pcmpeqb pcmpeqw pcmpeqd pcmpgtb pcmpgtw pcmpgtd \
	pf2id pf2iw pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul \
	pmachriw pmaddwd pmagw pmaxsw pmaxub pminsw pminub pmovmskb \
	pmulhrwc pmulhriw pmulhrwa pmulhuw pmulhw pmullw pmuludq \
	pmvzb pmvnzb pmvlzb pmvgezb pfnacc pfpnacc por prefetch prefetchw \
	prefetchnta prefetcht0 prefetcht1 prefetcht2 pfrcp pfrcpit1 pfrcpit2 \
	pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pf2iw pinsrw psadbw pshufd \
	pshufhw pshuflw pshufw psllw pslld psllq pslldq psraw psrad \
	psrlw psrld psrlq psrldq psubb psubw psubd psubq psubsb psubsw \
	psubusb psubusw psubsiw pswapd punpckhbw punpckhwd punpckhdq punpckhqdq \
	punpcklbw punpcklwd punpckldq punpcklqdq pxor rcpps rcpss \
	rsqrtps rsqrtss sfence shufpd shufps sqrtpd sqrtps sqrtsd sqrtss \
	stmxcsr subpd subps subsd subss ucomisd ucomiss \
	unpckhpd unpckhps unpcklpd unpcklps xorpd xorps

register=ah al ax bh bl bp bx ch cl cr0 cr2 cr3 cr4 cs \
	cx dh di dl dr0 dr1 dr2 dr3 dr6 dr7 ds dx eax ebp ebx ecx edi edx \
	es esi esp fs gs si sp ss st tr3 tr4 tr5 tr6 tr7 \
	st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 \
	xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7

# masm directives

directive=.186 .286 .286c .286p .287 .386 .386c .386p .387 .486 .486p \
	.8086 .8087 .alpha .break .code .const .continue .cref .data .data?  \
	.dosseg .else .elseif .endif .endw .err .err1 .err2 .errb \
	.errdef .errdif .errdifi .erre .erridn .erridni .errnb .errndef \
	.errnz .exit .fardata .fardata? .if .lall .lfcond .list .listall \
	.listif .listmacro .listmacroall  .model .no87 .nocref .nolist \
	.nolistif .nolistmacro .radix .repeat .sall .seq .sfcond .stack \
	.startup .tfcond .type .until .untilcxz .while .xall .xcref \
	.xlist alias align assume catstr comm comment db dd df dosseg dq \
	dt dup dw echo else elseif elseif1 elseif2 elseifb elseifdef elseifdif \
	elseifdifi elseife elseifidn elseifidni elseifnb elseifndef end \
	endif endm endp ends eq equ even exitm extern externdef extrn for \
	forc ge goto group gt high highword if if1 if2 ifb ifdef ifdif \
	ifdifi ife  ifidn ifidni ifnb ifndef include includelib instr invoke \
	irp irpc label le length lengthof local low lowword lroffset \
	lt macro mask mod .msfloat name ne offset opattr option org %out \
	page popcontext proc proto ptr public purge pushcontext record \
	repeat rept seg segment short size sizeof sizestr struc struct \
	substr subtitle subttl textequ this title type typedef union while width

directive_operand=$ ? @b @f addr basic byte c carry? dword \
	far far16 fortran fword near near16 overflow? parity? pascal qword  \
	real4  real8 real10 sbyte sdword sign? stdcall sword syscall tbyte \
	vararg word zero? flat near32 far32 \
	abs all assumes at casemap common compact \
	cpu dotname emulator epilogue error export expr16 expr32 farstack flat \
	forceframe huge language large listing ljmp loadds m510 medium memory \
	nearstack nodotname noemulator nokeyword noljmp nom510 none nonunique \
	nooldmacros nooldstructs noreadonly noscoped nosignextend nothing \
	notpublic oldmacros oldstructs os_dos para private prologue radix \
	readonly req scoped setif2 smallstack tiny use16 use32 uses \

# nasm directives, mostly complete, does not parse properly
# the following: %!<env>, %%, %+, %+n %-n, %{n}

directive_nasm=db dw dd dq dt resb resw resd resq rest incbin equ times \
	%define %idefine %xdefine %xidefine %undef %assign %iassign \
	%strlen %substr %macro %imacro %endmacro %rotate .nolist \
	%if %elif %else %endif %ifdef %ifndef %elifdef %elifndef \
	%ifmacro %ifnmacro %elifmacro %elifnmacro %ifctk %ifnctk %elifctk %elifnctk \
	%ifidn %ifnidn %elifidn %elifnidn %ifidni %ifnidni %elifidni %elifnidni \
	%ifid %ifnid %elifid %elifnid %ifstr %ifnstr %elifstr %elifnstr \
	%ifnum %ifnnum %elifnum %elifnnum %error %rep %endrep %exitrep \
	%include %push %pop %repl struct endstruc istruc at iend align alignb \
	%arg %stacksize %local %line \
	bits use16 use32 section absolute extern global common cpu org \
	section group import export

directive_operand_nasm=a16 a32 o16 o32 byte word dword nosplit $ $$ seq wrt \
	flat large small .text .data .bss near far \
	%0 %1 %2 %3 %4 %5 %6 %7 %8 %9


keywords.$(file.patterns.asm)=$(cpu_instruction) $(cpu_instruction2)
keywords2.$(file.patterns.asm)=$(fpu_instruction)
keywords3.$(file.patterns.asm)=$(register)
keywords4.$(file.patterns.asm)=$(directive) $(directive_nasm)
keywords5.$(file.patterns.asm)=$(directive_operand) $(directive_operand_nasm)
keywords6.$(file.patterns.asm)=$(ext_instruction)

comment.block.asm=;


# Assembler Styles
style.asm.32=fore:#808080,font:Verdana,size:8
# Default
style.asm.0=
# Comment
style.asm.1=fore:#adadad
#$(colour.code.comment.line),font:Comic Sans MS,size:8
# Number
style.asm.2=fore:#ff0000
# String
style.asm.3=$(colour.string)
# Operator
style.asm.4=$(colour.operator),bold
# Identifier
style.asm.5=
# CPU instruction
style.asm.6=$(colour.keyword),bold
#fore:#0000ff
# FPU instruction
style.asm.7=fore:#0000ff
# Register
style.asm.8=fore:#46aa03,bold
# assembler Directive
style.asm.9=fore:#0000ff
# assembler Directive Operand
style.asm.10=fore:#0000ff
# Comment block (GNU as /*...*/ syntax, unimplemented)
style.asm.11=$(colour.code.comment.box),$(font.code.comment.box)
# Character/String (single quote) (also character prefix in GNU as)
style.asm.12=$(colour.char)
# End of line where string is not closed
style.asm.13=fore:#000000,back:#E0C0E0,eolfilled
# Extended instructions
style.asm.14=fore:#B00040


command.compile.$(file.patterns.asm)=masm $(FileNameExt)

command.name.0.*.asm=Link
command.0.*.asm=link $(FileName)


statement.indent.$(file.patterns.asm)=9 .if
statement.end.$(file.patterns.asm)=9 .endif
