Index: opcodes/rl78-dis.c |
diff --git a/opcodes/rl78-dis.c b/opcodes/rl78-dis.c |
index 3c365adc82af0284ee784d3ff64b33a8c6874c7b..7d1eab4e31665e75322ee23957f57147bc575c51 100644 |
--- a/opcodes/rl78-dis.c |
+++ b/opcodes/rl78-dis.c |
@@ -155,38 +155,34 @@ print_insn_rl78 (bfd_vma addr, disassemble_info * dis) |
int do_cond = 0; |
int do_bang = 0; |
- s ++; |
- |
- if (*s == 'x') |
- { |
- do_hex = 1; |
- s++; |
- } |
- if (*s == '!') |
- { |
- do_bang = 1; |
- s++; |
- } |
- if (*s == 'e') |
- { |
- do_es = 1; |
- s++; |
- } |
- if (*s == 'a') |
- { |
- do_addr = 1; |
- s++; |
- } |
- if (*s == 's') |
+ while (1) |
{ |
- do_sfr = 1; |
- s++; |
- } |
- if (*s == 'c') |
- { |
- do_cond = 1; |
- s++; |
+ s ++; |
+ switch (*s) |
+ { |
+ case 'x': |
+ do_hex = 1; |
+ break; |
+ case '!': |
+ do_bang = 1; |
+ break; |
+ case 'e': |
+ do_es = 1; |
+ break; |
+ case 'a': |
+ do_addr = 1; |
+ break; |
+ case 's': |
+ do_sfr = 1; |
+ break; |
+ case 'c': |
+ do_cond = 1; |
+ break; |
+ default: |
+ goto no_more_modifiers; |
+ } |
} |
+ no_more_modifiers:; |
switch (*s) |
{ |
@@ -221,99 +217,104 @@ print_insn_rl78 (bfd_vma addr, disassemble_info * dis) |
case '0': |
case '1': |
- oper = opcode.op + *s - '0'; |
- if (do_bang) |
- PC ('!'); |
- |
- if (do_es) |
- { |
- if (oper->use_es && indirect_type (oper->type)) |
- PR (PS, "es:"); |
- } |
- |
- else if (do_cond) |
- { |
- PR (PS, "%s", condition_names[oper->condition]); |
- } |
- |
- else |
- switch (oper->type) |
+ oper = *s == '0' ? &opcode.op[0] : &opcode.op[1]; |
+ if (do_es) |
+ { |
+ if (oper->use_es && indirect_type (oper->type)) |
+ PR (PS, "es:"); |
+ } |
+ |
+ if (do_bang) |
+ PC ('!'); |
+ |
+ if (do_cond) |
+ { |
+ PR (PS, "%s", condition_names[oper->condition]); |
+ break; |
+ } |
+ |
+ switch (oper->type) |
+ { |
+ case RL78_Operand_Immediate: |
+ if (do_addr) |
+ dis->print_address_func (oper->addend, dis); |
+ else if (do_hex |
+ || oper->addend > 999 |
+ || oper->addend < -999) |
+ PR (PS, "%#x", oper->addend); |
+ else |
+ PR (PS, "%d", oper->addend); |
+ break; |
+ |
+ case RL78_Operand_Register: |
+ PR (PS, "%s", register_names[oper->reg]); |
+ break; |
+ |
+ case RL78_Operand_Bit: |
+ PR (PS, "%s.%d", register_names[oper->reg], oper->bit_number); |
+ break; |
+ |
+ case RL78_Operand_Indirect: |
+ case RL78_Operand_BitIndirect: |
+ switch (oper->reg) |
{ |
- case RL78_Operand_Immediate: |
- if (do_addr) |
- dis->print_address_func (oper->addend, dis); |
- else if (do_hex |
- || oper->addend > 999 |
- || oper->addend < -999) |
+ case RL78_Reg_None: |
+ if (oper->addend == 0xffffa && do_sfr && opcode.size == RL78_Byte) |
+ PR (PS, "psw"); |
+ else if (oper->addend == 0xffff8 && do_sfr && opcode.size == RL78_Word) |
+ PR (PS, "sp"); |
+ else if (oper->addend >= 0xffe20) |
PR (PS, "%#x", oper->addend); |
else |
- PR (PS, "%d", oper->addend); |
+ { |
+ int faddr = oper->addend; |
+ if (do_es && ! oper->use_es) |
+ faddr += 0xf0000; |
+ dis->print_address_func (faddr, dis); |
+ } |
break; |
- case RL78_Operand_Register: |
- PR (PS, "%s", register_names[oper->reg]); |
+ case RL78_Reg_B: |
+ case RL78_Reg_C: |
+ case RL78_Reg_BC: |
+ PR (PS, "%d[%s]", oper->addend, register_names[oper->reg]); |
break; |
- case RL78_Operand_Bit: |
- PR (PS, "%s.%d", register_names[oper->reg], oper->bit_number); |
+ default: |
+ PR (PS, "[%s", register_names[oper->reg]); |
+ if (oper->reg2 != RL78_Reg_None) |
+ PR (PS, "+%s", register_names[oper->reg2]); |
+ if (oper->addend) |
+ PR (PS, "+%d", oper->addend); |
+ PC (']'); |
break; |
- |
- case RL78_Operand_Indirect: |
- case RL78_Operand_BitIndirect: |
- switch (oper->reg) |
- { |
- case RL78_Reg_None: |
- if (oper->addend == 0xffffa && do_sfr && opcode.size == RL78_Byte) |
- PR (PS, "psw"); |
- else if (oper->addend == 0xffff8 && do_sfr && opcode.size == RL78_Word) |
- PR (PS, "sp"); |
- else if (oper->addend >= 0xffe20) |
- PR (PS, "%#x", oper->addend); |
- else |
- dis->print_address_func (oper->addend, dis); |
- break; |
- |
- case RL78_Reg_B: |
- case RL78_Reg_C: |
- case RL78_Reg_BC: |
- PR (PS, "%d[%s]", oper->addend, register_names[oper->reg]); |
- break; |
- |
- default: |
- PR (PS, "[%s", register_names[oper->reg]); |
- if (oper->reg2 != RL78_Reg_None) |
- PR (PS, "+%s", register_names[oper->reg2]); |
- if (oper->addend) |
- PR (PS, "+%d", oper->addend); |
- PC (']'); |
- break; |
- } |
- if (oper->type == RL78_Operand_BitIndirect) |
- PR (PS, ".%d", oper->bit_number); |
- break; |
+ } |
+ if (oper->type == RL78_Operand_BitIndirect) |
+ PR (PS, ".%d", oper->bit_number); |
+ break; |
#if DEBUG_SEMANTICS |
- /* Shouldn't happen - push and pop don't print |
- [SP] directly. But we *do* use them for |
- semantic debugging. */ |
- case RL78_Operand_PostInc: |
- PR (PS, "[%s++]", register_names[oper->reg]); |
- break; |
- case RL78_Operand_PreDec: |
- PR (PS, "[--%s]", register_names[oper->reg]); |
- break; |
+ /* Shouldn't happen - push and pop don't print |
+ [SP] directly. But we *do* use them for |
+ semantic debugging. */ |
+ case RL78_Operand_PostInc: |
+ PR (PS, "[%s++]", register_names[oper->reg]); |
+ break; |
+ case RL78_Operand_PreDec: |
+ PR (PS, "[--%s]", register_names[oper->reg]); |
+ break; |
#endif |
- default: |
- /* If we ever print this, that means the |
- programmer tried to print an operand with a |
- type we don't expect. Print the line and |
- operand number from rl78-decode.opc for |
- them. */ |
- PR (PS, "???%d.%d", opcode.lineno, *s - '0'); |
- break; |
- } |
+ default: |
+ /* If we ever print this, that means the |
+ programmer tried to print an operand with a |
+ type we don't expect. Print the line and |
+ operand number from rl78-decode.opc for |
+ them. */ |
+ PR (PS, "???%d.%d", opcode.lineno, *s - '0'); |
+ break; |
+ } |
} |
} |
} |