Skip to content

Commit

Permalink
[ASM] Support implicit comment after instruction and operands
Browse files Browse the repository at this point in the history
- [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
  • Loading branch information
tgtakaoka committed Jun 6, 2024
1 parent e22f998 commit 6687ab4
Show file tree
Hide file tree
Showing 60 changed files with 679 additions and 539 deletions.
5 changes: 3 additions & 2 deletions driver/asm_directive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ Error AsmDirective::encode(StrScanner &scan, Insn &insn, Context &context) {
_assembler.setCurrentLocation(insn.address());

const auto &parser = _assembler.parser();
if (parser.commentLine(scan))
auto p = scan;
if (parser.commentLine(p))
return OK;

auto error = OK;
Expand All @@ -99,7 +100,7 @@ Error AsmDirective::encode(StrScanner &scan, Insn &insn, Context &context) {
StrScanner directive;
parser.readInstruction(p, directive);
error = processPseudo(directive, p.skipSpaces(), context);
if (error == OK && !parser.endOfLine(p.skipSpaces()))
if (error == OK && !parser.endOfLine(p))
setError(p, GARBAGE_AT_END);
}
if (context.label.size()) {
Expand Down
10 changes: 4 additions & 6 deletions src/asm_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,6 @@ Error Assembler::encode(const char *line, Insn &insn, SymbolTable *symtab) {

if (error == OK)
insn.setAt(scan);
if (!_parser.endOfLine(scan.skipSpaces()))
return insn.setErrorIf(scan, GARBAGE_AT_END);
return insn.getError();
}

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

while (!endOfLine(p)) {
while (*p) {
if (*p == delim) {
auto a = p;
a += 1; // skip possible delimiter
if (endOfLine(a.skipSpaces()) || *a == ',') {
if (endOfLine(a) || *a == ',') {
scan = p;
return OK;
}
Expand Down Expand Up @@ -394,7 +392,7 @@ Error Assembler::defineDataConstant(StrScanner &scan, Insn &insn, uint8_t dataTy
const auto at = p;
ErrorAt exprErr;
const auto value = parseExpr(p, exprErr);
if (!endOfLine(p.skipSpaces()) && *p != ',')
if (!endOfLine(p) && *p != ',')
exprErr.setErrorIf(at, ILLEGAL_CONSTANT);
if (!exprErr.hasError()) {
auto v = value.getUnsigned();
Expand Down Expand Up @@ -540,7 +538,7 @@ Error Assembler::defineFloatConstant(StrScanner &scan, Insn &insn, uint8_t dataT
p = end;
}
}
if (!endOfLine(p.skipSpaces()) && *p != ',')
if (!endOfLine(p) && *p != ',')
exprErr.setErrorIf(at, ILLEGAL_CONSTANT);
if (!exprErr.hasError()) {
switch (type) {
Expand Down
2 changes: 1 addition & 1 deletion src/asm_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ struct Assembler : private ValueParser::Locator {
virtual void reset();

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

Expand Down
35 changes: 33 additions & 2 deletions src/asm_cdp1802.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,35 @@ constexpr Pseudo PSEUDOS[] PROGMEM = {
// clang-format on
PROGMEM constexpr Pseudos PSEUDO_TABLE{ARRAY_RANGE(PSEUDOS)};

/**
* RCA style numbers are the same as IBM plus '#hh' for hexadecimal.
*/
struct RcaNumberParser final : NumberParser {
Error parseNumber(StrScanner &scan, Value &val) const override {
auto p = scan;
if (*p == '#' && isxdigit(p[1])) {
const auto error = val.parseNumber(++p, RADIX_16);
if (error == OK)
scan = p;
return error;
}
return _ibm.parseNumber(scan, val);
}

private:
const IbmNumberParser _ibm{'X', 'B', 0, 'D'};
};

struct RcaCommentParser final : CommentParser {
bool commentLine(StrScanner &scan) const override {
static constexpr char TEXT_DOTDOT[] PROGMEM = "..";
return scan.iexpectText_P(TEXT_DOTDOT) || endOfLine(scan);
}
bool endOfLine(StrScanner &scan) const override {
return SemicolonCommentParser::singleton().endOfLine(scan);
}
};

struct RcaSymbolParser final : SymbolParser {
bool functionNameLetter(char c) const override { return symbolLetter(c) || c == '.'; }
bool instructionLetter(char c) const override {
Expand Down Expand Up @@ -66,14 +95,16 @@ struct RcaFunctionTable final : FunctionTable {

const ValueParser::Plugins &AsmCdp1802::defaultPlugins() {
static const struct final : ValueParser::Plugins {
const NumberParser &number() const override { return RcaNumberParser::singleton(); }
const CommentParser &comment() const override { return RcaCommentParser::singleton(); }
const NumberParser &number() const override { return _number; }
const CommentParser &comment() const override { return _comment; }
const SymbolParser &symbol() const override { return _symbol; }
const LetterParser &letter() const override { return _letter; }
const LocationParser &location() const override {
return AsteriskLocationParser::singleton();
}
const FunctionTable &function() const override { return _function; }
const RcaNumberParser _number{};
const RcaCommentParser _comment{};
const RcaSymbolParser _symbol{};
const RcaLetterParser _letter{};
const RcaFunctionTable _function{};
Expand Down
19 changes: 10 additions & 9 deletions src/asm_f3850.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,8 @@ AsmF3850::AsmF3850(const ValueParser::Plugins &plugins)

Error AsmF3850::parseOperand(StrScanner &scan, Operand &op) const {
op.setAt(scan.skipSpaces());
if (endOfLine(scan))
return OK;

auto p = scan;

auto reg = parseRegName(p);
if (reg != REG_UNDEF) {
if (int8_t(reg) < int8_t(REG_alias)) {
Expand All @@ -79,6 +77,7 @@ Error AsmF3850::parseOperand(StrScanner &scan, Operand &op) const {
}

auto val = parseExpr(p.skipSpaces(), op);

if (op.hasError())
return op.getError();
op.val16 = val.getUnsigned();
Expand Down Expand Up @@ -162,13 +161,15 @@ void AsmF3850::encodeOperand(AsmInsn &insn, const Operand &op, AddrMode mode) co

Error AsmF3850::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
return _insn.setError(insn.op2);
scan.skipSpaces();
if (TABLE.hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
return _insn.setError(insn.op2);
}
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
Expand Down
25 changes: 13 additions & 12 deletions src/asm_mc6800.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ AsmMc6800::AsmMc6800(const ValueParser::Plugins &plugins)
Error AsmMc6800::parseOperand(StrScanner &scan, Operand &op) const {
auto p = scan.skipSpaces();
op.setAt(p);
if (endOfLine(p) || *p == ',') {
if (*p == ',') {
op.mode = M_NONE;
scan = p;
return OK;
Expand Down Expand Up @@ -197,18 +197,19 @@ void AsmMc6800::emitOperand(AsmInsn &insn, AddrMode mode, const Operand &op) con

Error AsmMc6800::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
return _insn.setError(insn.op2);
scan.skipSpaces();
}
if (scan.expect(',')) {
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
return _insn.setError(insn.op3);
scan.skipSpaces();
if (TABLE.hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
return _insn.setError(insn.op2);
}
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
return _insn.setError(insn.op3);
}
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
Expand Down
15 changes: 9 additions & 6 deletions src/asm_mc68000.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,7 @@ Error AsmMc68000::parseOperand(StrScanner &scan, Operand &op) const {
op.setAt(op.list = p);
if (endOfLine(p))
return OK;

if (p.expect('#')) {
auto text = p;
op.val32 = parseExpr32(p, op);
Expand Down Expand Up @@ -762,13 +763,15 @@ Error AsmMc68000::encodeImpl(StrScanner &scan, Insn &_insn) const {
if (isize == ISZ_ERROR)
return _insn.setError(scan, ILLEGAL_SIZE);

if (parseOperand(scan, insn.srcOp) && insn.srcOp.hasError())
return _insn.setError(insn.srcOp);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.dstOp) && insn.dstOp.hasError())
return _insn.setError(insn.dstOp);
scan.skipSpaces();
if (TABLE.hasOperand(_cpuSpec, insn)) {
if (parseOperand(scan, insn.srcOp) && insn.srcOp.hasError())
return _insn.setError(insn.srcOp);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.dstOp) && insn.dstOp.hasError())
return _insn.setError(insn.dstOp);
}
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.srcOp, TABLE.searchName(_cpuSpec, insn)))
return _insn.getError();
Expand Down
27 changes: 12 additions & 15 deletions src/asm_mc6805.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,6 @@ Error AsmMc6805::setPcBits(int32_t value) {
Error AsmMc6805::parseOperand(StrScanner &scan, Operand &op) const {
auto p = scan.skipSpaces();
op.setAt(p);
if (endOfLine(p)) {
op.mode = M_NONE;
return OK;
}

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

Error AsmMc6805::encodeImpl(StrScanner &scan, Insn &_insn) const {
AsmInsn insn(_insn);
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
return _insn.setError(insn.op2);
scan.skipSpaces();
}
if (scan.expect(',')) {
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
return _insn.setError(insn.op3);
scan.skipSpaces();
if (TABLE.hasOperand(cpuType(), insn)) {
if (parseOperand(scan, insn.op1) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2) && insn.op2.hasError())
return _insn.setError(insn.op2);
}
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op3) && insn.op3.hasError())
return _insn.setError(insn.op3);
}
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
Expand Down
50 changes: 29 additions & 21 deletions src/asm_mc6809.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,6 @@ void AsmMc6809::encodeRegisterList(AsmInsn &insn, const Operand &op) const {
uint8_t post = 0;
auto p = op.list;
while (true) {
p.skipSpaces();
const auto r = p;
auto reg = parseRegName(p);
if (reg == REG_UNDEF)
Expand All @@ -247,12 +246,13 @@ void AsmMc6809::encodeRegisterList(AsmInsn &insn, const Operand &op) const {
if (post & bit)
insn.setErrorIf(r, DUPLICATE_REGISTER);
post |= bit;
if (endOfLine(p.skipSpaces()))
break;
if (!p.expect(',')) {
insn.setErrorIf(p, UNKNOWN_OPERAND);
break;
auto end = p;
if (p.skipSpaces().expect(',')) {
p.skipSpaces();
continue;
}
if (endOfLine(end))
break;
}
insn.emitOperand8(post);
}
Expand Down Expand Up @@ -497,8 +497,8 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
op.val32 = parseExpr32(p, op);
}

const auto endOfIndex = p.skipSpaces();
if (!p.expect(',')) {
auto indexEnd = p;
if (!p.skipSpaces().expect(',')) {
if (index == REG_UNDEF) {
if (op.indir) {
if (!p.expect(']'))
Expand All @@ -517,7 +517,7 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
scan = p;
return OK;
}
if (endOfLine(p)) {
if (endOfLine(indexEnd)) {
op.index = index;
op.mode = M_LIST;
op.extra = 1; // single register
Expand Down Expand Up @@ -552,7 +552,7 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
op.index = index;
op.mode = M_LIST;
op.extra = 1;
scan = endOfIndex;
scan = indexEnd;
return OK;
}

Expand All @@ -575,15 +575,21 @@ Error AsmMc6809::parseOperand(StrScanner &scan, Operand &op, AddrMode hint) cons
if (op.indir)
return op.setError(UNKNOWN_OPERAND);
// actual parsing happens on |encodeRegisterList|.
while (!endOfLine(p))
p += 1;
op.mode = M_LIST;
op.extra = 2; // multiple registers
scan = p;
return OK;
while (true) {
auto end = p;
if (parseRegName(p.skipSpaces()) != REG_UNDEF) {
end = p;
if (p.skipSpaces().expect(','))
continue;
}
scan = end;
return OK;
}
}

return OK;
return endOfLine(scan) ? OK : op.setError(UNKNOWN_OPERAND);
}

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

if (parseOperand(scan, insn.op1, insn.mode1()) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2, insn.mode2()) && insn.op2.hasError())
return _insn.setError(insn.op2);
scan.skipSpaces();
if (insn.mode1() != M_NONE) {
if (parseOperand(scan, insn.op1, insn.mode1()) && insn.op1.hasError())
return _insn.setError(insn.op1);
if (insn.mode2() != M_NONE && scan.skipSpaces().expect(',')) {
if (parseOperand(scan, insn.op2, insn.mode2()) && insn.op2.hasError())
return _insn.setError(insn.op2);
}
}
scan.skipSpaces();

if (_insn.setErrorIf(insn.op1, TABLE.searchName(cpuType(), insn)))
return _insn.getError();
Expand Down
Loading

0 comments on commit 6687ab4

Please sign in to comment.