diff --git a/Preferences/Macross Comments.tmPreferences b/Preferences/Macross Comments.tmPreferences
new file mode 100644
index 0000000..c291875
--- /dev/null
+++ b/Preferences/Macross Comments.tmPreferences
@@ -0,0 +1,42 @@
+
+
+
+
+ name
+ Comments
+ scope
+ source.asm.6502.macross
+ settings
+
+ shellVariables
+
+
+ name
+ TM_COMMENT_START
+ value
+ ;
+
+
+ name
+ TM_COMMENT_START_2
+ value
+ /*
+
+
+ name
+ TM_COMMENT_END_2
+ value
+ */
+
+
+ name
+ TM_COMMENT_DISABLE_INDENT_2
+ value
+ yes
+
+
+
+
+
+
+
diff --git a/Preferences/Macross Symbol List.tmPreferences b/Preferences/Macross Symbol List.tmPreferences
new file mode 100644
index 0000000..205cb5e
--- /dev/null
+++ b/Preferences/Macross Symbol List.tmPreferences
@@ -0,0 +1,16 @@
+
+
+
+
+ name
+ Symbol List
+ scope
+ source.asm.6502.macross entitity.name.struct, source.asm.6502.macross entitity.name.macro, source.asm.6502.macross entitity.name.function
+ settings
+
+ showInSymbolList
+ 1
+
+
+
+
diff --git a/Syntaxes/Macross.sublime-syntax b/Syntaxes/Macross.sublime-syntax
new file mode 100644
index 0000000..3c52822
--- /dev/null
+++ b/Syntaxes/Macross.sublime-syntax
@@ -0,0 +1,183 @@
+%YAML 1.2
+---
+name: MACROSS Assembler
+file_extensions: []
+scope: source.asm.6502.macross
+
+
+variables:
+ ws: '[ \t]'
+ ident: '[A-Za-z_][A-Za-z_0-9]*'
+
+contexts:
+ main:
+
+
+
+ - match: '\b(?i:include)\b'
+ scope: keyword.control.import
+
+ - match: '\b(macro){{ws}}+({{ident}})\b'
+ captures:
+ 1: keyword.control.import
+ 2: entitity.name.macro
+ push:
+ - match: '{'
+ set: block
+ - match: '\b{{ident}}\b'
+ scope: variable.parameter
+
+ - match: '\b(function){{ws}}+({{ident}})\b'
+ captures:
+ 1: keyword.control.import
+ 2: entitity.name.function
+ push:
+ - match: '{'
+ set: block
+ - match: '\b{{ident}}\b'
+ scope: variable.parameter
+
+ - match: \bstruct(?=\s*{)
+ scope: keyword
+ set: [name_after_struct, block]
+
+ - include: block
+ - include: block-content
+
+
+
+
+ name_after_struct:
+ # - match: \n
+ # scope: invalid.illegal
+ # pop: true
+ - include: comments
+ - match: '{{ident}}'
+ scope: entitity.name.struct
+ pop: true
+ - match: '[^ \t]+'
+ scope: invalid.illegal
+ pop: true
+
+
+ while_after_mdo:
+ # - match: \n
+ # scope: invalid.illegal
+ # pop: true
+ - include: comments
+ - match: '\b(?i:while|until)\b'
+ scope: keyword.control.import
+ pop: true
+ - match: '[^ \t]+'
+ scope: invalid.illegal
+ pop: true
+
+
+ block:
+ - match: \{
+ scope: invalid.illegal
+ meta_content_scope: meta.block
+ push: block
+ - match: \}
+ pop: true
+
+ - include: block-content
+
+
+ block-content:
+ - include: comments
+ - include: string
+ - include: mnemonics-6502
+ - include: mnemonics-65c02
+ - include: numbers
+
+ - match: '({{ident}}):'
+ captures:
+ 1: entitity.name.label
+
+ - match: '\b[AaXxYy]\b'
+ scope: constant.language.register
+
+ - match: '\b(?i:TRUE|FALSE|NULL|here)\b'
+ scope: constant.language
+
+
+ # data statement
+ - match: \b(?i:block|align|word|long|dbyte|byte|string|struct)\b
+ scope: storage.type
+
+ # macro statements
+ # c++ #if uses keyword.control.import
+ - match: \b(?i:mdefine|mif|melse|melseif|mwhile|freturn|mfor|mswitch|mcase|mdefault|define|variable|undefine|function|macro)\b
+ scope: keyword.control.import
+
+ # mdo { block } while | until
+ - match: \b(?i:mdo)
+ scope: keyword.control.import
+ set: [while_after_mdo, block]
+
+
+ - match: '\b(?i:assert|constrain|define|do|else|elseif|extern|freturn|function|if|include|macro|mcase|mdefault|mdefine|mdo|melse|melseif|mfor|mif|mswitch|muntil|mvariable|mwhile|org|rel|start|target|undefine|until|variable|while|word)\b'
+ scope: keyword
+
+ - match: '\b(?i:always|carry|equal|geq|greater|gt|leq|less|lt|minus|negative|neq|never|not_carry|not_equal|not_overflow|not_zero|overflow|plus|positive|sgeq|sgt|sleq|slt|sneq|zero)\b'
+ scope: keyword.condition
+
+
+ - match: '\b(?i:addressMode|apply|arrayLength|atascii|atasciiColor|debugModeOff|debugModeOn|emitModeOff|emitModeOn|isAbsoluteValue|isARegister|isBlock|isBuiltInFunction|isConditionCode|isDefined|isDirectMode|isExternal|isField|isFunction|isImmediateMode|isIndexedMode|isIndirectMode|isPostIndexedMode|isPreIndexedMode|isRelocatableValue|isString|isStruct|isSymbol|isXIndexedMode|isXRegister|isYIndexedMode|isYRegister|listingOff|listingOn|makeArray|nthChar|printf|strcat|strcmp|strcmplc|strlen|substr|symbolDefine|symbolLookup|symbolName|symbolUsage|valueType)\b'
+ scope: keyword
+
+
+
+
+ string:
+ - match: '"'
+ scope: string
+ push:
+ - meta_scope: string
+ - match: '\n'
+ pop: true
+ scope: invalid.illegal.newline
+ - match: '[^"\n]|\\.'
+ - match: '"'
+ pop: true
+
+ comments:
+ - match: ';'
+ push:
+ - meta_scope: comment.line
+ - match: '$'
+ pop: true
+
+ - match: '/\*'
+ push:
+ - meta_scope: comment.line
+ - match: '\*/'
+ pop: true
+
+ mnemonics-6502:
+ - match: \b(?i:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA)\b
+ scope: keyword.mnemonic.6502
+
+ mnemonics-65c02:
+ - match: \b(?i:BRA|PHX|PHY|PLX|PLY|STP|STZ|TRB|TSB|WAI)\b
+ scope: keyword.mnemonic.65c02
+
+ numbers:
+ - match: 0[0-7]+
+ scope: constant.numeric.octal
+ - match: 0[xX][0-9A-Fa-f]+
+ scope: constant.numeric.hexadecimal
+ - match: 0[qQ][0-3]+
+ scope: constant.numeric.quarters
+ - match: 0[bB][01]+
+ scope: constant.numeric
+
+ - match: \d+
+ scope: constant.numeric
+
+ - match: \'([^'\n]|\\.)\'
+ scope: constant.character
+ - match: \'.*$
+ scope: invalid.illegal.constant.character
+