Implement new way to address status bits. 128bit status.
This commit is contained in:
166
menu.cpp
166
menu.cpp
@@ -419,76 +419,11 @@ void SelectFile(const char* path, const char* pFileExt, int Options, unsigned ch
|
||||
menustate = MENU_FILE_SELECT1;
|
||||
}
|
||||
|
||||
int substrcpy(char *d, const char *s, char idx)
|
||||
{
|
||||
char p = 0;
|
||||
char *b = d;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
if ((p == idx) && *s && (*s != ',')) *d++ = *s;
|
||||
|
||||
if (*s == ',')
|
||||
{
|
||||
if (p == idx) break;
|
||||
p++;
|
||||
}
|
||||
|
||||
s++;
|
||||
}
|
||||
|
||||
*d = 0;
|
||||
return (int)(d - b);
|
||||
}
|
||||
|
||||
#define STD_EXIT " exit"
|
||||
#define STD_BACK " back"
|
||||
#define STD_SPACE_EXIT " SPACE to exit"
|
||||
#define STD_COMBO_EXIT " Ctrl+ESC to exit"
|
||||
|
||||
int getOptIdx(char *opt)
|
||||
{
|
||||
if ((opt[1] >= '0') && (opt[1] <= '9')) return opt[1] - '0';
|
||||
if ((opt[1] >= 'A') && (opt[1] <= 'V')) return opt[1] - 'A' + 10;
|
||||
return 0; // basically 0 cannot be valid because used as a reset. Thus can be used as a error.
|
||||
}
|
||||
|
||||
uint32_t getStatus(char *opt, uint32_t status)
|
||||
{
|
||||
char idx1 = getOptIdx(opt);
|
||||
char idx2 = getOptIdx(opt + 1);
|
||||
uint32_t x = (status & (1 << idx1)) ? 1 : 0;
|
||||
|
||||
if (idx2>idx1) {
|
||||
x = status >> idx1;
|
||||
x = x & ~(0xffffffff << (idx2 - idx1 + 1));
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
uint32_t setStatus(char *opt, uint32_t status, uint32_t value)
|
||||
{
|
||||
unsigned char idx1 = getOptIdx(opt);
|
||||
unsigned char idx2 = getOptIdx(opt + 1);
|
||||
uint32_t x = 1;
|
||||
|
||||
if (idx2>idx1) x = ~(0xffffffff << (idx2 - idx1 + 1));
|
||||
x = x << idx1;
|
||||
|
||||
return (status & ~x) | ((value << idx1) & x);
|
||||
}
|
||||
|
||||
uint32_t getStatusMask(char *opt)
|
||||
{
|
||||
char idx1 = getOptIdx(opt);
|
||||
char idx2 = getOptIdx(opt + 1);
|
||||
uint32_t x = 1;
|
||||
|
||||
if (idx2 > idx1) x = ~(0xffffffff << (idx2 - idx1 + 1));
|
||||
return x;
|
||||
}
|
||||
|
||||
// conversion table of Amiga keyboard scan codes to ASCII codes
|
||||
static const uint8_t keycode_table[128] =
|
||||
{
|
||||
@@ -1111,13 +1046,13 @@ void HandleUI(void)
|
||||
if (menu_visible > 0)
|
||||
{
|
||||
menu_visible = 0;
|
||||
video_menu_bg((user_io_status(0, 0) & 0xE) >> 1, 1);
|
||||
video_menu_bg(user_io_status_get("[3:1]"), 1);
|
||||
OsdMenuCtl(0);
|
||||
}
|
||||
else if (!menu_visible)
|
||||
{
|
||||
menu_visible--;
|
||||
video_menu_bg((user_io_status(0, 0) & 0xE) >> 1, 2);
|
||||
video_menu_bg(user_io_status_get("[3:1]"), 2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1128,7 +1063,7 @@ void HandleUI(void)
|
||||
{
|
||||
c = 0;
|
||||
menu_visible = 1;
|
||||
video_menu_bg((user_io_status(0, 0) & 0xE) >> 1);
|
||||
video_menu_bg(user_io_status_get("[3:1]"));
|
||||
OsdMenuCtl(1);
|
||||
}
|
||||
}
|
||||
@@ -1153,17 +1088,16 @@ void HandleUI(void)
|
||||
case KEY_F12:
|
||||
menu = true;
|
||||
menu_key_set(KEY_F12 | UPSTROKE);
|
||||
if(video_fb_state()) video_menu_bg((user_io_status(0, 0) & 0xE) >> 1);
|
||||
if(video_fb_state()) video_menu_bg(user_io_status_get("[3:1]"));
|
||||
video_fb_enable(0);
|
||||
break;
|
||||
|
||||
case KEY_F1:
|
||||
if (is_menu() && cfg.fb_terminal)
|
||||
{
|
||||
unsigned long status = (user_io_status(0, 0)+ 2) & 0xE;
|
||||
user_io_status(status, 0xE);
|
||||
FileSaveConfig(user_io_create_config_name(), &status, 4);
|
||||
video_menu_bg(status >> 1);
|
||||
user_io_status_set("[3:1]", user_io_status_get("[3:1]") + 1);
|
||||
user_io_status_save(user_io_create_config_name());
|
||||
video_menu_bg(user_io_status_get("[3:1]"));
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1659,7 +1593,7 @@ void HandleUI(void)
|
||||
//Hide or Disable flag (small letter - opposite action)
|
||||
while ((p[0] == 'H' || p[0] == 'D' || p[0] == 'h' || p[0] == 'd') && strlen(p) > 2)
|
||||
{
|
||||
int flg = (hdmask & (1 << getOptIdx(p))) ? 1 : 0;
|
||||
int flg = (hdmask & (1 << user_io_hd_mask(p + 1))) ? 1 : 0;
|
||||
if (p[0] == 'H') h |= flg;
|
||||
if (p[0] == 'h') h |= (flg ^ 1);
|
||||
if (p[0] == 'D') d |= flg;
|
||||
@@ -1803,13 +1737,9 @@ void HandleUI(void)
|
||||
// check for 'O'ption strings
|
||||
if ((p[0] == 'O') || (p[0] == 'o'))
|
||||
{
|
||||
int ex = (p[0] == 'o');
|
||||
uint32_t status = user_io_status(0, 0, ex); // 0,0 gets status
|
||||
|
||||
//option handled by ARM
|
||||
//option handled by HPS
|
||||
if (p[1] == 'X') p++;
|
||||
|
||||
uint32_t x = getStatus(p, status);
|
||||
uint32_t x = user_io_status_get(p + 1, p[0] == 'o');
|
||||
|
||||
// get currently active option
|
||||
substrcpy(s, p, 2 + x);
|
||||
@@ -2005,7 +1935,7 @@ void HandleUI(void)
|
||||
//Hide or Disable flag
|
||||
while ((p[0] == 'H' || p[0] == 'D' || p[0] == 'h' || p[0] == 'd') && strlen(p) > 2)
|
||||
{
|
||||
int flg = (hdmask & (1 << getOptIdx(p))) ? 1 : 0;
|
||||
int flg = (hdmask & (1 << user_io_hd_mask(p + 1))) ? 1 : 0;
|
||||
if (p[0] == 'H') h |= flg;
|
||||
if (p[0] == 'h') h |= (flg ^ 1);
|
||||
if (p[0] == 'D') d |= flg;
|
||||
@@ -2164,9 +2094,9 @@ void HandleUI(void)
|
||||
p++;
|
||||
}
|
||||
|
||||
uint32_t status = user_io_status(0, 0, ex); // 0,0 gets status
|
||||
uint32_t x = minus ? (getStatus(p, status) - 1) : (getStatus(p, status) + 1);
|
||||
uint32_t mask = getStatusMask(p);
|
||||
uint32_t x = user_io_status_get(p + 1, ex);
|
||||
x = minus ? (x - 1) : (x + 1);
|
||||
uint32_t mask = user_io_status_mask(p + 1);
|
||||
x &= mask;
|
||||
|
||||
if (byarm && is_x86() && p[1] == '2') x86_set_fdd_boot(!(x & 1));
|
||||
@@ -2187,7 +2117,7 @@ void HandleUI(void)
|
||||
if (!strlen(s) || get_arc(s) < 0) x = 0;
|
||||
}
|
||||
|
||||
user_io_status(setStatus(p, status, x), 0xffffffff, ex);
|
||||
user_io_status_set(p + 1, x, ex);
|
||||
|
||||
if (is_x86() && p[1] == 'A')
|
||||
{
|
||||
@@ -2202,36 +2132,37 @@ void HandleUI(void)
|
||||
}
|
||||
else if (((p[0] == 'T') || (p[0] == 'R') || (p[0] == 't') || (p[0] == 'r')) && select)
|
||||
{
|
||||
int bit;
|
||||
int ex = (p[0] == 't') || (p[0] == 'r');
|
||||
|
||||
// determine which status bit is affected
|
||||
uint32_t mask = 1 << getOptIdx(p);
|
||||
if (mask == 1 && is_x86())
|
||||
if (user_io_status_bits(p + 1, &bit, 0, ex) == 1)
|
||||
{
|
||||
x86_init();
|
||||
ResetUART();
|
||||
menustate = MENU_NONE1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_megacd())
|
||||
const char *opt = p + 1;
|
||||
if (!bit && is_x86())
|
||||
{
|
||||
if (mask == 1) mcd_set_image(0, "");
|
||||
if (mask == 2)
|
||||
{
|
||||
mcd_reset();
|
||||
mask = 1;
|
||||
}
|
||||
x86_init();
|
||||
ResetUART();
|
||||
menustate = MENU_NONE1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_megacd())
|
||||
{
|
||||
if (!bit) mcd_set_image(0, "");
|
||||
if (bit == 1)
|
||||
{
|
||||
mcd_reset();
|
||||
opt = "[0]";
|
||||
}
|
||||
}
|
||||
|
||||
if (is_pce() && mask == 1) pcecd_reset();
|
||||
if (is_pce() && !bit) pcecd_reset();
|
||||
|
||||
uint32_t status = user_io_status(0, 0, ex);
|
||||
user_io_status_set(opt, 1, ex);
|
||||
user_io_status_set(opt, 0, ex);
|
||||
|
||||
user_io_status(status ^ mask, mask, ex);
|
||||
user_io_status(status, mask, ex);
|
||||
menustate = MENU_GENERIC_MAIN1;
|
||||
if (p[0] == 'R' || p[0] == 'r') menustate = MENU_NONE1;
|
||||
menustate = MENU_GENERIC_MAIN1;
|
||||
if (p[0] == 'R' || p[0] == 'r') menustate = MENU_NONE1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2574,9 +2505,8 @@ void HandleUI(void)
|
||||
else
|
||||
{
|
||||
char *filename = user_io_create_config_name();
|
||||
uint32_t status[2] = { user_io_status(0, 0, 0), user_io_status(0, 0, 1) };
|
||||
printf("Saving config to %s\n", filename);
|
||||
FileSaveConfig(filename, status, 8);
|
||||
user_io_status_save(filename);
|
||||
if (is_x86()) x86_config_save();
|
||||
if (is_arcade()) arcade_nvm_save();
|
||||
}
|
||||
@@ -2918,7 +2848,7 @@ void HandleUI(void)
|
||||
{
|
||||
if (c & UPSTROKE)
|
||||
{
|
||||
video_menu_bg((user_io_status(0, 0) & 0xE) >> 1);
|
||||
video_menu_bg(user_io_status_get("[3:1]"));
|
||||
video_fb_enable(0);
|
||||
menustate = MENU_NONE1;
|
||||
menusub = 3;
|
||||
@@ -3009,8 +2939,8 @@ void HandleUI(void)
|
||||
if (!dipv)
|
||||
{
|
||||
arcade_sw_save(dipv);
|
||||
user_io_status(UIO_STATUS_RESET, UIO_STATUS_RESET);
|
||||
user_io_status(0, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 1);
|
||||
user_io_status_set("[0]", 0);
|
||||
menustate = MENU_NONE1;
|
||||
}
|
||||
else
|
||||
@@ -5139,10 +5069,10 @@ void HandleUI(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
user_io_status_reset();
|
||||
char *filename = user_io_create_config_name();
|
||||
uint32_t status[2] = { user_io_status(0, 0xffffffff, 0), user_io_status(0, 0xffffffff, 1) };
|
||||
printf("Saving config to %s\n", filename);
|
||||
FileSaveConfig(filename, status, 8);
|
||||
user_io_status_save(filename);
|
||||
menustate = MENU_GENERIC_MAIN1;
|
||||
for (int n = 0; n < 2; n++)
|
||||
{
|
||||
@@ -5150,8 +5080,8 @@ void HandleUI(void)
|
||||
{
|
||||
arcade_sw(n)->dip_cur = arcade_sw(n)->dip_def;
|
||||
arcade_sw_send(n);
|
||||
user_io_status(UIO_STATUS_RESET, UIO_STATUS_RESET);
|
||||
user_io_status(0, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 1);
|
||||
user_io_status_set("[0]", 0);
|
||||
arcade_sw_save(n);
|
||||
}
|
||||
}
|
||||
@@ -6387,7 +6317,7 @@ void HandleUI(void)
|
||||
{
|
||||
if (c & UPSTROKE)
|
||||
{
|
||||
video_menu_bg((user_io_status(0, 0) & 0xE) >> 1);
|
||||
video_menu_bg(user_io_status_get("[3:1]"));
|
||||
video_fb_enable(0);
|
||||
menustate = MENU_SYSTEM1;
|
||||
menusub = 3;
|
||||
|
||||
6
menu.h
6
menu.h
@@ -3,7 +3,6 @@
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
|
||||
void SelectFile(const char* path, const char* pFileExt, int Options, unsigned char MenuSelect, unsigned char MenuCancel);
|
||||
|
||||
void HandleUI(void);
|
||||
@@ -17,11 +16,6 @@ void InfoMessage(const char *message, int timeout = 2000, const char *title = "M
|
||||
void Info(const char *message, int timeout = 2000, int width = 0, int height = 0, int frame = 0);
|
||||
void MenuHide();
|
||||
|
||||
int getOptIdx(char *opt);
|
||||
uint32_t getStatus(char *opt, uint32_t status);
|
||||
uint32_t getStatusMask(char *opt);
|
||||
int substrcpy(char *d, const char *s, char idx);
|
||||
|
||||
void open_joystick_setup();
|
||||
int menu_lightgun_cb(int idx, uint16_t type, uint16_t code, int value);
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ void archie_set_ar(char i)
|
||||
{
|
||||
config.system_ctrl &= ~0b11000000;
|
||||
config.system_ctrl |= (i & 3) << 6;
|
||||
user_io_status(config.system_ctrl, 0b11000000);
|
||||
user_io_status_set("[7:6]", config.system_ctrl >> 6);
|
||||
}
|
||||
|
||||
int archie_get_ar()
|
||||
@@ -93,7 +93,7 @@ void archie_set_scale(char i)
|
||||
{
|
||||
config.system_ctrl &= ~0b1100000000;
|
||||
config.system_ctrl |= (i & 3) << 8;
|
||||
user_io_status(config.system_ctrl, 0b1100000000);
|
||||
user_io_status_set("[9:8]", config.system_ctrl >> 8);
|
||||
}
|
||||
|
||||
int archie_get_scale()
|
||||
@@ -103,26 +103,26 @@ int archie_get_scale()
|
||||
|
||||
void archie_set_60(char i)
|
||||
{
|
||||
if (i) config.system_ctrl |= 0b1000;
|
||||
else config.system_ctrl &= ~0b1000;
|
||||
user_io_status(config.system_ctrl, 0b10000);
|
||||
if (i) config.system_ctrl |= 0b10000;
|
||||
else config.system_ctrl &= ~0b10000;
|
||||
user_io_status_set("[4]", config.system_ctrl >> 4);
|
||||
}
|
||||
|
||||
int archie_get_60()
|
||||
{
|
||||
return config.system_ctrl & 0b1000;
|
||||
return config.system_ctrl & 0b10000;
|
||||
}
|
||||
|
||||
void archie_set_afix(char i)
|
||||
{
|
||||
if (i) config.system_ctrl |= 0b10000;
|
||||
else config.system_ctrl &= ~0b10000;
|
||||
user_io_status(config.system_ctrl, 0b100000);
|
||||
if (i) config.system_ctrl |= 0b100000;
|
||||
else config.system_ctrl &= ~0b100000;
|
||||
user_io_status_set("[5]", config.system_ctrl >> 5);
|
||||
}
|
||||
|
||||
int archie_get_afix()
|
||||
{
|
||||
return config.system_ctrl & 0b10000;
|
||||
return config.system_ctrl & 0b100000;
|
||||
}
|
||||
|
||||
static int mswap = 0;
|
||||
@@ -139,7 +139,7 @@ int archie_get_mswap()
|
||||
void archie_set_amix(char i)
|
||||
{
|
||||
config.system_ctrl = (config.system_ctrl & ~0b110) | ((i & 3)<<1);
|
||||
user_io_status(config.system_ctrl << 1, 0b1100);
|
||||
user_io_status_set("[3:2]", config.system_ctrl>>1);
|
||||
}
|
||||
|
||||
int archie_get_amix()
|
||||
@@ -295,7 +295,7 @@ inline int hdd_open(int unit, char *filename)
|
||||
void archie_init()
|
||||
{
|
||||
archie_debugf("init");
|
||||
user_io_status(UIO_STATUS_RESET, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 1);
|
||||
|
||||
// set config defaults
|
||||
config.system_ctrl = 0;
|
||||
@@ -338,7 +338,7 @@ void archie_init()
|
||||
|
||||
load_cmos();
|
||||
|
||||
user_io_status(~UIO_STATUS_RESET, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 0);
|
||||
|
||||
/*
|
||||
int i;
|
||||
|
||||
@@ -124,8 +124,8 @@ void mcd_set_image(int num, const char *filename)
|
||||
{
|
||||
mcd_mount_save("");
|
||||
|
||||
user_io_status(1, 1);
|
||||
user_io_status(0, 1);
|
||||
user_io_status_set("[0]", 1);
|
||||
user_io_status_set("[0]", 0);
|
||||
mcd_reset();
|
||||
|
||||
loaded = 0;
|
||||
|
||||
@@ -1043,14 +1043,14 @@ int neogeo_romset_tx(char* name)
|
||||
int system_type;
|
||||
static char full_path[1024];
|
||||
|
||||
system_type = (user_io_status(0, 0) >> 1) & 3;
|
||||
system_type = user_io_status_get("[2:1]") & 3;
|
||||
printf("System type: %u\n", system_type);
|
||||
|
||||
spi_uio_cmd_cont(UIO_GET_OSDMASK);
|
||||
uint16_t mask = spi_w(0);
|
||||
DisableIO();
|
||||
|
||||
user_io_status(1, 1); // Maintain reset
|
||||
user_io_status_set("[0]", 1); // Maintain reset
|
||||
|
||||
crom_sz_max = 0;
|
||||
crom_start = 0;
|
||||
@@ -1140,7 +1140,7 @@ int neogeo_romset_tx(char* name)
|
||||
FileGenerateSavePath((system_type & 2) ? "ngcd" : name, (char*)full_path);
|
||||
user_io_file_mount((char*)full_path, 0, 1);
|
||||
|
||||
user_io_status(0, 1); // Release reset
|
||||
user_io_status_set("[0]", 0); // Release reset
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -113,9 +113,9 @@ static void notify_mount(int load)
|
||||
|
||||
if (!load)
|
||||
{
|
||||
user_io_status(UIO_STATUS_RESET, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 1);
|
||||
usleep(100000);
|
||||
user_io_status(0, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -703,7 +703,7 @@ void psx_mount_cd(int f_index, int s_index, const char *filename)
|
||||
|
||||
}
|
||||
|
||||
if (!(user_io_status(0, 0, 1) >> 31)) psx_mount_save(last_dir);
|
||||
if (!(user_io_status_get("[63]"))) psx_mount_save(last_dir);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,27 @@ static sharpmz_tape_header_t tapeHeader;
|
||||
static tape_queue_t tapeQueue;
|
||||
static unsigned char debugEnabled = 0;
|
||||
|
||||
static uint32_t set_status(uint32_t new_status, uint32_t mask, int ex = 0)
|
||||
{
|
||||
static uint32_t status[2] = { 0, 0 };
|
||||
if (ex) ex = 1;
|
||||
|
||||
// if mask is 0 just return the current status
|
||||
if (mask) {
|
||||
// keep everything not masked
|
||||
status[ex] &= ~mask;
|
||||
// updated masked bits
|
||||
status[ex] |= new_status & mask;
|
||||
|
||||
spi_uio_cmd_cont(UIO_SET_STATUS2);
|
||||
spi32_w(status[0]);
|
||||
spi32_w(status[1]);
|
||||
DisableIO();
|
||||
}
|
||||
|
||||
return status[ex];
|
||||
}
|
||||
|
||||
// Method to open a file for writing.
|
||||
//
|
||||
int sharpmz_file_write(fileTYPE *file, const char *fileName)
|
||||
@@ -118,7 +139,7 @@ void sharpmz_reset(unsigned long preResetSleep, unsigned long postResetSleep)
|
||||
// Set the reset bit.
|
||||
//
|
||||
config.system_ctrl |= 1;
|
||||
user_io_status(config.system_ctrl, (1));
|
||||
set_status(config.system_ctrl, (1));
|
||||
|
||||
// Sleep and hold device in reset for given period.
|
||||
//
|
||||
@@ -128,7 +149,7 @@ void sharpmz_reset(unsigned long preResetSleep, unsigned long postResetSleep)
|
||||
// Remove reset.
|
||||
//
|
||||
config.system_ctrl &= ~(1);
|
||||
user_io_status(config.system_ctrl, (1));
|
||||
set_status(config.system_ctrl, (1));
|
||||
|
||||
// Sleep and hold device in reset for given period.
|
||||
//
|
||||
@@ -204,7 +225,7 @@ int sharpmz_reset_config(short setStatus)
|
||||
//
|
||||
if(setStatus)
|
||||
{
|
||||
user_io_status(config.system_ctrl, 0xffffffff);
|
||||
set_status(config.system_ctrl, 0xffffffff);
|
||||
|
||||
// Set the registers.
|
||||
//
|
||||
@@ -248,7 +269,7 @@ int sharpmz_reload_config(short setStatus)
|
||||
//
|
||||
if(setStatus && success)
|
||||
{
|
||||
user_io_status(config.system_ctrl, 0xffffffff);
|
||||
set_status(config.system_ctrl, 0xffffffff);
|
||||
|
||||
// Set the registers.
|
||||
//
|
||||
@@ -286,7 +307,7 @@ void sharpmz_init(void)
|
||||
|
||||
// Setup the status values based on the config.
|
||||
//
|
||||
user_io_status(config.system_ctrl, 0xffffffff);
|
||||
set_status(config.system_ctrl, 0xffffffff);
|
||||
|
||||
// Set the control registers according to config.
|
||||
//
|
||||
@@ -797,7 +818,7 @@ void sharpmz_set_aspect_ratio(short on, short setStatus)
|
||||
config.system_ctrl |= (on == 1 ? 1 << 1 : 0);
|
||||
|
||||
if(setStatus)
|
||||
user_io_status(config.system_ctrl, (1 << 1));
|
||||
set_status(config.system_ctrl, (1 << 1));
|
||||
}
|
||||
|
||||
// Return Scan doubler fx status bits. Bits 2,3,4 of systemctrl.
|
||||
@@ -827,7 +848,7 @@ void sharpmz_set_scandoubler_fx(short doubler, short setStatus)
|
||||
config.system_ctrl |= (doubler & 0x07) << 2;
|
||||
|
||||
if(setStatus)
|
||||
user_io_status(config.system_ctrl, (0x07 << 2));
|
||||
set_status(config.system_ctrl, (0x07 << 2));
|
||||
}
|
||||
|
||||
// Return VRAM wait state mode status bit. Bit 6 of system_reg, 0 = Off, 1 = On
|
||||
|
||||
@@ -297,7 +297,7 @@ static uint8_t bin2bcd(unsigned val)
|
||||
|
||||
void x86_init()
|
||||
{
|
||||
user_io_status(UIO_STATUS_RESET, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 1);
|
||||
|
||||
const char *home = HomeDir();
|
||||
|
||||
@@ -421,7 +421,7 @@ void x86_init()
|
||||
for (unsigned int i = 0; i < sizeof(cmos) / sizeof(cmos[0]); i++) IOWR(RTC_BASE, i, cmos[i]);
|
||||
|
||||
x86_share_reset();
|
||||
user_io_status(0, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 0);
|
||||
}
|
||||
|
||||
static void fdd_io(uint8_t read)
|
||||
|
||||
311
user_io.cpp
311
user_io.cpp
@@ -325,6 +325,137 @@ void user_io_read_core_name()
|
||||
printf("Core name is \"%s\"\n", core_name);
|
||||
}
|
||||
|
||||
int substrcpy(char *d, const char *s, char idx)
|
||||
{
|
||||
char p = 0;
|
||||
char *b = d;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
if ((p == idx) && *s && (*s != ',')) *d++ = *s;
|
||||
|
||||
if (*s == ',')
|
||||
{
|
||||
if (p == idx) break;
|
||||
p++;
|
||||
}
|
||||
|
||||
s++;
|
||||
}
|
||||
|
||||
*d = 0;
|
||||
return (int)(d - b);
|
||||
}
|
||||
|
||||
static char cur_status[16] = {};
|
||||
|
||||
int user_io_status_bits(const char *opt, int *s, int *e, int ex, int single)
|
||||
{
|
||||
uint32_t start = 0, end = 0;
|
||||
if (opt[0] == '[')
|
||||
{
|
||||
if (!single && sscanf(opt, "[%u:%u]", &end, &start) == 2)
|
||||
{
|
||||
if (start > 127 || end > 127 || end <= start) return 0;
|
||||
}
|
||||
else if (sscanf(opt, "[%u]", &start) == 1)
|
||||
{
|
||||
if (start > 127) return 0;
|
||||
end = start;
|
||||
}
|
||||
else return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((opt[0] >= '0') && (opt[0] <= '9')) start = opt[0] - '0';
|
||||
else if ((opt[0] >= 'A') && (opt[0] <= 'V')) start = opt[0] - 'A' + 10;
|
||||
else return 0;
|
||||
|
||||
if (!single && (opt[1] >= '0') && (opt[1] <= '9')) end = opt[1] - '0';
|
||||
else if (!single && (opt[1] >= 'A') && (opt[1] <= 'V')) end = opt[1] - 'A' + 10;
|
||||
else
|
||||
{
|
||||
single = 1;
|
||||
end = start;
|
||||
}
|
||||
|
||||
if (ex)
|
||||
{
|
||||
start += 32;
|
||||
end += 32;
|
||||
}
|
||||
|
||||
if (start > 127 || end > 127 || (!single && end <= start)) return 0;
|
||||
}
|
||||
|
||||
//max 8 bits per option
|
||||
if (end - start > 8) return 0;
|
||||
|
||||
if (s) *s = (int)start;
|
||||
if (e) *e = (int)end;
|
||||
return 1 + end - start;
|
||||
}
|
||||
|
||||
uint32_t user_io_status_get(const char *opt, int ex)
|
||||
{
|
||||
int start, end;
|
||||
int size = user_io_status_bits(opt, &start, &end, ex);
|
||||
if (!size) return 0;
|
||||
|
||||
uint32_t x = (cur_status[end / 8] << 8) | cur_status[start / 8];
|
||||
x >>= start % 8;
|
||||
return x & ~(0xffffffff << size);
|
||||
}
|
||||
|
||||
uint32_t user_io_status_mask(const char *opt)
|
||||
{
|
||||
return ~(0xffffffff << user_io_status_bits(opt, 0, 0, 0));
|
||||
}
|
||||
|
||||
uint32_t user_io_hd_mask(const char *opt)
|
||||
{
|
||||
int start;
|
||||
int size = user_io_status_bits(opt, &start, 0, 0, 1);
|
||||
if (!size) return 0;
|
||||
return start;
|
||||
}
|
||||
|
||||
void user_io_status_set(const char *opt, uint32_t value, int ex)
|
||||
{
|
||||
int start, end;
|
||||
int size = user_io_status_bits(opt, &start, &end, ex);
|
||||
if (!size) return;
|
||||
|
||||
int s = start / 8;
|
||||
int e = end / 8;
|
||||
|
||||
uint32_t mask = ~(0xffffffff << size);
|
||||
mask <<= start % 8;
|
||||
uint32_t x = (cur_status[e] << 8) | cur_status[s];
|
||||
x = (x & ~mask) | ((value << (start % 8)) & mask);
|
||||
|
||||
cur_status[s] = (char)x;
|
||||
if (e != s) cur_status[e] = (char)(x >> 8);
|
||||
|
||||
if (!is_st())
|
||||
{
|
||||
spi_uio_cmd_cont(UIO_SET_STATUS2);
|
||||
for (uint32_t i = 0; i < sizeof(cur_status); i += 2) spi_w((cur_status[i + 1] << 8) | cur_status[i]);
|
||||
DisableIO();
|
||||
}
|
||||
}
|
||||
|
||||
int user_io_status_save(const char *filename)
|
||||
{
|
||||
return FileSaveConfig(filename, cur_status, sizeof(cur_status));
|
||||
}
|
||||
|
||||
void user_io_status_reset()
|
||||
{
|
||||
memset(cur_status, 0, sizeof(cur_status));
|
||||
user_io_status_set("[0]", 0);
|
||||
}
|
||||
|
||||
static void set_kbd_led(int led, int state)
|
||||
{
|
||||
if (led & HID_LED_CAPS_LOCK)
|
||||
@@ -412,8 +543,9 @@ static char defmra[1024] = {};
|
||||
|
||||
static void parse_config()
|
||||
{
|
||||
uint64_t mask = 0;
|
||||
uint64_t overlap = 0;
|
||||
char mask[sizeof(cur_status) * 8] = {};
|
||||
char overlap[sizeof(cur_status) * 8] = {};
|
||||
int start, end, sz;
|
||||
|
||||
int i = 0;
|
||||
char *p;
|
||||
@@ -552,34 +684,37 @@ static void parse_config()
|
||||
}
|
||||
if (p[0] == 'P') p += 2;
|
||||
|
||||
if (p[0] == 'R' || p[0] == 'T')
|
||||
if (p[0] == 'R' || p[0] == 'T' || p[0] == 'r' || p[0] == 't')
|
||||
{
|
||||
uint64_t x = 1 << getOptIdx(p);
|
||||
overlap |= mask & x;
|
||||
mask |= x;
|
||||
sz = user_io_status_bits(p + 1, &start, &end, p[0] == 'r' || p[0] == 't');
|
||||
if (sz == 1)
|
||||
{
|
||||
overlap[start] |= mask[start];
|
||||
mask[start] |= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Invalid OSD option: %s\n", p);
|
||||
}
|
||||
}
|
||||
if (p[0] == 'r' || p[0] == 't')
|
||||
else if (p[0] == 'O' || p[0] == 'o')
|
||||
{
|
||||
uint64_t x = 1 << getOptIdx(p);
|
||||
x <<= 32;
|
||||
overlap |= mask & x;
|
||||
mask |= x;
|
||||
}
|
||||
if (p[0] == 'O')
|
||||
{
|
||||
char *opt = (p[1] == 'X') ? p + 1 : p;
|
||||
uint64_t x = getStatusMask(opt);
|
||||
x <<= getOptIdx(opt);
|
||||
overlap |= mask & x;
|
||||
mask |= x;
|
||||
}
|
||||
if (p[0] == 'o')
|
||||
{
|
||||
char *opt = (p[1] == 'X') ? p + 1 : p;
|
||||
uint64_t x = getStatusMask(opt);
|
||||
x <<= 32 + getOptIdx(opt);
|
||||
overlap |= mask & x;
|
||||
mask |= x;
|
||||
char *opt = (p[1] == 'X') ? (p + 2) : (p + 1);
|
||||
sz = user_io_status_bits(opt, &start, &end, p[0] == 'o');
|
||||
if (sz)
|
||||
{
|
||||
while (sz)
|
||||
{
|
||||
overlap[start] |= mask[start];
|
||||
mask[start] |= 1;
|
||||
sz--;
|
||||
start++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Invalid OSD option: %s\n", p);
|
||||
}
|
||||
}
|
||||
|
||||
if (p[0] == 'J')
|
||||
@@ -598,10 +733,8 @@ static void parse_config()
|
||||
|
||||
if (p[0] == 'O' && p[1] == 'X')
|
||||
{
|
||||
uint32_t status = user_io_status(0, 0);
|
||||
printf("found OX option: %s, 0x%08X\n", p, status);
|
||||
|
||||
unsigned long x = getStatus(p + 1, status);
|
||||
int x = user_io_status_get(p + 2);
|
||||
printf("found OX option: %s: %d\n", p, x);
|
||||
|
||||
if (is_x86())
|
||||
{
|
||||
@@ -702,7 +835,7 @@ static void parse_config()
|
||||
i++;
|
||||
} while (p || i<3);
|
||||
|
||||
mask |= 1; // reset is always on bit 0
|
||||
mask[0] = 1; // reset is always on bit 0
|
||||
printf("\n// Status Bit Map:\n");
|
||||
printf("// Upper Lower\n");
|
||||
printf("// 0 1 2 3 4 5 6 \n");
|
||||
@@ -710,24 +843,59 @@ static void parse_config()
|
||||
printf("// 0123456789ABCDEFGHIJKLMNOPQRSTUV 0123456789ABCDEFGHIJKLMNOPQRSTUV\n");
|
||||
char str[128];
|
||||
strcpy(str, "// ");
|
||||
for (int i = 0; i < 32; i++) strcat(str, (mask & (1ULL << i)) ? "X" : " ");
|
||||
for (int i = 0; i < 32; i++) strcat(str, mask[i] ? "X" : " ");
|
||||
strcat(str, " ");
|
||||
for (int i = 32; i < 64; i++) strcat(str, (mask & (1ULL << i)) ? "X" : " ");
|
||||
for (int i = 32; i < 64; i++) strcat(str, mask[i] ? "X" : " ");
|
||||
strcat(str, "\n");
|
||||
printf(str);
|
||||
|
||||
if (overlap)
|
||||
int ovr = 0;
|
||||
for (int i = 0; i < 64; i++) ovr |= overlap[i];
|
||||
|
||||
if (ovr)
|
||||
{
|
||||
strcpy(str, "// ");
|
||||
for (int i = 0; i < 32; i++) strcat(str, (overlap & (1ULL << i)) ? "^" : " ");
|
||||
for (int i = 0; i < 32; i++) strcat(str, overlap[i] ? "^" : " ");
|
||||
strcat(str, " ");
|
||||
for (int i = 32; i < 64; i++) strcat(str, (overlap & (1ULL << i)) ? "^" : " ");
|
||||
for (int i = 32; i < 64; i++) strcat(str, overlap[i] ? "^" : " ");
|
||||
strcat(str, "\n");
|
||||
printf(str);
|
||||
printf("// *Overlapped bits!* (can be intentional):\n");
|
||||
printf("// *Overlapped bits!* (can be intentional)\n");
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
ovr = 0;
|
||||
for (int i = 64; i < 128; i++) ovr |= mask[i];
|
||||
|
||||
if (ovr)
|
||||
{
|
||||
printf("// 0 0 0 0 1 1 1 \n");
|
||||
printf("// 6 7 8 9 0 1 2 \n");
|
||||
printf("// 45678901234567890123456789012345 67890123456789012345678901234567\n");
|
||||
strcpy(str, "// ");
|
||||
for (int i = 64; i < 96; i++) strcat(str, mask[i] ? "X" : " ");
|
||||
strcat(str, " ");
|
||||
for (int i = 96; i < 128; i++) strcat(str, mask[i] ? "X" : " ");
|
||||
strcat(str, "\n");
|
||||
printf(str);
|
||||
|
||||
ovr = 0;
|
||||
for (int i = 64; i < 128; i++) ovr |= overlap[i];
|
||||
|
||||
if (ovr)
|
||||
{
|
||||
strcpy(str, "// ");
|
||||
for (int i = 64; i < 96; i++) strcat(str, overlap[i] ? "^" : " ");
|
||||
strcat(str, " ");
|
||||
for (int i = 96; i < 128; i++) strcat(str, overlap[i] ? "^" : " ");
|
||||
strcat(str, "\n");
|
||||
printf(str);
|
||||
printf("// *Overlapped bits!* (can be intentional)\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
// legacy GBA versions
|
||||
if (is_gba() && !ss_base)
|
||||
{
|
||||
@@ -1096,7 +1264,7 @@ void user_io_init(const char *path, const char *xml)
|
||||
spi_uio_cmd16(UIO_SET_MEMSZ, sdram_sz(-1));
|
||||
|
||||
// send a reset
|
||||
user_io_status(UIO_STATUS_RESET, UIO_STATUS_RESET);
|
||||
user_io_status_set("[0]", 1);
|
||||
}
|
||||
else if (core_type == CORE_TYPE_SHARPMZ)
|
||||
{
|
||||
@@ -1162,23 +1330,21 @@ void user_io_init(const char *path, const char *xml)
|
||||
name = user_io_create_config_name();
|
||||
if (strlen(name) > 0)
|
||||
{
|
||||
uint32_t status[2] = { 0, 0 };
|
||||
if (!is_st() && !is_minimig())
|
||||
{
|
||||
printf("Loading config %s\n", name);
|
||||
if (FileLoadConfig(name, status, 8))
|
||||
memset(cur_status, 0, sizeof(cur_status));
|
||||
if (FileLoadConfig(name, cur_status, sizeof(cur_status)))
|
||||
{
|
||||
printf("Found config: %08X-%08X\n", status[0], status[1]);
|
||||
printf("Found config:\n");
|
||||
hexdump(cur_status, sizeof(cur_status));
|
||||
}
|
||||
else
|
||||
{
|
||||
status[0] = 0;
|
||||
status[1] = 0;
|
||||
memset(cur_status, 0, sizeof(cur_status));
|
||||
}
|
||||
|
||||
status[0] &= ~UIO_STATUS_RESET;
|
||||
user_io_status(status[0], ~UIO_STATUS_RESET, 0);
|
||||
user_io_status(status[1], 0xffffffff, 1);
|
||||
user_io_status_set("[0]", 1);
|
||||
}
|
||||
|
||||
if (is_st())
|
||||
@@ -1188,9 +1354,9 @@ void user_io_init(const char *path, const char *xml)
|
||||
}
|
||||
else if (is_menu())
|
||||
{
|
||||
user_io_status((cfg.menu_pal) ? 0x10 : 0, 0x10);
|
||||
if (cfg.fb_terminal) video_menu_bg((status[0] >> 1) & 7);
|
||||
else user_io_status(0, 0xE);
|
||||
user_io_status_set("[4]", (cfg.menu_pal) ? 1 : 0);
|
||||
if (cfg.fb_terminal) video_menu_bg(user_io_status_get("[3:1]"));
|
||||
else user_io_status_set("[3:1]", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1307,7 +1473,7 @@ void user_io_init(const char *path, const char *xml)
|
||||
send_rtc(3);
|
||||
|
||||
// release reset
|
||||
if (!is_minimig() && !is_st()) user_io_status(0, UIO_STATUS_RESET);
|
||||
if (!is_minimig() && !is_st()) user_io_status_set("[0]", 0);
|
||||
if (xml && isXmlName(xml) == 1) arcade_check_error();
|
||||
break;
|
||||
}
|
||||
@@ -2104,11 +2270,14 @@ static void check_status_change()
|
||||
if ((stchg & 0xF0) == 0xA0 && last_status_change != (stchg & 0xF))
|
||||
{
|
||||
last_status_change = (stchg & 0xF);
|
||||
uint32_t st0 = spi32_w(0);
|
||||
uint32_t st1 = spi32_w(0);
|
||||
for (uint i = 0; i < sizeof(cur_status); i += 2)
|
||||
{
|
||||
uint16_t x = spi_w(0);
|
||||
cur_status[i] = (char)x;
|
||||
cur_status[i + 1] = (char)(x >> 8);
|
||||
}
|
||||
DisableIO();
|
||||
user_io_status(st0, ~UIO_STATUS_RESET, 0);
|
||||
user_io_status(st1, 0xFFFFFFFF, 1);
|
||||
user_io_status_set("[0]", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2448,38 +2617,6 @@ char *user_io_get_confstr(int index)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
uint32_t user_io_status(uint32_t new_status, uint32_t mask, int ex)
|
||||
{
|
||||
static uint32_t status[2] = { 0, 0 };
|
||||
if (ex) ex = 1;
|
||||
|
||||
// if mask is 0 just return the current status
|
||||
if (mask) {
|
||||
// keep everything not masked
|
||||
status[ex] &= ~mask;
|
||||
// updated masked bits
|
||||
status[ex] |= new_status & mask;
|
||||
|
||||
if (!is_st())
|
||||
{
|
||||
if (!io_ver)
|
||||
{
|
||||
spi_uio_cmd8(UIO_SET_STATUS, status[0]);
|
||||
spi_uio_cmd32(UIO_SET_STATUS2, status[0], 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
spi_uio_cmd_cont(UIO_SET_STATUS2);
|
||||
spi32_w(status[0]);
|
||||
spi32_w(status[1]);
|
||||
DisableIO();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return status[ex];
|
||||
}
|
||||
|
||||
static char cur_btn = 0;
|
||||
char user_io_menu_button()
|
||||
{
|
||||
|
||||
42
user_io.h
42
user_io.h
@@ -153,33 +153,6 @@
|
||||
#define CORE_TYPE_SHARPMZ 0xa7 // Sharp MZ Series
|
||||
#define CORE_TYPE_8BIT2 0xa8 // generic core using dual SDRAM
|
||||
|
||||
#define UART_FLG_PPP 0x0001
|
||||
#define UART_FLG_TERM 0x0002
|
||||
#define UART_FLG_RTSCTS 0x0004
|
||||
#define UART_FLG_DTRDSR 0x0008
|
||||
#define UART_FLG_DSRDCD 0x0010
|
||||
#define UART_FLG_9600 0x0100
|
||||
#define UART_FLG_19200 0x0200
|
||||
#define UART_FLG_38400 0x0400
|
||||
#define UART_FLG_57600 0x0800
|
||||
#define UART_FLG_115200 0x1000
|
||||
|
||||
// user io status bits (currently only used by 8bit)
|
||||
#define UIO_STATUS_RESET 0x01
|
||||
|
||||
#define UIO_STOP_BIT_1 0
|
||||
#define UIO_STOP_BIT_1_5 1
|
||||
#define UIO_STOP_BIT_2 2
|
||||
|
||||
#define UIO_PARITY_NONE 0
|
||||
#define UIO_PARITY_ODD 1
|
||||
#define UIO_PARITY_EVEN 2
|
||||
#define UIO_PARITY_MARK 3
|
||||
#define UIO_PARITY_SPACE 4
|
||||
|
||||
#define UIO_PRIORITY_KEYBOARD 0
|
||||
#define UIO_PRIORITY_GAMEPAD 1
|
||||
|
||||
#define EMU_NONE 0
|
||||
#define EMU_MOUSE 1
|
||||
#define EMU_JOY0 2
|
||||
@@ -192,12 +165,21 @@ void user_io_poll();
|
||||
char user_io_menu_button();
|
||||
char user_io_user_button();
|
||||
void user_io_osd_key_enable(char);
|
||||
void user_io_read_confstr();
|
||||
char *user_io_get_confstr(int index);
|
||||
uint32_t user_io_status(uint32_t, uint32_t, int ex = 0);
|
||||
int user_io_get_kbd_reset();
|
||||
void user_io_set_kbd_reset(int reset);
|
||||
|
||||
int substrcpy(char *d, const char *s, char idx);
|
||||
|
||||
void user_io_read_confstr();
|
||||
char *user_io_get_confstr(int index);
|
||||
int user_io_status_bits(const char *opt, int *s, int *e, int ex = 0, int single = 0);
|
||||
uint32_t user_io_status_mask(const char *opt);
|
||||
uint32_t user_io_hd_mask(const char *opt);
|
||||
uint32_t user_io_status_get(const char *opt, int ex = 0);
|
||||
void user_io_status_set(const char *opt, uint32_t value, int ex = 0);
|
||||
int user_io_status_save(const char *filename);
|
||||
void user_io_status_reset();
|
||||
|
||||
uint32_t user_io_get_file_crc();
|
||||
int user_io_file_mount(const char *name, unsigned char index = 0, char pre = 0, int pre_size = 0);
|
||||
void user_io_bufferinvalidate(unsigned char index);
|
||||
|
||||
Reference in New Issue
Block a user