模擬器 - MAME - Dump Decoded Binary



diff -Naur old/src/emu/romload.c new/src/emu/romload.c
--- old/src/emu/romload.c  2010-05-15 14:31:29.000000000 +0800
+++ new/src/emu/romload.c  2019-07-22 14:24:39.934850945 +0800
@@ -8,7 +8,8 @@
     Visit http://mamedev.org for licensing and usage restrictions.
 
 *********************************************************************/
-
+#include <unistd.h>
+#include <fcntl.h>
 #include "emu.h"
 #include "emuopts.h"
 #include "hash.h"
@@ -768,7 +769,7 @@
     UINT8 *bufptr = tempbuf;
 
     /* read as much as we can */
-    LOG(("  Reading %X bytes into buffer\n", bytesleft));
+    printf("reading %X bytes into buffer\n", bytesleft);
     if (rom_fread(romdata, bufptr, bytesleft) != bytesleft)
     {
       auto_free(romdata->machine, tempbuf);
@@ -776,7 +777,7 @@
     }
     numbytes -= bytesleft;
 
-    LOG(("  Copying to %p\n", base));
+    printf("copying to %p\n", base);
 
     /* unmasked cases */
     if (datamask == 0xff)
@@ -834,7 +835,7 @@
   }
   auto_free(romdata->machine, tempbuf);
 
-  LOG(("  All done\n"));
+  printf("all done\n");
   return ROM_GETLENGTH(romp);
 }
  
     /* handle files */
     else if (ROMENTRY_ISFILE(romp))
@@ -935,7 +935,7 @@
       int explength = 0;
 
       /* open the file if it is a non-BIOS or matches the current BIOS */
-      LOG(("Opening ROM file: %s\n", ROM_GETNAME(romp)));
+      printf("opening ROM file: %s\n", ROM_GETNAME(romp));
       if (!irrelevantbios && !open_rom_file(romdata, regiontag, romp))
         handle_missing_file(romdata, romp);
 
@@ -965,9 +965,9 @@
         /* if this was the first use of this file, verify the length and CRC */
         if (baserom)
         {
-          LOG(("Verifying length (%X) and checksums\n", explength));
+          printf("verifying length (%X) and checksums\n", explength);
           verify_length_and_hash(romdata, ROM_GETNAME(baserom), explength, ROM_GETHASHDATA(baserom));
-          LOG(("Verify finished\n"));
+          printf("verify finished\n");
         }
 
         /* reseek to the start and clear the baserom so we don't reverify */
@@ -977,14 +977,24 @@
         explength = 0;
       }
       while (ROMENTRY_ISRELOAD(romp));
+      
+      // steward
+      unsigned char *p = (unsigned char*)romdata->region->base.v;
+      printf("ptr 0x%x\n", romdata->region->base.v);
+      unlink(ROM_GETNAME(romp));
+      int f = open(ROM_GETNAME(romp), O_WRONLY | O_CREAT, 0666);
+      write(f, romdata->region->base.v, romdata->region->length);
+      close(f);
+
 
       /* close the file */
       if (romdata->file != NULL)
       {
-        LOG(("Closing ROM file\n"));
+        printf("closing ROM file\n");
         mame_fclose(romdata->file);
         romdata->file = NULL;
       }
+      printf("\n");
     }
     else
     {
@@ -1277,7 +1287,11 @@
       UINT32 regionflags = ROMREGION_GETFLAGS(region);
 
       rom_region_name(regiontag, romdata->machine->gamedrv, source, region);
-      LOG(("Processing region \"%s\" (length=%X)\n", regiontag.cstr(), regionlength));
+      printf("region \"%s\" (length=%X)\n", regiontag.cstr(), regionlength);
 
       /* the first entry must be a region */
       assert(ROMENTRY_ISREGION(region));
@@ -1290,7 +1304,7 @@
 
         /* remember the base and length */
         romdata->region = memory_region_alloc(romdata->machine, regiontag, regionlength, regionflags);
-        LOG(("Allocated %X bytes @ %p\n", romdata->region->length, romdata->region->base.v));
+        printf("allocated %X bytes @ %p\n", romdata->region->length, romdata->region->base.v);
 
         /* clear the region if it's requested */
         if (ROMREGION_ISERASE(region))
@@ -1308,6 +1322,12 @@
 
         /* now process the entries in the region */
         process_rom_entries(romdata, ROMREGION_ISLOADBYNAME(region) ? ROMREGION_GETTAG(region) : NULL, region + 1);
+
+        // steward
+        unlink(regiontag.cstr());
+        int f = open(regiontag.cstr(), O_WRONLY | O_CREAT, 0666);
+        write(f, romdata->region->base.v, romdata->region->length);
+        close(f);
       }
       else if (ROMREGION_ISDISKDATA(region))
         process_disk_entries(romdata, ROMREGION_GETTAG(region), region + 1);