changeset 486:cb61c44f7846

Clean up PRG/RAW loading.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 11 Nov 2012 14:36:17 +0200
parents c1d5cccbf5b3
children b89598501cec
files objlink.c
diffstat 1 files changed, 63 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- a/objlink.c	Sun Nov 11 13:05:51 2012 +0200
+++ b/objlink.c	Sun Nov 11 14:36:17 2012 +0200
@@ -462,58 +462,98 @@
 }
 
 
-int dmLoadPRG(const char *fname, BOOL forceAddr, int destAddr)
+int dmLoadPRG(const char *filename, BOOL forceAddr, const ssize_t destAddr)
 {
     FILE *f;
-    ssize_t a, b, s;
+    ssize_t dataSize, loadAddr, endAddr;
+    Uint16 tmpAddr;
 
     // Open the input file
-    if ((f = fopen(fname, "rb")) == NULL)
+    if ((f = fopen(filename, "rb")) == NULL)
     {
         dmError("Error opening input file '%s' (%s).\n",
-            fname, strerror(errno));
+            filename, strerror(errno));
         return 1;
     }
 
     // Get filesize
-    if ((s = dmGetFileSize(f) - 2) < 0)
+    if ((dataSize = dmGetFileSize(f) - 2) < 0)
     {
-        dmError("Error getting file size for '%s'.\n", fname);
+        dmError("Error getting file size for '%s'.\n", filename);
         return 6;
     }
 
     // Get loading address
-    if ((a = fgetc(f)) < 0)
+    if (!dm_fread_le16(f, &tmpAddr))
     {
         dmError("Error reading input file '%s' (%s).\n",
-            fname, strerror(errno));
+            filename, strerror(errno));
         return 2;
     }
 
-    if ((b = fgetc(f)) < 0)
-    {
-        dmError("Error reading input file '%s' (%s).\n",
-            fname, strerror(errno));
-        return 3;
-    }
-
     // Show information
-    if (forceAddr)
-        a = destAddr;
-    else
-        a = a + (b * 0x100);
+    loadAddr = forceAddr ? destAddr : tmpAddr;
+    endAddr = loadAddr + dataSize - 1;
 
     dmPrint(1, "* Loading '%s', %s at $%.4x-$%.4x",
-        fname, forceAddr ? "PRGA" : "PRG", a, (a + s - 1));
+        filename, forceAddr ? "PRGA" : "PRG", loadAddr, endAddr);
 
-    if (a + s >= memModel->size)
+    if (endAddr >= memModel->size)
     {
         dmPrint(1, " .. Does not fit into the memory!\n");
         return 5;
     }
 
     // Load data
-    if (fread(&memory[a], s, 1, f) < 1)
+    if (fread(&memory[loadAddr], dataSize, 1, f) < 1)
+    {
+        dmPrint(1, " .. Error: %s.\n",
+            strerror(errno));
+        return 4;
+    }
+
+    dmPrint(1, " .. OK\n");
+
+    // Add to list of blocks
+    reserveMemBlock(loadAddr, endAddr, filename, MTYPE_RES);
+
+    return 0;
+}
+
+
+int dmLoadRAW(const char *filename, const ssize_t destAddr)
+{
+    FILE *f;
+    ssize_t dataSize, endAddr;
+
+    // Open the input file
+    if ((f = fopen(filename, "rb")) == NULL)
+    {
+        dmError("Error opening input file '%s' (%s).\n",
+            filename, strerror(errno));
+        return 1;
+    }
+
+    // Get filesize
+    if ((dataSize = dmGetFileSize(f)) < 0)
+    {
+        dmError("Error getting file size for '%s'.\n", filename);
+        return 6;
+    }
+
+    // Show information
+    endAddr = destAddr + dataSize - 1;
+    dmPrint(1, "* Loading '%s', RAW at $%.4x-$%.4x",
+        filename, destAddr, endAddr);
+
+    if (endAddr >= memModel->size)
+    {
+        dmPrint(1, " .. Does not fit into the memory!\n");
+        return 5;
+    }
+
+    // Load data
+    if (fread(&memory[destAddr], dataSize, 1, f) < 1)
     {
         dmPrint(1, " .. Error: %s.\n",
             strerror(errno));
@@ -523,55 +563,7 @@
     dmPrint(1, " .. OK\n");
 
     // Add info to list
-    reserveMemBlock(a, (a + s + 1), fname, MTYPE_RES);
-
-    return 0;
-}
-
-
-int dmLoadRAW(const char *fname, int destAddr)
-{
-    FILE *f;
-    ssize_t s;
-
-    // Open the input file
-    if ((f = fopen(fname, "rb")) == NULL)
-    {
-        dmError("Error opening input file '%s' (%s).\n",
-            fname, strerror(errno));
-        return 1;
-    }
-
-    // Get filesize
-    s = dmGetFileSize(f);
-    if (s < 0)
-    {
-        dmError("Error getting file size for '%s'.\n", fname);
-        return 6;
-    }
-
-    // Show information
-    dmPrint(1, "* Loading '%s', RAW at $%.4x-$%.4x",
-        fname, destAddr, (destAddr + s - 1));
-
-    if (destAddr + s >= memModel->size)
-    {
-        dmPrint(1, " .. Does not fit into the memory!\n");
-        return 5;
-    }
-
-    // Load data
-    if (fread(&memory[destAddr], s, 1, f) < 1)
-    {
-        dmPrint(1, " .. Error: %s.\n",
-            strerror(errno));
-        return 4;
-    }
-
-    dmPrint(1, " .. OK\n");
-
-    // Add info to list
-    reserveMemBlock(destAddr, (destAddr + s + 1), fname, MTYPE_RES);
+    reserveMemBlock(destAddr, endAddr, filename, MTYPE_RES);
 
     return 0;
 }