mcs48: Fix disassembly of short jump instructions located on page boundaries

This commit is contained in:
AJR 2018-12-29 14:06:51 -05:00
parent ceed23e875
commit b155b5df3f

View File

@ -66,14 +66,14 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0x10: util::stream_format(stream, "inc @r0"); break;
case 0x11: util::stream_format(stream, "inc @r1"); break;
case 0x12: if (!m_i802x)
util::stream_format(stream, "jb0 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb0 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
case 0x13: util::stream_format(stream, "addc a,#$%02X", params.r8(cpc++)); break;
case 0x14: util::stream_format(stream, "call $0%02X", params.r8(cpc++)); flags = STEP_OVER; break;
case 0x15: util::stream_format(stream, "dis i"); break;
case 0x16: util::stream_format(stream, "jtf $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0x16: util::stream_format(stream, "jtf $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0x17: util::stream_format(stream, "inc a"); break;
case 0x18: util::stream_format(stream, "inc r0"); break;
case 0x19: util::stream_format(stream, "inc r1"); break;
@ -93,7 +93,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0x23: util::stream_format(stream, "mov a,#$%02X", params.r8(cpc++)); break;
case 0x24: util::stream_format(stream, "jmp $1%02X", params.r8(cpc++)); break;
case 0x25: util::stream_format(stream, "en tcnti"); break;
case 0x26: util::stream_format(stream, "jnt0 $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0x26: util::stream_format(stream, "jnt0 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0x27: util::stream_format(stream, "clr a"); break;
case 0x28: util::stream_format(stream, "xch a,r0"); break;
case 0x29: util::stream_format(stream, "xch a,r1"); break;
@ -106,13 +106,13 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0x30: util::stream_format(stream, "xchd a,@r0"); break;
case 0x31: util::stream_format(stream, "xchd a,@r1"); break;
case 0x32: if (!m_i802x)
util::stream_format(stream, "jb1 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb1 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
case 0x34: util::stream_format(stream, "call $1%02X", params.r8(cpc++)); flags = STEP_OVER; break;
case 0x35: util::stream_format(stream, "dis tcnti"); break;
case 0x36: util::stream_format(stream, "jt0 $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0x36: util::stream_format(stream, "jt0 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0x37: util::stream_format(stream, "cpl a"); break;
case 0x39: util::stream_format(stream, "outl p1,a"); break;
case 0x3a: util::stream_format(stream, "outl p2,a"); break;
@ -126,7 +126,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0x43: util::stream_format(stream, "orl a,#$%02X", params.r8(cpc++)); break;
case 0x44: util::stream_format(stream, "jmp $2%02X", params.r8(cpc++)); break;
case 0x45: util::stream_format(stream, "strt cnt"); break;
case 0x46: util::stream_format(stream, "jnt1 $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0x46: util::stream_format(stream, "jnt1 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0x47: util::stream_format(stream, "swap a"); break;
case 0x48: util::stream_format(stream, "orl a,r0"); break;
case 0x49: util::stream_format(stream, "orl a,r1"); break;
@ -139,14 +139,14 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0x50: util::stream_format(stream, "anl a,@r0"); break;
case 0x51: util::stream_format(stream, "anl a,@r1"); break;
case 0x52: if (!m_i802x)
util::stream_format(stream, "jb2 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb2 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
case 0x53: util::stream_format(stream, "anl a,#$%02X", params.r8(cpc++)); break;
case 0x54: util::stream_format(stream, "call $2%02X", params.r8(cpc++)); flags = STEP_OVER; break;
case 0x55: util::stream_format(stream, "strt t"); break;
case 0x56: util::stream_format(stream, "jt1 $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0x56: util::stream_format(stream, "jt1 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0x57: util::stream_format(stream, "da a"); break;
case 0x58: util::stream_format(stream, "anl a,r0"); break;
case 0x59: util::stream_format(stream, "anl a,r1"); break;
@ -173,7 +173,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0x70: util::stream_format(stream, "addc a,@r0"); break;
case 0x71: util::stream_format(stream, "addc a,@r1"); break;
case 0x72: if (!m_i802x)
util::stream_format(stream, "jb3 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb3 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
@ -184,7 +184,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
util::stream_format(stream, "illegal");
break;
case 0x76: if (!m_i802x)
util::stream_format(stream, "jf1 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jf1 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
@ -219,9 +219,9 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0x86: if (m_i802x)
util::stream_format(stream, "illegal");
else if (!m_upi41)
util::stream_format(stream, "jni $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jni $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "jobf $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jobf $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
break;
case 0x88: if (!m_upi41 && !m_i802x)
util::stream_format(stream, "orl bus,#$%02X", params.r8(cpc++));
@ -255,7 +255,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
util::stream_format(stream, "illegal");
break;
case 0x92: if (!m_i802x)
util::stream_format(stream, "jb4 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb4 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
@ -271,7 +271,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
else
util::stream_format(stream, "sel an1");
break;
case 0x96: util::stream_format(stream, "jnz $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0x96: util::stream_format(stream, "jnz $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0x97: util::stream_format(stream, "clr c"); break;
case 0x98: if (!m_upi41 && !m_i802x)
util::stream_format(stream, "anl bus,#$%02X", params.r8(cpc++));
@ -313,7 +313,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0xb0: util::stream_format(stream, "mov @r0,#$%02X", params.r8(cpc++)); break;
case 0xb1: util::stream_format(stream, "mov @r1,#$%02X", params.r8(cpc++)); break;
case 0xb2: if (!m_i802x)
util::stream_format(stream, "jb5 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb5 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
@ -325,7 +325,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
util::stream_format(stream, "illegal");
break;
case 0xb6: if (!m_i802x)
util::stream_format(stream, "jf0 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jf0 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
@ -343,7 +343,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
else
util::stream_format(stream, "illegal");
break;
case 0xc6: util::stream_format(stream, "jz $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0xc6: util::stream_format(stream, "jz $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0xc7: if (!m_i802x)
util::stream_format(stream, "mov a,psw");
else
@ -392,7 +392,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0xd0: util::stream_format(stream, "xrl a,@r0"); break;
case 0xd1: util::stream_format(stream, "xrl a,@r1"); break;
case 0xd2: if (!m_i802x)
util::stream_format(stream, "jb6 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb6 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
@ -406,7 +406,7 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
case 0xd6: if (!m_upi41)
util::stream_format(stream, "illegal");
else
util::stream_format(stream, "jnibf $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jnibf $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
break;
case 0xd7: if (!m_i802x)
util::stream_format(stream, "mov psw,a");
@ -434,20 +434,20 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
else
util::stream_format(stream, "en dma");
break;
case 0xe6: util::stream_format(stream, "jnc $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0xe6: util::stream_format(stream, "jnc $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0xe7: util::stream_format(stream, "rl a"); break;
case 0xe8: util::stream_format(stream, "djnz r0,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xe9: util::stream_format(stream, "djnz r1,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xea: util::stream_format(stream, "djnz r2,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xeb: util::stream_format(stream, "djnz r3,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xec: util::stream_format(stream, "djnz r4,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xed: util::stream_format(stream, "djnz r5,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xee: util::stream_format(stream, "djnz r6,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xef: util::stream_format(stream, "djnz r7,$%03X", (pc & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xe8: util::stream_format(stream, "djnz r0,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xe9: util::stream_format(stream, "djnz r1,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xea: util::stream_format(stream, "djnz r2,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xeb: util::stream_format(stream, "djnz r3,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xec: util::stream_format(stream, "djnz r4,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xed: util::stream_format(stream, "djnz r5,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xee: util::stream_format(stream, "djnz r6,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xef: util::stream_format(stream, "djnz r7,$%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); flags = STEP_OVER; break;
case 0xf0: util::stream_format(stream, "mov a,@r0"); break;
case 0xf1: util::stream_format(stream, "mov a,@r1"); break;
case 0xf2: if (!m_i802x)
util::stream_format(stream, "jb7 $%03X", (pc & 0x700) | params.r8(cpc++));
util::stream_format(stream, "jb7 $%03X", ((pc + 1) & 0x700) | params.r8(cpc++));
else
util::stream_format(stream, "illegal");
break;
@ -456,10 +456,10 @@ offs_t mcs48_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
util::stream_format(stream, "illegal");
else if (!m_upi41)
util::stream_format(stream, "sel mb1");
else if (!m_i802x)
else
util::stream_format(stream, "en flags");
break;
case 0xf6: util::stream_format(stream, "jc $%03X", (pc & 0x700) | params.r8(cpc++)); break;
case 0xf6: util::stream_format(stream, "jc $%03X", ((pc + 1) & 0x700) | params.r8(cpc++)); break;
case 0xf7: util::stream_format(stream, "rlc a"); break;
case 0xf8: util::stream_format(stream, "mov a,r0"); break;
case 0xf9: util::stream_format(stream, "mov a,r1"); break;