scopeName: 'source.assembly.6502.kickass' name: 'Kick Assembler' fileTypes: [ 'a' 'asm' 's' 'S' ] patterns: [ { include: 'source.65c02-opcodes' } { include: 'source.6502x-opcodes' } { include: '#comments' } { include: '#directives' } { include: '#symbols' } ] repository: comments: patterns: [ { match: '(\\/\\/[^\\n]+)' name: 'comment.line' } { begin: '\\/\\*' end: '\\*\\/' name: 'comment.block' } ] symbols: patterns: [ # =============================================================== # Assembler symbols { # Labels name: 'entity.name.function.kickass' match: '^\\s*[!a-zA-Z_][a-zA-Z0-9_]*:' } { # Variable functions, like var.getValue() match: '(\\w+(?=\\())' name: 'entity.name.function.kickass' } # =============================================================== # Data types { # Chars match: "\\'\\S\\'" name: 'string.char.kickass' } { # Strings name: 'string.quoted.kickass' begin: '"' end: '"' } { # Hex numbers match: '-?\\$[A-Fa-f0-9]+' name: 'constant.numeric.hex.kickass' } { # Octals match: '@([0-7]+)\\b' name: 'constant.numeric.octal.merlin' } { # Binary numbers match: '%[01]+' name: 'constant.numeric.binary.merlin' } { # Decimal numbers match: '\\b([0-9]+)\\b' name: 'constant.numeric.decimal.merlin' } { # Operators match: '[-+/*^><|#\\[\\](),=.!&]' name: 'keyword.operator.kickass' } { # Immediate values match: '\\#(\'.\'|[^\\s\']+)' name: 'constant.numeric.hex.kickass' } { # Constants match: '\\b([_A-Z]+)\\b' name: 'variable.kickass' } ] directives: patterns: [ # =============================================================== # Preprocessor directives { match: '(\\#)((?:define|undef))([\\s\\w]+)' captures: 1: name: 'keyword.control.directive.kickass' 2: name: 'keyword.control.directive.kickass' 3: name: 'variable.kickass' } { match: '(\\#)((?:endif|el(se|if)|if|importif))([\\s\\w]+)' captures: 1: name: 'keyword.control.directive.kickass' 2: name: 'keyword.control.directive.kickass' 4: name: 'variable.kickass' } { match: '(\\#)((import(once)?))([\\s\\w]+)' name: 'keyword.control.directive.kickass' } # =============================================================== # Assembler directive conditionals { match: '(\\.)((?:elif|if))' captures: 1: name: 'keyword.control.directive.kickass' 2: name: 'keyword.control.directive.kickass' } { match: '(\\}?(\\s+)?)(else)' captures: 3: name: 'keyword.control.directive.kickass' } # =============================================================== # Assembler directives misc { # Assembler directives that have inconsistant syntax match: '(\\.)((?:return|namespace|print(now)?|by(te)?|align|assert(error)?|break|disk|dw(ord)?|encoding|enum|error(if)?|file(modify|namespace)?|fill(word)?|for|lohifill|memblock|modify|pc|plugin|pseudopc|segment(def|out)?|struct|te(xt)?|while|wo(rd)?|zp|import( binary| c64| source| text|once)))\\b' name: 'keyword.control.directive.kickass' } { match: '(\\}?(\\s+)?)(else)' captures: 2: name: 'keyword.control.directive.kickass' } # =============================================================== # Variables and Macros { match: '(\\.)(var|eval|const|label)(\\s*[a-zA-Z0-9_]*)(\\s*=)' captures: 1: name: 'keyword.control.directive.kickass' 2: name: 'keyword.control.directive.kickass' 3: name: 'support.function.kickass' 4: name: 'keyword.operator.kickass' } { match: '(\\.)(var|eval|const|label)(\\s*[a-zA-Z0-9_]*)' captures: 1: name: 'keyword.control.directive.kickass' 2: name: 'keyword.control.directive.kickass' 3: name: 'support.function.kickass' } { match: '(\\.)(function|macro)([\\s\\w_.]*)(\\()([^)]*)(\\))' captures: 1: name: 'keyword.control.directive.kickass' 2: name: 'keyword.control.directive.kickass' 3: name: 'entity.name.function.kickass' 4: name: 'keyword.operator.kickass' 5: name: 'constant.variable.kickass' 6: name: 'keyword.operator.kickass' } { match: '(\\.)(pseudocommand)(\\s+)([^\\s\\n]+)' captures: 1: name: 'keyword.control.directive.kickass' 2: name: 'keyword.control.directive.kickass' 4: name: 'entity.name.function.kickass' } ]