-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrgbds-mode.el
54 lines (50 loc) · 3.4 KB
/
rgbds-mode.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
;;; rgbds-mode --- Major mode for Gameboy assembly
;;; Commentary:
;;; Based on https://www.cemetech.net/forum/viewtopic.php?t=6413&start=0
;;; Code:
(require 'mwim)
(defconst rgbds-font-lock-keywords-1
(list
'(";.*" . font-lock-comment-face)
'("^\\*.*" . font-lock-comment-face)
'("\\<\\(adc\\|add\\|and\\|cp\\|dec\\|inc\\|or\\|sbc\\|sub\\|xor\\|call\\|jp\\|jr\\|ret\\|rst\\|bit\\|res\\|rl\\|rlc\\|rr\\|rrc\\|set\\|sla\\|sra\\|srl\\|swap\\|ccf\\|cpl\\|daa\\|di\\|ei\\|halt\\|nop\\|scf\\|stop\\|ld\\|pop\\|push\\|reti\\|rla\\|rlca\\|rra\\|rrca\\)\\>" . font-lock-builtin-face)
'("\\<\\(ADC\\|ADD\\|AND\\|CP\\|DEC\\|INC\\|OR\\|SBC\\|SUB\\|XOR\\|CALL\\|JP\\|JR\\|RET\\|RST\\|BIT\\|RES\\|RL\\|RLC\\|RR\\|RRC\\|SET\\|SLA\\|SRA\\|SRL\\|SWAP\\|CCF\\|CPL\\|DAA\\|DI\\|EI\\|HALT\\|NOP\\|SCF\\|STOP\\|LD\\|POP\\|PUSH\\|RETI\\|RLA\\|RLCA\\|RRA\\|RRCA\\)\\>" . font-lock-builtin-face)
'("\\<\\(a\\|b\\|c\\|d\\|e\\|h\\|l\\|af\\|bc\\|de\\|hl\\|sp\\|A\\|B\\|C\\|D\\|E\\|H\\|L\\|AF\\|BC\\|DE\\|HL\\|SP\\)\\>" . font-lock-variable-name-face)
'("\\(\\w*:\\)" . font-lock-variable-name-face))
"Minimal highlighting expressions for rgbds mode.")
(defconst rgbds-font-lock-keywords-2
(append rgbds-font-lock-keywords-1
(list
'("\\<\\(\\([0-9][0-9A-Fa-f]*[Hh]\\|\\(0[Xx]\\|[0-9]\\|\\$[0-9A-Fa-f]\\)[0-9A-Fa-f]*\\)\\|[01][01]*[Bb]\\|%[01][01]*\\|[0-9]*\\)\\>" . font-lock-constant-face)
'("\\(\\$\\)" . font-lock-function-name-face)))
"Additional Keywords to highlight in rgbds mode.")
(defconst rgbds-font-lock-keywords-3
(append rgbds-font-lock-keywords-2
(list
'("\\(\\.\\w*\\|#\\w*\\)" . font-lock-preprocessor-face)
'("\\<\\(DB\\|DW\\|DS\\|SECTION\\|EQU\\|EQUS\\|SET\\|POPS\\|PUSHS\\|MACRO\\|ENDM\\|RSSET\\|RSRESET\\|RB\\|RW\\|SHIFT\\|EXPORT\\|GLOBAL\\|PURGE\\|INCBIN\\|UNION\\|NEXTU\\|ENDU\\|PRINTT\\|PRINTI\\|PRINTV\\|PRINTF\\|REPT\\|ENDR\\|FAIL\\|WARN\\|INCLUDE\\|IF\\|ELIF\\|ELSE\\|ENDC\\|CHARMAP\\)\\>" . font-lock-preprocessor-face)
'("\\<\\(db\\|dw\\|ds\\|section\\|equ\\|equs\\|set\\|pops\\|pushs\\|macro\\|endm\\|rsset\\|rsreset\\|rb\\|rw\\|shift\\|export\\|global\\|purge\\|incbin\\|union\\|nextu\\|endu\\|printt\\|printi\\|printv\\|printf\\|rept\\|endr\\|fail\\|warn\\|include\\|if\\|elif\\|else\\|endc\\|charmap\\)\\>" . font-lock-preprocessor-face)))
"Balls-out highlighting in rgbds mode.")
(defvar rgbds-font-lock-keywords rgbds-font-lock-keywords-3
"Default highlighting expressions for rgbds mode.")
;; DON'T SREFACTOR THIS SEXP - there's a bug in srefactor that treats semicolons
;; as comments, even when they're not.
(define-derived-mode rgbds-mode
prog-mode
"RGBDS"
"Major mode for Gameboy assembly, to be assembled with rgbasm."
(setq font-lock-defaults '(rgbds-font-lock-keywords))
:syntax-table (let ((st (make-syntax-table)))
(modify-syntax-entry ?_ "w" st)
(modify-syntax-entry ?#"w" st)
(modify-syntax-entry ?. "w" st)
(modify-syntax-entry ?\; "<" st)
(modify-syntax-entry ?\n ">" st)
(modify-syntax-entry ?\t "-" st)
st))
(define-key rgbds-mode-map (kbd "C-j") 'newline-and-indent)
(define-key rgbds-mode-map (kbd "RET") 'newline-and-indent)
(define-key rgbds-mode-map (kbd "C-a") 'mwim-beginning-of-code-or-line)
(define-key rgbds-mode-map (kbd "C-e") 'mwim-end-of-code-or-line)
(provide 'rgbds-mode)
;;; rgbds-mode ends here