int assemble_operand(void) { u16 n; next(); switch (token) { case tA: case tB: case tC: case tX: case tY: case tZ: case tI: case tJ: return token & 7; case tPOP: return 0x18; case tPEEK: return 0x19; case tPUSH: return 0x1a; case tSP: return 0x1b; case tPC: return 0x1c; case tO: return 0x1d; case tNUMBER: if (tnumber < 0x20) return tnumber + 0x20; image[PC++] = tnumber; return 0x1f; case tSTRING: image[PC] = 0; use_label(tstring, PC++); return 0x1f; default: if (token != tOBRACK) die("expected ["); } next(); switch (token) { case tA: case tB: case tC: case tX: case tY: case tZ: case tI: case tJ: n = token & 7; expect(tCBRACK); return n; case tSTRING: use_label(tstring, PC); case tNUMBER: image[PC++] = tnumber; next(); if (token == tCBRACK) { return 0x1e; } else if ((token == tCOMMA) || (token == tPLUS)) { next(); if ((token >= tA) && (token <= tJ)) { n = 0x10 | (token & 7); } else { die("invalid register"); } expect(tCBRACK); return n; } else { die("invalid operand"); } default: die("invalid operand"); } return 0; }
void assemble_imm_or_label(void) { next(); if (token == tNUMBER) { image[PC++] = tnumber; } else if (token == tSTRING) { image[PC] = 0; use_label(tstring, PC++); } else { die("expected number or label"); } }
expression make_label_address(location loc, id_label label) { expression result = CAST(expression, new_label_address(parse_region, loc, label)); use_label(label); result->type = ptr_void_type; result->cst = fold_label_address(result); if (pedantic) pedwarn("ANSI C forbids `&&'"); return result; }
void assemble_imm_or_label(void) { do { next(); if (token == tNUMBER) { note[PC] = 'd'; image[PC++] = tnumber; } else if (token == tSTRING) { note[PC] = 'd'; image[PC] = 0; use_label(tstring, PC++); } else if (token == tQSTRING) { char *x = tstring; while (*x) { note[PC] = 'd'; image[PC++] = *x++; } } else { die("expected number or label"); } next(); } while (token == tCOMMA); }
int assemble_operand(void) { u16 n; next(); switch (token) { case tA: case tB: case tC: case tX: case tY: case tZ: case tI: case tJ: return token & 7; case tR0: case tR1: case tR2: case tR3: case tR4: case tR5: case tR6: case tR7: return (token - 8) & 7; case tPOP: return 0x18; case tPEEK: return 0x19; case tPUSH: return 0x1a; case tSP: return 0x1b; case tPC: return 0x1c; case tEX: return 0x1d; case tNUMBER: if (tnumber < 0x20) return tnumber + 0x21; image[PC++] = tnumber; return 0x1f; case tSTRING: image[PC] = 0; use_label(tstring, PC++); return 0x1f; default: if (token != tOBRACK) die("expected ["); } /* we must have seen a '[' */ next(); switch (token) { case tA: case tB: case tC: case tX: case tY: case tZ: case tI: case tJ: n = token & 7; next(); if (token == tCBRACK) return 0x08 | n; if ((token != tCOMMA) && (token != tPLUS)) die("expected , or +"); next(); if (token == tSTRING) { use_label(tstring, PC++); } else if (token == tNUMBER) { image[PC++] = tnumber; } else { die("expected immediate value"); } expect(tCBRACK); return 0x10 | n; case tSTRING: use_label(tstring, PC++); case tNUMBER: if (token == tNUMBER) image[PC++] = tnumber; next(); if (token == tCBRACK) { return 0x1e; } else if ((token == tCOMMA) || (token == tPLUS)) { next(); if ((token >= tA) && (token <= tJ)) { n = 0x10 | (token & 7); } else { die("invalid register"); } expect(tCBRACK); return n; } else { die("invalid operand"); } default: die("invalid operand"); } return 0; }