% 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"); }