diff options
Diffstat (limited to 'misc/nasm.sl')
-rw-r--r-- | misc/nasm.sl | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/misc/nasm.sl b/misc/nasm.sl new file mode 100644 index 0000000..2ddb5c1 --- /dev/null +++ b/misc/nasm.sl @@ -0,0 +1,320 @@ +% 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"); +} |