mirror of
				https://github.com/netwide-assembler/nasm.git
				synced 2025-10-10 00:25:06 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			321 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			321 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| % This file defines a NASM editor mode for the JED editor.
 | |
| % JED's home page is http://space.mit.edu/~davis/jed.html.
 | |
| %
 | |
| % To install, copy this file into your JED_LIBRARY directory
 | |
| % (/usr/local/jed/lib or C:\JED\LIB or whatever), then add the
 | |
| % following lines to your .jedrc or jed.rc file:
 | |
| %   autoload("nasm_mode", "nasm");
 | |
| %   add_mode_for_extension("nasm", "asm");
 | |
| % (you can of course replace "asm" with whatever file extension
 | |
| % you like to use for your NASM source files).
 | |
| 
 | |
| variable Nasm_Instruction_Indent = 10;
 | |
| variable Nasm_Comment_Column = 33;
 | |
| variable Nasm_Comment_Space = 1;
 | |
| 
 | |
| variable nasm_kw_2 = strcat("ahalaxbhblbpbtbxchclcscxdbdddhdidldqdsdtdwdxes",
 | |
| 			    "fsgsinjajbjcjejgjljojpjsjzorsispssto");
 | |
| variable nasm_kw_3 = strncat("a16a32aaaaadaamaasadcaddandbsfbsrbtcbtrbtscbw",
 | |
| 			     "cdqclccldclicmccmpcr0cr2cr3cr4cwddaadasdecdiv",
 | |
| 			     "dr0dr1dr2dr3dr6dr7eaxebpebxecxediedxequesiesp",
 | |
| 			     "farfldfsthltincintjaejbejgejlejmpjnajnbjncjne",
 | |
| 			     "jngjnljnojnpjnsjnzjpejpolarldslealeslfslgslsl",
 | |
| 			     "lssltrmm0mm1mm2mm3mm4mm5mm6mm7movmulnegnopnot",
 | |
| 			     "o16o32outpopporrclrcrrepretrolrorrsmsalsarsbb",
 | |
| 			     "segshlshrsmist0st1st2st3st4st5st6st7stcstdsti",
 | |
| 			     "strsubtr3tr4tr5tr6tr7wrtxor", 9);
 | |
| variable nasm_kw_4 = strncat("arplbytecallcltscwdeemmsfabsfaddfbldfchsfcom",
 | |
| 			     "fcosfdivfenifildfistfld1fldzfmulfnopfsinfstp",
 | |
| 			     "fsubftstfxamfxchibtsidivimulinsbinsdinswint1",
 | |
| 			     "int3intoinvdiretjcxzjnaejnbejngejnlelahflgdt",
 | |
| 			     "lidtlldtlmswlocklongloopmovdmovqnearpandpopa",
 | |
| 			     "popfpushpxorreperepzresbresdresqrestreswretf",
 | |
| 			     "retnsahfsalcsetasetbsetcsetesetgsetlsetosetp",
 | |
| 			     "setssetzsgdtshldshrdsidtsldtsmswtestumovverr",
 | |
| 			     "verwwaitwordxaddxbtsxchg", 9);
 | |
| variable nasm_kw_5 = strncat("boundbswapcmovacmovbcmovccmovecmovgcmovlcmovo",
 | |
| 			     "cmovpcmovscmovzcmpsbcmpsdcmpswcpuiddwordenter",
 | |
| 			     "f2xm1faddpfbstpfclexfcomifcompfdisifdivpfdivr",
 | |
| 			     "ffreefiaddficomfidivfimulfinitfistpfisubfldcw",
 | |
| 			     "fldpifmulpfpremfptanfsavefsqrtfstcwfstswfsubp",
 | |
| 			     "fsubrfucomfyl2xicebpint01iretdiretwjecxzleave",
 | |
| 			     "lodsblodsdlodswloopeloopzmovsbmovsdmovswmovsx",
 | |
| 			     "movzxoutsboutsdoutswpaddbpadddpaddwpandnpopad",
 | |
| 			     "popawpopfdpopfwpslldpsllqpsllwpsradpsrawpsrld",
 | |
| 			     "psrlqpsrlwpsubbpsubdpsubwpushapushfqwordrdmsr",
 | |
| 			     "rdpmcrdtscrepnerepnzscasbscasdscaswsetaesetbe",
 | |
| 			     "setgesetlesetnasetnbsetncsetnesetngsetnlsetno",
 | |
| 			     "setnpsetnssetnzsetpesetposhortstosbstosdstosw",
 | |
| 			     "timestwordwrmsrxlatb", 14);
 | |
| variable nasm_kw_6 = strncat("cmovaecmovbecmovgecmovlecmovnacmovnbcmovnc",
 | |
| 			     "cmovnecmovngcmovnlcmovnocmovnpcmovnscmovnz",
 | |
| 			     "cmovpecmovpofcmovbfcmovefcmovufcomipfcompp",
 | |
| 			     "fdivrpficompfidivrfisubrfldenvfldl2efldl2t",
 | |
| 			     "fldlg2fldln2fpatanfprem1frstorfscalefsetpm",
 | |
| 			     "fstenvfsubrpfucomifucompincbininvlpgloopne",
 | |
| 			     "loopnzpaddsbpaddswpmulhwpmullwpsubsbpsubsw",
 | |
| 			     "pushadpushawpushfdpushfwsetnaesetnbesetnge",
 | |
| 			     "setnlewbinvd", 9);
 | |
| variable nasm_kw_7 = strncat("cmovnaecmovnbecmovngecmovnlecmpxchgfcmovbe",
 | |
| 			     "fcmovnbfcmovnefcmovnufdecstpfincstpfrndint",
 | |
| 			     "fsincosfucomipfucomppfxtractfyl2xp1loadall",
 | |
| 			     "paddusbpadduswpcmpeqbpcmpeqdpcmpeqwpcmpgtb",
 | |
| 			     "pcmpgtdpcmpgtwpmaddwdpsubusbpsubusw", 5);
 | |
| variable nasm_kw_8 = "fcmovnbepackssdwpacksswbpackuswb";
 | |
| variable nasm_kw_9 = strcat("cmpxchg8bpunpckhbwpunpckhdqpunpckhwdpunpcklbw",
 | |
| 			    "punpckldqpunpcklwd");
 | |
| variable nasm_kw_10 = "cmpxchg486loadall286";
 | |
| 
 | |
| define nasm_indent_line() {
 | |
|     variable word, len, e, c;
 | |
| 
 | |
|     e = eolp();
 | |
| 
 | |
|     push_spot();
 | |
|     EXIT_BLOCK {
 | |
| 	pop_spot();
 | |
| 	if (what_column() <= Nasm_Instruction_Indent)
 | |
| 	    skip_white();
 | |
|     }
 | |
| 
 | |
|     bol_skip_white();
 | |
|     c = what_column();
 | |
| 
 | |
|     if (orelse
 | |
|        {looking_at_char(';')}
 | |
|        {looking_at_char('#')}
 | |
|        {looking_at_char('[')}) {
 | |
| 	bol_trim();
 | |
| 	pop_spot();
 | |
| 	EXIT_BLOCK {
 | |
| 	}
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     if (looking_at_char('%')) {
 | |
| 	go_right_1();
 | |
| 	!if (orelse
 | |
| 	    {looking_at_char('$')}
 | |
| 	    {looking_at_char('%')}
 | |
| 	    {looking_at_char('+')}
 | |
| 	    {looking_at_char('-')}
 | |
| 	    {looking_at_char('0')}
 | |
| 	    {looking_at_char('1')}
 | |
| 	    {looking_at_char('2')}
 | |
| 	    {looking_at_char('3')}
 | |
| 	    {looking_at_char('4')}
 | |
| 	    {looking_at_char('5')}
 | |
| 	    {looking_at_char('6')}
 | |
| 	    {looking_at_char('7')}
 | |
| 	    {looking_at_char('8')}
 | |
| 	    {looking_at_char('9')}) {
 | |
| 	    bol_trim();
 | |
| 	    pop_spot();
 | |
| 	    EXIT_BLOCK {
 | |
| 	    }
 | |
| 	    return;
 | |
| 	}
 | |
| 	go_left_1();
 | |
|     }
 | |
| 
 | |
|     push_mark();
 | |
|     skip_chars("%$+-");
 | |
|     skip_chars("0-9a-zA-Z_.");
 | |
|     word = bufsubstr();
 | |
| 
 | |
|     if (orelse
 | |
|        {c == 1}
 | |
|        {looking_at_char(':')}) {
 | |
| 	push_spot();
 | |
| 	bol_trim();
 | |
| 	pop_spot();
 | |
| 	len = strlen(word);
 | |
| 	if (looking_at_char(':')) {
 | |
| 	    go_right_1();
 | |
| 	    len++;
 | |
| 	}
 | |
| 	trim();
 | |
| 	if (e or not(eolp())) {
 | |
| 	    if (len >= Nasm_Instruction_Indent) {
 | |
| 		pop();
 | |
| 		whitespace(1);
 | |
| 	    } else
 | |
| 		whitespace(Nasm_Instruction_Indent - len);
 | |
| 	    if (e) {
 | |
| 		pop_spot();
 | |
| 		eol();
 | |
| 		push_spot();
 | |
| 	    }
 | |
| 	}
 | |
|     } else {
 | |
| 	bol_trim();
 | |
| 	whitespace(Nasm_Instruction_Indent);
 | |
|     }
 | |
| }
 | |
| 
 | |
| define nasm_newline_indent() {
 | |
|     push_spot();
 | |
|     bol_skip_white();
 | |
|     if (eolp())
 | |
| 	trim();
 | |
|     pop_spot();
 | |
|     newline();
 | |
|     nasm_indent_line();
 | |
| }
 | |
| 
 | |
| define nasm_bol_self_ins() {
 | |
|     push_spot();
 | |
|     bskip_white();
 | |
|     bolp();
 | |
|     pop_spot();
 | |
| 
 | |
|     call("self_insert_cmd");
 | |
| 
 | |
|     % Grotty: force immediate update of the syntax highlighting.
 | |
|     insert_char('.');
 | |
|     deln(left(1));
 | |
| 
 | |
|     if (())
 | |
| 	nasm_indent_line();
 | |
| }
 | |
| 
 | |
| define nasm_self_ins_ind() {
 | |
|     call("self_insert_cmd");
 | |
| 
 | |
|     % Grotty: force immediate update of the syntax highlighting.
 | |
|     insert_char('.');
 | |
|     deln(left(1));
 | |
| 
 | |
|     nasm_indent_line();
 | |
| }
 | |
| 
 | |
| define nasm_insert_comment() {
 | |
|     variable spc;
 | |
| 
 | |
|     bol_skip_white();
 | |
|     if (looking_at_char(';')) {
 | |
| 	bol_trim();
 | |
| 	go_right(1);
 | |
| 	skip_white();
 | |
| 	return;
 | |
|     } else if (eolp()) {
 | |
| 	bol_trim();
 | |
| 	insert("; ");
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     forever {
 | |
| 	skip_chars("^;\n'\"");
 | |
| 	if (looking_at_char('\'')) {
 | |
| 	    go_right_1();
 | |
| 	    skip_chars("^'\n");
 | |
| 	    !if (eolp())
 | |
| 		go_right_1();
 | |
| 	} else if (looking_at_char('\"')) {
 | |
| 	    go_right_1();
 | |
| 	    skip_chars("^\"\n");
 | |
| 	    !if (eolp())
 | |
| 		go_right_1();
 | |
| 	} else if (looking_at_char(';')) {
 | |
| 	    !if (bolp()) {
 | |
| 		go_left_1();
 | |
| 		trim();
 | |
| 		!if (looking_at_char(';'))
 | |
| 		    go_right_1();
 | |
| 	    }
 | |
| 	    break;
 | |
| 	} else {
 | |
| 	    break;
 | |
| 	}
 | |
|     }
 | |
|     spc = Nasm_Comment_Column - what_column();
 | |
|     if (spc < Nasm_Comment_Space)
 | |
| 	spc = Nasm_Comment_Space;
 | |
|     whitespace(spc);
 | |
|     if (eolp()) {
 | |
| 	insert("; ");
 | |
|     } else {
 | |
| 	go_right_1();
 | |
| 	skip_white();
 | |
|     }
 | |
| }
 | |
| 
 | |
| $1 = "NASM";
 | |
| create_syntax_table($1);
 | |
| 
 | |
| define_syntax (";", "", '%', $1);
 | |
| define_syntax ("([", ")]", '(', $1);
 | |
| define_syntax ('"', '"', $1);
 | |
| define_syntax ('\'', '\'', $1);
 | |
| define_syntax ("0-9a-zA-Z_.@#", 'w', $1);
 | |
| define_syntax ("-+0-9a-fA-F.xXL", '0', $1);
 | |
| define_syntax (",:", ',', $1);
 | |
| define_syntax ('%', '#', $1);
 | |
| define_syntax ("|^&<>+-*/%~", '+', $1);
 | |
| 
 | |
| set_syntax_flags($1,1);
 | |
| 
 | |
| #ifdef HAS_DFA_SYNTAX
 | |
| 
 | |
| dfa_enable_highlight_cache("nasm.dfa", $1);
 | |
| dfa_define_highlight_rule(";.*$", "comment", $1);
 | |
| dfa_define_highlight_rule("[A-Za-z_\\.\\?][A-Za-z0-9_\\.\\?\\$#@~]*",
 | |
| 		      "Knormal", $1);
 | |
| dfa_define_highlight_rule("$([A-Za-z_\\.\\?][A-Za-z0-9_\\.\\?\\$#@~]*)?",
 | |
| 		      "normal", $1);
 | |
| dfa_define_highlight_rule("[0-9]+(\\.[0-9]*)?([Ee][\\+\\-]?[0-9]*)?",
 | |
| 		      "number", $1);
 | |
| dfa_define_highlight_rule("[0-9]+[QqBb]", "number", $1);
 | |
| dfa_define_highlight_rule("(0x|\\$[0-9A-Fa-f])[0-9A-Fa-f]*", "number", $1);
 | |
| dfa_define_highlight_rule("[0-9A-Fa-f]+[Hh]", "number", $1);
 | |
| dfa_define_highlight_rule("\"[^\"]*\"", "string", $1);
 | |
| dfa_define_highlight_rule("\"[^\"]*$", "string", $1);
 | |
| dfa_define_highlight_rule("'[^']*'", "string", $1);
 | |
| dfa_define_highlight_rule("'[^']*$", "string", $1);
 | |
| dfa_define_highlight_rule("[\\(\\)\\[\\],:]*", "delimiter", $1);
 | |
| dfa_define_highlight_rule("^[ \t]*#", "PQpreprocess", $1);
 | |
| dfa_define_highlight_rule("^[ \t]*\\%{?[^%\\$\\+\\-0-9]", "PQpreprocess", $1);
 | |
| dfa_define_highlight_rule("^%$", "preprocess", $1);
 | |
| dfa_define_highlight_rule("[\\|\\^&<>\\+\\-\\*/%~]*", "operator", $1);
 | |
| dfa_define_highlight_rule("%([%\\$]?-?[0-9A-Za-z_\\.\\?\\$~@]+|{[^}]*}?)",
 | |
| 		      "preprocess", $1);
 | |
| dfa_define_highlight_rule("[ \t]*", "normal", $1);
 | |
| dfa_define_highlight_rule(".", "normal", $1);
 | |
| dfa_build_highlight_table($1);
 | |
| #endif
 | |
| 
 | |
| define_keywords_n($1, nasm_kw_2, 2, 0);
 | |
| define_keywords_n($1, nasm_kw_3, 3, 0);
 | |
| define_keywords_n($1, nasm_kw_4, 4, 0);
 | |
| define_keywords_n($1, nasm_kw_5, 5, 0);
 | |
| define_keywords_n($1, nasm_kw_6, 6, 0);
 | |
| define_keywords_n($1, nasm_kw_7, 7, 0);
 | |
| define_keywords_n($1, nasm_kw_8, 8, 0);
 | |
| define_keywords_n($1, nasm_kw_9, 9, 0);
 | |
| define_keywords_n($1, nasm_kw_10, 10, 0);
 | |
| 
 | |
| define_keywords_n($1, "org", 3, 1);
 | |
| define_keywords_n($1, "bitsiend", 4, 1);
 | |
| define_keywords_n($1, "aligngroupstruc", 5, 1);
 | |
| define_keywords_n($1, "alignbcommonexternglobalistruc", 6, 1);
 | |
| define_keywords_n($1, "sectionsegmentlibrary", 7, 1);
 | |
| define_keywords_n($1, "absoluteendstruc", 8, 1);
 | |
| define_keywords_n($1, "uppercase", 9, 1);
 | |
| 
 | |
| !if (keymap_p ($1)) make_keymap ($1);
 | |
| definekey("nasm_bol_self_ins", ";", $1);
 | |
| definekey("nasm_bol_self_ins", "#", $1);
 | |
| definekey("nasm_bol_self_ins", "%", $1);
 | |
| definekey("nasm_bol_self_ins", "[", $1);
 | |
| definekey("nasm_self_ins_ind", ":", $1);
 | |
| definekey("nasm_insert_comment", "^[;", $1);
 | |
| 
 | |
| define nasm_mode() {
 | |
|     set_mode("NASM", 4);
 | |
|     use_keymap ("NASM");
 | |
|     use_syntax_table ("NASM");
 | |
|     set_buffer_hook ("indent_hook", "nasm_indent_line");
 | |
|     set_buffer_hook ("newline_indent_hook", "nasm_newline_indent");
 | |
|     runhooks("nasm_mode_hook");
 | |
| }
 |