summaryrefslogtreecommitdiff
path: root/m68k_debugging.cpp
blob: f9b0b3875ec442ff8149f1ea6c27ed2ad79d48d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* SPDX-License-Identifier: Unlicense
 */

#include "m68k_debugging.hpp"
#include "musashi-m68k/m68k.h"
#include "utils.hpp"

#include <cstdlib>
#include <cassert>

static inline m68k_register_t ConvertRegisterId(M68KRegister register_id)
{
    switch (register_id) {
    case M68KRegister::kD0:
        return M68K_REG_D0;
    case M68KRegister::kD1:
        return M68K_REG_D1;
    case M68KRegister::kD2:
        return M68K_REG_D2;
    case M68KRegister::kD3:
        return M68K_REG_D3;
    case M68KRegister::kD4:
        return M68K_REG_D4;
    case M68KRegister::kD5:
        return M68K_REG_D5;
    case M68KRegister::kD6:
        return M68K_REG_D6;
    case M68KRegister::kD7:
        return M68K_REG_D7;
    case M68KRegister::kA0:
        return M68K_REG_A0;
    case M68KRegister::kA1:
        return M68K_REG_A1;
    case M68KRegister::kA2:
        return M68K_REG_A2;
    case M68KRegister::kA3:
        return M68K_REG_A3;
    case M68KRegister::kA4:
        return M68K_REG_A4;
    case M68KRegister::kA5:
        return M68K_REG_A5;
    case M68KRegister::kA6:
        return M68K_REG_A6;
    case M68KRegister::kA7:
        return M68K_REG_A7;
    case M68KRegister::kPS:
        return M68K_REG_SR;
    case M68KRegister::kPC:
        return M68K_REG_PC;
    case M68KRegister::kFP0:
    case M68KRegister::kFPC:
    case M68KRegister::kFPS:
    case M68KRegister::kFPI:
    case M68KRegister::kRegistersCount:
        assert(!"Unsupported register_id");
        break;
    }
    assert(!"Unknown register_id");
    UNREACHABLE();
}

uint32_t M68KDebuggingControl::GetRegister(M68KRegister register_id) const
{
    return m68k_get_reg(nullptr, ConvertRegisterId(register_id));
}

M68KCPUState M68KDebuggingControl::GetCPUState() const
{
    return M68KCPUState{
        static_cast<size_t>(M68KRegister::kPC) + 1,
        {
            GetRegister(M68KRegister::kD0),
            GetRegister(M68KRegister::kD1),
            GetRegister(M68KRegister::kD2),
            GetRegister(M68KRegister::kD3),
            GetRegister(M68KRegister::kD4),
            GetRegister(M68KRegister::kD5),
            GetRegister(M68KRegister::kD6),
            GetRegister(M68KRegister::kD7),
            GetRegister(M68KRegister::kA0),
            GetRegister(M68KRegister::kA1),
            GetRegister(M68KRegister::kA2),
            GetRegister(M68KRegister::kA3),
            GetRegister(M68KRegister::kA4),
            GetRegister(M68KRegister::kA5),
            GetRegister(M68KRegister::kA6),
            GetRegister(M68KRegister::kA7),
            GetRegister(M68KRegister::kPS),
            GetRegister(M68KRegister::kPC),
        },
    };
}

void M68KDebuggingControl::SetRegister(M68KRegister register_id, uint32_t value)
{
    return m68k_set_reg(ConvertRegisterId(register_id), value);
}

void M68KDebuggingControl::Reset()
{
    m68k_pulse_reset();
}

void M68KDebuggingControl::Continue()
{
    // TODO
    abort();
}

void M68KDebuggingControl::Pause()
{
    // TODO
    abort();
}

uint8_t M68KDebuggingControl::Read8(uint32_t address) const
{
    return static_cast<uint8_t>(m68k_read_memory_8(address & 0x00FFFFFF));
}

uint16_t M68KDebuggingControl::Read16(uint32_t address) const
{
    return static_cast<uint16_t>(m68k_read_memory_16(address & 0x00FFFFFF));
}

uint32_t M68KDebuggingControl::Read32(uint32_t address) const
{
    return static_cast<uint32_t>(m68k_read_memory_32(address & 0x00FFFFFF));
}

void M68KDebuggingControl::Write8(uint32_t address, uint8_t value)
{
    m68k_write_memory_8(address, value);
}

void M68KDebuggingControl::Write16(uint32_t address, uint16_t value)
{
    m68k_write_memory_16(address, value);
}

void M68KDebuggingControl::Write32(uint32_t address, uint32_t value)
{
    m68k_write_memory_32(address, value);
}