Progress bar for arcades. Update NeoGeo progress bar.

This commit is contained in:
sorgelig
2021-03-29 04:33:10 +08:00
parent 9b18257b8e
commit 5d45b59117
7 changed files with 79 additions and 106 deletions

View File

@@ -6570,3 +6570,41 @@ void menu_process_save()
{
menu_save_timer = GetTimer(1000);
}
static char pchar[] = { 0x8C, 0x8E, 0x8F, 0x90, 0x91, 0x7F };
#define PROGRESS_CNT 28
#define PROGRESS_CHARS (int)(sizeof(pchar)/sizeof(pchar[0]))
#define PROGRESS_MAX ((PROGRESS_CHARS*PROGRESS_CNT)-1)
void ProgressMessage(const char* title, const char* text, int current, int max)
{
static int progress;
if (!current && !max)
{
progress = -1;
MenuHide();
return;
}
int new_progress = (((uint64_t)current)*PROGRESS_MAX) / max;
if (progress != new_progress)
{
progress = new_progress;
static char progress_buf[128];
memset(progress_buf, 0, sizeof(progress_buf));
if (new_progress > PROGRESS_MAX) new_progress = PROGRESS_MAX;
char c = pchar[new_progress % PROGRESS_CHARS];
new_progress /= PROGRESS_CHARS;
char *buf = progress_buf;
sprintf(buf, "\n\n %.27s\n ", text);
buf += strlen(buf);
for (int i = 0; i <= new_progress; i++) buf[i] = (i < new_progress) ? 0x7F : c;
buf[PROGRESS_CNT] = 0;
InfoMessage(progress_buf, 2000, title);
}
}

1
menu.h
View File

@@ -9,6 +9,7 @@ void menu_process_save();
void PrintDirectory(int expand = 0);
void ScrollLongName(void);
void ProgressMessage(const char* title = 0, const char* text = 0, int current = 0, int max = 0);
void ErrorMessage(const char *message, unsigned char code);
void InfoMessage(const char *message, int timeout = 2000, const char *title = "Message");
void Info(const char *message, int timeout = 2000, int width = 0, int height = 0, int frame = 0);

View File

@@ -38,6 +38,7 @@ struct arc_struct {
int ifrom;
int ito;
int imap;
int file_size;
uint32_t address;
uint32_t crc;
buffer_data *data;
@@ -318,7 +319,7 @@ static void send_to_ddr(uint32_t address, void* buf, uint32_t len)
return;
}
static void rom_finish(int send, uint32_t address)
static void rom_finish(int send, uint32_t address, int index)
{
if (romlen[0] && romdata)
{
@@ -339,14 +340,21 @@ static void rom_finish(int send, uint32_t address)
}
else
{
char str[32];
sprintf(str, "ROM #%d", index);
ProgressMessage(0, 0, 0, 0);
while (romlen[0] > 0)
{
ProgressMessage("Sending", str, len - romlen[0], len);
uint16_t chunk = (romlen[0] > 4096) ? 4096 : romlen[0];
user_io_file_tx_data(data, chunk);
romlen[0] -= chunk;
data += chunk;
}
ProgressMessage(0, 0, 0, 0);
}
// signal end of transmission
@@ -427,12 +435,13 @@ unsigned char* hexstr_to_char(const char* hexstr, size_t *out_len)
* */
static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, const int n, SAX_Data* sd)
{
static char message[32];
struct arc_struct *arc_info = (struct arc_struct *)sd->user;
(void)(sd);
switch (evt)
{
case XML_EVENT_START_DOC:
message[0] = 0;
arc_info->insiderom = 0;
arc_info->insidesw = 0;
break;
@@ -463,6 +472,7 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons
arc_info->address = 0;
arc_info->insideinterleave = 0;
MD5Init(&arc_info->context);
ProgressMessage(0, 0, 0, 0);
}
if (!strcasecmp(node->tag, "switches"))
@@ -515,6 +525,7 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons
if (!strcasecmp(node->attributes[i].name, "index") && !strcasecmp(node->tag, "rom"))
{
arc_info->romindex = atoi(node->attributes[i].value);
sprintf(message, "Assembling ROM #%d", arc_info->romindex);
}
if (!strcasecmp(node->attributes[i].name, "address") && !strcasecmp(node->tag, "rom"))
{
@@ -721,6 +732,8 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons
for (int i = 1; i < 8; i++) romlen[i] = romlen[0];
}
ProgressMessage("Loading", message, ftell(sd->file), arc_info->file_size);
break;
case XML_EVENT_TEXT:
@@ -746,6 +759,8 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons
// At the end of a rom node (when it is closed) we need to calculate hash values and clean up
if (!strcasecmp(node->tag, "rom"))
{
message[0] = 0;
if (arc_info->insiderom)
{
unsigned char checksum[16];
@@ -785,7 +800,7 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons
}
}
rom_finish(checksumsame, arc_info->address);
rom_finish(checksumsame, arc_info->address, arc_info->romindex);
}
arc_info->insiderom = 0;
}
@@ -1032,6 +1047,9 @@ int arcade_send_rom(const char *xml)
arc_info.data = buffer_init(kBigTextSize);
arc_info.error_msg[0] = 0;
arc_info.validrom0 = 0;
struct stat64 *st = getPathStat(xml);
if (st) arc_info.file_size = (int)st->st_size;
ProgressMessage(0, 0, 0, 0);
// parse
XMLDoc_parse_file_SAX(xml, &sax, &arc_info);

View File

@@ -107,36 +107,6 @@ static void fix_convert(uint8_t* buf_in, uint8_t* buf_out, uint32_t size)
for (uint32_t i = 0; i < size; i++) buf_out[i] = buf_in[(i & ~0x1F) | ((i >> 2) & 7) | ((i & 1) << 3) | (((i & 2) << 3) ^ 0x10)];
}
static char pchar[] = { 0x8C, 0x8E, 0x8F, 0x90, 0x91, 0x7F };
#define PROGRESS_CNT 10
#define PROGRESS_CHARS (sizeof(pchar)/sizeof(pchar[0]))
#define PROGRESS_MAX ((PROGRESS_CHARS*PROGRESS_CNT)-1)
static void neogeo_osd_progress(const char* name, unsigned int progress)
{
static char progress_buf[64];
memset(progress_buf, ' ', sizeof(progress_buf));
if (progress > PROGRESS_MAX) progress = PROGRESS_MAX;
char c = pchar[progress % PROGRESS_CHARS];
progress /= PROGRESS_CHARS;
const char* p = strrchr(name, '/');
if (p) p++;
else p = name;
if (strlen(p) > 16) p = p + strlen(p) - 16;
strcpy(progress_buf, p);
char *buf = progress_buf + strlen(progress_buf);
*buf++ = ' ';
for (unsigned int i = 0; i <= progress; i++) buf[i] = (i < progress) ? 0x7F : c;
buf[PROGRESS_CNT] = 0;
Info(progress_buf);
}
static uint32_t neogeo_file_tx(const char* path, const char* name, uint8_t neo_file_type, uint8_t index, uint32_t offset, uint32_t size)
{
fileTYPE f = {};
@@ -162,8 +132,7 @@ static uint32_t neogeo_file_tx(const char* path, const char* name, uint8_t neo_f
// prepare transmission of new file
user_io_set_download(1);
int progress = -1;
ProgressMessage();
while (bytes2send)
{
uint16_t chunk = (bytes2send > sizeof(buf)) ? sizeof(buf) : bytes2send;
@@ -194,16 +163,13 @@ static uint32_t neogeo_file_tx(const char* path, const char* name, uint8_t neo_f
}
DisableFpga();
int new_progress = PROGRESS_MAX - ((((uint64_t)bytes2send)*PROGRESS_MAX) / size);
if (progress != new_progress)
{
progress = new_progress;
neogeo_osd_progress(name, progress);
}
ProgressMessage("Loading", name, size - bytes2send, size);
bytes2send -= chunk;
}
FileClose(&f);
ProgressMessage();
// signal end of transmission
user_io_set_download(0);
@@ -252,11 +218,11 @@ static uint32_t load_crom_to_mem(const char* path, const char* name, uint8_t ind
printf("CROM %s (offset %u, size %u) with index %u\n", name, offset, size, index);
// Put pairs of bitplanes in the correct order for the core
int progress = -1;
uint32_t remain = size;
uint32_t map_addr = 0x38000000 + (((index - 64) >> 1) * 1024 * 1024);
ProgressMessage();
while (remain)
{
uint32_t partsz = remain;
@@ -275,12 +241,7 @@ static uint32_t load_crom_to_mem(const char* path, const char* name, uint8_t ind
FileReadAdv(&f, loadbuf, partsz/2);
spr_convert_skp((uint16_t*)loadbuf, ((uint16_t*)base) + ((index ^ 1) & 1), partsz / 4);
int new_progress = PROGRESS_MAX - ((((uint64_t)(remain - partsz))*PROGRESS_MAX) / size);
if (progress != new_progress)
{
progress = new_progress;
neogeo_osd_progress(name, progress);
}
ProgressMessage("Loading", name, size - (remain - partsz), size);
munmap(base, partsz);
remain -= partsz;
@@ -289,6 +250,7 @@ static uint32_t load_crom_to_mem(const char* path, const char* name, uint8_t ind
close(memfd);
FileClose(&f);
ProgressMessage();
return map_addr - 0x38000000;
}
@@ -323,8 +285,6 @@ static uint32_t load_rom_to_mem(const char* path, const char* name, uint8_t neo_
FileSeek(&f, offset, SEEK_SET);
printf("ROM %s (offset %u, size %u, exp %u, type %u, addr %u) with index %u\n", name, offset, size, expand, neo_file_type, addr, index);
int progress = -1;
uint32_t remainf = size;
if(expand) size = expand;
@@ -332,6 +292,7 @@ static uint32_t load_rom_to_mem(const char* path, const char* name, uint8_t neo_
uint32_t map_addr = 0x30000000 + (addr ? addr : ((index >= 16) && (index < 64)) ? (index - 16) * 0x80000 : (index == 9) ? 0x2000000 : 0x8000000);
ProgressMessage();
while (remain)
{
uint32_t partsz = remain;
@@ -369,12 +330,8 @@ static uint32_t load_rom_to_mem(const char* path, const char* name, uint8_t neo_
if (partszf) FileReadAdv(&f, base, partszf);
}
int new_progress = PROGRESS_MAX - ((((uint64_t)(remain - partsz))*PROGRESS_MAX) / size);
if (progress != new_progress)
{
progress = new_progress;
neogeo_osd_progress(name, progress);
}
ProgressMessage("Loading", name, size - (remain - partsz), size);
munmap(base, partsz);
remain -= partsz;
map_addr += partsz;
@@ -382,6 +339,7 @@ static uint32_t load_rom_to_mem(const char* path, const char* name, uint8_t neo_
close(memfd);
FileClose(&f);
ProgressMessage();
return size;
}

View File

@@ -1605,6 +1605,7 @@ int XMLDoc_parse_file_SAX(const SXML_CHAR* filename, const SAX_Callbacks* sax, v
sd.name = (SXML_CHAR*)filename;
sd.user = user;
sd.file = f;
#ifdef SXMLC_UNICODE
bom = freadBOM(f, NULL, NULL); /* Skip BOM, if any */
/* In Unicode, re-open the file in text-mode if there is no BOM (or UTF-8) as we assume that

View File

@@ -269,6 +269,7 @@ typedef enum _XMLEvent {
*/
typedef struct _SAX_Data {
const SXML_CHAR* name;
FILE *file;
int line_num;
void* user;
} SAX_Data;

View File

@@ -1928,31 +1928,6 @@ static void check_status_change()
}
}
static char pchar[] = { 0x8C, 0x8F, 0x7F };
#define PROGRESS_CNT 28
#define PROGRESS_CHARS (sizeof(pchar)/sizeof(pchar[0]))
#define PROGRESS_MAX ((PROGRESS_CHARS*PROGRESS_CNT)-1)
static void tx_progress(const char* name, unsigned int progress)
{
static char progress_buf[128];
memset(progress_buf, 0, sizeof(progress_buf));
if (progress > PROGRESS_MAX) progress = PROGRESS_MAX;
char c = pchar[progress % PROGRESS_CHARS];
progress /= PROGRESS_CHARS;
char *buf = progress_buf;
sprintf(buf, "\n\n %.27s\n ", name);
buf += strlen(buf);
for (unsigned int i = 0; i <= progress; i++) buf[i] = (i < progress) ? 0x7F : c;
buf[PROGRESS_CNT] = 0;
InfoMessage(progress_buf, 2000, "Loading");
}
static void show_core_info(int info_n)
{
int i = 2;
@@ -2125,9 +2100,7 @@ int user_io_file_tx_a(const char* name, uint16_t index)
int use_progress = 1;
int size = bytes2send;
int progress = -1;
if (use_progress) MenuHide();
if (use_progress) ProgressMessage(0, 0, 0, 0);
while (bytes2send)
{
uint16_t chunk = (bytes2send > sizeof(buf)) ? sizeof(buf) : bytes2send;
@@ -2135,15 +2108,7 @@ int user_io_file_tx_a(const char* name, uint16_t index)
FileReadAdv(&f, buf, chunk);
user_io_file_tx_data(buf, chunk);
if (use_progress)
{
int new_progress = PROGRESS_MAX - ((((uint64_t)bytes2send)*PROGRESS_MAX) / size);
if (progress != new_progress)
{
progress = new_progress;
tx_progress(f.name, progress);
}
}
if (use_progress) ProgressMessage("Loading", f.name, size - bytes2send, size);
bytes2send -= chunk;
}
@@ -2155,7 +2120,7 @@ int user_io_file_tx_a(const char* name, uint16_t index)
// signal end of transmission
user_io_set_download(0);
MenuHide();
ProgressMessage(0, 0, 0, 0);
return 1;
}
@@ -2274,8 +2239,7 @@ int user_io_file_tx(const char* name, unsigned char index, char opensave, char m
int use_progress = 1; // (bytes2send > (1024 * 1024)) ? 1 : 0;
int size = bytes2send;
int progress = -1;
if (use_progress) MenuHide();
if (use_progress) ProgressMessage(0, 0, 0, 0);
if(ss_base && opensave) process_ss(name);
@@ -2313,15 +2277,7 @@ int user_io_file_tx(const char* name, unsigned char index, char opensave, char m
if (is_snes() && is_snes_bs) snes_patch_bs_header(&f, buf);
user_io_file_tx_data(buf, chunk);
if (use_progress)
{
int new_progress = PROGRESS_MAX - ((((uint64_t)bytes2send)*PROGRESS_MAX) / size);
if (progress != new_progress)
{
progress = new_progress;
tx_progress(f.name, progress);
}
}
if (use_progress) ProgressMessage("Loading", f.name, size - bytes2send, size);
bytes2send -= chunk;
if (skip >= chunk) skip -= chunk;
@@ -2356,7 +2312,7 @@ int user_io_file_tx(const char* name, unsigned char index, char opensave, char m
send_pcolchr(name, (index & 0x1F) | 0x60, 1);
}
MenuHide();
ProgressMessage(0, 0, 0, 0);
return 1;
}