Skip to content

Commit 587dd7b

Browse files
committed
[ASM] Support implicit comment after instruction and operands
- [F3850] Support implicit comment - [MC6800] Support implicit comment - [MC6805] Support implicit comment - [MC6809] Support implicit comment - [MC68000] Support implicit comment - [MN1610] Support implicit comment - [MOS6502] Support implicit comment - [SCN2650] Support implicit comment - [TMS7000] Support implicit comment - [TMS9900] Support implicit comment
1 parent 9c37bdf commit 587dd7b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+533
-392
lines changed

driver/asm_directive.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ Error AsmDirective::encode(StrScanner &scan, Insn &insn, Context &context) {
8888
_assembler.setCurrentLocation(insn.address());
8989

9090
const auto &parser = _assembler.parser();
91-
if (parser.commentLine(scan))
91+
auto p = scan;
92+
if (parser.commentLine(p))
9293
return OK;
9394

9495
auto error = OK;

src/asm_base.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,6 @@ Error Assembler::encode(const char *line, Insn &insn, SymbolTable *symtab) {
119119

120120
if (error == OK)
121121
insn.setAt(scan);
122-
if (!_parser.endOfLine(scan.skipSpaces()))
123-
return insn.setErrorIf(scan, GARBAGE_AT_END);
124122
return insn.getError();
125123
}
126124

@@ -322,11 +320,11 @@ Error Assembler::isString(StrScanner &scan, ErrorAt &error) const {
322320
if (delim == 0)
323321
return NOT_AN_EXPECTED;
324322

325-
while (!endOfLine(p)) {
323+
while (*p) {
326324
if (*p == delim) {
327325
auto a = p;
328326
a += 1; // skip possible delimiter
329-
if (endOfLine(a.skipSpaces()) || *a == ',') {
327+
if (endOfLine(a) || *a == ',') {
330328
scan = p;
331329
return OK;
332330
}
@@ -394,7 +392,7 @@ Error Assembler::defineDataConstant(StrScanner &scan, Insn &insn, uint8_t dataTy
394392
const auto at = p;
395393
ErrorAt exprErr;
396394
const auto value = parseExpr(p, exprErr);
397-
if (!endOfLine(p.skipSpaces()) && *p != ',')
395+
if (!endOfLine(p) && *p != ',')
398396
exprErr.setErrorIf(at, ILLEGAL_CONSTANT);
399397
if (!exprErr.hasError()) {
400398
auto v = value.getUnsigned();
@@ -540,7 +538,7 @@ Error Assembler::defineFloatConstant(StrScanner &scan, Insn &insn, uint8_t dataT
540538
p = end;
541539
}
542540
}
543-
if (!endOfLine(p.skipSpaces()) && *p != ',')
541+
if (!endOfLine(p) && *p != ',')
544542
exprErr.setErrorIf(at, ILLEGAL_CONSTANT);
545543
if (!exprErr.hasError()) {
546544
switch (type) {

src/asm_base.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ struct Assembler : private ValueParser::Locator {
3737
virtual void reset();
3838

3939
const ValueParser &parser() const { return _parser; }
40-
bool endOfLine(const StrScanner &scan) const { return _parser.endOfLine(scan); }
40+
bool endOfLine(StrScanner &scan) const { return _parser.endOfLine(scan); }
4141
/** Parse |expr| text and get value. */
4242
Value parseExpr(StrScanner &expr, ErrorAt &error, char delim = 0) const;
4343

src/asm_cdp1802.cpp

+33-2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,35 @@ constexpr Pseudo PSEUDOS[] PROGMEM = {
3939
// clang-format on
4040
PROGMEM constexpr Pseudos PSEUDO_TABLE{ARRAY_RANGE(PSEUDOS)};
4141

42+
/**
43+
* RCA style numbers are the same as IBM plus '#hh' for hexadecimal.
44+
*/
45+
struct RcaNumberParser final : NumberParser {
46+
Error parseNumber(StrScanner &scan, Value &val) const override {
47+
auto p = scan;
48+
if (*p == '#' && isxdigit(p[1])) {
49+
const auto error = val.parseNumber(++p, RADIX_16);
50+
if (error == OK)
51+
scan = p;
52+
return error;
53+
}
54+
return _ibm.parseNumber(scan, val);
55+
}
56+
57+
private:
58+
const IbmNumberParser _ibm{'X', 'B', 0, 'D'};
59+
};
60+
61+
struct RcaCommentParser final : CommentParser {
62+
bool commentLine(StrScanner &scan) const override {
63+
static constexpr char TEXT_DOTDOT[] PROGMEM = "..";
64+
return scan.iexpectText_P(TEXT_DOTDOT) || endOfLine(scan);
65+
}
66+
bool endOfLine(StrScanner &scan) const override {
67+
return SemicolonCommentParser::singleton().endOfLine(scan);
68+
}
69+
};
70+
4271
struct RcaSymbolParser final : SymbolParser {
4372
bool functionNameLetter(char c) const override { return symbolLetter(c) || c == '.'; }
4473
bool instructionLetter(char c) const override {
@@ -66,14 +95,16 @@ struct RcaFunctionTable final : FunctionTable {
6695

6796
const ValueParser::Plugins &AsmCdp1802::defaultPlugins() {
6897
static const struct final : ValueParser::Plugins {
69-
const NumberParser &number() const override { return RcaNumberParser::singleton(); }
70-
const CommentParser &comment() const override { return RcaCommentParser::singleton(); }
98+
const NumberParser &number() const override { return _number; }
99+
const CommentParser &comment() const override { return _comment; }
71100
const SymbolParser &symbol() const override { return _symbol; }
72101
const LetterParser &letter() const override { return _letter; }
73102
const LocationParser &location() const override {
74103
return AsteriskLocationParser::singleton();
75104
}
76105
const FunctionTable &function() const override { return _function; }
106+
const RcaNumberParser _number{};
107+
const RcaCommentParser _comment{};
77108
const RcaSymbolParser _symbol{};
78109
const RcaLetterParser _letter{};
79110
const RcaFunctionTable _function{};

src/asm_f3850.cpp

+10-9
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,8 @@ AsmF3850::AsmF3850(const ValueParser::Plugins &plugins)
6060

6161
Error AsmF3850::parseOperand(StrScanner &scan, Operand &op) const {
6262
op.setAt(scan.skipSpaces());
63-
if (endOfLine(scan))
64-
return OK;
65-
6663
auto p = scan;
64+
6765
auto reg = parseRegName(p);
6866
if (reg != REG_UNDEF) {
6967
if (int8_t(reg) < int8_t(REG_alias)) {
@@ -79,6 +77,7 @@ Error AsmF3850::parseOperand(StrScanner &scan, Operand &op) const {
7977
}
8078

8179
auto val = parseExpr(p.skipSpaces(), op);
80+
8281
if (op.hasError())
8382
return op.getError();
8483
op.val16 = val.getUnsigned();
@@ -162,13 +161,15 @@ void AsmF3850::encodeOperand(AsmInsn &insn, const Operand &op, AddrMode mode) co
162161

163162
Error AsmF3850::encodeImpl(StrScanner &scan, Insn &_insn) const {
164163
AsmInsn insn(_insn);
165-
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
166-
return _insn.setError(insn.op1);
167-
if (scan.skipSpaces().expect(',')) {
168-
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
169-
return _insn.setError(insn.op2);
170-
scan.skipSpaces();
164+
if (TABLE.hasOperand(cpuType(), insn)) {
165+
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
166+
return _insn.setError(insn.op1);
167+
if (scan.skipSpaces().expect(',')) {
168+
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
169+
return _insn.setError(insn.op2);
170+
}
171171
}
172+
scan.skipSpaces();
172173

173174
if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
174175
return _insn.getError();

src/asm_mc6800.cpp

+13-12
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ AsmMc6800::AsmMc6800(const ValueParser::Plugins &plugins)
6666
Error AsmMc6800::parseOperand(StrScanner &scan, Operand &op) const {
6767
auto p = scan.skipSpaces();
6868
op.setAt(p);
69-
if (endOfLine(p) || *p == ',') {
69+
if (*p == ',') {
7070
op.mode = M_NONE;
7171
scan = p;
7272
return OK;
@@ -197,18 +197,19 @@ void AsmMc6800::emitOperand(AsmInsn &insn, AddrMode mode, const Operand &op) con
197197

198198
Error AsmMc6800::encodeImpl(StrScanner &scan, Insn &_insn) const {
199199
AsmInsn insn(_insn);
200-
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
201-
return _insn.setError(insn.op1);
202-
if (scan.skipSpaces().expect(',')) {
203-
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
204-
return _insn.setError(insn.op2);
205-
scan.skipSpaces();
206-
}
207-
if (scan.expect(',')) {
208-
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
209-
return _insn.setError(insn.op3);
210-
scan.skipSpaces();
200+
if (TABLE.hasOperand(cpuType(), insn)) {
201+
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
202+
return _insn.setError(insn.op1);
203+
if (scan.skipSpaces().expect(',')) {
204+
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
205+
return _insn.setError(insn.op2);
206+
}
207+
if (scan.skipSpaces().expect(',')) {
208+
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
209+
return _insn.setError(insn.op3);
210+
}
211211
}
212+
scan.skipSpaces();
212213

213214
if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
214215
return _insn.getError();

src/asm_mc68000.cpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,7 @@ Error AsmMc68000::parseOperand(StrScanner &scan, Operand &op) const {
595595
op.setAt(op.list = p);
596596
if (endOfLine(p))
597597
return OK;
598+
598599
if (p.expect('#')) {
599600
auto text = p;
600601
op.val32 = parseExpr32(p, op);
@@ -762,13 +763,15 @@ Error AsmMc68000::encodeImpl(StrScanner &scan, Insn &_insn) const {
762763
if (isize == ISZ_ERROR)
763764
return _insn.setError(scan, ILLEGAL_SIZE);
764765

765-
if (parseOperand(scan, insn.srcOp) && insn.srcOp.hasError())
766-
return _insn.setError(insn.srcOp);
767-
if (scan.skipSpaces().expect(',')) {
768-
if (parseOperand(scan, insn.dstOp) && insn.dstOp.hasError())
769-
return _insn.setError(insn.dstOp);
770-
scan.skipSpaces();
766+
if (TABLE.hasOperand(_cpuSpec, insn)) {
767+
if (parseOperand(scan, insn.srcOp) && insn.srcOp.hasError())
768+
return _insn.setError(insn.srcOp);
769+
if (scan.skipSpaces().expect(',')) {
770+
if (parseOperand(scan, insn.dstOp) && insn.dstOp.hasError())
771+
return _insn.setError(insn.dstOp);
772+
}
771773
}
774+
scan.skipSpaces();
772775

773776
if (_insn.setErrorIf(insn.srcOp, TABLE.searchName(_cpuSpec, insn)))
774777
return _insn.getError();

src/asm_mc6805.cpp

+12-15
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,6 @@ Error AsmMc6805::setPcBits(int32_t value) {
8888
Error AsmMc6805::parseOperand(StrScanner &scan, Operand &op) const {
8989
auto p = scan.skipSpaces();
9090
op.setAt(p);
91-
if (endOfLine(p)) {
92-
op.mode = M_NONE;
93-
return OK;
94-
}
9591

9692
if (p.expect('#')) {
9793
op.val16 = parseExpr16(p, op);
@@ -244,18 +240,19 @@ void AsmMc6805::emitOperand(AsmInsn &insn, AddrMode mode, const Operand &op) con
244240

245241
Error AsmMc6805::encodeImpl(StrScanner &scan, Insn &_insn) const {
246242
AsmInsn insn(_insn);
247-
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
248-
return _insn.setError(insn.op1);
249-
if (scan.skipSpaces().expect(',')) {
250-
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
251-
return _insn.setError(insn.op2);
252-
scan.skipSpaces();
253-
}
254-
if (scan.expect(',')) {
255-
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
256-
return _insn.setError(insn.op3);
257-
scan.skipSpaces();
243+
if (TABLE.hasOperand(cpuType(), insn)) {
244+
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
245+
return _insn.setError(insn.op1);
246+
if (scan.skipSpaces().expect(',')) {
247+
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
248+
return _insn.setError(insn.op2);
249+
}
250+
if (scan.skipSpaces().expect(',')) {
251+
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
252+
return _insn.setError(insn.op3);
253+
}
258254
}
255+
scan.skipSpaces();
259256

260257
if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
261258
return _insn.getError();

src/asm_mc6809.cpp

+29-21
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ void AsmMc6809::encodeRegisterList(AsmInsn &insn, const Operand &op) const {
236236
uint8_t post = 0;
237237
auto p = op.list;
238238
while (true) {
239-
p.skipSpaces();
240239
const auto r = p;
241240
auto reg = parseRegName(p);
242241
if (reg == REG_UNDEF)
@@ -247,12 +246,13 @@ void AsmMc6809::encodeRegisterList(AsmInsn &insn, const Operand &op) const {
247246
if (post & bit)
248247
insn.setErrorIf(r, DUPLICATE_REGISTER);
249248
post |= bit;
250-
if (endOfLine(p.skipSpaces()))
251-
break;
252-
if (!p.expect(',')) {
253-
insn.setErrorIf(p, UNKNOWN_OPERAND);
254-
break;
249+
auto end = p;
250+
if (p.skipSpaces().expect(',')) {
251+
p.skipSpaces();
252+
continue;
255253
}
254+
if (endOfLine(end))
255+
break;
256256
}
257257
insn.emitOperand8(post);
258258
}
@@ -497,8 +497,8 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
497497
op.val32 = parseExpr32(p, op);
498498
}
499499

500-
const auto endOfIndex = p.skipSpaces();
501-
if (!p.expect(',')) {
500+
auto indexEnd = p;
501+
if (!p.skipSpaces().expect(',')) {
502502
if (index == REG_UNDEF) {
503503
if (op.indir) {
504504
if (!p.expect(']'))
@@ -517,7 +517,7 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
517517
scan = p;
518518
return OK;
519519
}
520-
if (endOfLine(p)) {
520+
if (endOfLine(indexEnd)) {
521521
op.index = index;
522522
op.mode = M_LIST;
523523
op.extra = 1; // single register
@@ -552,7 +552,7 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
552552
op.index = index;
553553
op.mode = M_LIST;
554554
op.extra = 1;
555-
scan = endOfIndex;
555+
scan = indexEnd;
556556
return OK;
557557
}
558558

@@ -575,15 +575,21 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
575575
if (op.indir)
576576
return op.setError(UNKNOWN_OPERAND);
577577
// actual parsing happens on |encodeRegisterList|.
578-
while (!endOfLine(p))
579-
p += 1;
580578
op.mode = M_LIST;
581579
op.extra = 2; // multiple registers
582-
scan = p;
583-
return OK;
580+
while (true) {
581+
auto end = p;
582+
if (parseRegName(p.skipSpaces()) != REG_UNDEF) {
583+
end = p;
584+
if (p.skipSpaces().expect(','))
585+
continue;
586+
}
587+
scan = end;
588+
return OK;
589+
}
584590
}
585591

586-
return OK;
592+
return endOfLine(scan) ? OK : op.setError(UNKNOWN_OPERAND);
587593
}
588594

589595
Error AsmMc6809::processPseudo(StrScanner &scan, Insn &insn) {
@@ -601,13 +607,15 @@ Error AsmMc6809::encodeImpl(StrScanner &scan, Insn &_insn) const {
601607
if (error)
602608
return _insn.setError(error);
603609

604-
if (parseOperand(scan, insn.op1, insn.mode1()) && insn.op1.hasError())
605-
return _insn.setError(insn.op1);
606-
if (scan.skipSpaces().expect(',')) {
607-
if (parseOperand(scan, insn.op2, insn.mode2()) && insn.op2.hasError())
608-
return _insn.setError(insn.op2);
609-
scan.skipSpaces();
610+
if (insn.mode1() != M_NONE) {
611+
if (parseOperand(scan, insn.op1, insn.mode1()) && insn.op1.hasError())
612+
return _insn.setError(insn.op1);
613+
if (insn.mode2() != M_NONE && scan.skipSpaces().expect(',')) {
614+
if (parseOperand(scan, insn.op2, insn.mode2()) && insn.op2.hasError())
615+
return _insn.setError(insn.op2);
616+
}
610617
}
618+
scan.skipSpaces();
611619

612620
if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
613621
return _insn.getError();

0 commit comments

Comments
 (0)