Language Server Protocol implementation for Motorola 68000 family assembly, based on tree-sitter-m68k
- Suitable for use with LSP supporting editors e.g. Neovim
- Includes VS Code extension
- Auto-completion:
- Instruction mnemonics
- Assembler directives
- Registers
- Symbols
- Code Linting
- Parser errors
- Processor support
- Code Folding
- Document Formatting
- Document Highlights
- Document Links
- Document Symbols
- Find References
- Go to definition
- Hover
- Instruction/directive documentation
- Symbol info
- Multiple workspaces
- Rename Symbols
- Signature Help
Install the package via npm:
npm install --global m68k-lsp-server
Configure using nvim-lspconfig
e.g.
require('lspconfig').m68k.setup{
on_attach = on_attach,
init_options = {
includePaths = { '../include', '/home/myuser/includes' },
format = {
case = {
instruction = 'upper'
}
}
}
}
See emacs-m68k
Start the server e.g.:
m68k-lsp-server --stdio
The LSP client can configured using the following settings, either as initialization options, or as a .m68krc.json
file in your workspace root, for project specific overrides.
Lists the processor(s) that your code is targeted at. This controls completion suggestions and provides diagnostics.
{
"processors": ["mc68030", "mc68881"]
}
Default: ["mc68000"]
Supported values:
mc68000
,mc68010
,mc68020
,mc68030
,mc68040
,mc68060
,mc68881
,mc68851
,cpu32
Additional paths to use to resolve include directives. This is equivalent to INCDIR
in source. It should probably
include anything you pass to vasm -I
arguments. Can be absolute or relative.
{
"includePaths": ["../include", "/home/myuser/includes"]
}
Default: []
The server can use vasm to provide diagnostic messages. When enabled it will assemble source files on save/open and display any errors or warnings.
The server will use a local vasmm68k_mot
executable if one exists in your path or is configured in vasm.binPath
, otherwise it will default to a bundled version complied in Web Assembly.
{
"vasm": {
"provideDiagnostics": true,
"binPath": "vasmm68k_mot",
"args": [],
"preferWasm": false,
"exclude": []
}
}
(defaults)
Property | Description |
---|---|
provideDiagnostics |
Enable vasm diagnostics |
binPath |
Filename or full path of vasm executable binary |
args |
Custom arguments to pass to vasm. Include paths and processor(s) from server config will automatically be added |
preferWasm |
Always use bundled Web Assembly vasm |
exclude |
File patterns to ignore and not build directly e.g. ["*.i"] |
The language server supports document formatting which can be configured using the following options:
Enforce consistency of upper/lower case on elements which are normally case insensitive.
Option | Behaviour |
---|---|
upper |
Upper case |
lower |
Lower case |
any |
Do not change case |
This can either be configured globally for all elements:
{
"format": {
"case": "lower"
}
}
or per element type
{
"format": {
"case": {
"instruction": "lower",
"directive": "lower",
"control": "upper",
"sectionType": "lower",
"register": "lower",
"hex": "lower"
}
}
}
Element | Description |
---|---|
instruction |
Instruction mnemonic/size e.g. move.w |
directive |
Assembler directive mnemonic/qualifier e.g. include |
control |
Assembler control keywords e.g. ifeq /endc |
sectionType |
Section type e.g. bss |
register |
Register name e.g. d0 ,sr |
hex |
Hexadecimal number literal |
Default: "lower"
Determines whether labels should have a colon suffix.
Can be set for all labels:
{
"format": {
"labelColon": "on"
}
}
or individually for global and local labels:
{
"format": {
"labelColon": {
"global": "on",
"local": "off"
}
}
}
Option | Behaviour |
---|---|
on |
Add colon |
off |
Remove colon |
notInline |
No colon for labels on same line as instruction |
onlyInline |
Only add colon for labels on same line as instruction |
any |
Do not change |
Default: "on"
Include space between operands e.g. move d0, d1
. VASM needs -spaces
or -phxass
option to support this.
Option | Behaviour |
---|---|
on |
Add space |
off |
Remove space |
any |
Do not change |
Default: "off"
{
"format": {
"operandSpace": "off"
}
}
Quote style to use for strings and paths.
{
"format": {
"quotes": "single"
}
}
Option | Behaviour |
---|---|
single |
Single quotes: ' |
double |
Double quotes: " |
any |
Do not change |
Default: "double"
Indents elements to align by type.
{
"format": {
"align": {
"mnemonic": 8,
"operands": 16,
"comment": 48,
"operator": 0,
"value": 0,
"indentStyle": "space",
"tabSize": 8,
"autoExtend": "line"
}
}
}
(defaults)
Property | Description |
---|---|
mnemonic |
Position of instruction/directive mnemonic and size e.g. move.w ,include . |
operands |
Position of operands e.g. d0,d1 . |
comment |
Position of comment following statement. Comments on their own line are not affected. |
operator |
Position of = character in constant assignment |
value |
Position of value in constant assignment |
standaloneComment |
Position / behaviour of comment with no other elements on the same line. |
indentStyle |
Character to use for indent - tab or space . |
tabSize |
Width of tab character to calculate positions when using tab indent style. |
autoExtend |
Behaviour when a component exceeds the available space between positions. See below. |
Options for standaloneComment
:
Option | Behaviour |
---|---|
"nearest" |
Align to nearest element position (default). E.g. if current position is closest to mnemonic it snaps to that column |
"ignore" |
Don't align |
elementName |
Align to named element position e.g. "label" , "mnemonic" , "operands" |
number |
Numeric literal position |
Options for autoExtend
:
Option | Behaviour |
---|---|
line |
Adjust the position for the affected line only |
block |
Adjust the position, maintaining alignment for all lines within the same block i.e. code separated by two or more line breaks |
file |
Adjust the position, maintaining alignment for all lines in the source file |
Remove trailing whitespace from lines?
{
"format": {
"trimWhitespace": true
}
}
default: true
Require line break on final line?
{
"format": {
"finalNewLine": true
}
}
New line type: lf
, cr
, crlf
{
"format": {
"endOfLine": "lf"
}
}
default: lf
- Full documentation for 68010+ instructions
- Diagnostics
- Instruction signatures
- Amiga or other platform specific docs?
This project is made available under the MIT License.