jak-project/common/dma/dma.cpp

130 lines
3.2 KiB
C++
Raw Normal View History

2021-08-07 02:30:02 +00:00
#include "dma.h"
#include "common/util/Assert.h"
2021-08-07 02:30:02 +00:00
#include "fmt/core.h"
std::string DmaTag::print() const {
2021-08-07 02:30:02 +00:00
std::string result;
const char* mode_names[8] = {"refe", "cnt", "next", "ref", "refs", "call", "ret", "end"};
result += fmt::format("TAG: 0x{:08x} {:4s} qwc 0x{:04x}", addr, mode_names[(int)kind], qwc);
if (spr) {
result += " SPR";
}
result += "\n";
return result;
}
2021-08-07 22:57:13 +00:00
std::string VifCode::print() const {
2021-08-07 22:57:13 +00:00
std::string result;
switch (kind) {
2021-08-10 01:42:05 +00:00
case Kind::NOP:
result = "NOP";
break;
case Kind::STCYCL: {
VifCodeStcycl stcycl(immediate);
result = fmt::format("STCYCL cl: {} wl: {}", stcycl.cl, stcycl.wl);
} break;
2021-08-10 01:42:05 +00:00
case Kind::OFFSET:
result = fmt::format("OFFSET 0x{:x}", immediate);
2021-08-10 01:42:05 +00:00
break;
case Kind::BASE:
result = fmt::format("BASE 0x{:x}", immediate);
2021-08-10 01:42:05 +00:00
break;
case Kind::ITOP:
result = "ITOP";
break;
case Kind::STMOD:
result = fmt::format("STMOD 0b{:b}", immediate);
2021-08-10 01:42:05 +00:00
break;
case Kind::MSK3PATH:
result = "MSK3PATH";
break;
case Kind::MARK:
result = "MARK";
break;
case Kind::FLUSHE:
result = "FLUSHE";
break;
case Kind::FLUSH:
result = "FLUSH";
break;
case Kind::FLUSHA:
result = "FLUSHA";
break;
case Kind::MSCAL:
result = fmt::format("MSCAL 0x{:x}", immediate);
2021-08-10 01:42:05 +00:00
break;
case Kind::MSCNT:
result = "MSCNT";
break;
case Kind::MSCALF:
result = fmt::format("MSCALF 0x{:x}", immediate);
2021-08-10 01:42:05 +00:00
break;
case Kind::STMASK:
result = "STMASK";
break;
case Kind::STROW:
result = "STROW";
break;
case Kind::STCOL:
result = "STCOL";
break;
case Kind::MPG:
result = "MPG";
break;
case Kind::DIRECT:
result = "DIRECT";
break;
case Kind::DIRECTHL:
result = "DIRECTHL";
break;
case Kind::PC_PORT:
result = "PC_PORT";
break;
case Kind::UNPACK_V4_8: {
VifCodeUnpack up(*this);
result = fmt::format("UNPACK-V4-8: {} addr: {} us: {} tops: {}", num, up.addr_qw,
up.is_unsigned, up.use_tops_flag);
break;
}
case Kind::UNPACK_V4_16: {
VifCodeUnpack up(*this);
result = fmt::format("UNPACK-V4-16: {} addr: {} us: {} tops: {}", num, up.addr_qw,
up.is_unsigned, up.use_tops_flag);
break;
}
case Kind::UNPACK_V4_32: {
VifCodeUnpack up(*this);
result = fmt::format("UNPACK-V4-32: {} addr: {} us: {} tops: {}", num, up.addr_qw,
up.is_unsigned, up.use_tops_flag);
break;
}
case Kind::UNPACK_V3_32: {
VifCodeUnpack up(*this);
result = fmt::format("UNPACK-V3-32: {} addr: {} us: {} tops: {}", num, up.addr_qw,
up.is_unsigned, up.use_tops_flag);
break;
}
case Kind::UNPACK_V2_16: {
VifCodeUnpack up(*this);
result = fmt::format("UNPACK-V2-16: {} addr: {} us: {} tops: {}", num, up.addr_qw,
up.is_unsigned, up.use_tops_flag);
break;
}
2021-08-07 22:57:13 +00:00
default:
result = "???";
ASSERT_MSG(false, fmt::format("Unhandled vif code {}", (int)kind));
2021-08-07 22:57:13 +00:00
break;
}
2021-08-10 01:42:05 +00:00
// TODO: the rest of the VIF code.
2021-08-07 22:57:13 +00:00
return result;
}