diff --git a/Syntaxes/sc-asm.sublime-syntax b/Syntaxes/sc-asm.sublime-syntax new file mode 100644 index 0000000..8335a62 --- /dev/null +++ b/Syntaxes/sc-asm.sublime-syntax @@ -0,0 +1,220 @@ +%YAML 1.2 +--- +name: S-C Assembler +file_extensions: [] +scope: source.asm.sc-asm + +variables: + ws: '[ \t]+' + xws: '[ \t\x08]*' + ident: '[A-Za-z][A-Za-z0-9.]*' + lident: '.[0-9]{1,2}' + +contexts: + prototype: + - include: eol + main: + + - meta_include_prototype: false + + - match: ^[*] + push: + - meta_scope: comment.line + - match: \n + pop: true + + + # assembler commands. there are others but these are used by a2osx... + - match: '^{{xws}}((?i)NEW|AUTO|MANUAL|MAN|ASM)\b' + captures: + 1: keyword.directive + # scope: keyword.directive + push: + - match: $ + pop: true + + - match: '^{{xws}}((?i)SAVE|LOAD)\b' + captures: + 1: keyword.directive + # scope: keyword.directive + push: operand-path + + + + + - match: '{{ws}}' + push: opcode + + - match: '^{{ws}}((?i)\.MA)\s({{ident}})' + captures: + 2: keyword.directive + 1: entity.name.function + push: eol + + + - match: '^({{ident}}){{ws}}\.((?i)EQ)\b' + captures: + 1: entity.name.constant + 2: keyword.directive + push: operand + + - match: '^{{lident}}' + scope: entity.name.label.local + + + - match: '^{{ident}}' + scope: entity.name.function + + + opcode: + - match: '{{ws}}' + set: operand + - include: scope:source.asm.65816#mnemonics-6502 + - include: scope:source.asm.65816#mnemonics-65c02 + - include: scope:source.asm.65816#mnemonics-65c02s + - include: scope:source.asm.65816#mnemonics-65816 + - include: mnemonics-6502-alt + + + - match: \.(?i:DA)\b + scope: keyword.directive.data + set: operand + + - match: \.(?i:HS)\b + scope: keyword.directive.data + set: operand-hex + + - match: \.(?i:AS|AT|AZ)\b + scope: keyword.directive.data + set: operand-string + + - match: \.(?i:OP)\b + scope: keyword.directive + set: operand-op + + + - match: \.(?i:INB|IN|TF)\b + scope: keyword.control.import + set: operand-path + + + - match: \.(?i:LIST)\b + scope: keyword.directive + set: operand-list + + + - match: \.(?i:AC|AS|AT|AZ|BS|DA|DO|DUMMY|ED|ELSE|EM|EN|EP|EQ|FIN|HS|IN|INB|LIST|MA|OP|OR|PG|PH|TA|TF|TI|US)\b + scope: keyword.directive + + + + - match: '>{{ident}}' + scope: variable.function.macro + set: operand + + + + operand: + - include: numbers + - include: strings + - match: ']\d+' + scope: variable.other + #- include: macro-parm + + + + operand-op: + - match: '(?i:6502|SW16|65C02|65R02|65802|65816)' + scope: constant.language + set: comment + - include: error + + operand-hex: + - match: '[0-9A-Fa-f]{2}' + scope: constant.numeric.hex + - include: expect-comment + + + operand-path: + - match: \S+ + scope: string.unquoted + set: expect-comment + - include: expect-comment + + # -? delimiter (anything but delimiter)* delimiter + # pop: 1 needed for \1 backref matching. + operand-string: + + - match: '-?([^ \t-])' + scope: punctuation.definition.string.begin + push: [comment, operand-string-inner] + + # - include: expect-comment + + operand-string-inner: + - meta_scope: string.quoted + - match: \1 + scope: punctuation.definition.string.end + pop: true + + + operand-list: + # .LIST ON | OFF | CON | COFF | MON | MOFF | XON | XOFF + - match: \b(?i:[CMX]?ON|[CMX]?OFF)\b + scope: constant.language + set: comment + + - include: error + + + + error: + - match: \S + scope: invalid.illegal.expect.comment + + + expect-comment: + - include: comment + - match: \S + scope: invalid.illegal.expect.comment + + comment: + - match: (?<=[\t ]) + push: + - meta_scope: comment.line + - match: \n + pop: true + - include: eol + + + mnemonics-6502-alt: + - match: \b(?i:BLT|BGE)\b + scope: keyword.mnemonic.6502.alt + + numbers: + - match: \b\d+\b + scope: constant.numeric + - match: \$[0-9a-fA-F]+\b + scope: constant.numeric.hex + - match: \%[01_]+\b + scope: constant.numeric.binary + + strings: + + - match: "'" + scope: punctuation.definition.string.begin + push: + - meta_include_prototype: false + - meta_scope: string.quoted.single + - match: "'" + scope: punctuation.definition.string.end + pop: true + - match: \n + scope: invalid.illegal.newline.asm + pop: true + + + eol: + - match: '$' + pop: true + diff --git a/sc-asm directives.sublimes-completions b/sc-asm directives.sublimes-completions new file mode 100644 index 0000000..dec54f9 --- /dev/null +++ b/sc-asm directives.sublimes-completions @@ -0,0 +1,34 @@ +{ + "scope": "source.asm.sc-asm meta.directive", + "completions": + [ + ".ac", + ".as", + ".at", + ".az", + ".bs", + ".da", + ".do", + ".dummy", + ".ed", + ".else", + ".em", + ".en", + ".ep", + ".eq", + ".fin", + ".hs", + ".in", + ".inb", + ".list", + ".ma", + ".op", + ".or", + ".pg", + ".ph", + ".ta", + ".tf", + ".ti", + ".us" + ] +} \ No newline at end of file