libn64/io: Break out filesystem operations.
authorTyler J. Stachecki <stachecki.tyler@gmail.com>
Sun, 11 Mar 2018 00:16:51 +0000 (19:16 -0500)
committerTyler J. Stachecki <stachecki.tyler@gmail.com>
Sun, 11 Mar 2018 00:16:51 +0000 (19:16 -0500)
Signed-off-by: Tyler J. Stachecki <stachecki.tyler@gmail.com>
libn64/Makefile
libn64/io/filesystem.c [new file with mode: 0644]
libn64/io/pi_thread.c
libn64/priv_include/io/filesystem.h [new file with mode: 0644]

index d49012f..2b2a530 100644 (file)
@@ -40,6 +40,7 @@ ASMFILES = $(call FIXPATH,\
 
 CFILES = $(call FIXPATH,\
        io/init.c \
+       io/filesystem.c \
        io/pi_thread.c \
        io/si_thread.c \
        os/fbtext.c \
diff --git a/libn64/io/filesystem.c b/libn64/io/filesystem.c
new file mode 100644 (file)
index 0000000..855e8a7
--- /dev/null
@@ -0,0 +1,51 @@
+//
+// libn64/io/filesystem.c: Filesystem operations.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#include <io.h>
+#include <io/filesystem.h>
+#include <libn64.h>
+#include <stdint.h>
+
+// Issues a request to the PI subsystem to load a file.
+void filesystem_load(const struct libn64_pi_request *pi_req) {
+  uint32_t pi_addr;
+
+  extern char _binary_filesystem_bin_start;
+  static const char *fs_ptr = &_binary_filesystem_bin_start;
+  uint32_t fs_offs;
+
+  // PI transfer lengths must be an even number of bytes.
+  // The source address must also be 2-byte aligned, but the
+  // filesystem packer takes care of doing that for us.
+  uint32_t transfer_size = (pi_req->size + 1) & ~0x1;
+
+  // Cart domain is 0x1000_0000, a 0x1000 header is stapled onto
+  // the cart by checksum, and the cart gets loaded to 0x8000_0400.
+  // Do a bit of fudging to figure out where the data is located.
+  __builtin_memcpy(&fs_offs, &fs_ptr, sizeof(fs_offs));
+  fs_offs -= 0x70000400;
+
+  __asm__ __volatile__(
+    ".set noreorder\n\t"
+
+    "lui %0, 0xA460\n\t"
+    "sw %1, 0x0(%0)\n\t"
+    "sw %2, 0x4(%0)\n\t"
+    "sw %3, 0xC(%0)\n\t"
+
+    ".set reorder\n\t"
+
+    : "=&r" (pi_addr)
+    : "r" (pi_req->dest_address),
+      "r" (pi_req->src_address + fs_offs),
+      "r" (transfer_size)
+  );
+}
+
index 96eb5e6..eefd0f9 100644 (file)
@@ -9,6 +9,7 @@
 //
 
 #include <io.h>
+#include <io/filesystem.h>
 #include <io/pi_thread.h>
 #include <libn64.h>
 #include <mq.h>
 #include <syscall.h>
 
 libn64func
-static void filesystem_load(const struct libn64_pi_request *pi_req);
-
-libn64func
 static void libn64_pi_issue(struct libn64_mq *pi_backlog,
     uint32_t command, const struct libn64_pi_request *pi_req);
 
-// Issues a request to the PI subsystem to load a file.
-void filesystem_load(const struct libn64_pi_request *pi_req) {
-  uint32_t pi_addr;
-
-  extern char _binary_filesystem_bin_start;
-  static const char *fs_ptr = &_binary_filesystem_bin_start;
-  uint32_t fs_offs;
-
-  // PI transfer lengths must be an even number of bytes.
-  // The source address must also be 2-byte aligned, but the
-  // filesystem packer takes care of doing that for us.
-  uint32_t transfer_size = (pi_req->size + 1) & ~0x1;
-
-  // Cart domain is 0x1000_0000, a 0x1000 header is stapled onto
-  // the cart by checksum, and the cart gets loaded to 0x8000_0400.
-  // Do a bit of fudging to figure out where the data is located.
-  __builtin_memcpy(&fs_offs, &fs_ptr, sizeof(fs_offs));
-  fs_offs -= 0x70000400;
-
-  __asm__ __volatile__(
-    ".set noreorder\n\t"
-
-    "lui %0, 0xA460\n\t"
-    "sw %1, 0x0(%0)\n\t"
-    "sw %2, 0x4(%0)\n\t"
-    "sw %3, 0xC(%0)\n\t"
-
-    ".set reorder\n\t"
-
-    : "=&r" (pi_addr)
-    : "r" (pi_req->dest_address),
-      "r" (pi_req->src_address + fs_offs),
-      "r" (transfer_size)
-  );
-}
-
 // Issues a command to the PI subsystem.
 void libn64_pi_issue(struct libn64_mq *pi_backlog,
     uint32_t command, const struct libn64_pi_request *pi_req) {
diff --git a/libn64/priv_include/io/filesystem.h b/libn64/priv_include/io/filesystem.h
new file mode 100644 (file)
index 0000000..5cdb5d5
--- /dev/null
@@ -0,0 +1,20 @@
+//
+// libn64/priv_include/io/filesystem.h: Filesystem operations.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_PRIV_INCLUDE_IO_FILESYSTEM_H
+#define LIBN64_PRIV_INCLUDE_IO_FILESYSTEM_H
+
+#include <libn64.h>
+
+libn64func
+void filesystem_load(const struct libn64_pi_request *pi_req);
+
+#endif
+