Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions shared/profiles.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,14 @@ static struct { uint32_t key; struct profile value; } *profile_map = NULL;
/* Track which path we loaded profiles.ini from */
static char loaded_profiles_path[512] = "";

/* Quirk field descriptor table — single source of truth for INI keys */
/* Quirk field descriptor table — generated from QUIRK_FIELDS X-macro in quirks.h */
static const struct {
const char *name;
size_t offset;
} quirk_fields[] = {
{ "load_store_quirk", offsetof(struct quirks, load_store_quirk) },
{ "shift_quirk", offsetof(struct quirks, shift_quirk) },
{ "jump_quirk", offsetof(struct quirks, jump_quirk) },
{ "logic_vf_quirk", offsetof(struct quirks, logic_vf_quirk) },
{ "i_overflow_quirk", offsetof(struct quirks, i_overflow_quirk) },
{ "draw_flag_quirk", offsetof(struct quirks, draw_flag_quirk) },
{ "vwrap", offsetof(struct quirks, vwrap) },
{ "hwrap", offsetof(struct quirks, hwrap) },
#define QUIRK_X_ENTRY(name, default_val) { #name, offsetof(struct quirks, name) },
QUIRK_FIELDS(QUIRK_X_ENTRY)
#undef QUIRK_X_ENTRY
};
#define NUM_QUIRK_FIELDS (sizeof(quirk_fields) / sizeof(quirk_fields[0]))

Expand Down
39 changes: 23 additions & 16 deletions shared/quirks.h
Original file line number Diff line number Diff line change
@@ -1,28 +1,35 @@
#ifndef QUIRKS_H
#define QUIRKS_H

/*
* X-macro list of all quirk fields.
* Format: X(field_name, default_value)
* This is the single source of truth — the struct, defaults,
* and INI field table are all generated from this list.
*/
#define QUIRK_FIELDS(X) \
X(load_store_quirk, 1) \
X(shift_quirk, 1) \
X(jump_quirk, 0) \
X(logic_vf_quirk, 0) \
X(i_overflow_quirk, 0) \
X(draw_flag_quirk, 0) \
X(vwrap, 1) \
X(hwrap, 0)


struct quirks {
bool load_store_quirk;
bool shift_quirk;
bool jump_quirk; /* BNNN: use VX instead of V0 for offset */
bool logic_vf_quirk; /* 8XY1/2/3: set VF=0 */
bool i_overflow_quirk; /* I+VX overflow sets VF (FX1E quirk) */
bool draw_flag_quirk; /* draw_flag reset behavior */
bool vwrap; /* vertical wrapping */
bool hwrap; /* horizontal wrapping */
#define QUIRK_X_FIELD(name, default_val) bool name;
QUIRK_FIELDS(QUIRK_X_FIELD)
#undef QUIRK_X_FIELD
};

/* Get default quirks */
static inline struct quirks quirks_get_defaults(void) {
struct quirks defaults;
defaults.load_store_quirk = 1;
defaults.shift_quirk = 1;
defaults.jump_quirk = 0;
defaults.logic_vf_quirk = 0;
defaults.i_overflow_quirk = 0;
defaults.draw_flag_quirk = 0;
defaults.vwrap = 1;
defaults.hwrap = 0;
#define QUIRK_X_DEFAULT(name, default_val) defaults.name = default_val;
QUIRK_FIELDS(QUIRK_X_DEFAULT)
#undef QUIRK_X_DEFAULT
return defaults;
}

Expand Down
Loading