annotate .cms/lib/codemirror/mode/z80/z80.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 CodeMirror.defineMode('z80', function(_config, parserConfig) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 var ez80 = parserConfig.ez80;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 var keywords1, keywords2;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 if (ez80) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 var variables2 = /^(n?[zc]|p[oe]?|m)\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 startState: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 context: 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 if (!stream.column())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 state.context = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 if (stream.eatSpace())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 var w;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 if (stream.eatWhile(/\w/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 if (ez80 && stream.eat('.')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 stream.eatWhile(/\w/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 w = stream.current();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 if (stream.indentation()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 if ((state.context == 1 || state.context == 4) && variables1.test(w)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 state.context = 4;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 return 'var2';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 if (state.context == 2 && variables2.test(w)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 state.context = 4;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 return 'var3';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 if (keywords1.test(w)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 state.context = 1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 return 'keyword';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 } else if (keywords2.test(w)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 state.context = 2;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 return 'keyword';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 } else if (state.context == 4 && numbers.test(w)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 return 'number';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 if (errors.test(w))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 return 'error';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 } else if (stream.match(numbers)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 return 'number';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 } else if (stream.eat(';')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 return 'comment';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 } else if (stream.eat('"')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 while (w = stream.next()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 if (w == '"')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 if (w == '\\')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 } else if (stream.eat('\'')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 if (stream.match(/\\?.'/))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 return 'number';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 } else if (stream.eat('.') || stream.sol() && stream.eat('#')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 state.context = 5;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 if (stream.eatWhile(/\w/))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 return 'def';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 } else if (stream.eat('$')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 if (stream.eatWhile(/[\da-f]/i))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 return 'number';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 } else if (stream.eat('%')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 if (stream.eatWhile(/[01]/))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 return 'number';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 CodeMirror.defineMIME("text/x-z80", "z80");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 CodeMirror.defineMIME("text/x-ez80", { name: "z80", ez80: true });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 });