master v1.2.2
Avril 4 years ago
parent 0aaf0d8ba3
commit ab69e5e2a7
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -5,4 +5,39 @@
namespace hv { namespace hv {
/// Print a single screen /// Print a single screen
void print_screen(const span<unsigned char> bytes, unsigned long offset); void print_screen(const span<unsigned char> bytes, unsigned long offset);
inline void lookup_hex_string(std::uint64_t x, char* s)
{
static const char digits[513] =
"000102030405060708090a0b0c0d0e0f"
"101112131415161718191a1b1c1d1e1f"
"202122232425262728292a2b2c2d2e2f"
"303132333435363738393a3b3c3d3e3f"
"404142434445464748494a4b4c4d4e4f"
"505152535455565758595a5b5c5d5e5f"
"606162636465666768696a6b6c6d6e6f"
"707172737475767778797a7b7c7d7e7f"
"808182838485868788898a8b8c8d8e8f"
"909192939495969798999a9b9c9d9e9f"
"a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
"b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
"c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
"d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
"e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
int i = 7;
const char *lut = (const char *)digits;
while (i >= 0)
{
int pos = (x & 0xFF) * 2;
char ch = lut[pos];
s[i * 2] = ch;
ch = lut[pos + 1];
s[i * 2 + 1] = ch;
x >>= 8;
i -= 1;
}
}
} }

@ -1,5 +1,6 @@
#include <fmt/format.h> #include <fmt/format.h>
#include <span.hpp> #include <span.hpp>
#include <hex.hpp>
const static constexpr char ascii_map[256] = { const static constexpr char ascii_map[256] = {
'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.',
@ -71,6 +72,22 @@ inline __attribute__((always_inline)) void print_exact(const char (&ar)[N])
fwrite(ar, N, 1, stdout); fwrite(ar, N, 1, stdout);
} }
inline static void u64_to_hex(std::uint64_t num, char* s)
{
hv::lookup_hex_string(num, s);
#if 0
std::uint64_t x = num;
x = ((x & 0xFFFF) << 32) | ((x & 0xFFFF0000) >> 16);
x = ((x & 0x0000FF000000FF00) >> 8) | (x & 0x000000FF000000FF) << 16;
x = ((x & 0x00F000F000F000F0) >> 4) | (x & 0x000F000F000F000F) << 8;
uint64_t mask = ((x + 0x0606060606060606) >> 4) & 0x0101010101010101;
x += 0x27 * mask;
*(uint64_t *)s = x;
#endif
}
namespace hv { namespace hv {
void print_screen(const span<unsigned char> memory, unsigned long offset) void print_screen(const span<unsigned char> memory, unsigned long offset)
{ {
@ -82,7 +99,17 @@ namespace hv {
#define S #define S
#define P_EX(n, buf) print_exact(buf) #define P_EX(n, buf) print_exact(buf)
#endif #endif
fmt::print("0x{:016x} ", offset); char posbuf[3 + 16 + 2] = { '0' };
posbuf[0] = '\n';
posbuf[1] = '0';
posbuf[2] = 'x';
posbuf[3 + 16] = ' ';
posbuf[3 + 16 + 1] = ' ';
u64_to_hex(offset, posbuf+3);
prints(posbuf+1);
char hxbuf[3]; char hxbuf[3];
std::size_t i=0; std::size_t i=0;
char r_ascii[2 + ROW_SZ]; char r_ascii[2 + ROW_SZ];
@ -94,11 +121,14 @@ namespace hv {
for(;i<memory.size();i++) { for(;i<memory.size();i++) {
if (i && i % ROW_SZ == 0) { //TODO: Change to i +=16 so we don't have to branch here on every byte. Make sure to not overrun buffer tho if (i && i % ROW_SZ == 0) { //TODO: Change to i +=16 so we don't have to branch here on every byte. Make sure to not overrun buffer tho
P_EX(S, r_ascii); P_EX(S, r_ascii);
fmt::print("\n0x{:016x} ", i+offset); //TODO: Implement this manually then write the buffer with `print_exact`
u64_to_hex(i+offset, posbuf+3);
print_exact(posbuf);
} }
unsigned char idx = memory[i]; unsigned char idx = memory[i];
hex02(idx, hxbuf); hex02(idx, hxbuf);
print_exact(hxbuf); print_exact(hxbuf);
ascii[i%ROW_SZ] = ascii_map[idx]; ascii[i%ROW_SZ] = ascii_map[idx];
} }
if (memory.size() % ROW_SZ != 0) if (memory.size() % ROW_SZ != 0)

Loading…
Cancel
Save