summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/avr8/avr8dasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/avr8/avr8dasm.cpp')
-rw-r--r--src/devices/cpu/avr8/avr8dasm.cpp41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/devices/cpu/avr8/avr8dasm.cpp b/src/devices/cpu/avr8/avr8dasm.cpp
index cfc99b955d3..5f47198c425 100644
--- a/src/devices/cpu/avr8/avr8dasm.cpp
+++ b/src/devices/cpu/avr8/avr8dasm.cpp
@@ -7,7 +7,7 @@
*/
#include "emu.h"
-#include "avr8.h"
+#include "avr8dasm.h"
#define RD2(op) (((op) >> 4) & 0x0003)
#define RD3(op) (((op) >> 4) & 0x0007)
@@ -25,11 +25,16 @@
#define ACONST6(op) ((((op) >> 5) & 0x0030) | ((op) & 0x000f))
#define MULCONST2(op) ((((op) >> 6) & 0x0002) | (((op) >> 3) & 0x0001))
-CPU_DISASSEMBLE(avr8)
+u32 avr8_disassembler::opcode_alignment() const
{
- int pos = 0;
- uint32_t op = oprom[pos++];
- op |= oprom[pos++] << 8;
+ return 2;
+}
+
+offs_t avr8_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+{
+ offs_t base_pc = pc;
+ uint32_t op = opcodes.r16(pc);
+ pc += 2;
uint32_t addr;
const char* register_names[0x40] = {"PINA", "DDRA", "PORTA", "PINB", "DDRB", "PORTB", "PINC", "DDRC", "PORTC", "PIND", "DDRD", "PORTD", "PINE", "DDRE", "PORTE", "PINF", "DDRF", "PORTF", "PING", "DDRG", "PORTG", "TIFR0", "TIFR1", "TIFR2","TIFR3", "TIFR4", "TIFR5", "PCIFR", "EIFR", "EIMSK", "GPIOR0", "EECR", "EEDR", "EEARL", "EEARH", "GTCCR", "TCCR0A", "TCCR0B", "TCNT0", "OCR0A", "OCR0B", "0x29", "GPIOR1", "GPIOR2", "SPCR", "SPSR", "SPDR", "0x2F", "ACSR", "OCDR", "0x32", "SMCR", "MCUSR", "MCUCR", "0x36", "SPMCSR", "0x38", "0x39", "0x3A", "RAMPZ", "EIND", "SPL", "SPH", "SREG"};
@@ -226,8 +231,8 @@ CPU_DISASSEMBLE(avr8)
{
case 0x0000:
op <<= 16;
- op |= oprom[pos++];
- op |= oprom[pos++] << 8;
+ op |= opcodes.r16(pc);
+ pc += 2;
util::stream_format(stream, "LDS R%d, (0x%04x)", RD5(op >> 16), op & 0x0000ffff);
break;
case 0x0001:
@@ -277,8 +282,8 @@ CPU_DISASSEMBLE(avr8)
{
case 0x0000:
op <<= 16;
- op |= oprom[pos++];
- op |= oprom[pos++] << 8;
+ op |= opcodes.r16(pc);
+ pc += 2;
util::stream_format(stream, "STS (0x%04x), R%d", op & 0x0000ffff, RD5(op >> 16));
break;
case 0x0001:
@@ -410,15 +415,15 @@ CPU_DISASSEMBLE(avr8)
case 0x000c:
case 0x000d:
addr = KCONST22(op) << 16;
- addr |= oprom[pos++];
- addr |= oprom[pos++] << 8;
+ addr |= opcodes.r16(pc);
+ pc += 2;
util::stream_format(stream, "JMP 0x%06x", addr << 1);
break;
case 0x000e:
case 0x000f:
addr = KCONST22(op) << 16;
- addr |= oprom[pos++];
- addr |= oprom[pos++] << 8;
+ addr |= opcodes.r16(pc);
+ pc += 2;
util::stream_format(stream, "CALL 0x%06x", addr << 1);
break;
default:
@@ -505,15 +510,15 @@ CPU_DISASSEMBLE(avr8)
case 0x000c:
case 0x000d:
op <<= 16;
- op |= oprom[pos++];
- op |= oprom[pos++] << 8;
+ op |= opcodes.r16(pc);
+ pc += 2;
util::stream_format(stream, "JMP 0x%06x", KCONST22(op) << 1);
break;
case 0x000e:
case 0x000f:
op <<= 16;
- op |= oprom[pos++];
- op |= oprom[pos++] << 8;
+ op |= opcodes.r16(pc);
+ pc += 2;
util::stream_format(stream, "CALL 0x%06x", KCONST22(op) << 1);
break;
}
@@ -669,5 +674,5 @@ CPU_DISASSEMBLE(avr8)
break;
}
- return pos | DASMFLAG_SUPPORTED;
+ return (pc - base_pc) | SUPPORTED;
}