From 2ece18b4cc40c04d9f49b8fd6a6f04429c536648 Mon Sep 17 00:00:00 2001 From: Kevin Zurawel Date: Sat, 16 Dec 2017 10:35:23 -0600 Subject: [PATCH] Add support for 6502 assembly (#1245) * Add support for 6502 assembly * Address PR feedback --- components.js | 4 ++ components/prism-asm6502.js | 28 +++++++++++++ components/prism-asm6502.min.js | 1 + examples/prism-asm6502.html | 42 +++++++++++++++++++ plugins/show-language/prism-show-language.js | 2 +- .../show-language/prism-show-language.min.js | 2 +- tests/languages/asm6502/comment_feature.test | 13 ++++++ .../languages/asm6502/directive_feature.test | 12 ++++++ tests/languages/asm6502/number_feature.test | 18 ++++++++ tests/languages/asm6502/opcode_feature.test | 17 ++++++++ tests/languages/asm6502/register_feature.test | 17 ++++++++ tests/languages/asm6502/string_feature.test | 12 ++++++ 12 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 components/prism-asm6502.js create mode 100644 components/prism-asm6502.min.js create mode 100644 examples/prism-asm6502.html create mode 100644 tests/languages/asm6502/comment_feature.test create mode 100644 tests/languages/asm6502/directive_feature.test create mode 100644 tests/languages/asm6502/number_feature.test create mode 100644 tests/languages/asm6502/opcode_feature.test create mode 100644 tests/languages/asm6502/register_feature.test create mode 100644 tests/languages/asm6502/string_feature.test diff --git a/components.js b/components.js index fa6a6b6ae9..84811c57e4 100644 --- a/components.js +++ b/components.js @@ -94,6 +94,10 @@ var components = { "title": "AsciiDoc", "owner": "Golmote" }, + "asm6502": { + "title": "6502 Assembly", + "owner": "kzurawel" + }, "aspnet": { "title": "ASP.NET (C#)", "require": "markup", diff --git a/components/prism-asm6502.js b/components/prism-asm6502.js new file mode 100644 index 0000000000..039203286a --- /dev/null +++ b/components/prism-asm6502.js @@ -0,0 +1,28 @@ +Prism.languages.asm6502 = { + 'comment': /;.*/, + 'directive': { + pattern: /\.\w+(?= )/, + alias: 'keyword' + }, + 'string': /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/, + 'opcode': { + pattern: /\b(?: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|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/, + alias: 'property' + }, + 'hexnumber': { + pattern: /#?\$[\da-fA-F]{2,4}/, + alias: 'string' + }, + 'binarynumber': { + pattern: /#?%[01]+/, + alias: 'string' + }, + 'decimalnumber': { + pattern: /#?\d+/, + alias: 'string' + }, + 'register': { + pattern: /\b[xyaXYA]\b/, + alias: 'variable' + } +}; diff --git a/components/prism-asm6502.min.js b/components/prism-asm6502.min.js new file mode 100644 index 0000000000..7832a33af6 --- /dev/null +++ b/components/prism-asm6502.min.js @@ -0,0 +1 @@ +Prism.languages.asm6502={comment:/;.*/,directive:{pattern:/\.\w+(?= )/,alias:"keyword"},string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,opcode:{pattern:/\b(?: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|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/,alias:"property"},hexnumber:{pattern:/#?\$[\da-fA-F]{2,4}/,alias:"string"},binarynumber:{pattern:/#?%[01]+/,alias:"string"},decimalnumber:{pattern:/#?\d+/,alias:"string"},register:{pattern:/\b[xyaXYA]\b/,alias:"variable"}}; \ No newline at end of file diff --git a/examples/prism-asm6502.html b/examples/prism-asm6502.html new file mode 100644 index 0000000000..23d3aafc7d --- /dev/null +++ b/examples/prism-asm6502.html @@ -0,0 +1,42 @@ +

6502 Assembly

+

To use this language, use the class "language-asm6502".

+ +

Comments

+
; This is a comment
+ +

Labels

+
label1:   ; a label
+ +

Opcodes

+

+SEI
+CLC
+
+; lowercase
+inx
+bne label1
+
+ +

Assembler directives

+

+.segment CODE
+.word $07d3
+
+ +

Registers

+

+ASL A  ; "A"
+LDA label1,x  ; "x"
+
+ +

Strings

+

+.include "header.asm"
+
+ +

Numbers

+

+LDA #127
+STA $80f0
+LDY #%01011000
+
diff --git a/plugins/show-language/prism-show-language.js b/plugins/show-language/prism-show-language.js index 2ae6c11d12..a4662d3512 100644 --- a/plugins/show-language/prism-show-language.js +++ b/plugins/show-language/prism-show-language.js @@ -11,7 +11,7 @@ if (!Prism.plugins.toolbar) { } // The languages map is built automatically with gulp -var Languages = /*languages_placeholder[*/{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","asciidoc":"AsciiDoc","aspnet":"ASP.NET (C#)","autohotkey":"AutoHotkey","autoit":"AutoIt","basic":"BASIC","csharp":"C#","cpp":"C++","coffeescript":"CoffeeScript","css-extras":"CSS Extras","django":"Django/Jinja2","fsharp":"F#","glsl":"GLSL","graphql":"GraphQL","http":"HTTP","inform7":"Inform 7","json":"JSON","latex":"LaTeX","livescript":"LiveScript","lolcode":"LOLCODE","matlab":"MATLAB","mel":"MEL","n4js":"N4JS","nasm":"NASM","nginx":"nginx","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","opencl":"OpenCL","parigp":"PARI/GP","php":"PHP","php-extras":"PHP Extras","powershell":"PowerShell","properties":".properties","protobuf":"Protocol Buffers","jsx":"React JSX","renpy":"Ren'py","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","typescript":"TypeScript","vbnet":"VB.Net","vhdl":"VHDL","vim":"vim","wiki":"Wiki markup","xojo":"Xojo (REALbasic)","yaml":"YAML"}/*]*/; +var Languages = /*languages_placeholder[*/{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","asciidoc":"AsciiDoc","asm6502":"6502 Assembly","aspnet":"ASP.NET (C#)","autohotkey":"AutoHotkey","autoit":"AutoIt","basic":"BASIC","csharp":"C#","cpp":"C++","coffeescript":"CoffeeScript","css-extras":"CSS Extras","django":"Django/Jinja2","fsharp":"F#","glsl":"GLSL","graphql":"GraphQL","http":"HTTP","inform7":"Inform 7","json":"JSON","latex":"LaTeX","livescript":"LiveScript","lolcode":"LOLCODE","matlab":"MATLAB","mel":"MEL","n4js":"N4JS","nasm":"NASM","nginx":"nginx","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","opencl":"OpenCL","parigp":"PARI/GP","php":"PHP","php-extras":"PHP Extras","powershell":"PowerShell","properties":".properties","protobuf":"Protocol Buffers","jsx":"React JSX","renpy":"Ren'py","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","typescript":"TypeScript","vbnet":"VB.Net","vhdl":"VHDL","vim":"vim","wiki":"Wiki markup","xojo":"Xojo (REALbasic)","yaml":"YAML"}/*]*/; Prism.plugins.toolbar.registerButton('show-language', function(env) { var pre = env.element.parentNode; if (!pre || !/pre/i.test(pre.nodeName)) { diff --git a/plugins/show-language/prism-show-language.min.js b/plugins/show-language/prism-show-language.min.js index 3894328cf6..ae3791564b 100644 --- a/plugins/show-language/prism-show-language.min.js +++ b/plugins/show-language/prism-show-language.min.js @@ -1 +1 @@ -!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",asciidoc:"AsciiDoc",aspnet:"ASP.NET (C#)",autohotkey:"AutoHotkey",autoit:"AutoIt",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",django:"Django/Jinja2",fsharp:"F#",glsl:"GLSL",graphql:"GraphQL",http:"HTTP",inform7:"Inform 7",json:"JSON",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",jsx:"React JSX",renpy:"Ren'py",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim",wiki:"Wiki markup",xojo:"Xojo (REALbasic)",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(t){var a=t.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var s=a.getAttribute("data-language")||e[t.language]||t.language.substring(0,1).toUpperCase()+t.language.substring(1),r=document.createElement("span");return r.textContent=s,r}})}}(); \ No newline at end of file +!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",asciidoc:"AsciiDoc",asm6502:"6502 Assembly",aspnet:"ASP.NET (C#)",autohotkey:"AutoHotkey",autoit:"AutoIt",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",django:"Django/Jinja2",fsharp:"F#",glsl:"GLSL",graphql:"GraphQL",http:"HTTP",inform7:"Inform 7",json:"JSON",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",jsx:"React JSX",renpy:"Ren'py",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim",wiki:"Wiki markup",xojo:"Xojo (REALbasic)",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(t){var a=t.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var s=a.getAttribute("data-language")||e[t.language]||t.language.substring(0,1).toUpperCase()+t.language.substring(1),r=document.createElement("span");return r.textContent=s,r}})}}(); \ No newline at end of file diff --git a/tests/languages/asm6502/comment_feature.test b/tests/languages/asm6502/comment_feature.test new file mode 100644 index 0000000000..d4b860167a --- /dev/null +++ b/tests/languages/asm6502/comment_feature.test @@ -0,0 +1,13 @@ +; +; foo bar baz + +------------------------- + +[ + ["comment", ";"], + ["comment", "; foo bar baz"] +] + +------------------------- + +Check for comments diff --git a/tests/languages/asm6502/directive_feature.test b/tests/languages/asm6502/directive_feature.test new file mode 100644 index 0000000000..1cf42c81d2 --- /dev/null +++ b/tests/languages/asm6502/directive_feature.test @@ -0,0 +1,12 @@ +.segment CODE + +------------------------- + +[ + ["directive", ".segment"], + " CODE" +] + +------------------------- + +Check for directives diff --git a/tests/languages/asm6502/number_feature.test b/tests/languages/asm6502/number_feature.test new file mode 100644 index 0000000000..55262f67bd --- /dev/null +++ b/tests/languages/asm6502/number_feature.test @@ -0,0 +1,18 @@ +LDA #127 +STA $8000 +LDX #%10001010 + +------------------------- + +[ + ["opcode", "LDA"], + ["decimalnumber", "#127"], + ["opcode", "STA"], + ["hexnumber", "$8000"], + ["opcode", "LDX"], + ["binarynumber", "#%10001010"] +] + +------------------------- + +Check for numbers diff --git a/tests/languages/asm6502/opcode_feature.test b/tests/languages/asm6502/opcode_feature.test new file mode 100644 index 0000000000..75e7b42806 --- /dev/null +++ b/tests/languages/asm6502/opcode_feature.test @@ -0,0 +1,17 @@ +LDA +BNE +inx +clc + +------------------------------------- + +[ + ["opcode", "LDA"], + ["opcode", "BNE"], + ["opcode", "inx"], + ["opcode", "clc"] +] + +------------------------------------- + +Check for opcodes diff --git a/tests/languages/asm6502/register_feature.test b/tests/languages/asm6502/register_feature.test new file mode 100644 index 0000000000..91ec7c42be --- /dev/null +++ b/tests/languages/asm6502/register_feature.test @@ -0,0 +1,17 @@ +LDA $8000,x +ASL A + +------------------------- + +[ + ["opcode", "LDA"], + ["hexnumber", "$8000"], + ",", + ["register", "x"], + ["opcode", "ASL"], + ["register", "A"] +] + +------------------------- + +Check for registers diff --git a/tests/languages/asm6502/string_feature.test b/tests/languages/asm6502/string_feature.test new file mode 100644 index 0000000000..0205074449 --- /dev/null +++ b/tests/languages/asm6502/string_feature.test @@ -0,0 +1,12 @@ +.include "header.asm" + +------------------------- + +[ + ["directive", ".include"], + ["string", "\"header.asm\""] +] + +------------------------- + +Check for strings