psyq-asm 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/LICENSE +56 -0
- package/README.md +220 -0
- package/bin/psyq-asm.mjs +149 -0
- package/dist/asm/assemble.d.ts +10 -0
- package/dist/asm/assemble.d.ts.map +1 -0
- package/dist/asm/assemble.js +42 -0
- package/dist/asm/assemble.js.map +1 -0
- package/dist/asm/diagnostics.d.ts +22 -0
- package/dist/asm/diagnostics.d.ts.map +1 -0
- package/dist/asm/diagnostics.js +40 -0
- package/dist/asm/diagnostics.js.map +1 -0
- package/dist/asm/directives.d.ts +67 -0
- package/dist/asm/directives.d.ts.map +1 -0
- package/dist/asm/directives.js +254 -0
- package/dist/asm/directives.js.map +1 -0
- package/dist/asm/expand.d.ts +21 -0
- package/dist/asm/expand.d.ts.map +1 -0
- package/dist/asm/expand.js +540 -0
- package/dist/asm/expand.js.map +1 -0
- package/dist/asm/hazards.d.ts +10 -0
- package/dist/asm/hazards.d.ts.map +1 -0
- package/dist/asm/hazards.js +196 -0
- package/dist/asm/hazards.js.map +1 -0
- package/dist/asm/layout.d.ts +17 -0
- package/dist/asm/layout.d.ts.map +1 -0
- package/dist/asm/layout.js +257 -0
- package/dist/asm/layout.js.map +1 -0
- package/dist/asm/lexer.d.ts +23 -0
- package/dist/asm/lexer.d.ts.map +1 -0
- package/dist/asm/lexer.js +81 -0
- package/dist/asm/lexer.js.map +1 -0
- package/dist/asm/object.d.ts +6 -0
- package/dist/asm/object.d.ts.map +1 -0
- package/dist/asm/object.js +46 -0
- package/dist/asm/object.js.map +1 -0
- package/dist/asm/operands.d.ts +49 -0
- package/dist/asm/operands.d.ts.map +1 -0
- package/dist/asm/operands.js +114 -0
- package/dist/asm/operands.js.map +1 -0
- package/dist/asm/parser.d.ts +28 -0
- package/dist/asm/parser.d.ts.map +1 -0
- package/dist/asm/parser.js +60 -0
- package/dist/asm/parser.js.map +1 -0
- package/dist/asm/relocations.d.ts +42 -0
- package/dist/asm/relocations.d.ts.map +1 -0
- package/dist/asm/relocations.js +214 -0
- package/dist/asm/relocations.js.map +1 -0
- package/dist/asm/sections.d.ts +23 -0
- package/dist/asm/sections.d.ts.map +1 -0
- package/dist/asm/sections.js +81 -0
- package/dist/asm/sections.js.map +1 -0
- package/dist/asm/stream.d.ts +77 -0
- package/dist/asm/stream.d.ts.map +1 -0
- package/dist/asm/stream.js +2 -0
- package/dist/asm/stream.js.map +1 -0
- package/dist/asm/symbols.d.ts +42 -0
- package/dist/asm/symbols.d.ts.map +1 -0
- package/dist/asm/symbols.js +122 -0
- package/dist/asm/symbols.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/isa/decode.d.ts +8 -0
- package/dist/isa/decode.d.ts.map +1 -0
- package/dist/isa/decode.js +92 -0
- package/dist/isa/decode.js.map +1 -0
- package/dist/isa/encode.d.ts +9 -0
- package/dist/isa/encode.d.ts.map +1 -0
- package/dist/isa/encode.js +124 -0
- package/dist/isa/encode.js.map +1 -0
- package/dist/isa/fields.d.ts +27 -0
- package/dist/isa/fields.d.ts.map +1 -0
- package/dist/isa/fields.js +49 -0
- package/dist/isa/fields.js.map +1 -0
- package/dist/isa/format.d.ts +14 -0
- package/dist/isa/format.d.ts.map +1 -0
- package/dist/isa/format.js +98 -0
- package/dist/isa/format.js.map +1 -0
- package/dist/isa/instruction.d.ts +15 -0
- package/dist/isa/instruction.d.ts.map +1 -0
- package/dist/isa/instruction.js +47 -0
- package/dist/isa/instruction.js.map +1 -0
- package/dist/isa/registers.d.ts +8 -0
- package/dist/isa/registers.d.ts.map +1 -0
- package/dist/isa/registers.js +55 -0
- package/dist/isa/registers.js.map +1 -0
- package/dist/isa/table.d.ts +179 -0
- package/dist/isa/table.d.ts.map +1 -0
- package/dist/isa/table.js +128 -0
- package/dist/isa/table.js.map +1 -0
- package/dist/options.d.ts +29 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +0 -0
- package/dist/options.js.map +1 -0
- package/dist/program/decode-words.d.ts +9 -0
- package/dist/program/decode-words.d.ts.map +1 -0
- package/dist/program/decode-words.js +87 -0
- package/dist/program/decode-words.js.map +1 -0
- package/dist/program/format-program.d.ts +12 -0
- package/dist/program/format-program.d.ts.map +1 -0
- package/dist/program/format-program.js +37 -0
- package/dist/program/format-program.js.map +1 -0
- package/dist/public-types.d.ts +253 -0
- package/dist/public-types.d.ts.map +1 -0
- package/dist/public-types.js +2 -0
- package/dist/public-types.js.map +1 -0
- package/dist/util.d.ts +3 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +11 -0
- package/dist/util.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Diagnostics, Position } from './diagnostics.js';
|
|
2
|
+
import { type Expr } from './operands.js';
|
|
3
|
+
export type Directive = {
|
|
4
|
+
readonly kind: 'section';
|
|
5
|
+
readonly name: string;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: 'align';
|
|
8
|
+
readonly power: number;
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: 'globl';
|
|
11
|
+
readonly name: string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: 'extern';
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly size?: number;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'common';
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly size: number;
|
|
20
|
+
readonly align?: number;
|
|
21
|
+
readonly local: boolean;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: 'values';
|
|
24
|
+
readonly unit: 1 | 2 | 4;
|
|
25
|
+
readonly values: readonly Expr[];
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: 'bytes';
|
|
28
|
+
readonly bytes: Uint8Array;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: 'space';
|
|
31
|
+
readonly size: number;
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: 'ent';
|
|
34
|
+
readonly name: string;
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: 'end';
|
|
37
|
+
readonly name?: string;
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: 'frame';
|
|
40
|
+
readonly reg: number;
|
|
41
|
+
readonly size: number;
|
|
42
|
+
readonly returnReg: number;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: 'mask' | 'fmask';
|
|
45
|
+
readonly bits: number;
|
|
46
|
+
readonly offset: number;
|
|
47
|
+
} | {
|
|
48
|
+
readonly kind: 'set';
|
|
49
|
+
readonly option: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Accepted and ignored. `transparent` directives are invisible to the nop
|
|
53
|
+
* pass's lookahead, as they are to maspsx's (`.loc` and COFF debugging
|
|
54
|
+
* records); the others end the lookahead.
|
|
55
|
+
*/
|
|
56
|
+
| {
|
|
57
|
+
readonly kind: 'ignored';
|
|
58
|
+
readonly transparent: boolean;
|
|
59
|
+
};
|
|
60
|
+
/** Decode the C-style escapes of a `.ascii` string body into bytes. */
|
|
61
|
+
export declare function decodeString(body: string): number[];
|
|
62
|
+
/**
|
|
63
|
+
* Recognize a directive and parse its arguments. Problems are reported to
|
|
64
|
+
* `diagnostics` and yield `undefined`.
|
|
65
|
+
*/
|
|
66
|
+
export declare function interpretDirective(name: string, text: string, at: Position, diagnostics: Diagnostics): Directive | undefined;
|
|
67
|
+
//# sourceMappingURL=directives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../src/asm/directives.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAA2B,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAA;CAAE,GACvF;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACnD;;;;GAIG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC;AAwFhE,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBnD;AA8JD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,QAAQ,EACZ,WAAW,EAAE,WAAW,GACvB,SAAS,GAAG,SAAS,CASvB"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/** Directive recognition and argument parsing (see docs/ASPSX-2.81.md, "Directives"). */
|
|
3
|
+
import { parseRegister } from '../isa/registers.js';
|
|
4
|
+
import { splitTopLevel } from './lexer.js';
|
|
5
|
+
import { parseExpr, parseInteger } from './operands.js';
|
|
6
|
+
const SECTIONS = new Set(['.text', '.data', '.rdata', '.sdata', '.sbss', '.bss']);
|
|
7
|
+
const SET_OPTIONS = new Set([
|
|
8
|
+
'reorder',
|
|
9
|
+
'noreorder',
|
|
10
|
+
'macro',
|
|
11
|
+
'nomacro',
|
|
12
|
+
'at',
|
|
13
|
+
'noat',
|
|
14
|
+
'volatile',
|
|
15
|
+
'novolatile',
|
|
16
|
+
]);
|
|
17
|
+
const TRANSPARENT_DEBUG = new Set(['.stabs', '.stabn', '.stabd', '.def', '.begin', '.bend']);
|
|
18
|
+
const OPAQUE_DEBUG = new Set(['.type', '.size', '.val', '.scl', '.endef', '.dim', '.tag', '.line']);
|
|
19
|
+
const SYMBOL_NAME = /^[A-Za-z_.$][A-Za-z0-9_.$]*$/;
|
|
20
|
+
/**
|
|
21
|
+
* Largest `.space` or `.comm` size accepted: 16 MiB, eight times a PlayStation's
|
|
22
|
+
* main memory. A bound keeps a malformed size from exhausting memory.
|
|
23
|
+
*/
|
|
24
|
+
const MAX_RESERVATION = 0x1000000;
|
|
25
|
+
/** Internal: a malformed directive, turned into a diagnostic by `interpretDirective`. */
|
|
26
|
+
class DirectiveError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
constructor(message, code = 'invalid-directive') {
|
|
29
|
+
super(message);
|
|
30
|
+
this.code = code;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function args(text) {
|
|
34
|
+
return text === '' ? [] : splitTopLevel(text, ',').map((p) => p.text.trim());
|
|
35
|
+
}
|
|
36
|
+
function expectCount(name, list, min, max) {
|
|
37
|
+
if (list.length < min || list.length > max) {
|
|
38
|
+
const range = min === max ? String(min) : `${String(min)} to ${String(max)}`;
|
|
39
|
+
throw new DirectiveError(`${name} takes ${range} argument${max === 1 ? '' : 's'}, not ${String(list.length)}.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function symbolArg(name, text) {
|
|
43
|
+
const t = String(text);
|
|
44
|
+
if (!SYMBOL_NAME.test(t))
|
|
45
|
+
throw new DirectiveError(`${name}: ${JSON.stringify(t)} is not a symbol name.`);
|
|
46
|
+
return t;
|
|
47
|
+
}
|
|
48
|
+
function integerArg(name, text, min, max) {
|
|
49
|
+
const parsed = parseInteger(String(text));
|
|
50
|
+
if (!parsed.ok)
|
|
51
|
+
throw new DirectiveError(`${name}: ${parsed.message}`, parsed.code === 'invalid-operand' ? 'invalid-directive' : parsed.code);
|
|
52
|
+
if (parsed.value < min || parsed.value > max) {
|
|
53
|
+
throw new DirectiveError(`${name}: ${String(parsed.value)} is outside ${String(min)} to ${String(max)}.`, 'immediate-out-of-range');
|
|
54
|
+
}
|
|
55
|
+
return parsed.value;
|
|
56
|
+
}
|
|
57
|
+
function registerArg(name, text) {
|
|
58
|
+
const n = parseRegister(String(text));
|
|
59
|
+
if (n === undefined)
|
|
60
|
+
throw new DirectiveError(`${name}: ${JSON.stringify(String(text))} is not a register.`);
|
|
61
|
+
return n;
|
|
62
|
+
}
|
|
63
|
+
const SIMPLE_ESCAPES = {
|
|
64
|
+
n: 10,
|
|
65
|
+
t: 9,
|
|
66
|
+
r: 13,
|
|
67
|
+
b: 8,
|
|
68
|
+
f: 12,
|
|
69
|
+
v: 11,
|
|
70
|
+
'\\': 92,
|
|
71
|
+
'"': 34,
|
|
72
|
+
"'": 39,
|
|
73
|
+
};
|
|
74
|
+
/** Decode the C-style escapes of a `.ascii` string body into bytes. */
|
|
75
|
+
export function decodeString(body) {
|
|
76
|
+
const bytes = [];
|
|
77
|
+
const encoder = new TextEncoder();
|
|
78
|
+
for (let i = 0; i < body.length; i++) {
|
|
79
|
+
const c = String(body[i]);
|
|
80
|
+
if (c !== '\\') {
|
|
81
|
+
bytes.push(...encoder.encode(c));
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const rest = body.slice(i + 1);
|
|
85
|
+
const octal = /^[0-7]{1,3}/.exec(rest);
|
|
86
|
+
const hex = /^x([0-9a-fA-F]+)/.exec(rest);
|
|
87
|
+
if (octal !== null) {
|
|
88
|
+
bytes.push(Number.parseInt(octal[0], 8) & 0xff);
|
|
89
|
+
i += octal[0].length;
|
|
90
|
+
}
|
|
91
|
+
else if (hex !== null) {
|
|
92
|
+
bytes.push(Number.parseInt(String(hex[1]), 16) & 0xff);
|
|
93
|
+
i += hex[0].length;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const next = rest.charAt(0);
|
|
97
|
+
bytes.push(SIMPLE_ESCAPES[next] ?? next.charCodeAt(0));
|
|
98
|
+
i += 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return bytes;
|
|
102
|
+
}
|
|
103
|
+
function stringsArg(name, text) {
|
|
104
|
+
const list = args(text);
|
|
105
|
+
if (list.length === 0)
|
|
106
|
+
throw new DirectiveError(`${name} needs at least one argument.`);
|
|
107
|
+
return list.flatMap((item) => {
|
|
108
|
+
if (item.length < 2 || !item.startsWith('"') || !item.endsWith('"')) {
|
|
109
|
+
throw new DirectiveError(`${name}: ${item} is not a quoted string.`);
|
|
110
|
+
}
|
|
111
|
+
return decodeString(item.slice(1, -1));
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function valuesArg(name, text, unit) {
|
|
115
|
+
const list = args(text);
|
|
116
|
+
if (list.length === 0)
|
|
117
|
+
throw new DirectiveError(`${name} needs at least one argument.`);
|
|
118
|
+
return list.map((item) => {
|
|
119
|
+
const parsed = parseExpr(item);
|
|
120
|
+
if (!parsed.ok)
|
|
121
|
+
throw new DirectiveError(`${name}: ${parsed.message}`, parsed.code === 'invalid-operand' ? 'invalid-directive' : parsed.code);
|
|
122
|
+
if (unit !== 4 && parsed.value.kind !== 'number') {
|
|
123
|
+
throw new DirectiveError(`${name} can hold only numbers; use .word for ${item}.`, 'unsupported-syntax');
|
|
124
|
+
}
|
|
125
|
+
return parsed.value;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function interpret(name, text, at, diagnostics) {
|
|
129
|
+
if (SECTIONS.has(name)) {
|
|
130
|
+
expectCount(name, args(text), 0, 0);
|
|
131
|
+
return { kind: 'section', name };
|
|
132
|
+
}
|
|
133
|
+
switch (name) {
|
|
134
|
+
case '.section': {
|
|
135
|
+
const section = text.split(/[\s,]/, 1).join('');
|
|
136
|
+
if (section === '')
|
|
137
|
+
throw new DirectiveError('.section needs a section name.');
|
|
138
|
+
return { kind: 'section', name: section };
|
|
139
|
+
}
|
|
140
|
+
case '.align': {
|
|
141
|
+
const list = args(text);
|
|
142
|
+
expectCount(name, list, 1, 1);
|
|
143
|
+
return { kind: 'align', power: integerArg(name, list[0], 0, 15) };
|
|
144
|
+
}
|
|
145
|
+
case '.globl':
|
|
146
|
+
case '.global': {
|
|
147
|
+
const list = args(text);
|
|
148
|
+
expectCount(name, list, 1, 1);
|
|
149
|
+
return { kind: 'globl', name: symbolArg(name, list[0]) };
|
|
150
|
+
}
|
|
151
|
+
case '.extern': {
|
|
152
|
+
const list = args(text);
|
|
153
|
+
expectCount(name, list, 1, 2);
|
|
154
|
+
const symbol = symbolArg(name, list[0]);
|
|
155
|
+
return list.length === 2
|
|
156
|
+
? { kind: 'extern', name: symbol, size: integerArg(name, list[1], 0, 0x7fffffff) }
|
|
157
|
+
: { kind: 'extern', name: symbol };
|
|
158
|
+
}
|
|
159
|
+
case '.comm':
|
|
160
|
+
case '.lcomm': {
|
|
161
|
+
const list = args(text);
|
|
162
|
+
expectCount(name, list, 2, 3);
|
|
163
|
+
const base = {
|
|
164
|
+
kind: 'common',
|
|
165
|
+
name: symbolArg(name, list[0]),
|
|
166
|
+
size: integerArg(name, list[1], 0, MAX_RESERVATION),
|
|
167
|
+
local: name === '.lcomm',
|
|
168
|
+
};
|
|
169
|
+
return list.length === 3 ? { ...base, align: integerArg(name, list[2], 1, 0x8000) } : base;
|
|
170
|
+
}
|
|
171
|
+
case '.word':
|
|
172
|
+
return { kind: 'values', unit: 4, values: valuesArg(name, text, 4) };
|
|
173
|
+
case '.half':
|
|
174
|
+
case '.short':
|
|
175
|
+
return { kind: 'values', unit: 2, values: valuesArg(name, text, 2) };
|
|
176
|
+
case '.byte':
|
|
177
|
+
return { kind: 'values', unit: 1, values: valuesArg(name, text, 1) };
|
|
178
|
+
case '.ascii':
|
|
179
|
+
return { kind: 'bytes', bytes: Uint8Array.from(stringsArg(name, text)) };
|
|
180
|
+
case '.asciiz':
|
|
181
|
+
return { kind: 'bytes', bytes: Uint8Array.from([...stringsArg(name, text), 0]) };
|
|
182
|
+
case '.space':
|
|
183
|
+
case '.skip': {
|
|
184
|
+
const list = args(text);
|
|
185
|
+
expectCount(name, list, 1, 1);
|
|
186
|
+
return { kind: 'space', size: integerArg(name, list[0], 0, MAX_RESERVATION) };
|
|
187
|
+
}
|
|
188
|
+
case '.ent': {
|
|
189
|
+
const list = args(text);
|
|
190
|
+
expectCount(name, list, 1, 1);
|
|
191
|
+
return { kind: 'ent', name: symbolArg(name, list[0]) };
|
|
192
|
+
}
|
|
193
|
+
case '.end': {
|
|
194
|
+
const list = args(text);
|
|
195
|
+
expectCount(name, list, 0, 1);
|
|
196
|
+
return list.length === 1 ? { kind: 'end', name: symbolArg(name, list[0]) } : { kind: 'end' };
|
|
197
|
+
}
|
|
198
|
+
case '.frame': {
|
|
199
|
+
const list = args(text);
|
|
200
|
+
expectCount(name, list, 3, 3);
|
|
201
|
+
return {
|
|
202
|
+
kind: 'frame',
|
|
203
|
+
reg: registerArg(name, list[0]),
|
|
204
|
+
size: integerArg(name, list[1], 0, 0x7fffffff),
|
|
205
|
+
returnReg: registerArg(name, list[2]),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
case '.mask':
|
|
209
|
+
case '.fmask': {
|
|
210
|
+
const list = args(text);
|
|
211
|
+
expectCount(name, list, 2, 2);
|
|
212
|
+
return {
|
|
213
|
+
kind: name === '.mask' ? 'mask' : 'fmask',
|
|
214
|
+
bits: integerArg(name, list[0], -0x80000000, 0xffffffff) >>> 0,
|
|
215
|
+
offset: integerArg(name, list[1], -0x80000000, 0x7fffffff),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
case '.set': {
|
|
219
|
+
const option = text.trim();
|
|
220
|
+
if (!SET_OPTIONS.has(option)) {
|
|
221
|
+
diagnostics.warning(at, 'ignored-directive', `.set ${option} is not a known option and is ignored.`);
|
|
222
|
+
}
|
|
223
|
+
return { kind: 'set', option };
|
|
224
|
+
}
|
|
225
|
+
case '.file':
|
|
226
|
+
return { kind: 'ignored', transparent: false };
|
|
227
|
+
case '.loc':
|
|
228
|
+
return { kind: 'ignored', transparent: true };
|
|
229
|
+
default:
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
if (TRANSPARENT_DEBUG.has(name) || OPAQUE_DEBUG.has(name)) {
|
|
233
|
+
diagnostics.warnOnce('debug-directives', at, 'ignored-directive', `debugging directives such as ${name} are ignored.`);
|
|
234
|
+
return { kind: 'ignored', transparent: TRANSPARENT_DEBUG.has(name) };
|
|
235
|
+
}
|
|
236
|
+
diagnostics.error(at, 'unknown-directive', `unknown directive ${name}.`);
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Recognize a directive and parse its arguments. Problems are reported to
|
|
241
|
+
* `diagnostics` and yield `undefined`.
|
|
242
|
+
*/
|
|
243
|
+
export function interpretDirective(name, text, at, diagnostics) {
|
|
244
|
+
try {
|
|
245
|
+
return interpret(name, text, at, diagnostics);
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
// `interpret` throws nothing but DirectiveError: argument parsing is pure.
|
|
249
|
+
const failure = error;
|
|
250
|
+
diagnostics.error(at, failure.code, failure.message);
|
|
251
|
+
return undefined;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=directives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/asm/directives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type IsaRow } from '../isa/table.js';
|
|
2
|
+
import type { SmallDataEntry } from '../public-types.js';
|
|
3
|
+
import type { Diagnostics } from './diagnostics.js';
|
|
4
|
+
import type { SourceOperand } from './operands.js';
|
|
5
|
+
import type { Statement } from './parser.js';
|
|
6
|
+
import type { Item, PendingArg, PendingWord } from './stream.js';
|
|
7
|
+
export interface ExpandContext {
|
|
8
|
+
readonly gpSize: number;
|
|
9
|
+
readonly smallData: ReadonlyMap<string, SmallDataEntry>;
|
|
10
|
+
readonly partialDivExpansion: boolean;
|
|
11
|
+
readonly diagnostics: Diagnostics;
|
|
12
|
+
}
|
|
13
|
+
type Operands = readonly SourceOperand[];
|
|
14
|
+
/** `li rd,value` as ASPSX 2.56 and later expand it. */
|
|
15
|
+
export declare function loadImmediate(rd: number, n: number): PendingWord[];
|
|
16
|
+
/** Match operands to a table row's syntax, or explain why they do not fit. */
|
|
17
|
+
export declare function bindNative(row: IsaRow, given: Operands): PendingArg[] | string;
|
|
18
|
+
/** Turn statements into the stream the nop and layout passes work on. */
|
|
19
|
+
export declare function expand(statements: readonly Statement[], ctx: ExpandContext): Item[];
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=expand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/asm/expand.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,MAAM,EAAsB,MAAM,iBAAiB,CAAC;AACpF,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAQ,aAAa,EAAc,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,IAAI,EAAW,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxD,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAGD,KAAK,QAAQ,GAAG,SAAS,aAAa,EAAE,CAAC;AA6JzC,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAKlE;AA6TD,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,UAAU,EAAE,GAAG,MAAM,CAsB9E;AAuBD,yEAAyE;AACzE,wBAAgB,MAAM,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,EAAE,CA8DnF"}
|