From 0eb7b3017d2ee9d4a746949cb6cd1a836ba1aec1 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Thu, 12 Dec 2019 03:43:49 +0800 Subject: [PATCH] Fixes, tweaks, cleanup. --- MiSTer.vcxproj | 6 + MiSTer.vcxproj.filters | 207 +++++++----- fpga_io.cpp | 7 +- lib/md5/md5.c | 4 +- main.cpp | 3 +- menu.cpp | 122 ++++--- support/arcade/buffer.cpp | 209 ++++++------ support/arcade/buffer.h | 6 +- support/arcade/romutils.cpp | 623 ++++++++++++++++++++---------------- support/arcade/romutils.h | 9 +- support/sharpmz/sharpmz.cpp | 2 +- support/sharpmz/sharpmz.h | 2 +- user_io.cpp | 122 +------ user_io.h | 7 +- video.cpp | 2 +- 15 files changed, 666 insertions(+), 665 deletions(-) diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index 3845d6c..c95ee18 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -64,6 +64,7 @@ + @@ -74,6 +75,8 @@ + + @@ -115,6 +118,7 @@ + @@ -127,6 +131,8 @@ + + diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters index 3209fb7..f11e2f2 100644 --- a/MiSTer.vcxproj.filters +++ b/MiSTer.vcxproj.filters @@ -21,6 +21,27 @@ {83fcb534-f976-4615-bdeb-ba80fb510f9a} + + {478f0e62-2042-41ff-8b48-b48e6b5aed88} + + + {30fe8838-348b-4aa5-b517-93cae495ce86} + + + {e440dc55-22b0-40b2-887d-dfd701749ea0} + + + {095305c7-e04b-4f03-b8d8-db2d888b449c} + + + {a5ee9c49-ce79-4665-8a6e-751bd82eff23} + + + {f72c7b7a-09fd-4c2f-a8cb-14e1077e8acb} + + + {9e138a0b-53c4-4ae8-a59b-6b7bf2dcc01b} + @@ -73,36 +94,6 @@ Source Files - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - Source Files\libco @@ -133,26 +124,65 @@ Source Files - - Source Files - Source Files Source Files - - Source Files - Source Files + + Source Files\md5 + + + Source Files\lodepng + + + Source Files\support + - Source Files + Source Files\support + + + Source Files\support - Source Files + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support + + + Source Files\support @@ -216,48 +246,12 @@ Header Files - - Header Files - Header Files Header Files - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - Header Files\libco @@ -288,26 +282,71 @@ Header Files - - Header Files - Header Files Header Files - - Header Files - - - Header Files - Header Files + + Header Files\md5 + + + Header Files\support + + + Header Files\imlib + + + Header Files\support + + + Header Files\support + + + Header Files\support + + + Header Files\support + + + Header Files\lodpng + + + Header Files\support + + + Header Files\support + + + Header Files\support + + + Header Files\support + + + Header Files\support + + + Header Files\support + + + Header Files\support + + + Header Files\support + - Header Files + Header Files\support + + + Header Files\support + + + Header Files\support \ No newline at end of file diff --git a/fpga_io.cpp b/fpga_io.cpp index 1e1e1fa..8e56282 100644 --- a/fpga_io.cpp +++ b/fpga_io.cpp @@ -528,8 +528,8 @@ int fpga_load_rbf(const char *name, const char *cfg, const char *xml) } } close(rbf); - app_restart(!strcasecmp(name, "menu.rbf") ? "menu.rbf" : path,xml); + app_restart(!strcasecmp(name, "menu.rbf") ? "menu.rbf" : path, xml); return ret; } @@ -651,10 +651,7 @@ void app_restart(const char *path, const char *xml) char *appname = getappname(); printf("restarting the %s\n", appname); - if (xml) - execl(appname, appname, path, xml,NULL); - else - execl(appname, appname, path, NULL); + execl(appname, appname, path, xml, NULL); printf("Something went wrong. Rebooting...\n"); reboot(0); diff --git a/lib/md5/md5.c b/lib/md5/md5.c index 949fe93..15e5dfc 100644 --- a/lib/md5/md5.c +++ b/lib/md5/md5.c @@ -137,7 +137,7 @@ MD5Update(ctx, buf, len) } /* - * Final wrapup - pad to 64-byte boundary with the bit pattern + * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void @@ -181,7 +181,7 @@ MD5Final(digest, ctx) putu32(ctx->buf[1], digest + 4); putu32(ctx->buf[2], digest + 8); putu32(ctx->buf[3], digest + 12); - memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ + memset(ctx, 0, sizeof(struct MD5Context)); /* In case it's sensitive */ } #ifndef ASM_MD5 diff --git a/main.cpp b/main.cpp index 7086f74..0927b4a 100644 --- a/main.cpp +++ b/main.cpp @@ -57,6 +57,7 @@ int main(int argc, char *argv[]) printf("Version %s\n\n", version + 5); if (argc > 1) printf("Core path: %s\n", argv[1]); + if (argc > 2) printf("XML path: %s\n", argv[2]); if (!is_fpga_ready(1)) { @@ -66,7 +67,7 @@ int main(int argc, char *argv[]) } FindStorage(); - user_io_init((argc > 1) ? argv[1] : "",(argc > 2) ? argv[2] : ""); + user_io_init((argc > 1) ? argv[1] : "",(argc > 2) ? argv[2] : NULL); #ifdef USE_SCHEDULER scheduler_init(); diff --git a/menu.cpp b/menu.cpp index 4fa4b51..0296f41 100644 --- a/menu.cpp +++ b/menu.cpp @@ -168,7 +168,7 @@ static uint32_t menustate = MENU_NONE1; static uint32_t parentstate; static uint32_t menusub = 0; static uint32_t menusub_last = 0; //for when we allocate it dynamically and need to know last row -static uint32_t menumask = 0; // Used to determine which rows are selectable... +static uint64_t menumask = 0; // Used to determine which rows are selectable... static uint32_t menu_timer = 0; extern const char *version; @@ -1003,12 +1003,12 @@ void HandleUI(void) { if (down) { - if((menumask >= ((uint32_t)1 << (menusub + 1)))) // Any active entries left? + if((menumask >= ((uint64_t)1 << (menusub + 1)))) // Any active entries left? { do { menusub++; - } while ((menumask & ((uint32_t)1 << menusub)) == 0); + } while ((menumask & ((uint64_t)1 << menusub)) == 0); } else { @@ -1025,14 +1025,14 @@ void HandleUI(void) do { --menusub; - } while ((menumask & ((uint32_t)1 << menusub)) == 0); + } while ((menumask & ((uint64_t)1 << menusub)) == 0); } else { do { menusub++; - } while ((menumask & ((uint32_t)(~0) << (menusub + 1))) != 0); // jump to last item + } while ((menumask & ((uint64_t)(~0) << (menusub + 1))) != 0); // jump to last item } menustate = parentstate; } @@ -4481,21 +4481,16 @@ void HandleUI(void) break; } } - if (!strcasecmp(".mra",&(SelectedRBF[strlen(SelectedRBF) - 4]))) + + if (!strcasecmp(".mra",&(SelectedRBF[strlen(SelectedRBF) - 4]))) { - char rbfname[4096]; - char rbfpath[4096]; - fprintf(stderr,"MRA FILE LOADED - write code\n"); // find the RBF file from the XML - arcade_scan_xml_for_rbf(getFullPath(SelectedRBF),rbfname); - fprintf(stderr,"MRA SelectedRBF: [%s]\n",SelectedRBF); - fprintf(stderr,"MRA rbf: [%s]\n",rbfname); - sprintf(rbfpath,"arcade/%s",rbfname); - fpga_load_rbf(getFullPath(rbfpath),NULL,SelectedRBF); + arcade_load(getFullPath(SelectedRBF)); } else - // close OSD now as the new core may not even have one + { fpga_load_rbf(SelectedRBF); + } break; case MENU_CORE_FILE_SELECTED2: @@ -4612,7 +4607,7 @@ void open_joystick_setup() /* * CalculateFileNameLengthWithoutExtension - * + * * This function takes a filename and length, and returns * the length. It will remove the .rbf or .mra from the length * based on the fs_pFileExt global @@ -4620,69 +4615,68 @@ void open_joystick_setup() * If the fs_pFileExt has multiple extensions, it will look through * each to try to find a match. */ -int CalculateFileNameLengthWithoutExtension(char *name,char *possibleextensions) +int CalculateFileNameLengthWithoutExtension(char *name, char *possibleextensions) { - char *ext = possibleextensions; - int found=0; + int found = 0; /* the default length is the whole string */ int len = strlen(name); /* find the extension on the end of the name*/ - char *fext = strrchr(name, '.'); + char *fext = strrchr(name, '.'); /* we want to push past the period - and just have rbf instead of .rbf*/ - if (fext) fext++; + if (fext) fext++; /* walk through each extension and see if it matches */ - while (!found && *ext && fext) - { - char e[4]; - memcpy(e, ext, 3); - if (e[2] == ' ') - { - e[2] = 0; - if (e[1] == ' ') e[1] = 0; - } + while (!found && *ext && fext) + { + char e[4]; + memcpy(e, ext, 3); + if (e[2] == ' ') + { + e[2] = 0; + if (e[1] == ' ') e[1] = 0; + } - e[3] = 0; - found = 1; - for (int i = 0; i < 4; i++) - { - if (e[i] == '*') break; - if (e[i] == '?' && fext[i]) continue; + e[3] = 0; + found = 1; + for (int i = 0; i < 4; i++) + { + if (e[i] == '*') break; + if (e[i] == '?' && fext[i]) continue; - if (tolower(e[i]) != tolower(fext[i])) found = 0; + if (tolower(e[i]) != tolower(fext[i])) found = 0; - if (!e[i] || !found) break; - } - if (found) break; + if (!e[i] || !found) break; + } + if (found) break; - if (strlen(ext) < 3) break; - ext += 3; - } + if (strlen(ext) < 3) break; + ext += 3; + } - /* if we haven't found a match, then the answer is the full length of the string */ - if (!found) return len; + /* if we haven't found a match, then the answer is the full length of the string */ + if (!found) return len; - /* we have a match, now we need to handle extensions that are less than 3 characters */ - char e[5]; - memcpy(e + 1, ext, 3); - /* 0x20 is a space in ascii*/ - if (e[3] == 0x20) - { - e[3] = 0; - if (e[2] == 0x20) - { - e[2] = 0; - } - } - e[0] = '.'; - e[4] = 0; - int l = strlen(e); + /* we have a match, now we need to handle extensions that are less than 3 characters */ + char e[5]; + memcpy(e + 1, ext, 3); + /* 0x20 is a space in ascii*/ + if (e[3] == 0x20) + { + e[3] = 0; + if (e[2] == 0x20) + { + e[2] = 0; + } + } + e[0] = '.'; + e[4] = 0; + int l = strlen(e); - if ((len>l) && !strncasecmp(name + len - l, e, l)) len -= l; + if ((len > l) && !strncasecmp(name + len - l, e, l)) len -= l; - //printf("len: %d l: %d str[%s] e[%s] ext[%s]\n",len,l,name,e,ext); - return len; + //printf("len: %d l: %d str[%s] e[%s] ext[%s]\n",len,l,name,e,ext); + return len; } @@ -4718,8 +4712,6 @@ void ScrollLongName(void) ScrollText(flist_iSelectedEntry()-flist_iFirstEntry(), flist_SelectedItem()->altname, 0, len, max_len, 1); } - - void PrintFileName(char *name, int row, int maxinv) { int len; diff --git a/support/arcade/buffer.cpp b/support/arcade/buffer.cpp index 34225ca..02b6e18 100644 --- a/support/arcade/buffer.cpp +++ b/support/arcade/buffer.cpp @@ -10,77 +10,77 @@ //////////////////////////////////////////////////////////////////////////////// -// +// // Function buffer_init // -// Purpose: -// +// Purpose: +// // This function will return a struct with the values it needs before it -// can be used with buffer_append. The default "expand_length" is -// +// can be used with buffer_append. The default "expand_length" is +// // Parameters: -// -// initial_size (IN) This parameter will preallocate the buffer with this +// +// initial_size (IN) This parameter will preallocate the buffer with this // size in bytes. -// +// // Returns: -// +// // returns a struct, or NULL on error -// +// // Error Definitions: -// +// // NULL = Couldn't create the structure // //////////////////////////////////////////////////////////////////////////////// buffer_data * buffer_init(unsigned int initial_size) { - - buffer_data * buffer = NULL; - - // only allow max initial size of SIZE_MAX - if (initial_size > 65535) { - return NULL; - } - // malloc the space for a pointer to a buffer_data - buffer = (buffer_data *)malloc(sizeof(buffer_data)); - if (buffer == NULL) { - return NULL; - } - - // fill the struct up - buffer->expand_length = initial_size; - buffer->capacity = initial_size; - buffer->length = 0; - - // allocate the buffer space - buffer->content = (char *)malloc(sizeof(char) * initial_size); - buffer->content[0]=0; - if (buffer->content == NULL) { - // can't allocate the buffer, therefore we need to clean everything up - free(buffer); - return NULL; - } - - // return a pointer to our buffer_data structure - return buffer; + buffer_data * buffer = NULL; + + // only allow max initial size of SIZE_MAX + if (initial_size > 65535) { + return NULL; + } + + // malloc the space for a pointer to a buffer_data + buffer = (buffer_data *)malloc(sizeof(buffer_data)); + if (buffer == NULL) { + return NULL; + } + + // fill the struct up + buffer->expand_length = initial_size; + buffer->capacity = initial_size; + buffer->length = 0; + + // allocate the buffer space + buffer->content = (char *)malloc(sizeof(char) * initial_size); + buffer->content[0] = 0; + if (buffer->content == NULL) { + // can't allocate the buffer, therefore we need to clean everything up + free(buffer); + return NULL; + } + + // return a pointer to our buffer_data structure + return buffer; } //////////////////////////////////////////////////////////////////////////////// -// +// // Function buffer_append // -// Purpose: -// +// Purpose: +// // This function will take data and append it into a buffer in the struct // given. It will growing as required (or as allowed by realloc) by the -// length desired in the structure element "expand_length" plus the length -// of the data being appended. If additional expansion is not desired, you +// length desired in the structure element "expand_length" plus the length +// of the data being appended. If additional expansion is not desired, you // can set the struct element "expand_length" to zero. -// +// // Parameters: -// +// // buffer_data (IN/OUT) This parameter is a struct (mapped below) to // keep track of the internal buffer and its working parameters. // @@ -94,74 +94,74 @@ buffer_data * buffer_init(unsigned int initial_size) { // // append_data (IN) This parameter is a const char * that is the data // to be appended. -// +// // Returns: -// +// // This function will return the amount of bytes appended. If the // return value is <= 0 there was an error. -// +// // Error Definitions: -// +// // -1 = No data was given to append // -2 = Additional space could not be allocated for the buffer. -// +// //////////////////////////////////////////////////////////////////////////////// int buffer_append(buffer_data * buffer, const char * append_data) { - // ensure there IS something to append.. - const unsigned int append_len = strlen(append_data); - if (append_len < 1) { - return -1; - } + // ensure there IS something to append.. + const unsigned int append_len = strlen(append_data); + if (append_len < 1) { + return -1; + } - // is there enough space, or should we reallocate memory? - if (buffer->length + append_len > buffer->capacity) { + // is there enough space, or should we reallocate memory? + if (buffer->length + append_len > buffer->capacity) { - const unsigned int realloc_size = - buffer->capacity + append_len + buffer->expand_length; - - // allocate the new buffer - char *new_buffer = (char *)realloc(buffer->content, realloc_size); - - // resize success.. - if (new_buffer == NULL) { - return -2; - } + const unsigned int realloc_size = + buffer->capacity + append_len + buffer->expand_length; - // copy the data to append into the new content buffer - strcat(new_buffer, append_data); - - // update the struct with the new values - buffer->content = new_buffer; // new buffer content - buffer->capacity = realloc_size; // add the amount to expand beyond our initial needs - buffer->length = buffer->length + append_len; - - } else { - // append the string - strcat(buffer->content, append_data); - } + // allocate the new buffer + char *new_buffer = (char *)realloc(buffer->content, realloc_size); - // update the buffer length - buffer->length += append_len; - - // return the amount appended - return append_len; + // resize success.. + if (new_buffer == NULL) { + return -2; + } + + // copy the data to append into the new content buffer + strcat(new_buffer, append_data); + + // update the struct with the new values + buffer->content = new_buffer; // new buffer content + buffer->capacity = realloc_size; // add the amount to expand beyond our initial needs + buffer->length = buffer->length + append_len; + + } + else { + // append the string + strcat(buffer->content, append_data); + } + + // update the buffer length + buffer->length += append_len; + + // return the amount appended + return append_len; } - //////////////////////////////////////////////////////////////////////////////// -// +// // Function buffer_destroy // -// Purpose: -// +// Purpose: +// // This function will destroy the inner buffer and reset all of the data // if the struct was dynamically allocated, it is expected that you will // take care of freeing the data. -// +// // Parameters: -// +// // buffer_data (IN) This parameter is a struct (mapped below) to // keep track of the internal buffer and its working parameters. // @@ -173,23 +173,22 @@ int buffer_append(buffer_data * buffer, const char * append_data) { // } buffer_data; // // Returns: -// +// // returns nothing -// +// //////////////////////////////////////////////////////////////////////////////// void buffer_destroy(buffer_data * buffer) { - // only work with valid data.. - if (buffer != NULL) { - - // if the content is not null, free it. - if (buffer->content != NULL) { - free(buffer->content); - } - - // free the buffer - free(buffer); - } + // only work with valid data.. + if (buffer != NULL) { + // if the content is not null, free it. + if (buffer->content != NULL) { + free(buffer->content); + } + + // free the buffer + free(buffer); + } } diff --git a/support/arcade/buffer.h b/support/arcade/buffer.h index 4a0fe3d..a5ec284 100644 --- a/support/arcade/buffer.h +++ b/support/arcade/buffer.h @@ -1,5 +1,5 @@ -#ifndef STRING_UTILS_H_ -#define STRING_UTILS_H_ +#ifndef BUFFER_H_ +#define BUFFER_H_ typedef struct { unsigned int length; @@ -12,4 +12,4 @@ buffer_data * buffer_init(const unsigned int initial_size); int buffer_append(buffer_data *buffer, const char *append_data); void buffer_destroy(buffer_data * buffer); -#endif // STRING_UTILS_H_ +#endif diff --git a/support/arcade/romutils.cpp b/support/arcade/romutils.cpp index e68f853..93b9da8 100644 --- a/support/arcade/romutils.cpp +++ b/support/arcade/romutils.cpp @@ -3,18 +3,88 @@ #include #include #include +#include - -#include "sxmlc.h" - +#include "../../sxmlc.h" #include "../../user_io.h" #include "../../file_io.h" #include "../../menu.h" +#include "../../fpga_io.h" +#include "../../lib/md5/md5.h" #include "buffer.h" +#define DEBUG_ROM_BINARY 0 +#if DEBUG_ROM_BINARY +FILE *rombinary; +#endif + +static int file_tx_start(unsigned char index) +{ + // set index byte (0=bios rom, 1-n=OSD entry index) + user_io_set_index(index); + + // prepare transmission of new file + user_io_set_download(1); + +#if DEBUG_ROM_BINARY + rombinary = fopen("/media/fat/this.rom", "wb"); +#endif + return 1; +} + +static int file_tx_body(const uint8_t *buf, uint16_t chunk, struct MD5Context *md5context) +{ + EnableFpga(); + spi8(UIO_FILE_TX_DAT); + + spi_write(buf, chunk, user_io_get_width()); + DisableFpga(); + + if (md5context) MD5Update(md5context, buf, chunk); +#if DEBUG_ROM_BINARY + fwrite(buf, 1, chunk, rombinary); +#endif + + return 1; +} + +static int file_tx_body_filepart(const char *name, int start, int len, struct MD5Context *md5context) +{ + char mute = 0; + fileTYPE f = {}; + static uint8_t buf[4096]; + if (!FileOpen(&f, name, mute)) return 0; + if (start) FileSeek(&f, start, SEEK_SET); + unsigned long bytes2send = f.size; + if (len > 0 && len < (int)bytes2send) bytes2send = len; + /* transmit the entire file using one transfer */ + printf("Selected file %s with %lu bytes to send \n", name, bytes2send); + while (bytes2send) + { + uint16_t chunk = (bytes2send > sizeof(buf)) ? sizeof(buf) : bytes2send; + + FileReadAdv(&f, buf, chunk); + file_tx_body(buf, chunk, md5context); + + bytes2send -= chunk; + } + + return 1; +} + +static int file_tx_finish() +{ + printf("\n"); +#if DEBUG_ROM_BINARY + fclose(rombinary); +#endif + + // signal end of transmission + user_io_set_download(0); + return 1; +} -#include "md5.h" /* * adapted from https://gist.github.com/xsleonard/7341172 * @@ -32,44 +102,35 @@ * */ unsigned char* hexstr_to_char(const char* hexstr, size_t *out_len) { - size_t len = strlen(hexstr); - unsigned char* chrs = (unsigned char*)malloc((len+1) * sizeof(*chrs)); - int dest=0; - // point to the beginning of the array - const char *ptr = hexstr; - while (*ptr) { - // check to see if we have a space - while (*ptr=='\n' || *ptr=='\r' || *ptr==' ' || *ptr=='\t' || *ptr==9 /*horiz tab*/) ptr++; - if (*ptr==0) break; + size_t len = strlen(hexstr); + unsigned char* chrs = (unsigned char*)malloc((len + 1) * sizeof(*chrs)); + int dest = 0; + // point to the beginning of the array + const char *ptr = hexstr; + while (*ptr) { + // check to see if we have a space + while (*ptr == '\n' || *ptr == '\r' || *ptr == ' ' || *ptr == '\t' || *ptr == 9 /*horiz tab*/) ptr++; + if (*ptr == 0) break; - // pull two characters off - int val1= (*ptr % 32 + 9) % 25 * 16; - ptr++; - /* check to odd numbers of characters*/ - if (*ptr==0) { - int val= (ptr[-1] % 32 + 9) % 25; - chrs[dest++] = val; - break; - } - int val2= (*ptr % 32 + 9) % 25; - ptr++; - chrs[dest++] = val1+val2; - } - chrs[dest]=0; - *out_len = dest; /* dest is 0 based, so we don't need to subtract 1*/ - return chrs; + // pull two characters off + int val1 = (*ptr % 32 + 9) % 25 * 16; + ptr++; + /* check to odd numbers of characters*/ + if (*ptr == 0) { + int val = (ptr[-1] % 32 + 9) % 25; + chrs[dest++] = val; + break; + } + int val2 = (*ptr % 32 + 9) % 25; + ptr++; + chrs[dest++] = val1 + val2; + } + chrs[dest] = 0; + *out_len = dest; /* dest is 0 based, so we don't need to subtract 1*/ + return chrs; } - -/* -user_io.h:int user_io_file_tx_start(const char *name,unsigned char index=0); -user_io.h:int user_io_file_tx_body(const uint8_t *buf,uint16_t chunk); -user_io.h:int user_io_file_tx_body_filepart(const char *name,int start=0, int len=0); -user_io.h:int user_io_file_tx_finish(); -*/ - - -#define kBigTextSize 4096 +#define kBigTextSize 1024 struct arc_struct { char md5[kBigTextSize]; char zipname[kBigTextSize]; @@ -84,7 +145,7 @@ struct arc_struct { int insiderom; int validrom0; buffer_data *data; - struct MD5Context context; + struct MD5Context context; }; char global_error_msg[kBigTextSize]; @@ -100,100 +161,98 @@ char global_error_msg[kBigTextSize]; static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, const int n, SAX_Data* sd) { struct arc_struct *arc_info = (struct arc_struct *)sd->user; - (void)(sd); + (void)(sd); - switch (evt) - { - case XML_EVENT_START_NODE: + switch (evt) + { + case XML_EVENT_START_NODE: /* initialization */ - - // initialize things for each tag (node): buffer_destroy(arc_info->data); - arc_info->data=buffer_init(kBigTextSize); - arc_info->partname[0]=0; - arc_info->offset=0; - arc_info->length=-1; - arc_info->repeat=1; + arc_info->data = buffer_init(kBigTextSize); + arc_info->partname[0] = 0; + arc_info->offset = 0; + arc_info->length = -1; + arc_info->repeat = 1; /* on the beginning of a rom tag, we need to reset the state*/ - if (!strcasecmp(node->tag,"rom")) + if (!strcasecmp(node->tag, "rom")) { - arc_info->insiderom=1; - arc_info->romname[0]=0; - arc_info->romindex=0; - arc_info->md5[0]=0; - MD5Init (&arc_info->context); + arc_info->insiderom = 1; + arc_info->romname[0] = 0; + arc_info->romindex = 0; + arc_info->md5[0] = 0; + MD5Init(&arc_info->context); } // for each part tag, we clear the partzipname since it is optional and may not appear in the part tag - if (!strcasecmp(node->tag,"part")) - arc_info->partzipname[0]=0; + if (!strcasecmp(node->tag, "part")) + arc_info->partzipname[0] = 0; //printf("XML_EVENT_START_NODE: tag [%s]\n",node->tag); // walk the attributes and save them in the data structure as appropriate - for (int i = 0; i < node->n_attributes; i++) - { - //printf("attribute %d name [%s] value [%s]\n",i,node->attributes[i].name,node->attributes[i].value); - if (!strcasecmp(node->attributes[i].name,"zip") && !strcasecmp(node->tag,"rom")) - { - strcpy(arc_info->zipname,node->attributes[i].value); - } - if (!strcasecmp(node->attributes[i].name,"name") && !strcasecmp(node->tag,"rom")) - { - strcpy(arc_info->romname,node->attributes[i].value); - } - if (!strcasecmp(node->attributes[i].name,"md5") && !strcasecmp(node->tag,"rom")) - { - strcpy(arc_info->md5,node->attributes[i].value); - } - if (!strcasecmp(node->attributes[i].name,"index") && !strcasecmp(node->tag,"rom")) - { - arc_info->romindex=atoi(node->attributes[i].value); - } - /* these only exist if we are inside the rom tag, and in a part tag*/ - if (arc_info->insiderom) { - if (!strcasecmp(node->attributes[i].name,"zip") && !strcasecmp(node->tag,"part")) - { - strcpy(arc_info->partzipname,node->attributes[i].value); - } - if (!strcasecmp(node->attributes[i].name,"name") && !strcasecmp(node->tag,"part")) - { - strcpy(arc_info->partname,node->attributes[i].value); - } - if (!strcasecmp(node->attributes[i].name,"offset") && !strcasecmp(node->tag,"part")) - { - arc_info->offset=atoi(node->attributes[i].value); - } - if (!strcasecmp(node->attributes[i].name,"length") && !strcasecmp(node->tag,"part")) - { - arc_info->length=atoi(node->attributes[i].value); - } - if (!strcasecmp(node->attributes[i].name,"repeat") && !strcasecmp(node->tag,"part")) - { - arc_info->repeat=atoi(node->attributes[i].value); - } - } - } + for (int i = 0; i < node->n_attributes; i++) + { + //printf("attribute %d name [%s] value [%s]\n",i,node->attributes[i].name,node->attributes[i].value); + if (!strcasecmp(node->attributes[i].name, "zip") && !strcasecmp(node->tag, "rom")) + { + strcpy(arc_info->zipname, node->attributes[i].value); + } + if (!strcasecmp(node->attributes[i].name, "name") && !strcasecmp(node->tag, "rom")) + { + strcpy(arc_info->romname, node->attributes[i].value); + } + if (!strcasecmp(node->attributes[i].name, "md5") && !strcasecmp(node->tag, "rom")) + { + strcpy(arc_info->md5, node->attributes[i].value); + } + if (!strcasecmp(node->attributes[i].name, "index") && !strcasecmp(node->tag, "rom")) + { + arc_info->romindex = atoi(node->attributes[i].value); + } + /* these only exist if we are inside the rom tag, and in a part tag*/ + if (arc_info->insiderom) { + if (!strcasecmp(node->attributes[i].name, "zip") && !strcasecmp(node->tag, "part")) + { + strcpy(arc_info->partzipname, node->attributes[i].value); + } + if (!strcasecmp(node->attributes[i].name, "name") && !strcasecmp(node->tag, "part")) + { + strcpy(arc_info->partname, node->attributes[i].value); + } + if (!strcasecmp(node->attributes[i].name, "offset") && !strcasecmp(node->tag, "part")) + { + arc_info->offset = atoi(node->attributes[i].value); + } + if (!strcasecmp(node->attributes[i].name, "length") && !strcasecmp(node->tag, "part")) + { + arc_info->length = atoi(node->attributes[i].value); + } + if (!strcasecmp(node->attributes[i].name, "repeat") && !strcasecmp(node->tag, "part")) + { + arc_info->repeat = atoi(node->attributes[i].value); + } + } + } /* at the beginning of each rom - tell the user_io to start a new message */ - if (!strcasecmp(node->tag,"rom")) + if (!strcasecmp(node->tag, "rom")) { - // clear an error message if we have a second rom0 - // this is kind of a problem - you will never see the - // error from the first rom0? - // - if (arc_info->romindex==0 && strlen(arc_info->zipname)) - arc_info->error_msg[0]=0; + // clear an error message if we have a second rom0 + // this is kind of a problem - you will never see the + // error from the first rom0? + // + if (arc_info->romindex == 0 && strlen(arc_info->zipname)) + arc_info->error_msg[0] = 0; - user_io_file_tx_start(arc_info->romname,arc_info->romindex); + file_tx_start(arc_info->romindex); } - break; + break; - case XML_EVENT_TEXT: + case XML_EVENT_TEXT: /* the text node is the data between tags, ie: this text * * the buffer_append is part of a buffer library that will realloc automatically @@ -201,67 +260,68 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons buffer_append(arc_info->data, text); //printf("XML_EVENT_TEXT: text [%s]\n",text); break; - case XML_EVENT_END_NODE: + + case XML_EVENT_END_NODE: //printf("XML_EVENT_END_NODE: tag [%s]\n",node->tag ); - + // 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")) { - if (arc_info->insiderom) + if (!strcasecmp(node->tag, "rom")) { + if (arc_info->insiderom) { - unsigned char checksum[16]; - int checksumsame=1; - char *md5=arc_info->md5; - user_io_file_tx_finish(); - MD5Final (checksum, &arc_info->context); - printf("md5[%s]\n",arc_info->md5); + unsigned char checksum[16]; + int checksumsame = 1; + char *md5 = arc_info->md5; + file_tx_finish(); + MD5Final(checksum, &arc_info->context); + printf("md5[%s]\n", arc_info->md5); printf("md5-calc["); - for (int i = 0; i < 16; i++) - { + for (int i = 0; i < 16; i++) + { char hex[10]; - snprintf(hex,10,"%02x", (unsigned int) checksum[i]); - printf ("%02x", (unsigned int) checksum[i]); - if (md5[0]!=hex[0] || md5[1]!=hex[1]) { - checksumsame=0; + snprintf(hex, 10, "%02x", (unsigned int)checksum[i]); + printf("%02x", (unsigned int)checksum[i]); + if (md5[0] != hex[0] || md5[1] != hex[1]) { + checksumsame = 0; } - md5+=2; - } - printf ("]\n"); - if (checksumsame==0) + md5 += 2; + } + printf("]\n"); + if (checksumsame == 0) { printf("mismatch\n"); if (!strlen(arc_info->error_msg)) - snprintf(arc_info->error_msg,kBigTextSize,"md5 mismatch for rom %d",arc_info->romindex); + snprintf(arc_info->error_msg, kBigTextSize, "md5 mismatch for rom %d", arc_info->romindex); } - else + else { // this code sets the validerom0 and clears the message - // if a rom with index 0 has a correct md5. It supresses + // if a rom with index 0 has a correct md5. It supresses // sending any further rom0 messages - if (arc_info->romindex==0) + if (arc_info->romindex == 0) { - arc_info->validrom0=1; - arc_info->error_msg[0]=0; + arc_info->validrom0 = 1; + arc_info->error_msg[0] = 0; } } } - arc_info->insiderom=0; + arc_info->insiderom = 0; } // At the end of a part node, send the rom part if we are inside a rom tag //int user_io_file_tx_body_filepart(const char *name,int start, int len) - if (!strcasecmp(node->tag,"part") && arc_info->insiderom) + if (!strcasecmp(node->tag, "part") && arc_info->insiderom) { // suppress rom0 if we already sent a valid one // this is useful for merged rom sets - if the first one was valid, use it // the second might not be - if (arc_info->romindex==0 && arc_info->validrom0==1) + if (arc_info->romindex == 0 && arc_info->validrom0 == 1) break; - char fname[kBigTextSize*2+16]; - int start,length,repeat; - repeat=arc_info->repeat; - start=arc_info->offset; - length=0; - if (arc_info->length>0) length = arc_info->length; + char fname[kBigTextSize * 2 + 16]; + int start, length, repeat; + repeat = arc_info->repeat; + start = arc_info->offset; + length = 0; + if (arc_info->length > 0) length = arc_info->length; //printf("partname[%s]\n",arc_info->partname); //printf("zipname [%s]\n",arc_info->zipname); //printf("offset[%d]\n",arc_info->offset); @@ -270,207 +330,216 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons // if (strlen(arc_info->partzipname)) { - if (arc_info->partzipname[0]=='/') - sprintf(fname,"arcade%s/%s",arc_info->partzipname,arc_info->partname); + if (arc_info->partzipname[0] == '/') + sprintf(fname, "arcade%s/%s", arc_info->partzipname, arc_info->partname); else - sprintf(fname,"arcade/mame/%s/%s",arc_info->partzipname,arc_info->partname); + sprintf(fname, "arcade/mame/%s/%s", arc_info->partzipname, arc_info->partname); } else { - if (arc_info->zipname[0]=='/') - sprintf(fname,"arcade%s/%s",arc_info->zipname,arc_info->partname); + if (arc_info->zipname[0] == '/') + sprintf(fname, "arcade%s/%s", arc_info->zipname, arc_info->partname); else - sprintf(fname,"arcade/mame/%s/%s",arc_info->zipname,arc_info->partname); + sprintf(fname, "arcade/mame/%s/%s", arc_info->zipname, arc_info->partname); } - - //user_io_file_tx_body_filepart(getFullPath(fname),0,0); if (strlen(arc_info->partname)) { - printf("user_io_file_tx_body_filepart(const char *name[%s],int start[%d], int len[%d])\n",fname,start,length); - for (int i=0;icontext); + printf("user_io_file_tx_body_filepart(const char *name[%s],int start[%d], int len[%d])\n", fname, start, length); + for (int i = 0; i < repeat; i++) { + int result = file_tx_body_filepart(fname, start, length, &arc_info->context); // we should check file not found error for the zip - if (result==0) + if (result == 0) { - int skip=0; - if (!strncasecmp(fname,"arcade/mame/",strlen("arcade/mame/"))) - skip=strlen("arcade/mame/"); - printf("%s does not exist\n",fname); - snprintf(arc_info->error_msg,kBigTextSize,"%s\n" - "\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\n" - "File Not Found",fname+skip); + int skip = 0; + if (!strncasecmp(fname, "arcade/mame/", strlen("arcade/mame/"))) + skip = strlen("arcade/mame/"); + printf("%s does not exist\n", fname); + snprintf(arc_info->error_msg, kBigTextSize, "%s\n" + "\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\n" + "File Not Found", fname + skip); } } } else // we have binary data? { - //printf("we have bin.hex data [%s]\n",arc_info->data->content); - size_t len=0; - unsigned char* binary=hexstr_to_char(arc_info->data->content,&len); - //printf("len %d:\n",len); - //for (size_t i=0;icontext); - } - if (binary) free(binary); + //printf("we have bin.hex data [%s]\n",arc_info->data->content); + size_t len = 0; + unsigned char* binary = hexstr_to_char(arc_info->data->content, &len); + //printf("len %d:\n",len); + //for (size_t i=0;icontext); + } + if (binary) free(binary); } - - } - break; + break; - case XML_EVENT_ERROR: - printf("XML parse: %s: ERROR %d\n", text, n); - snprintf(arc_info->error_msg,kBigTextSize,"XML parse: %s: ERROR %d\n", text, n); - break; - default: - break; - } + case XML_EVENT_ERROR: + printf("XML parse: %s: ERROR %d\n", text, n); + snprintf(arc_info->error_msg, kBigTextSize, "XML parse: %s: ERROR %d\n", text, n); + break; + default: + break; + } - return true; + return true; } + static int xml_scan_rbf(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, const int n, SAX_Data* sd) { - static int insiderbf=0; + static int insiderbf = 0; char bigtext[kBigTextSize]; char *rbf = (char *)sd->user; - switch (evt) - { - case XML_EVENT_START_NODE: - bigtext[0]=0; - if (!strcasecmp(node->tag,"rbf")) { - insiderbf=1; + switch (evt) + { + case XML_EVENT_START_NODE: + bigtext[0] = 0; + if (!strcasecmp(node->tag, "rbf")) { + insiderbf = 1; + } + printf("XML_EVENT_START_NODE: tag [%s]\n", node->tag); + for (int i = 0; i < node->n_attributes; i++) + { + printf("attribute %d name [%s] value [%s]\n", i, node->attributes[i].name, node->attributes[i].value); } - printf("XML_EVENT_START_NODE: tag [%s]\n",node->tag); - for (int i = 0; i < node->n_attributes; i++) - { - printf("attribute %d name [%s] value [%s]\n",i,node->attributes[i].name,node->attributes[i].value); - } - break; - case XML_EVENT_TEXT: + break; + case XML_EVENT_TEXT: if (insiderbf) { - strncat(bigtext,text,kBigTextSize-strlen(bigtext)-1); - printf("XML_EVENT_TEXT: text [%s]\n",text); + strncat(bigtext, text, kBigTextSize - strlen(bigtext) - 1); + printf("XML_EVENT_TEXT: text [%s]\n", text); } break; - case XML_EVENT_END_NODE: - if (!strcasecmp(node->tag,"rbf")) + case XML_EVENT_END_NODE: + if (!strcasecmp(node->tag, "rbf")) { - insiderbf=0; + insiderbf = 0; //printf("bigtext [%s]\n",bigtext); - strncpy(rbf,bigtext,kBigTextSize); + strncpy(rbf, bigtext, kBigTextSize); //printf("got rbf tag [%s]\n",rbf); } - printf("XML_EVENT_END_NODE: tag [%s]\n",node->tag ); - break; + printf("XML_EVENT_END_NODE: tag [%s]\n", node->tag); + break; - case XML_EVENT_ERROR: - printf("XML parse: %s: ERROR %d\n", text, n); - break; - default: - break; - } + case XML_EVENT_ERROR: + printf("XML parse: %s: ERROR %d\n", text, n); + break; + default: + break; + } - return true; + return true; } int arcade_send_rom(const char *xml) { - SAX_Callbacks sax; - SAX_Callbacks_init(&sax); + SAX_Callbacks sax; + SAX_Callbacks_init(&sax); - sax.all_event = xml_send_rom; + sax.all_event = xml_send_rom; // create the structure we use for the XML parser struct arc_struct arc_info; - arc_info.data=buffer_init(kBigTextSize); - arc_info.error_msg[0]=0; - arc_info.validrom0=0; + arc_info.data = buffer_init(kBigTextSize); + arc_info.error_msg[0] = 0; + arc_info.validrom0 = 0; // parse - XMLDoc_parse_file_SAX(xml, &sax, &arc_info); - if (arc_info.validrom0==0 && strlen(arc_info.error_msg)) + XMLDoc_parse_file_SAX(xml, &sax, &arc_info); + if (arc_info.validrom0 == 0 && strlen(arc_info.error_msg)) { - strcpy(global_error_msg,arc_info.error_msg); - printf("arcade_send_rom: pretty error: [%s]\n",global_error_msg); + strcpy(global_error_msg, arc_info.error_msg); + printf("arcade_send_rom: pretty error: [%s]\n", global_error_msg); } buffer_destroy(arc_info.data); - return 0; + return 0; } -int CheckArcadeError(void) +int arcade_check_error(void) { - if (global_error_msg[0]!=0) { - printf("ERROR: [%s]\n",global_error_msg); - Info(global_error_msg,1000*30); - global_error_msg[0]=0; + if (global_error_msg[0] != 0) { + printf("ERROR: [%s]\n", global_error_msg); + Info(global_error_msg, 1000 * 30); + global_error_msg[0] = 0; } return 0; } -int arcade_scan_xml_for_rbf(const char *xml,char *rbfname) +int arcade_load(const char *xml) { - char rbfname_fragment[kBigTextSize]; - rbfname_fragment[0]=0; - rbfname[0]=0; - SAX_Callbacks sax; - SAX_Callbacks_init(&sax); + MenuHide(); - sax.all_event = xml_scan_rbf; - XMLDoc_parse_file_SAX(xml, &sax, rbfname_fragment); - strcpy(rbfname,rbfname_fragment); + char rbfname[kBigTextSize]; + char xmlname[kBigTextSize]; - //printf("arcade_scan_xml_for_rbf [%s]\n",xml); + strcpy(xmlname, xml); + + rbfname[0] = 0; + SAX_Callbacks sax; + SAX_Callbacks_init(&sax); + + sax.all_event = xml_scan_rbf; + XMLDoc_parse_file_SAX(xmlname, &sax, rbfname); + + printf("arcade_scan_xml_for_rbf [%s]\n", xmlname); /* once we have the rbfname fragment from the MRA xml file * search the arcade folder for the match */ - struct dirent *entry; - DIR *dir=NULL; + struct dirent *entry; + DIR *dir = NULL; //printf("opendir(%s)\n",getFullPath("arcade")); - if (!(dir = opendir(getFullPath("arcade")))) - { + if (!(dir = opendir(getFullPath("arcade")))) + { printf("arcade directory not found\n"); - return 0; - } + return 0; + } - while ((entry = readdir(dir)) != NULL) { - if (entry->d_type == DT_DIR) { - } - else { + int found = 0; + int len; + while ((entry = readdir(dir)) != NULL) + { + if (entry->d_type != DT_DIR) + { char newstring[kBigTextSize]; //printf("entry name: %s\n",entry->d_name); - snprintf(newstring,kBigTextSize,"Arcade-%s_",rbfname_fragment); - if (!strncasecmp(newstring,entry->d_name,strlen(newstring))) { - closedir(dir); - strcpy(rbfname,entry->d_name); - return 0; - } - snprintf(newstring,kBigTextSize,"%s_",rbfname_fragment); - if (!strncasecmp(newstring,entry->d_name,strlen(newstring))) { - closedir(dir); - strcpy(rbfname,entry->d_name); - return 0; - } - snprintf(newstring,kBigTextSize,"%s.",rbfname_fragment); - if (!strncasecmp(newstring,entry->d_name,strlen(newstring))) { - closedir(dir); - strcpy(rbfname,entry->d_name); - return 0; + snprintf(newstring, kBigTextSize, "Arcade-%s", rbfname); + len = strlen(newstring); + if (!strncasecmp(newstring, entry->d_name, len) && (entry->d_name[len] == '.' || entry->d_name[len] == '_')) + { + found = 1; + break; } - } - } + snprintf(newstring, kBigTextSize, "%s", rbfname); + len = strlen(newstring); + if (!strncasecmp(newstring, entry->d_name, len) && (entry->d_name[len] == '.' || entry->d_name[len] == '_')) + { + found = 1; + break; + } + } + } - if (dir) closedir(dir); - strcpy(rbfname,rbfname_fragment); - return 0; + if (found) sprintf(rbfname, "%s/arcade/%s", getRootDir(), entry->d_name); + closedir(dir); + + if (found) + { + printf("MRA: %s, RBF: %s\n", xmlname, rbfname); + fpga_load_rbf(rbfname, NULL, xmlname); + } + else + { + Info("No core found!"); + } + + return 0; } - diff --git a/support/arcade/romutils.h b/support/arcade/romutils.h index b367b23..98868a6 100644 --- a/support/arcade/romutils.h +++ b/support/arcade/romutils.h @@ -1,5 +1,8 @@ -#include "../../file_io.h" +#ifndef ROMUTILS_H_ +#define ROMUTILS_H_ int arcade_send_rom(const char *xml); -int arcade_scan_xml_for_rbf(const char *xml,char *rbfname); -int CheckArcadeError(void); +int arcade_load(const char *xml); +int arcade_check_error(void); + +#endif diff --git a/support/sharpmz/sharpmz.cpp b/support/sharpmz/sharpmz.cpp index 21ab697..0c3edbb 100644 --- a/support/sharpmz/sharpmz.cpp +++ b/support/sharpmz/sharpmz.cpp @@ -1955,7 +1955,7 @@ int sharpmz_default_ui_state(void) // void sharpmz_ui(int idleState, int idle2State, int systemState, int selectFile, uint32_t *parentstate, uint32_t *menustate, uint32_t *menusub, uint32_t *menusub_last, - uint32_t *menumask, char *selectedPath, const char **helptext, char *helptext_custom, + uint64_t *menumask, char *selectedPath, const char **helptext, char *helptext_custom, uint32_t *fs_ExtLen, uint32_t *fs_Options, uint32_t *fs_MenuSelect, uint32_t *fs_MenuCancel, char *fs_pFileExt, unsigned char menu, unsigned char select, unsigned char up, unsigned char down, diff --git a/support/sharpmz/sharpmz.h b/support/sharpmz/sharpmz.h index 7cc6594..669b9e4 100644 --- a/support/sharpmz/sharpmz.h +++ b/support/sharpmz/sharpmz.h @@ -457,7 +457,7 @@ void sharpmz_select_file(const char*, unsigned char, char *, c int sharpmz_default_ui_state(void); void sharpmz_ui(int idleState, int idle2State, int systemState, int selectFile, uint32_t *parentstate, uint32_t *menustate, uint32_t *menusub, uint32_t *menusub_last, - uint32_t *menumask, char *selectedPath, const char **helptext, char *helptext_custom, + uint64_t *menumask, char *selectedPath, const char **helptext, char *helptext_custom, uint32_t *fs_ExtLen, uint32_t *fs_Options, uint32_t *fs_MenuSelect, uint32_t *fs_MenuCancel, char *fs_pFileExt, unsigned char menu, unsigned char select, unsigned char up, unsigned char down, diff --git a/user_io.cpp b/user_io.cpp index dbf0fbe..c57501d 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -693,6 +693,11 @@ int user_io_is_dualsdr() return dual_sdr; } +int user_io_get_width() +{ + return fio_size; +} + void user_io_init(const char *path, const char *xml) { char *name; @@ -703,13 +708,7 @@ void user_io_init(const char *path, const char *xml) // we need to set the directory to where the XML file (MRA) is // not the RBF. The RBF will be in arcade, which the user shouldn't // browse - if (strlen(xml)) { - //printf("USER_IO_INIT got XML: [%s] [%s]\n",path,xml); - strcpy(core_path, getFullPath(xml)); - } else { - strcpy(core_path, path); - } - //printf("USER_IO_INIT core_path: [%s] \n",core_path); + strcpy(core_path, xml ? xml : path); memset(sd_image, 0, sizeof(sd_image)); @@ -825,7 +824,11 @@ void user_io_init(const char *path, const char *xml) } else { - if (is_minimig()) + if (xml) + { + arcade_send_rom(xml); + } + else if (is_minimig()) { puts("Identified Minimig V2 core"); BootInit(); @@ -869,14 +872,6 @@ void user_io_init(const char *path, const char *xml) if (user_io_use_cheats()) cheats_init("", user_io_get_file_crc()); } - /* AJS -- NOT SURE THIS IS THE BEST PLACE */ - if (strlen(xml)) { - //sprintf(mainpath, "%s/%s", user_io_get_core_path(), xml); - printf("USER_IO_INIT got XML: [%s]\n",xml); - //printf("USER_IO_INIT got XML: [%s]\n",mainpath); - arcade_send_rom(getFullPath(xml)); - } - if (is_cpc_core()) { for (int m = 0; m < 3; m++) @@ -1599,101 +1594,6 @@ static void check_status_change() } } -#define DEBUG_ROM_BINARY 0 -#if DEBUG_ROM_BINARY -FILE *rombinary; -#endif - -int user_io_file_tx_start(const char *name,unsigned char index) -{ - // set index byte (0=bios rom, 1-n=OSD entry index) - user_io_set_index(index); - - int len = strlen(name); - const char *p = name + len - 4; - EnableFpga(); - spi8(UIO_FILE_INFO); - spi_w(toupper(p[0]) << 8 | toupper(p[1])); - spi_w(toupper(p[2]) << 8 | toupper(p[3])); - DisableFpga(); - - // prepare transmission of new file - EnableFpga(); - spi8(UIO_FILE_TX); - spi8(0xff); - DisableFpga(); - - file_crc = 0; -#if DEBUG_ROM_BINARY - rombinary=fopen("/media/fat/this.rom","wb"); -#endif - return 1; -} -int user_io_file_tx_body(const uint8_t *buf,uint16_t chunk,struct MD5Context *md5context) -{ - printf("."); - - EnableFpga(); - spi8(UIO_FILE_TX_DAT); - - spi_write(buf, chunk, fio_size); - DisableFpga(); - - file_crc = crc32(file_crc, buf ,chunk ); - if (md5context) MD5Update (md5context, buf,chunk); -#if DEBUG_ROM_BINARY - fwrite(buf,1,chunk,rombinary); -#endif - - return 1; -} -int user_io_file_tx_body_filepart(const char *name,int start, int len,struct MD5Context *md5context) -{ - char mute=0; - fileTYPE f = {}; - static uint8_t buf[4096]; - if (!FileOpen(&f, name, mute)) return 0; - if (start) FileSeek(&f, start, SEEK_SET); - unsigned long bytes2send = f.size; - if (len>0 && len < bytes2send) bytes2send=len; - /* transmit the entire file using one transfer */ - printf("Selected file %s with %lu bytes to send \n", name, bytes2send); - while (bytes2send) - { - printf("."); - - uint16_t chunk = (bytes2send > sizeof(buf)) ? sizeof(buf) : bytes2send; - - FileReadAdv(&f, buf, chunk); - user_io_file_tx_body(buf,chunk,md5context); - - - bytes2send -= chunk; - } - - - return 1; -} -int user_io_file_tx_finish() -{ - // check if core requests some change while downloading - check_status_change(); - - printf("\n"); - printf("CRC32: %08X\n", file_crc); -#if DEBUG_ROM_BINARY - fclose(rombinary); -#endif - - // signal end of transmission - EnableFpga(); - spi8(UIO_FILE_TX); - spi8(0x00); - DisableFpga(); - printf("\n"); - return 1; -} - static char pchar[] = { 0x8C, 0x8F, 0x7F }; #define PROGRESS_CNT 28 diff --git a/user_io.h b/user_io.h index 6e04c36..52d2c75 100644 --- a/user_io.h +++ b/user_io.h @@ -210,12 +210,7 @@ void user_io_read_confstr(); char *user_io_get_confstr(int index); uint32_t user_io_8bit_set_status(uint32_t, uint32_t, int ex = 0); int user_io_file_tx(const char* name, unsigned char index = 0, char opensave = 0, char mute = 0, char composite = 0); - -int user_io_file_tx_start(const char *name,unsigned char index=0); -int user_io_file_tx_body(const uint8_t *buf,uint16_t chunk,struct MD5Context *md5context=NULL); -int user_io_file_tx_body_filepart(const char *name,int start=0, int len=0,struct MD5Context *md5context=NULL); -int user_io_file_tx_finish(); - +int user_io_get_width(); uint32_t user_io_get_file_crc(); int user_io_file_mount(char *name, unsigned char index = 0, char pre = 0); diff --git a/video.cpp b/video.cpp index b32ab3c..a4d0b31 100644 --- a/video.cpp +++ b/video.cpp @@ -603,7 +603,7 @@ static uint32_t show_video_info(int force) Info(str, cfg.video_info * 1000); } - CheckArcadeError(); + arcade_check_error(); uint32_t scrh = v_cur.item[5]; if (height && scrh)