assembly-yasm-helper 1.4.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env node
2
- require('../dist/server.js');
1
+ #!/usr/bin/env node
2
+ require('../dist/server.js');
package/changelog.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 2.0.0
2
+ - add **LSP server** — full language server for Neovim and any LSP-compatible editor
3
+ - install via `npm install -g assembly-yasm-helper`, run as `assembly-yasm-lsp --stdio`
4
+ - supports: completion, hover, go to definition, document symbols, signature help, references, diagnostics, semantic tokens, compiler check on save
5
+ - add npm `bin` entry: `assembly-yasm-lsp` command available after global install
6
+
1
7
  ## 1.4.0
2
8
  - add **Find All References** (Shift+F12) — shows every usage of a label, variable, proc, or macro in the current file
3
9
  - add **Rename Symbol** (F2) — renames all occurrences at once; guards against renaming keywords or registers
@@ -0,0 +1,11 @@
1
+ "use strict";var b=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports);var W=b(B=>{"use strict";Object.defineProperty(B,"__esModule",{value:!0});B.AllowKinds=B.KeywordType=void 0;var ts;(function(r){r[r.macroLabel=0]="macroLabel",r[r.file=1]="file",r[r.instruction=2]="instruction",r[r.register=3]="register",r[r.precompiled=4]="precompiled",r[r.memoryAllocation=5]="memoryAllocation",r[r.savedWord=6]="savedWord",r[r.size=7]="size",r[r.variable=8]="variable",r[r.method=9]="method",r[r.structure=10]="structure",r[r.macro=11]="macro",r[r.label=12]="label",r[r.constant=13]="constant",r[r.operator=14]="operator"})(ts=B.KeywordType||(B.KeywordType={}));var ss;(function(r){r[r.memory=0]="memory",r[r.variables=1]="variables",r[r.constants=2]="constants",r[r.all=3]="all",r[r.size=4]="size",r[r.none=5]="none",r[r.inst=6]="inst",r[r.macro=7]="macro",r[r.label=8]="label",r[r.interrupt=9]="interrupt"})(ss=B.AllowKinds||(B.AllowKinds={}))});var pe=b($=>{"use strict";Object.defineProperty($,"__esModule",{value:!0});$.Label=$.Macro=$.Procedure=$.Info=$.KeywordDef=void 0;var Ne=W(),le=class{constructor(e,s,n=Ne.KeywordType.instruction,i,o=2,a){this.name=e,this.def=s,this.type=n,this.opCount=o,i!==void 0?this.data=i:this.data=this.generateSyntax(e,o,a),a===void 0?this.allowType=Ne.AllowKinds.all:this.allowType=a}generateSyntax(e,s,n){let{AllowKinds:i}=W();return s===0?e:s===1?e+(n===i.label?" target":" operand"):s===2?e+" dst, src":e+" ..."}};$.KeywordDef=le;var te=class{constructor(e,s,n=[],i=[]){this.des=s,this.name=e,this.params=n,this.output=i}paramsString(){let e="";for(let s of this.params)e+="push ["+s+`]
2
+ `;return e+="call "+this.name,e}paramsStringMac(){let e=this.name+" ";for(let s=0;s<this.params.length;s++){let n=this.params[s];e+="["+n+"]",s!==this.params.length-1&&(e+=", ")}return e}outputs(){let e="";for(let s=0;s<this.output.length;s++){let n=this.output[s];e+=n+`
3
+ `}return e}asMarkedText(e=!1){return[{language:"plainText",value:this.des},{language:"assembly",value:e?this.paramsStringMac():this.paramsString()},{language:"assembly",value:this.output.length>0?`Output:
4
+ `+this.outputs():""}]}};$.Info=te;var ue=class{constructor(e,s,n="near"){this.name=e,this.description=s,this.status=n}};$.Procedure=ue;var de=class{constructor(e,s,n){this.name=e,this.short=s,n===void 0?this.des=new te(e,""):this.des=n}};$.Macro=de;var fe=class{constructor(e,s){this.name=e,this.value=s}};$.Label=fe});var X=b(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.KEYWORD_DICTIONARY=_.REGISTERS=_.PREPROCESSOR=_.AVX_REGISTERS=void 0;var rs=W(),K=pe();_.REGISTERS=["ah","bh","ch","dh","al","bl","cl","dl","sil","dil","bpl","spl","r8b","r9b","r10b","r11b","r12b","r13b","r14b","r15b","ax","bx","cx","dx","di","si","bp","sp","r8w","r9w","r10w","r11w","r12w","r13w","r14w","r15w","eax","ebx","ecx","edx","edi","esi","ebp","esp","r8d","r9d","r10d","r11d","r12d","r13d","r14d","r15d","rax","rbx","rcx","rdx","rdi","rsi","rbp","rsp","r8","r9","r10","r11","r12","r13","r14","r15","cs","ds","es","fs","gs","ss","eip","rip","eflags","rflags","cr0","cr2","cr3","cr4","cr8","dr0","dr1","dr2","dr3","dr6","dr7"];_.AVX_REGISTERS=[...Array.from({length:16},(r,e)=>`ymm${e}`),...Array.from({length:32},(r,e)=>`zmm${e}`),...Array.from({length:8},(r,e)=>`k${e}`)];_.PREPROCESSOR=[{name:"%include",detail:"(Preprocessor)",doc:"Include another file"},{name:"%macro",detail:"(Preprocessor)",doc:"Define a multi-line macro"},{name:"%endmacro",detail:"(Preprocessor)",doc:"End macro definition"},{name:"%define",detail:"(Preprocessor)",doc:"Define a single-line macro"},{name:"%assign",detail:"(Preprocessor)",doc:"Define a numeric macro"},{name:"%undef",detail:"(Preprocessor)",doc:"Undefine a macro"},{name:"%ifdef",detail:"(Preprocessor)",doc:"If macro is defined"},{name:"%ifndef",detail:"(Preprocessor)",doc:"If macro is not defined"},{name:"%if",detail:"(Preprocessor)",doc:"Conditional assembly"},{name:"%elif",detail:"(Preprocessor)",doc:"Else if condition"},{name:"%else",detail:"(Preprocessor)",doc:"Else branch"},{name:"%endif",detail:"(Preprocessor)",doc:"End conditional block"},{name:"%rep",detail:"(Preprocessor)",doc:"Repeat block"},{name:"%endrep",detail:"(Preprocessor)",doc:"End repeat block"}];var{KeywordType:Y,AllowKinds:m}=rs;function c(r,e,s=2,n=m.all){return new K.KeywordDef(r,e,Y.instruction,void 0,s,n)}function k(r,e,s=0,n){return new K.KeywordDef(r,e,Y.savedWord,void 0,s,n)}function L(r,e){return new K.KeywordDef(r,e,Y.memoryAllocation,r+" ")}function D(r,e,s=0){return new K.KeywordDef(r,e,Y.precompiled,r,s)}function F(r,e){return new K.KeywordDef(r,e,Y.size,r,0)}function U(r,e){return new K.KeywordDef(r,e,Y.register,r,0)}_.KEYWORD_DICTIONARY=[k("section","Defines a section (e.g., section .data)"),k("segment","Defines a segment"),k("global","Declares a global symbol"),k("extern","Declares an external symbol"),k("common","Declares common uninitialized data"),k("default rel","Use RIP-relative addressing"),k("bits","Specify target processor mode"),k("align","Aligns next instruction/data"),F("tiny","Code and data in one segment"),F("small","One code and one data segment"),F("medium","Multiple code segments"),F("compact","Multiple data segments"),F("large","Multiple code and data segments"),F("huge","Large with >64KB arrays"),F("flat","Flat 32/64 bit memory model"),F("stdcall","Standard calling convention"),L("db","Define byte"),L("dw","Define word"),L("dd","Define doubleword"),L("dq","Define quadword"),L("dt","Define tenbytes"),L("resb","Reserve bytes"),L("resw","Reserve words"),L("resd","Reserve dwords"),L("resq","Reserve qwords"),L("rest","Reserve tenbytes"),L("byte","1 byte memory pointer"),L("word","2 byte memory pointer"),L("dword","4 byte memory pointer"),L("qword","8 byte memory pointer"),L("tbyte","10 byte memory pointer"),k("DATASEG","Start data segment"),k("IDEAL","Switch to IDEAL mode"),k("MASM","Switch to MASM mode"),k("CODESEG","Start code segment"),new K.KeywordDef("MODEL","Defines memory model",Y.savedWord,"MODEL [size]",1,m.size),new K.KeywordDef("STACK","Defines stack size",Y.savedWord,"STACK [constant]",1,m.constants),D("%macro","Start NASM macro"),D("%endmacro","End NASM macro"),D("%define","Define macro"),D("%include","Include file"),D("macro","Define macro",1),D("endm","End macro"),D("equ","Constant equate"),D("dup","Duplicate values",1),D("include","Include file"),c("mov","Move value"),c("movzx","Move with zero extend"),c("movsx","Move with sign extend"),c("xchg","Exchange operands"),c("xadd","Exchange and add"),c("cmpxchg","Compare and exchange"),c("lea","Load effective address",2,m.variables|m.memory),c("nop","No operation",0),c("add","Add"),c("sub","Subtract"),c("inc","Increment",1),c("dec","Decrement",1),c("neg","Negate",1),c("cmp","Compare"),c("mul","Unsigned multiply",1),c("imul","Signed multiply",1),c("div","Unsigned divide",1),c("idiv","Signed divide",1),c("cbw","Convert byte to word",0),c("cwd","Convert word to dword",0),c("cdq","Convert dword to qword",0),c("cqo","Convert qword to octoword",0),c("and","Logical AND"),c("or","Logical OR"),c("xor","Logical XOR"),c("not","Bitwise NOT",1),c("test","Logical compare"),c("shl","Shift left"),c("shr","Shift right"),c("sal","Arithmetic shift left"),c("sar","Arithmetic shift right"),c("rol","Rotate left"),c("ror","Rotate right"),c("rcl","Rotate through carry left"),c("rcr","Rotate through carry right"),c("shld","Double shift left"),c("shrd","Double shift right"),c("int","Software interrupt",1,m.constants),c("into","Interrupt on overflow",0),c("iret","Interrupt return",0),c("syscall","System call",0),c("sysret","Return from syscall",0),c("hlt","Halt processor",0),c("in","Input from port"),c("out","Output to port"),c("push","Push operand",1),c("pop","Pop operand",1),c("pushf","Push FLAGS",0),c("pushfd","Push EFLAGS",0),c("pushfq","Push RFLAGS",0),c("popf","Pop FLAGS",0),c("popfd","Pop EFLAGS",0),c("popfq","Pop RFLAGS",0),c("pusha","Push all registers",0),c("pushad","Push all registers",0),c("popa","Pop all registers",0),c("popad","Pop all registers",0),c("jmp","Jump",1,m.label),c("call","Call procedure",1,m.label),c("ret","Return",0),c("enter","Create stack frame",2),c("leave","Destroy stack frame",0),c("je","Jump if equal",1,m.label),c("jne","Jump if not equal",1,m.label),c("ja","Jump if above",1,m.label),c("jae","Jump if above or equal",1,m.label),c("jb","Jump if below",1,m.label),c("jbe","Jump if below or equal",1,m.label),c("jg","Jump if greater",1,m.label),c("jge","Jump if greater or equal",1,m.label),c("jl","Jump if less",1,m.label),c("jle","Jump if less or equal",1,m.label),c("jc","Jump if carry",1,m.label),c("jnc","Jump if not carry",1,m.label),c("jz","Jump if zero",1,m.label),c("jnz","Jump if not zero",1,m.label),c("js","Jump if sign",1,m.label),c("jns","Jump if not sign",1,m.label),c("jo","Jump if overflow",1,m.label),c("jno","Jump if not overflow",1,m.label),c("jcxz","Jump if CX zero",1,m.label),c("jecxz","Jump if ECX zero",1,m.label),c("jrcxz","Jump if RCX zero",1,m.label),c("rep","Repeat instruction",1),c("repz","Repeat if zero",1),c("repnz","Repeat if not zero",1),c("cld","Clear direction flag",0),c("std","Set direction flag",0),c("scasb","Scan byte",0),c("scasw","Scan word",0),c("scasd","Scan dword",0),c("scasq","Scan qword",0),c("cmpsb","Compare byte strings",0),c("cmpsw","Compare word strings",0),c("cmpsd","Compare dword strings",0),c("cmpsq","Compare qword strings",0),c("stosb","Store byte string",0),c("stosw","Store word string",0),c("stosd","Store dword string",0),c("stosq","Store qword string",0),c("lodsb","Load byte string",0),c("lodsw","Load word string",0),c("lodsd","Load dword string",0),c("lodsq","Load qword string",0),c("movsb","Move byte string",0),c("movsw","Move word string",0),c("movsd","Move dword string",0),c("movsq","Move qword string",0),c("loop","Loop until RCX=0",1,m.label),c("loope","Loop while equal",1,m.label),c("loopne","Loop while not equal",1,m.label),c("stc","Set carry flag",0),c("clc","Clear carry flag",0),c("cmc","Complement carry flag",0),c("sti","Enable interrupts",0),c("cli","Disable interrupts",0),c("lahf","Load flags into AH",0),c("sahf","Store AH into flags",0),c("daa","Decimal adjust after add",0),c("das","Decimal adjust after sub",0),c("aaa","ASCII adjust after add",0),c("aas","ASCII adjust after sub",0),c("aam","ASCII adjust after multiply",0),c("aad","ASCII adjust before divide",0),D("proc","Define procedure"),D("endp","End procedure"),D("struc","Define structure"),D("ends","End structure"),U("st0","FPU register 0"),U("st1","FPU register 1"),U("st2","FPU register 2"),U("st3","FPU register 3"),U("st4","FPU register 4"),U("st5","FPU register 5"),U("st6","FPU register 6"),U("st7","FPU register 7"),c("fwait","Wait for FPU",0)];_.KEYWORD_MAP=new Map(_.KEYWORD_DICTIONARY.map(r=>[r.name.toLowerCase(),r]));_.getKeyword=function(r){if(r)return _.KEYWORD_MAP.get(r.toLowerCase())}});var Be=b((en,je)=>{"use strict";var{KEYWORD_MAP:ns}=X(),he=class{constructor(){this.clear()}clear(){this.vars=[],this.procs=[],this.macros=[],this.labels=[],this.labelsEE=[],this.structs=[],this.structureInfo=[],this.includedFiles=[],this.varMap=new Map,this.procMap=new Map,this.macroMap=new Map,this.labelMap=new Map,this.varSet=new Set,this.procSet=new Set,this.macroSet=new Set,this.labelSet=new Set,this.sectionIndex=new Map}addToSection(e,s){if(!e)return;let n=e.toLowerCase();this.sectionIndex.has(n)||this.sectionIndex.set(n,[]),this.sectionIndex.get(n).push(s)}getSectionSymbols(e){return this.sectionIndex.get(e.toLowerCase())||[]}addVariable(e){let s=e.name.toLowerCase();this.varSet.has(s)||(this.varSet.add(s),this.vars.push(e),this.varMap.set(s,e),this.addToSection(e.section,e))}findVariable(e){return this.varMap.get(e.toLowerCase())}addProcedure(e){let s=e.name.toLowerCase();this.procSet.has(s)||(this.procSet.add(s),this.procs.push(e),this.procMap.set(s,e),this.addToSection(e.section,e))}findProcedure(e){return this.procMap.get(e.toLowerCase())}addMacro(e,s,n=0){let i=e.toLowerCase();if(this.macroSet.has(i))return;this.macroSet.add(i);let o={name:e,line:s,argCount:n};this.macros.push(o),this.macroMap.set(i,o)}findMacro(e){return this.macroMap.get(e.toLowerCase())}addLabel(e,s){let n=e.toLowerCase();if(this.labelSet.has(n))return;this.labelSet.add(n);let i={name:e,line:s};this.labels.push(i),this.labelMap.set(n,i)}findLabel(e){let s=e.toLowerCase();return this.labelMap.has(s)?this.labelMap.get(s):this.labelsEE.find(n=>n.name.toLowerCase()===s)}getKeyword(e){if(e)return ns.get(e.toLowerCase())}};je.exports={SymbolRegistry:he}});var Fe=b((tn,We)=>{"use strict";var me=class{tokenize(e){let s=[],n="",i=!1;for(let o=0;o<e.length;o++){let a=e[o];if(!i&&a===";")break;if(a==='"'||a==="'"){n+=a,i?(s.push(n),n="",i=!1):i=!0;continue}if(i){n+=a;continue}if(/\s|,|\[|\]|\(|\)/.test(a)){n.length&&(s.push(n),n=""),/\s/.test(a)||s.push(a);continue}n+=a}return n.length&&s.push(n),s}};We.exports={AsmTokenizer:me}});var se=b((sn,Ue)=>{"use strict";var{KeywordType:O}=W(),ge=class r{static typeMap={[O.instruction]:"(Command)",[O.memoryAllocation]:"(Memory)",[O.precompiled]:"(Instruction)",[O.register]:"(Register)",[O.savedWord]:"(Saved)",[O.size]:"(Size)",[O.label]:"(Label)",[O.macro]:"(Macro)",[O.method]:"(Procedure)",[O.structure]:"(Structure)",[O.variable]:"(Variable)"};static getType(e){return r.typeMap[e]||"(Unknown)"}static clearSpace(e){return e.trim()}static splitLine(e){return e.split(/[,\s\[\]\(\)]+/).filter(Boolean)}static isNumberStr(e){return/^0x[0-9a-f]+$/i.test(e)||/^[0-9]+$/i.test(e)||/^[0-9a-f]+h$/i.test(e)||/^[01]+b$/i.test(e)||/^[0-9]+d$/i.test(e)}static getNumMsg(e){let s,n;if(/^0x/i.test(e)?(s=16,n=Number.parseInt(e,16)):e.endsWith("h")?(s=16,n=Number.parseInt(e.slice(0,-1),16)):e.endsWith("b")?(s=2,n=Number.parseInt(e.slice(0,-1),2)):(s=10,n=Number.parseInt(e,10)),Number.isNaN(n))return null;let i=`(${s===16?"Hexadecimal":s===2?"Binary":"Decimal"} Number) ${e}:
5
+ `;return s!==10&&(i+=` Decimal: ${n.toString(10)}
6
+ `),s!==16&&(i+=` Hex: ${n.toString(16)}h / 0x${n.toString(16).toUpperCase()}
7
+ `),s!==2&&(i+=` Binary: ${n.toString(2)}b
8
+ `),i}};Ue.exports={Utils:ge}});var Ve=b((rn,Ye)=>{"use strict";var Ke=require("fs"),re=require("path"),{AsmTokenizer:is}=Fe(),{Utils:Ee}=se(),{Info:os,Procedure:as,Label:cs}=pe(),Me=class{constructor(e,s=null){this.tokenizer=new is,this.registry=e,this.currentFilePath=s,this.currentSection="",this.varRegex=/\b(db|dw|dd|dq|dt|resb|resw|resd|resq|equ)\b/i,this.labelRegex=/^\s*((?:%%)?[A-Za-z_.$?][\w.$?]*):/,this.procRegex=/^\s*([A-Za-z_.$?][\w.$?]*)\s+proc\b/i,this.macroRegex=/^\s*%macro\b/i,this.defineRegex=/^\s*%(define|assign)\b/i}async scan(e,s=!0){s&&(this.registry.clear(),this.currentFilePath&&this.registry.includedFiles.push(re.normalize(this.currentFilePath))),this.currentSection="";for(let n=0;n<e.length;n++){let i=this._buildContext(e[n]);this._detectSection(i)||(this._detectLabel(i,n),this._detectVariable(i,n,s),await this._detectProcedure(i,n,e),await this._detectInclude(i),this._detectMacro(i,n),this._detectDefine(i),this._detectExtern(i,n))}}_buildContext(e){let s=Ee.clearSpace(e);return{raw:e,clean:s,lower:s.toLowerCase(),noComment:e.replace(/;.*$/,"").trim(),words:this.tokenizer.tokenize(e)}}_detectSection(e){return!e.lower.startsWith("section")&&!e.lower.startsWith("segment")?!1:(e.words.length>1&&(this.currentSection=e.words[1].toLowerCase()),!0)}_detectLabel(e,s){let n=e.noComment.match(this.labelRegex);if(n&&!this.registry.findLabel(n[1])&&this.registry.addLabel(n[1],s),e.lower.startsWith("label")&&e.words.length>=2){let i=e.words[1];this.registry.labelsEE.push(new cs(i,e.raw.substring(e.raw.indexOf(i)+i.length)))}}_detectVariable(e,s,n){n&&(e.words.length<2||!this.varRegex.test(e.words[1])||this.registry.addVariable({name:e.words[0],type:e.words[1],section:this.currentSection,line:s}))}async _detectProcedure(e,s,n){let i=e.clean.match(this.procRegex);if(!i||this.registry.findProcedure(i[1]))return;let o=i[1],a=this._parseProcDocComments(n,s,o),u=new as(o,a);u.section=this.currentSection,u.line=s,this.registry.addProcedure(u)}_parseProcDocComments(e,s,n){let i=new os("",""),o=[];for(let a=s-1;a>=0&&Ee.clearSpace(e[a]).startsWith(";");a--)o.push(e[a].substring(e[a].indexOf(";")+1));for(let a of o)a.startsWith("@out: ")?i.output.push(a.substring(a.indexOf(" ",a.indexOf("@out: ")))):a.startsWith("@arg: ")?i.params.push(Ee.clearSpace(a.substring(a.indexOf(" ",a.indexOf("@arg: "))))):i.des+=a;return i.name=n,i}async _detectInclude(e){if(!e.lower.startsWith("%include")&&!e.lower.startsWith("include"))return;let s=e.raw.match(/['"](.*?)['"]/);if(!s||!this.currentFilePath)return;let n=re.dirname(this.currentFilePath),i=re.normalize(re.resolve(n,s[1]));if(!Ke.existsSync(i)||this.registry.includedFiles.includes(i))return;let o=Ke.readFileSync(i,"utf8");this.registry.includedFiles.push(i);let a=this.currentSection;await this.scan(o.split(/\r?\n/),!1),this.currentSection=a}_detectMacro(e,s){if(!this.macroRegex.test(e.raw)||e.words.length<=1)return;let n=e.words[1],i=e.words.length>2?parseInt(e.words[2],10):0;this.registry.findMacro(n)||this.registry.addMacro(n,s,isNaN(i)?0:i)}_detectDefine(e){if(!this.defineRegex.test(e.raw)||e.words.length<=1)return;let s=e.words[1];this.registry.defines||(this.registry.defines=[]),this.registry.defines.includes(s)||this.registry.defines.push(s)}_detectExtern(e,s){if(e.words[0]?.toLowerCase()!=="extern"||e.words.length<=1)return;let n=e.words[1];this.registry.findLabel(n)||this.registry.addLabel(n,s)}};Ye.exports={DocumentScanner:Me}});var ne=b((nn,Je)=>{"use strict";var ls={REG:1,MEM:2,IMM:4,LABEL:8,VAR:16};Je.exports={OperandType:ls}});var H=b((on,Xe)=>{"use strict";var{OperandType:us}=ne(),t=us,ds={mov:[[t.REG,t.REG],[t.REG,t.MEM],[t.MEM,t.REG],[t.REG,t.IMM],[t.MEM,t.IMM]],movzx:[[t.REG,t.REG],[t.REG,t.MEM]],movsx:[[t.REG,t.REG],[t.REG,t.MEM]],movsxd:[[t.REG,t.REG],[t.REG,t.MEM]],lea:[[t.REG,t.MEM]],xchg:[[t.REG,t.REG],[t.REG,t.MEM],[t.MEM,t.REG]],xadd:[[t.REG,t.REG],[t.MEM,t.REG]],cmpxchg:[[t.REG,t.REG],[t.MEM,t.REG]],push:[[t.REG],[t.MEM],[t.IMM]],pop:[[t.REG],[t.MEM]],add:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],adc:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],sub:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],sbb:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],mul:[[t.REG],[t.MEM]],imul:[[t.REG],[t.MEM],[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.REG,t.REG,t.IMM],[t.REG,t.MEM,t.IMM]],div:[[t.REG],[t.MEM]],idiv:[[t.REG],[t.MEM]],inc:[[t.REG],[t.MEM]],dec:[[t.REG],[t.MEM]],neg:[[t.REG],[t.MEM]],cbw:[[]],cwd:[[]],cwde:[[]],cdq:[[]],cdqe:[[]],cqo:[[]],and:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],or:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],xor:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],not:[[t.REG],[t.MEM]],cmp:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],test:[[t.REG,t.REG],[t.REG,t.MEM],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],bswap:[[t.REG]],bt:[[t.REG,t.REG],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],bts:[[t.REG,t.REG],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],btr:[[t.REG,t.REG],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],btc:[[t.REG,t.REG],[t.REG,t.IMM],[t.MEM,t.REG],[t.MEM,t.IMM]],bsf:[[t.REG,t.REG],[t.REG,t.MEM]],bsr:[[t.REG,t.REG],[t.REG,t.MEM]],shl:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],shr:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],sal:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],sar:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],rol:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],ror:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],rcl:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],rcr:[[t.REG,t.IMM],[t.REG,t.REG],[t.MEM,t.IMM],[t.MEM,t.REG]],shld:[[t.REG,t.REG,t.IMM],[t.REG,t.REG,t.REG],[t.MEM,t.REG,t.IMM],[t.MEM,t.REG,t.REG]],shrd:[[t.REG,t.REG,t.IMM],[t.REG,t.REG,t.REG],[t.MEM,t.REG,t.IMM],[t.MEM,t.REG,t.REG]],jmp:[[t.LABEL],[t.REG],[t.MEM]],call:[[t.LABEL],[t.REG],[t.MEM]],ret:[[],[t.IMM]],enter:[[t.IMM,t.IMM]],leave:[[]],clc:[[]],stc:[[]],cmc:[[]],cli:[[]],sti:[[]],cld:[[]],std:[[]],lahf:[[]],sahf:[[]],pushf:[[]],popf:[[]],pushfq:[[]],popfq:[[]],movsb:[[]],movsw:[[]],movsd:[[]],movsq:[[]],stosb:[[]],stosw:[[]],stosd:[[]],stosq:[[]],lodsb:[[]],lodsw:[[]],lodsd:[[]],lodsq:[[]],cmpsb:[[]],cmpsw:[[]],cmpsd:[[]],cmpsq:[[]],scasb:[[]],scasw:[[]],scasd:[[]],scasq:[[]],syscall:[[]],sysret:[[]],sysenter:[[]],sysexit:[[]],int:[[t.IMM]],into:[[]],iret:[[]],iretd:[[]],iretq:[[]],in:[[t.REG,t.REG],[t.REG,t.IMM]],out:[[t.REG,t.REG],[t.IMM,t.REG]],rdtsc:[[]],rdtscp:[[]],cpuid:[[]],nop:[[]],hlt:[[]],ud2:[[]],pause:[[]],lfence:[[]],mfence:[[]],sfence:[[]],xlatb:[[]],je:[[t.LABEL]],jne:[[t.LABEL]],jz:[[t.LABEL]],jnz:[[t.LABEL]],jg:[[t.LABEL]],jl:[[t.LABEL]],jge:[[t.LABEL]],jle:[[t.LABEL]],ja:[[t.LABEL]],jb:[[t.LABEL]],jae:[[t.LABEL]],jbe:[[t.LABEL]],jc:[[t.LABEL]],jnc:[[t.LABEL]],js:[[t.LABEL]],jns:[[t.LABEL]],jo:[[t.LABEL]],jno:[[t.LABEL]],jp:[[t.LABEL]],jnp:[[t.LABEL]],jpe:[[t.LABEL]],jpo:[[t.LABEL]],jcxz:[[t.LABEL]],jecxz:[[t.LABEL]],jrcxz:[[t.LABEL]],loop:[[t.LABEL]],loope:[[t.LABEL]],loopne:[[t.LABEL]]};Xe.exports={INSTRUCTION_SIGNATURES:ds}});var Ze=b((an,He)=>{"use strict";var{Utils:be}=se(),{INSTRUCTION_SIGNATURES:fs}=H();function ps(r,e){let s=[],n=e.findProcedure(r),i=e.findVariable(r),o=e.getKeyword(r),a=e.findMacro(r),u=e.findLabel(r);if(be.isNumberStr(r))s.push({language:"assembly",value:be.getNumMsg(r)});else if(i)s.push({language:"assembly",value:`(Variable) ${i.name}: ${i.type}${i.section?" [section "+i.section+"]":""}`});else if(n)s.push({language:"assembly",value:"(Procedure) "+n.name},{language:"plainText",value:n.description.des},{language:"assembly",value:n.description.paramsString()},{language:"assembly",value:n.description.outputs()});else if(a){let d=a.argCount!==void 0?` \u2014 ${a.argCount} arg${a.argCount!==1?"s":""}`:"",l=a.line!==void 0?` [line ${a.line+1}]`:"";s.push({language:"assembly",value:"(Macro) "+a.name+d+l})}else if(o){s.push({language:"assembly",value:be.getType(o.type)+" "+o.name},{language:"plainText",value:o.def},{language:"assembly",value:"Syntax: "+o.data});let d=fs[r.toLowerCase()];if(d?.length){let l=h=>(h&3)===3?"r/m":h&1?"reg":h&2?"mem":h&4?"imm":h&8?"label":"?",f=d.map(h=>h.length?`${r.toLowerCase()} ${h.map(l).join(", ")}`:r.toLowerCase()).join(`
9
+ `);s.push({language:"assembly",value:f})}}else if(u){let d=u.line!==void 0?` [line ${u.line+1}]`:u.value?` => ${u.value}`:"";s.push({language:"assembly",value:"(Label) "+u.name+d})}return s.length>0?s:null}He.exports={getHoverContent:ps}});var tt=b((cn,et)=>{"use strict";var Qe=require("vscode"),{getHoverContent:hs}=Ze(),we=class{constructor(e){this.registry=e}async provideHover(e,s){let n=e.getText(new Qe.Range(s.line,0,s.line,s.character)),i=n.match(/(\")/g)||n.match(/(\')/g),o=n.match(/^[^\;]*\;.*$/);if(i||o)return null;let a=e.getWordRangeAtPosition(s);if(!a)return null;let u=e.getText(a),d=hs(u,this.registry);return d?new Qe.Hover(d):null}};et.exports={TasmHoverProvider:we}});var rt=b((ln,st)=>{"use strict";var Re=class{static parse(e){if(e=e.trim(),e==="")return"BASE";if(!e.includes("+"))return e.length>0&&!e.endsWith(" ")?"BASE_DONE":"BASE";let s=e.split("+").map(i=>i.trim()),n=s[s.length-1];if(n==="")return"INDEX";if(n.includes("*")){let i=n.split("*");return i.length===2&&i[1].trim()===""?"SCALE_INPUT":"SCALE_DONE"}return"INDEX_DONE"}};st.exports={MemoryAddressParser:Re}});var pt=b((un,ft)=>{"use strict";var{Utils:ms}=se(),{KeywordType:g}=W(),{KEYWORD_MAP:it,REGISTERS:ie,AVX_REGISTERS:ot,PREPROCESSOR:gs}=X(),{OperandType:Z}=ne(),{INSTRUCTION_SIGNATURES:at}=H(),{MemoryAddressParser:Es}=rt(),nt=["db","dw","dd","dq","dt","resb","resw","resd","resq","equ"],Ms=new Set([g.instruction,g.memoryAllocation,g.precompiled]),ct=["byte","word","dword","qword","tword","oword","yword","zword"],bs=Array.from(it.values());function ws(r,e){let{line:s,lineIdx:n,lines:i}=r,o=[];if(Rs(s,s.length)||Ss(s))return o;let a=s.trimStart(),u=s.length===a.length,d=a.length>0?a.split(/\s+/).map(f=>f.toLowerCase()):[],l=d.length>1||d.length===1&&/\s$/.test(s);return a.startsWith("%")?xs(i,n,e):(l||Cs(u,o),d[0]==="section"&&l?vs():ys(s)?Gs(s,e):l?Ls(d,s,e,o):(a.length>0&&Ds(d,e,o),Ts(o)))}function Rs(r,e){let s=r.indexOf(";");return s!==-1&&s<e}function Ss(r){let e=r.match(/['"]/g);return!!(e&&e.length%2!==0)}function ys(r){return r.lastIndexOf("[")>r.lastIndexOf("]")}function xs(r,e,s){let n=[];for(let o of gs)n.push(M(o.name,g.precompiled,o.detail,o.doc,null,"01"));for(let o of s.macros)n.push(M(o.name,g.macro,"(Macro)","",null,"05"));let i=Is(r,e);if(i>0)for(let o=1;o<=i;o++)n.push(M(`%${o}`,g.constant,`(Macro arg ${o})`,"",null,"01"));return n}function Is(r,e){for(let s=e-1;s>=0;s--){let n=r[s].trim().toLowerCase();if(n.startsWith("%endmacro"))return 0;if(n.startsWith("%macro")){let i=n.split(/\s+/),o=parseInt(i[2],10);return isNaN(o)?0:o}}return 0}function Cs(r,e){if(r){for(let s of["section .data","section .text","section .bss"])e.push(M(s,g.savedWord));e.push(M("global",g.savedWord)),e.push(M("extern",g.savedWord))}}function vs(){let r=[];for(let e of["data","text","bss"])r.push(M("."+e,g.savedWord));return r}function Gs(r,e){let s=[],n=r.slice(r.lastIndexOf("[")+1);switch(Es.parse(n)){case"BASE":for(let o of e.vars)s.push(M(o.name,g.variable,"","",null,"01"));for(let o of ie)s.push(M(o,g.register,"","",null,"02"));break;case"BASE_DONE":s.push(M("+",g.operator,"(Offset)"));break;case"INDEX":for(let o of ie)s.push(M(o,g.register));break;case"INDEX_DONE":s.push(M("*",g.operator,"(Scale)"));break;case"SCALE_INPUT":for(let o of["1","2","4","8"])s.push(M(o,g.constant,"(Scale)"));break}return s}function Ls(r,e,s,n){let i=r[0].toLowerCase();if(!at[i])return s.findMacro(i)?_s(s):As(r);let o=ut(i,lt(e));if(o===void 0)return n;if(o&Z.MEM){for(let a of ct)n.push(M(a,g.size,"(Size)","",null,"01"));for(let a of s.vars)n.push(M(a.name,g.variable,"","",null,"02"))}if(o&Z.REG&&(ie.forEach(a=>n.push(M(a,g.register,"","",null,dt(a)))),ot.forEach(a=>n.push(M(a,g.register,"","",null,"05")))),o&Z.IMM){n.push(M("0",g.constant,"(Immediate)","",null,"04"));for(let a of s.defines||[])n.push(M(a,g.constant,"(%define)","",null,"04"))}if(o&Z.LABEL){let a=o===Z.LABEL?"01":"02";s.labels.forEach(u=>n.push(M(u.name,g.label,"","",null,a))),s.procs.forEach(u=>n.push(M(u.name,g.method,"","",null,a)))}return n}function _s(r){let e=[];for(let s of ct)e.push(M(s,g.size,"(Size)","",null,"01"));for(let s of r.vars)e.push(M(s.name,g.variable,"","",null,"02"));return ie.forEach(s=>e.push(M(s,g.register,"","",null,dt(s)))),ot.forEach(s=>e.push(M(s,g.register,"","",null,"05"))),e.push(M("0",g.constant,"(Immediate)","",null,"04")),e}function As(r){let e=[],s=r.filter(n=>n.length>0)[1]||"";if(!nt.includes(s))for(let n of nt){let i=it.get(n);e.push(M(n,g.memoryAllocation,i?i.def:"(Memory)"))}return e}function Ds(r,e,s){let n=(r[0]||"").toLowerCase();for(let i of bs)Ms.has(i.type)&&i.name.toLowerCase().startsWith(n)&&s.push(M(i.name,i.type,ms.getType(i.type),i.def));for(let i of e.macros)i.name.toLowerCase().startsWith(n)&&s.push(M(i.name,g.macro,"(Macro)",i.doc||"",null,"01"))}function Ts(r){let e=new Set;return r.filter(s=>e.has(s.label)?!1:(e.add(s.label),!0))}function lt(r){return r.split(";")[0].split(",").length-1}function ut(r,e){let s=at[r];if(!s)return null;let n=0,i=!1;for(let o of s)o.length>e&&(n|=o[e],i=!0);return i?n:void 0}function dt(r){let e=r.toLowerCase();return/^(xmm|ymm|zmm)\d+$/.test(e)||/^k\d+$/.test(e)?"05":/^(r(ax|bx|cx|dx|si|di|bp|sp)|r\d+)$/.test(e)||/^(e(ax|bx|cx|dx|si|di|bp|sp)|r\d+d)$/.test(e)?"03":"04"}function M(r,e,s="",n="",i=null,o="02"){return{label:r,kindType:e,detail:s,doc:n,sortText:o+"_"+r,insertText:i}}ft.exports={getCompletionItems:ws,getAllowedOperandTypes:ut,getOperandIndex:lt}});var mt=b((dn,ht)=>{"use strict";var S=require("vscode"),{KeywordType:A}=W(),{getCompletionItems:Ps}=pt(),qs={[A.instruction]:S.CompletionItemKind.Keyword,[A.memoryAllocation]:S.CompletionItemKind.Keyword,[A.precompiled]:S.CompletionItemKind.Interface,[A.register]:S.CompletionItemKind.Constant,[A.savedWord]:S.CompletionItemKind.Property,[A.size]:S.CompletionItemKind.Constructor,[A.variable]:S.CompletionItemKind.Variable,[A.method]:S.CompletionItemKind.Method,[A.structure]:S.CompletionItemKind.Struct,[A.label]:S.CompletionItemKind.Unit,[A.macro]:S.CompletionItemKind.Function,[A.file]:S.CompletionItemKind.File,[A.constant]:S.CompletionItemKind.Value,[A.operator]:S.CompletionItemKind.Operator},Se=class{constructor(e,s){this.registry=e,this.scanner=s}async provideCompletionItems(e,s,n,i){let o=new S.CompletionList([],!1);if(i.triggerCharacter===" "&&!S.workspace.getConfiguration("assembly").get("tabTriggerCompletions"))return o;i.triggerKind===S.CompletionTriggerKind.Invoke&&await this.scanner.scan(e.getText().split(/\r?\n/));let a=e.lineAt(s.line).text.slice(0,s.character);if(i.triggerCharacter===" "){let l=a.split(";")[0],f=l.trimStart().split(/\s+/).map(E=>E.toLowerCase()),h=l.lastIndexOf(",");if((h!==-1?l.slice(h+1):l.slice(l.search(/\S/)+(f[0]||"").length)).trim().length>0)return o}let u=[];for(let l=0;l<e.lineCount;l++)u.push(e.lineAt(l).text);let d=Ps({line:a,lineIdx:s.line,lines:u},this.registry);return o.items=d.map(l=>{let f=new S.CompletionItem(l.label,qs[l.kindType]??S.CompletionItemKind.Text);return f.detail=l.detail,f.documentation=l.doc,f.sortText=l.sortText,l.insertText&&(f.insertText=l.insertText),f}),o}};ht.exports={AsmCompletionProvider:Se}});var Mt=b((fn,Et)=>{"use strict";var{KEYWORD_DICTIONARY:$s}=X(),{KeywordType:ks,AllowKinds:gt}=W(),{INSTRUCTION_SIGNATURES:Os}=H(),{OperandType:N}=ne(),ae={8:["al","bl","cl","dl","ah","bh","ch","dh","sil","dil","bpl","spl","r8b","r9b","r10b","r11b","r12b","r13b","r14b","r15b"],16:["ax","bx","cx","dx","si","di","bp","sp","r8w","r9w","r10w","r11w","r12w","r13w","r14w","r15w"],32:["eax","ebx","ecx","edx","esi","edi","ebp","esp","r8d","r9d","r10d","r11d","r12d","r13d","r14d","r15d"],64:["rax","rbx","rcx","rdx","rsi","rdi","rbp","rsp","r8","r9","r10","r11","r12","r13","r14","r15","rip"],128:[],256:[],512:[]};for(let r=0;r<16;r++)ae[128].push(`xmm${r}`);for(let r=0;r<16;r++)ae[256].push(`ymm${r}`);for(let r=0;r<32;r++)ae[512].push(`zmm${r}`);var oe={};for(let[r,e]of Object.entries(ae))for(let s of e)oe[s]=Number(r);var zs=new Map($s.map(r=>[r.name.toLowerCase(),r]));function Ns(r,e){let s=[];return js(r,s),Fs(r,s,e),Us(r,s),s}function js(r,e){Bs(r,e),Ws(r,e)}function Bs(r,e){let s=new Map;for(let n=0;n<r.length;n++){let i=r[n].split(";")[0].trimEnd();if(!i.trimStart().endsWith(":"))continue;let o=i.trim().slice(0,-1).trim().toLowerCase();o&&(o.startsWith("%%")||(s.has(o)?e.push(v(n,r[n].indexOf(o.charAt(0)),o.length,`Duplicate label '${o}' (first defined at line ${s.get(o)+1})`,"error")):s.set(o,n)))}}function Ws(r,e){let s=[],n=[],i=[],o=[];for(let a=0;a<r.length;a++){let u=r[a].split(";")[0].trim().toLowerCase();if(!u)continue;let d=u.split(/\s+/),l=d[0],f=d[1]||"";f==="proc"&&s.push(a),l==="endp"&&(s.length===0?e.push(v(a,0,4,"'endp' without matching 'proc'","error")):s.pop()),l==="%macro"&&n.push(a),l==="%endmacro"&&(n.length===0?e.push(v(a,0,8,"'%endmacro' without matching '%macro'","error")):n.pop()),["%if","%ifdef","%ifndef"].includes(l)&&i.push(a),l==="%endif"&&(i.length===0?e.push(v(a,0,6,"'%endif' without matching '%if'","error")):i.pop()),f==="macro"&&o.push(a),l==="endm"&&(o.length===0?e.push(v(a,0,4,"'endm' without matching 'macro'","error")):o.pop())}for(let a of s)e.push(v(a,0,4,"'proc' is never closed with 'endp'","error"));for(let a of n)e.push(v(a,0,6,"'%macro' is never closed with '%endmacro'","error"));for(let a of i)e.push(v(a,0,3,"'%if' block is never closed with '%endif'","error"));for(let a of o)e.push(v(a,0,5,"'macro' is never closed with 'endm'","error"))}function Fs(r,e,s){let n=["jmp","je","jne","jz","jnz","jg","jl","jge","jle","ja","jb","jae","jbe","jc","jnc","js","jns","jo","jno","jcxz","jecxz","jrcxz","loop","loope","loopne"],i=new Set([...s.labels.map(a=>a.name.toLowerCase()),...s.procs.map(a=>a.name.toLowerCase())]),o=new Set(s.vars.map(a=>a.name.toLowerCase()));for(let a=0;a<r.length;a++){let u=r[a].split(";")[0],d=u.trim().toLowerCase();if(!d)continue;let l=d.split(/[\s,]+/).filter(p=>p.length>0);if(l.length<2)continue;let f=l[0];if(n.includes(f)||f==="call"){let p=l[1];if(!Q(p)&&!p.startsWith("[")&&!p.startsWith("0x")&&!i.has(p)){let E=u.toLowerCase().indexOf(p,f.length);e.push(v(a,E,p.length,`Undefined label or procedure '${p}'`,"warning"))}}if(["mov","add","sub","cmp","and","or","xor","test","lea","movzx","movsx"].includes(f))for(let p=1;p<l.length;p++){let E=l[p].replace(/[\[\]]/g,"");if(!(ye(E)||Q(E)||Xs(E))&&/^[a-z_][a-z0-9_]*$/.test(E)&&!o.has(E)&&!i.has(E)){let w=u.toLowerCase().indexOf(E,f.length);w!==-1&&e.push(v(a,w,E.length,`'${E}' is not defined as a variable or label`,"warning"))}}}}function Us(r,e){for(let s=0;s<r.length;s++){let n=r[s].split(";")[0],i=n.trim().toLowerCase();if(!i||i.endsWith(":"))continue;let o=i.search(/[\s\t]/);if(o===-1)continue;let a=i.substring(0,o).trim(),u=zs.get(a);if(!u||u.type!==ks.instruction)continue;let l=i.substring(o).trim().split(",").map(p=>p.trim()).filter(p=>p.length>0),f=Os[a],h=f?.some(p=>p.length===l.length);if(u.opCount>=0&&l.length!==u.opCount&&!h){let p=n.toLowerCase().indexOf(a);e.push(v(s,p,a.length,`'${a}' requires ${u.opCount} operand(s), got ${l.length}`,"error"));continue}if(u.opCount===1&&l.length===1){let p=l[0].replace(/[\[\]]/g,"").trim();Ks(s,n,p,a,u.allowType,e)}if(u.opCount===2&&l.length===2&&Ys(s,n,a,l,e),f&&l.length>=2){let p=l.map(w=>Vs(w));if(!f.some(w=>w.length===l.length&&w.every((x,I)=>p[I]&x))){let w=n.toLowerCase().indexOf(a);e.push(v(s,w,a.length,`'${a}' has no valid form for (${p.map(x=>Js(x)).join(", ")})`,"warning"))}}}}function Ks(r,e,s,n,i,o){if(i===gt.label){if(ye(s)||Q(s)){let a=e.toLowerCase().indexOf(s,n.length);o.push(v(r,a,s.length,`'${n}' expects a label, not '${s}'`,"error"))}return}if(i===gt.constants&&!Q(s)){let a=e.toLowerCase().indexOf(s,n.length);o.push(v(r,a,s.length,`'${n}' expects a constant, not '${s}'`,"error"))}}function Ys(r,e,s,n,i){if(["movzx","movsx","movsxd"].includes(s))return;let a={byte:8,word:16,dword:32,qword:64,tbyte:80,oword:128,yword:256,zword:512},u=E=>{let x=E.replace(/\[/g," ").replace(/\]/g," ").trim().split(/\s+/).filter(R=>R.length>0),I=null,C=null;for(let R of x)a[R]!==void 0?I=R:oe[R]!==void 0&&(C=R);return I?{bits:a[I],label:I,token:I}:C?{bits:oe[C],label:C,token:C}:null},d=u(n[0]),l=u(n[1]);if(!d||!l||d.bits===l.bits)return;let f=e.indexOf(","),h=f!==-1?f:0,p=e.toLowerCase().indexOf(l.token,h);i.push(v(r,p,l.token.length,`Size mismatch: '${d.label}' is ${d.bits}-bit but '${l.label}' is ${l.bits}-bit`,"error"))}function v(r,e,s,n,i){let o=Math.max(0,e);return{line:r,startCol:o,endCol:o+s,message:n,severity:i}}function Vs(r){if(r.includes("["))return N.MEM;let e=r.split(/\s+/).filter(s=>s.length>0);return e.some(s=>ye(s))?N.REG:e.length===1&&Q(e[0])?N.IMM:N.LABEL|N.IMM}function Js(r){return(r&3)===3?"r/m":r&N.REG?"reg":r&N.MEM?"mem":r&N.IMM?"imm":r&N.LABEL?"label":"?"}function ye(r){return r in oe||/^(xmm|ymm|zmm)\d+$/.test(r)||/^r\d+(b|w|d)?$/.test(r)}function Q(r){return/^0x[0-9a-f]+$/i.test(r)||/^[0-9][0-9a-f]*(h|b|d)?$/i.test(r)}function Xs(r){return["byte","word","dword","qword","tbyte","oword","yword","zword","ptr","rel","near","far","short"].includes(r)}Et.exports={analyzeDiagnostics:Ns}});var wt=b((pn,bt)=>{"use strict";var ee=require("vscode"),{analyzeDiagnostics:Hs}=Mt(),xe=class{constructor(e){this.registry=e,this.collection=ee.languages.createDiagnosticCollection("assembly")}analyze(e){let s=[];for(let o=0;o<e.lineCount;o++)s.push(e.lineAt(o).text);let i=Hs(s,this.registry).map(o=>{let a=new ee.Range(o.line,o.startCol,o.line,o.endCol),u=o.severity==="error"?ee.DiagnosticSeverity.Error:ee.DiagnosticSeverity.Warning;return new ee.Diagnostic(a,o.message,u)});this.collection.set(e.uri,i)}dispose(){this.collection.dispose()}};bt.exports={DiagnosticProvider:xe}});var xt=b((hn,yt)=>{"use strict";var St=require("child_process"),Ie=require("fs"),Zs=require("path"),Qs=require("os");async function er(r){let{compilerPath:e,compilerType:s,compilerFormat:n,debugInfo:i,outputExt:o,documentText:a}=r,u=Zs.join(Qs.tmpdir(),`asm_check_${Date.now()}.asm`);try{Ie.writeFileSync(u,a,"utf8")}catch{return[]}let d=sr(s,u,n,i,o),l=u.replace(".asm",`.${o}`);return new Promise(f=>{St.execFile(e,d,{timeout:1e4},(h,p,E)=>{if(Ie.unlink(u,()=>{}),Ie.unlink(l,()=>{}),!h){f([]);return}let w=E||p||"",x=s==="nasm"?Rt(w,"NASM"):Rt(w,"YASM");f(x)})})}async function tr(r){let e=process.platform==="win32"?"where":"which";return new Promise(s=>{St.exec(`${e} ${r}`,(n,i)=>{if(n||!i.trim()){s("");return}s(i.trim().split(`
10
+ `)[0].trim())})})}function sr(r,e,s,n,i){let o=e.replace(".asm",`.${i}`),a=[`-f${s}`,e,"-o",o];return n!=="none"&&a.splice(1,0,`-g${n}`),a}function Rt(r,e){let s=[];for(let n of r.split(`
11
+ `)){let i=n.match(/^.*?:(\d+):\s*(error|warning|note):\s*(.+)$/i);if(!i)continue;let o=Math.max(0,parseInt(i[1])-1),a=i[2].toLowerCase()==="warning"?"warning":"error";s.push({line:o,message:i[3].trim(),severity:a,source:e})}return s}yt.exports={runCompiler:er,findCompiler:tr}});var Ct=b((mn,It)=>{"use strict";var z=require("vscode"),rr=require("fs"),{runCompiler:nr,findCompiler:ir}=xt(),Ce=class{constructor(){this.collection=z.languages.createDiagnosticCollection("assembly-compiler"),this.statusBar=z.window.createStatusBarItem(z.StatusBarAlignment.Left,100),this.statusBar.show()}async analyze(e){let s=z.workspace.getConfiguration("assembly"),n=s.get("enableCompilerCheck",!1),i=s.get("compilerType","yasm"),o=s.get("compilerFormat","elf64"),a=s.get("compilerDebugInfo","dwarf2"),u=s.get("outputExtension","o");if(!n){this.collection.delete(e.uri),this.statusBar.text="";return}let d=s.get("compilerPath","");if(d||(d=await ir(i)),!d){this.collection.delete(e.uri),this.statusBar.text=`$(warning) ${i.toUpperCase()}: compiler not found`,this.statusBar.tooltip=`Install ${i} or set 'assembly.compilerPath' in settings`;return}if(!rr.existsSync(d)){this.statusBar.text=`$(warning) ${i.toUpperCase()}: not found at '${d}'`,this.statusBar.tooltip="Check 'assembly.compilerPath' in settings";return}this.statusBar.text=`$(sync~spin) ${i.toUpperCase()}: compiling...`;let f=(await nr({compilerPath:d,compilerType:i,compilerFormat:o,debugInfo:a,outputExt:u,documentText:e.getText()})).map(h=>{let p=new z.Range(h.line,0,h.line,Number.MAX_SAFE_INTEGER),E=h.severity==="warning"?z.DiagnosticSeverity.Warning:z.DiagnosticSeverity.Error,w=new z.Diagnostic(p,h.message,E);return w.source=h.source,w});if(this.collection.set(e.uri,f),f.length===0)this.statusBar.text=`$(check) ${i.toUpperCase()}: ok`;else{let h=f.filter(E=>E.severity===z.DiagnosticSeverity.Error).length,p=f.filter(E=>E.severity===z.DiagnosticSeverity.Warning).length;this.statusBar.text=`$(error) ${i.toUpperCase()}: ${h} error(s), ${p} warning(s)`}}dispose(){this.collection.dispose(),this.statusBar.dispose()}};It.exports={CompilerProvider:Ce}});var Gt=b((gn,vt)=>{"use strict";var j=require("vscode"),ve=class{constructor(e){this.registry=e}provideDefinition(e,s,n){if(!j.workspace.getConfiguration("assembly").get("enableGoToDefinition"))return null;let i=e.getWordRangeAtPosition(s);if(!i)return null;let o=e.getText(i),a=this.registry.findLabel(o);if(a&&a.line!==void 0)return new j.Location(e.uri,new j.Position(a.line,0));let u=this.registry.findVariable(o);if(u&&u.line!==void 0)return new j.Location(e.uri,new j.Position(u.line,0));let d=this.registry.findProcedure(o);if(d&&d.line!==void 0)return new j.Location(e.uri,new j.Position(d.line,0));let l=this.registry.findMacro(o);return l&&l.line!==void 0?new j.Location(e.uri,new j.Position(l.line,0)):null}};vt.exports={AsmDefinitionProvider:ve}});var _t=b((En,Lt)=>{"use strict";var T=require("vscode"),Ge=class{constructor(e){this.registry=e}provideDocumentSymbols(e,s){if(!T.workspace.getConfiguration("assembly").get("enableDocumentSymbols"))return[];let n=[];for(let i of this.registry.procs){if(i.line===void 0)continue;let o=new T.Range(i.line,0,i.line,0);n.push(new T.DocumentSymbol(i.name,"(Procedure)",T.SymbolKind.Function,o,o))}for(let i of this.registry.vars){if(i.line===void 0)continue;let o=new T.Range(i.line,0,i.line,0);n.push(new T.DocumentSymbol(i.name,i.type+(i.section?" ["+i.section+"]":""),T.SymbolKind.Variable,o,o))}for(let i of this.registry.macros){if(i.line===void 0)continue;let o=new T.Range(i.line,0,i.line,0);n.push(new T.DocumentSymbol(i.name,"(Macro)",T.SymbolKind.Module,o,o))}for(let i of this.registry.labels){if(i.line===void 0)continue;let o=new T.Range(i.line,0,i.line,0);n.push(new T.DocumentSymbol(i.name,"(Label)",T.SymbolKind.Key,o,o))}return n}};Lt.exports={AsmDocumentSymbolProvider:Ge}});var Tt=b((Mn,Dt)=>{"use strict";var V=require("vscode"),{KEYWORD_MAP:or}=X(),{INSTRUCTION_SIGNATURES:ar}=H(),At=r=>(r&3)===3?"r/m":r&1?"reg":r&2?"mem":r&4?"imm":r&8?"label":"?",Le=class{constructor(e){this.registry=e}provideSignatureHelp(e,s,n,i){if(!V.workspace.getConfiguration("assembly").get("enableSignatureHelp"))return null;let o=e.lineAt(s.line).text.slice(0,s.character),a=o.indexOf(";");if(a!==-1&&a<s.character)return null;let d=o.trimStart().split(/\s+/);if(d.length<2)return null;let l=d[0].toLowerCase(),f=or.get(l),h=ar[l],p=this.registry?.findMacro(l),E=o.slice(o.toLowerCase().indexOf(l)+l.length),w=(E.match(/,/g)||[]).length,x=new V.SignatureHelp;if(h?.length){x.signatures=h.map(R=>{let G=R.length?`${l} ${R.map(At).join(", ")}`:l,P=new V.SignatureInformation(G,f?.def||""),q=l.length+(R.length?1:0);for(let J of R){let ke=At(J),Oe=G.indexOf(ke,q),ze=Oe+ke.length;P.parameters.push(new V.ParameterInformation([Oe,ze])),q=ze+1}return P});let I=E.split(","),C=0;if(w>0){let R=I.slice(0,w).map(G=>G.trim());for(let G=0;G<h.length;G++)if(!(h[G].length<I.length)&&R.every((P,q)=>!P||this._classify(P)&h[G][q])){C=G;break}}x.activeSignature=C,x.activeParameter=Math.min(w,h[C].length-1)}else if(f?.data){let I=new V.SignatureInformation(f.data,f.def||""),C=f.data.slice(l.length).trim();if(C){let R=f.data.length-C.length;for(let G of C.split(",")){let P=G.trim(),q=f.data.indexOf(P,R),J=q+P.length;I.parameters.push(new V.ParameterInformation([q,J])),R=J+1}}x.signatures=[I],x.activeSignature=0,x.activeParameter=Math.min(w,I.parameters.length-1)}else if(p?.argCount>0){let I=Array.from({length:p.argCount},(P,q)=>`%${q+1}`),C=`${p.name} ${I.join(", ")}`,R=new V.SignatureInformation(C,`(Macro) ${p.name} \u2014 ${p.argCount} arg${p.argCount!==1?"s":""}`),G=p.name.length+1;for(let P of I){let q=C.indexOf(P,G),J=q+P.length;R.parameters.push(new V.ParameterInformation([q,J])),G=J+1}x.signatures=[R],x.activeSignature=0,x.activeParameter=Math.min(w,I.length-1)}else return null;return x}_classify(e){if(e.includes("["))return 2;let s=e.split(/\s+/).filter(n=>n.length>0);return s.some(n=>this._isReg(n))?1:s.length===1&&/^(0x[0-9a-f]+|[0-9][0-9a-f]*[hbd]?)$/i.test(s[0])?4:12}_isReg(e){return/^(r(ax|bx|cx|dx|si|di|bp|sp)|e(ax|bx|cx|dx|si|di|bp|sp)|[abcd][xhl]|[sd]il|[bs]pl|r\d{1,2}[bdw]?|[xyz]mm\d+|k[0-7]|[cdefgs]s|[re]ip|rflags|eflags)$/i.test(e)}};Dt.exports={AsmSignatureHelpProvider:Le}});var kt=b((bn,$t)=>{"use strict";var{KEYWORD_MAP:cr,REGISTERS:lr,AVX_REGISTERS:ur}=X(),{INSTRUCTION_SIGNATURES:dr}=H(),fr=["macro","register"],pr=[],Pt=new Set([...lr.map(r=>r.toLowerCase()),...ur.map(r=>r.toLowerCase())]),qt=/\b([A-Za-z][A-Za-z0-9]*)\b/g;function hr(r,e){let s=[];for(let n=0;n<r.length;n++){let i=r[n];if(!i.trim())continue;let o=i.trimStart();if(o.startsWith(";")||o.startsWith("%"))continue;let a=i.split(";")[0],u=a.match(/^(\s*)([A-Za-z_.$?][A-Za-z0-9_.$?]*)/);if(u){let l=u[1].length,f=u[2],h=f.toLowerCase();!a.slice(l+f.length).trimStart().startsWith(":")&&!cr.has(h)&&!dr[h]&&!Pt.has(h)&&e.findMacro(h)&&s.push({line:n,col:l,length:f.length,tokenTypeIndex:0})}qt.lastIndex=0;let d;for(;(d=qt.exec(a))!==null;)Pt.has(d[1].toLowerCase())&&s.push({line:n,col:d.index,length:d[1].length,tokenTypeIndex:1})}return s}$t.exports={getSemanticTokens:hr,TOKEN_TYPES:fr,TOKEN_MODIFIERS:pr}});var Nt=b((wn,zt)=>{"use strict";var _e=require("vscode"),{getSemanticTokens:mr,TOKEN_TYPES:gr,TOKEN_MODIFIERS:Er}=kt(),Ot=new _e.SemanticTokensLegend(gr,Er),Ae=class{constructor(e){this.registry=e,this._emitter=new _e.EventEmitter,this.onDidChangeSemanticTokens=this._emitter.event}fire(){this._emitter.fire()}provideDocumentSemanticTokens(e){let s=[];for(let i=0;i<e.lineCount;i++)s.push(e.lineAt(i).text);let n=new _e.SemanticTokensBuilder(Ot);for(let i of mr(s,this.registry))n.push(i.line,i.col,i.length,i.tokenTypeIndex,0);return n.build()}};zt.exports={AsmSemanticTokensProvider:Ae,SEMANTIC_TOKENS_LEGEND:Ot}});var Bt=b((Rn,jt)=>{"use strict";var Mr=/^\s*[A-Za-z_.$?][\w.$?]*\s+proc\b/i,br=/^\s*endp\s*(?:;.*)?$/i,wr=/^\s*%macro\b/i,Rr=/^\s*%endmacro\s*(?:;.*)?$/i,Sr=/^\s*[A-Za-z_.$?][\w.$?]*\s+struc\b/i,yr=/^\s*ends\s*(?:;.*)?$/i,xr=/^\s*(section|segment)\b/i;function Ir(r){let e=[],s=r.length,n=[],i=[],o=[],a=-1;for(let u=0;u<s;u++){let d=r[u];if(xr.test(d)){if(a>=0){let l=u-1;for(;l>a&&r[l].trim()==="";)l--;l>a&&e.push({start:a,end:l,kind:"region"})}a=u;continue}if(Mr.test(d)){n.push(u);continue}if(br.test(d)&&n.length){let l=n.pop();u>l&&e.push({start:l,end:u,kind:null});continue}if(wr.test(d)){i.push(u);continue}if(Rr.test(d)&&i.length){let l=i.pop();u>l&&e.push({start:l,end:u,kind:null});continue}if(Sr.test(d)){o.push(u);continue}if(yr.test(d)&&o.length){let l=o.pop();u>l&&e.push({start:l,end:u,kind:null});continue}}if(a>=0){let u=s-1;for(;u>a&&r[u].trim()==="";)u--;u>a&&e.push({start:a,end:u,kind:"region"})}return e}jt.exports={getFoldingRanges:Ir}});var Ft=b((Sn,Wt)=>{"use strict";var De=require("vscode"),{getFoldingRanges:Cr}=Bt(),Te=class{provideFoldingRanges(e){let s=[];for(let n=0;n<e.lineCount;n++)s.push(e.lineAt(n).text);return Cr(s).map(n=>n.kind==="region"?new De.FoldingRange(n.start,n.end,De.FoldingRangeKind.Region):new De.FoldingRange(n.start,n.end))}};Wt.exports={AsmFoldingProvider:Te}});var Kt=b((yn,Ut)=>{"use strict";function vr(r,e,s,n){let i=r.toLowerCase(),o=s.findLabel(i)||s.findVariable(i)||s.findProcedure(i)||s.findMacro(i);if(!o)return[];let a=[],u=new RegExp(`\\b${Gr(r)}\\b`,"gi");for(let d=0;d<e.length;d++){let l=e[d].replace(/;.*$/,""),f;for(u.lastIndex=0;(f=u.exec(l))!==null;)!n&&o.line===d||a.push({line:d,startCol:f.index,endCol:f.index+f[0].length})}return a}function Gr(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}Ut.exports={findReferences:vr}});var Jt=b((xn,Vt)=>{"use strict";var Yt=require("vscode"),{findReferences:Lr}=Kt(),_r=/\b([A-Za-z_.$?][\w.$?]*)\b/g,Pe=class{constructor(e){this.registry=e}provideReferences(e,s,n){let i=e.getWordRangeAtPosition(s,_r);if(!i)return[];let o=e.getText(i),a=[];for(let u=0;u<e.lineCount;u++)a.push(e.lineAt(u).text);return Lr(o,a,this.registry,n.includeDeclaration).map(u=>new Yt.Location(e.uri,new Yt.Range(u.line,u.startCol,u.line,u.endCol)))}};Vt.exports={AsmReferencesProvider:Pe}});var es=b((In,Qt)=>{"use strict";var ce=require("vscode"),{KEYWORD_MAP:Xt,REGISTERS:Ar,AVX_REGISTERS:Dr}=X(),Ht=/\b([A-Za-z_.$?][\w.$?]*)\b/g,Zt=new Set([...Ar.map(r=>r.toLowerCase()),...Dr.map(r=>r.toLowerCase())]),qe=class{constructor(e){this.registry=e}prepareRename(e,s){let n=e.getWordRangeAtPosition(s,Ht);if(!n)throw new Error("\u0E44\u0E21\u0E48\u0E1E\u0E1A identifier \u0E15\u0E23\u0E07\u0E19\u0E35\u0E49");let i=e.getText(n),o=i.toLowerCase();if(Xt.has(o)||Zt.has(o))throw new Error(`"${i}" \u0E40\u0E1B\u0E47\u0E19 keyword/register \u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16 rename \u0E44\u0E14\u0E49`);if(!(this.registry.findLabel(o)||this.registry.findVariable(o)||this.registry.findProcedure(o)||this.registry.findMacro(o)))throw new Error(`"${i}" \u0E44\u0E21\u0E48\u0E43\u0E0A\u0E48 symbol \u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E44\u0E27\u0E49\u0E43\u0E19\u0E44\u0E1F\u0E25\u0E4C\u0E19\u0E35\u0E49`);return n}provideRenameEdits(e,s,n){let i=n.toLowerCase();if(Xt.has(i)||Zt.has(i))throw new Error(`"${n}" \u0E40\u0E1B\u0E47\u0E19 keyword/register \u0E44\u0E21\u0E48\u0E2A\u0E32\u0E21\u0E32\u0E23\u0E16\u0E43\u0E0A\u0E49\u0E40\u0E1B\u0E47\u0E19\u0E0A\u0E37\u0E48\u0E2D\u0E44\u0E14\u0E49`);let o=e.getWordRangeAtPosition(s,Ht);if(!o)return null;let a=e.getText(o),u=new ce.WorkspaceEdit,d=new RegExp(`\\b${Tr(a)}\\b`,"gi");for(let l=0;l<e.lineCount;l++){let f=e.lineAt(l).text.replace(/;.*$/,""),h;for(d.lastIndex=0;(h=d.exec(f))!==null;){let p=new ce.Position(l,h.index),E=new ce.Position(l,h.index+h[0].length);u.replace(e.uri,new ce.Range(p,E),n)}}return u}};function Tr(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}Qt.exports={AsmRenameProvider:qe}});var y=require("vscode"),{SymbolRegistry:Pr}=Be(),{DocumentScanner:qr}=Ve(),{TasmHoverProvider:$r}=tt(),{AsmCompletionProvider:kr}=mt(),{DiagnosticProvider:Or}=wt(),{CompilerProvider:zr}=Ct(),{AsmDefinitionProvider:Nr}=Gt(),{AsmDocumentSymbolProvider:jr}=_t(),{AsmSignatureHelpProvider:Br}=Tt(),{AsmSemanticTokensProvider:Wr,SEMANTIC_TOKENS_LEGEND:Fr}=Nt(),{AsmFoldingProvider:Ur}=Ft(),{AsmReferencesProvider:Kr}=Jt(),{AsmRenameProvider:Yr}=es(),$e=class{constructor(e){this.context=e,this.registry=new Pr,this.scanner=new qr(this.registry),this.diagnostics=new Or(this.registry),this.compiler=new zr,this.semanticTokens=new Wr(this.registry),this._debounceTimer=null}activate(){this.context.subscriptions.push(y.languages.registerHoverProvider("assembly",new $r(this.registry))),this.context.subscriptions.push(y.languages.registerCompletionItemProvider("assembly",new kr(this.registry,this.scanner)," ",".","[",","," ","+","*","(")),this.context.subscriptions.push(y.languages.registerDefinitionProvider("assembly",new Nr(this.registry))),this.context.subscriptions.push(y.languages.registerDocumentSymbolProvider("assembly",new jr(this.registry))),this.context.subscriptions.push(y.languages.registerSignatureHelpProvider("assembly",new Br(this.registry)," ",",")),this.context.subscriptions.push(y.languages.registerDocumentSemanticTokensProvider("assembly",this.semanticTokens,Fr)),this.context.subscriptions.push(y.languages.registerFoldingRangeProvider("assembly",new Ur)),this.context.subscriptions.push(y.languages.registerReferenceProvider("assembly",new Kr(this.registry))),this.context.subscriptions.push(y.languages.registerRenameProvider("assembly",new Yr(this.registry))),this.context.subscriptions.push(this.diagnostics.collection),this.context.subscriptions.push(this.compiler.collection),this.context.subscriptions.push(y.workspace.onDidChangeTextDocument(e=>this.scheduleScan(e.document))),this.context.subscriptions.push(y.workspace.onDidOpenTextDocument(e=>this.triggerScan(e))),this.context.subscriptions.push(y.window.onDidChangeActiveTextEditor(e=>{e&&this.triggerScan(e.document)})),this.context.subscriptions.push(y.workspace.onDidSaveTextDocument(e=>this.triggerScan(e,!0))),this.context.subscriptions.push(y.workspace.onDidChangeConfiguration(e=>{e.affectsConfiguration("assembly.tabSize")&&this._applyTabSize()})),this._applyTabSize(),y.window.activeTextEditor&&this.triggerScan(y.window.activeTextEditor.document)}_applyTabSize(){let e=y.workspace.getConfiguration("assembly").get("tabSize",8);y.workspace.getConfiguration("editor",{languageId:"assembly"}).update("tabSize",e,y.ConfigurationTarget.Global,!0)}scheduleScan(e){this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=setTimeout(()=>{this._debounceTimer=null,this.triggerScan(e)},300)}async triggerScan(e,s=!1){if(!e||e.languageId!=="assembly"||e.uri.scheme!=="file")return;let n=e.getText().split(/\r?\n/);this.scanner.currentFilePath=e.uri.fsPath,await this.scanner.scan(n),this.diagnostics.analyze(e),this.semanticTokens.fire(),s&&await this.compiler.analyze(e)}};function Vr(r){console.log("MY VERSION LOADED \u2705"),new $e(r).activate()}exports.activate=Vr;function Jr(){}exports.deactivate=Jr;