8. Advanced: versioned packed SPVAR
define SAVE_MAGIC = 0x5A31;
define SAVE_VERSION = 1;
define MODE_SHIFT = 0;
define MODE_MASK = 0x00000003;
define ENABLE_SHIFT = 2;
define ENABLE_MASK = 0x00000004;
define STRENGTH_SHIFT = 3;
define STRENGTH_MASK = 0x000003F8;
int mode;
int enabled;
int strength = 25;
int packed;
int dirty;
init {
if(get_pvar(SPVAR_1, 0, INT32_MAX, 0) == SAVE_MAGIC &&
get_pvar(SPVAR_2, 0, 100, 0) == SAVE_VERSION) {
packed = get_pvar(SPVAR_3, 0, 1023, 0);
unpack_settings(packed);
}
}
main {
if(event_press(PS5_TRIANGLE)) {
mode = mode + 1;
if(mode > 3) mode = 0;
dirty = TRUE;
}
if(event_press(PS5_CROSS)) {
enabled = !enabled;
dirty = TRUE;
}
if(event_press(PS5_UP)) {
strength = strength + 1;
if(strength > 100) strength = 100;
dirty = TRUE;
}
if(dirty && event_press(PS5_OPTIONS)) {
packed = pack_settings();
set_pvar(SPVAR_1, SAVE_MAGIC);
set_pvar(SPVAR_2, SAVE_VERSION);
set_pvar(SPVAR_3, packed);
dirty = FALSE;
}
set_val(TRACE_1, mode);
set_val(TRACE_2, enabled);
set_val(TRACE_3, strength);
}
function pack_settings() {
int_dummy = 0;
int_dummy = int_dummy | ((mode << MODE_SHIFT) & MODE_MASK);
int_dummy = int_dummy | ((enabled << ENABLE_SHIFT) & ENABLE_MASK);
int_dummy = int_dummy | ((strength << STRENGTH_SHIFT) & STRENGTH_MASK);
return int_dummy;
}
function unpack_settings(value) {
mode = (value & MODE_MASK) >> MODE_SHIFT;
enabled = (value & ENABLE_MASK) >> ENABLE_SHIFT;
strength = (value & STRENGTH_MASK) >> STRENGTH_SHIFT;
if(mode < 0 || mode > 3) mode = 0;
if(strength < 0 || strength > 100) strength = 25;
}
int int_dummy;Previous7. Intermediate: validated persistent settingNext9. Advanced: OLED status card with a custom button badge
Last updated

