Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
a2f4a33c8This file is pinned to the selected release. Download the original to open it in your design tool.
#include "GateBoyApp/TraceViewer.h"
#if 0
#include <vector>
#include <cstddef>
#include <float.h>
void TraceViewer::render(void* blob, int size, int count, const std::vector<SignalData>& signals, double center, double span) {
double tmin = center - span / 2;
double tmax = center + span / 2;
for (int i = 0; i < 1024; i++) {
double t = double(i) / 1024.0f;
t *= (tmax - tmin);
t += tmin;
int s = (int)floor(t);
if (s < 0) continue;
if (s >= count) continue;
uint8_t* base = (uint8_t*)blob + (s * size);
render_signals(signals, base, screen_x + i, screen_y);
}
}
int TraceViewer::render_signals(const std::vector<SignalData>& signals, void* blob, int x, int y) {
int cx = x;
int cy = y;
for (const SignalData& s : signals) {
uint8_t* src = (uint8_t*)blob + s.byte_offset;
if (!s.children.empty()) {
cy += 12;
cy += render_signals(s.children, src, cx, cy);
}
else {
if (s.bit_width == 0) {
cy += 12;
}
else {
for (int bit = s.bit_offset; bit < (s.bit_offset + s.bit_width); bit++) {
int b = (src[bit >> 3] >> (bit & 7)) & 1;
for (int by = 0; by < 11; by++) {
framebuffer[(cx + 0) + (cy + by) * fb_width] = b ? 0xFFCCCC99 : 0xFF484365;
}
cy += 12;
}
}
}
}
return cy - y;
}
#endif
#if 0
void plot_signal(int x, int y, void* d, std::vector<SignalMap>& map) {
for (int field = 0; field < map.size(); field++) {
SignalMap sig = map[field];
uint8_t* src = (uint8_t*)d + sig.offset;
for (int bit = 0; bit < sig.width; bit++) {
int b = (src[bit >> 3] >> (bit & 7)) & 1;
for (int by = 0; by < 12; by++) {
for (int bx = 0; bx < 6; bx++) {
framebuffer[x + bx + y * fb_width] = b ? 0xFFCCCC99 : 0xFF484365;
}
y++;
}
}
}
}
void draw_labels(int x, int y, std::vector<SignalMap>& map) {
for (int field = 0; field < map.size(); field++) {
SignalMap sig = map[field];
qp.render_text(x, y, sig.name);
y += sig.width * 12;
}
}
//-----------------------------------------------------------------------------
uint32_t pal(char c) {
if (c == '.') return 0xFF383355 + 0x00101010;
if (c == '|') return 0x00000000;
if (c == '#') return 0xFFCCCC99;
return 0x00000000;
}
void draw_icon(uint32_t* framebuffer, int fb_width,
const char* icon, int icon_width, int icon_height,
int dst_x, int dst_y, bool highlight) {
//dst_x *= 2;
//dst_y *= 2;
for (int y = 0; y < icon_height; y++) {
for (int x = 0; x < icon_width; x++) {
char p = icon[x + y * icon_width];
uint32_t c2 = pal(p);
//if (x == 0 && c2 == 0) c2 = 0x00335533;
//if (x == icon_width - 1 && c2 == 0) c2 = 0x00335533;
if (c2) {
if (highlight) c2 += 0x00303030;
framebuffer[(x * 1 + 0 + dst_x) + (y * 1 + 0 + dst_y) * fb_width] = c2;
//framebuffer[(x * 2 + 0 + dst_x) + (y * 2 + 0 + dst_y) * fb_width] = c2;
//framebuffer[(x * 2 + 1 + dst_x) + (y * 2 + 0 + dst_y) * fb_width] = c2;
//framebuffer[(x * 2 + 0 + dst_x) + (y * 2 + 1 + dst_y) * fb_width] = c2;
//framebuffer[(x * 2 + 1 + dst_x) + (y * 2 + 1 + dst_y) * fb_width] = c2;
}
}
}
}
const char* trace_0000 =
" "
" "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" "
" ";
const char* trace_0101 =
" "
" "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" "
" ";
const char* trace_0001 =
" "
" "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" "
" ";
const char* trace_0100 =
" "
" "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" "
" ";
//-----------------------------------------------------------------------------
const char* trace_0010 =
" "
" "
" ....#### "
" .....### "
" ......## "
" .......# "
" .......# "
" ......## "
" .....### "
" ....#### "
" "
" ";
const char* trace_0111 =
" "
" "
" ....#### "
" .....### "
" ......## "
" .......# "
" .......# "
" ......## "
" .....### "
" ....#### "
" "
" ";
const char* trace_0011 =
" "
" "
" ........ "
" ........ "
" ........ "
" .......# "
" ......## "
" .....### "
" ....#### "
" ...##### "
" "
" ";
const char* trace_0110 =
" "
" "
" ...##### "
" ....#### "
" .....### "
" ......## "
" .......# "
" ........ "
" ........ "
" ........ "
" "
" ";
//-----------------------------------------------------------------------------
const char* trace_1000 =
" "
" "
" ####.... "
" #####... "
" ######.. "
" #######. "
" #######. "
" ######.. "
" #####... "
" ####.... "
" "
" ";
const char* trace_1101 =
" "
" "
" ####.... "
" #####... "
" ######.. "
" #######. "
" #######. "
" ######.. "
" #####... "
" ####.... "
" "
" ";
const char* trace_1001 =
" "
" "
" ######## "
" ######## "
" ######## "
" #######. "
" ######.. "
" #####... "
" ####.... "
" ###..... "
" "
" ";
const char* trace_1100 =
" "
" "
" ###..... "
" ####.... "
" #####... "
" ######.. "
" #######. "
" ######## "
" ######## "
" ######## "
" "
" ";
//-----------------------------------------------------------------------------
const char* trace_1010 =
" "
" "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" "
" ";
const char* trace_1111 =
" "
" "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" "
" ";
const char* trace_1011 =
" "
" "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" "
" ";
const char* trace_1110 =
" "
" "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" "
" ";
//-----------------------------------------------------------------------------
const char* trace_dot_hi =
" "
" "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" ######## "
" "
" ";
const char* trace_dot_lo =
" "
" "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" ........ "
" "
" ";
/*
const char* trace_dot_hi =
" "
" # "
" ### "
" ##### "
" ####### "
" ######### "
" ####### "
" ##### "
" ### "
" # "
" "
" ";
const char* trace_dot_lo =
" "
" . "
" ... "
" ..... "
" ....... "
" ......... "
" ....... "
" ..... "
" ... "
" . "
" "
" ";
*/
const char* trace_icons[16] = {
trace_0000,
trace_0001,
trace_0010,
trace_0011,
trace_0100,
trace_0101,
trace_0110,
trace_0111,
trace_1000,
trace_1001,
trace_1010,
trace_1011,
trace_1100,
trace_1101,
trace_1110,
trace_1111,
};
void TextPainter::trace_q(const char* name, bool q) {
int icon_width = 12;
int icon_height = 12;
int dst_x = trace_x + (col * 1 + 0) * icon_width ;
int dst_y = trace_y + row * icon_height;
if (clock == 0) {
render_text(dst_x - (6 * 12), dst_y, name);
}
const char* src_q = q ? trace_dot_hi : trace_dot_lo;
draw_icon(framebuffer, fb_width,
src_q, icon_width, icon_height,
dst_x, dst_y,
col == highlight_col);
row++;
}
void TextPainter::trace_s(const char* name, bool s) {
int icon_width = 12;
int icon_height = 12;
int dst_x = trace_x + (col * 1 + 0) * icon_width ;
int dst_y = trace_y + row * icon_height;
if (clock == 0) {
int x = trace_x + col * 3 * icon_width;
render_text(x - (6 * 12), dst_y, name);
}
const char* src_s = s ? trace_dot_hi : trace_dot_lo;
draw_icon(framebuffer, fb_width,
src_s, icon_width, icon_height,
dst_x, dst_y,
col == highlight_col);
row++;
}
void TextPainter::trace_d(const char* name, bool d) {
int icon_width = 12;
int icon_height = 12;
int dst_x = trace_x + (col * 1 + 0) * icon_width ;
int dst_y = trace_y + row * icon_height;
if (clock == 0) {
int x = trace_x + col * 3 * icon_width;
render_text(x - (6 * 12), dst_y, name);
}
const char* src_d = d ? trace_dot_hi : trace_dot_lo;
draw_icon(framebuffer, fb_width,
src_d, icon_width, icon_height,
dst_x, dst_y,
col == highlight_col);
row++;
}
void TextPainter::trace_qd(const char* name, bool q, bool qc, bool d, bool dc) {
int icon_width = 12;
int icon_height = 12;
int dst_x = trace_x + (col * 1 + 0) * icon_width ;
int dst_y = trace_y + row * icon_height;
if (clock == 0) {
render_text(dst_x - (6 * 12), dst_y, name);
}
//q = 0;
//d = 0;
int t = (q << 3) | (qc << 2) | (d << 1) | (dc << 0);
const char* src = trace_icons[t];
draw_icon(framebuffer, fb_width,
src, icon_width, icon_height,
dst_x, dst_y,
col == highlight_col);
row++;
}
void TextPainter::trace_qd(const char* name, const reg& q, const reg& d) {
int icon_width = 12;
int icon_height = 12;
int dst_x = trace_x + (col * 1 + 0) * icon_width ;
int dst_y = trace_y + row * icon_height;
if (clock == 0) {
render_text(dst_x - (6 * 12), dst_y, name);
}
int t = (q.q() << 3) | (q.c() << 2) | (d.q() << 1) | (d.c() << 0);
const char* src = trace_icons[t];
draw_icon(framebuffer, fb_width,
src, icon_width, icon_height,
dst_x, dst_y,
col == highlight_col);
row++;
}
#endif