summaryrefslogtreecommitdiffstats
path: root/gbdk/gbdk-support/makecom/makecom.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-06-02 15:28:40 +0200
committerLouis Burda <quent.burda@gmail.com>2022-06-02 15:28:40 +0200
commit5bc16063c29aa4d3d287ebd163ccdbcbf54c4f9f (patch)
treec131f947a37b3af2d14d41e9eda098bdec2d061c /gbdk/gbdk-support/makecom/makecom.c
parent78a5f810b22f0d8cafa05f638b0cb2e889824859 (diff)
downloadcscg2022-gearboy-master.tar.gz
cscg2022-gearboy-master.zip
Added submodule filesHEADmaster
Diffstat (limited to 'gbdk/gbdk-support/makecom/makecom.c')
-rw-r--r--gbdk/gbdk-support/makecom/makecom.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/gbdk/gbdk-support/makecom/makecom.c b/gbdk/gbdk-support/makecom/makecom.c
new file mode 100644
index 00000000..a6abd51d
--- /dev/null
+++ b/gbdk/gbdk-support/makecom/makecom.c
@@ -0,0 +1,147 @@
+// This is free and unencumbered software released into the public domain.
+// For more information, please refer to <https://unlicense.org>
+// bbbbbr 2022
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <ctype.h>
+
+#include "path_ops.h"
+#include "common.h"
+#include "files.h"
+#include "noi_file.h"
+#include "bin_to_com.h"
+
+#define EXT_NOI "noi"
+
+char filename_in_bin[MAX_STR_LEN] = "";
+char filename_in_noi[MAX_STR_LEN] = "";
+char filename_out_com[MAX_STR_LEN] = "";
+char filename_banks_base[MAX_STR_LEN] = "";
+char filename_overlay[COM_OVERLAY_NAME_LEN] = "";
+
+uint8_t * p_rom_buf_in = NULL;
+size_t rom_buf_in_len = 0;
+
+static void str_to_upper(char * str);
+static void filenames_out_prepare(void);
+static void display_help(void);
+static int handle_args(int argc, char * argv[]);
+void cleanup(void);
+
+
+static void str_to_upper(char * str) {
+ while (*str) {
+ *str = toupper(*str);
+ str++;
+ }
+}
+
+
+
+// Generate names for the exported bank/overlay files
+// based on the output COM filename and path
+static void filenames_out_prepare(void) {
+
+ char str_banks_name[MAX_STR_LEN];
+ char str_path_only[MAX_STR_LEN];
+
+ snprintf(str_banks_name, sizeof(str_banks_name), "%s", filename_out_com);
+
+ if (!get_path_without_filename(filename_out_com, str_path_only, sizeof(str_path_only))) {
+ printf("makecom: Error: source path %s exceeds max length\n", filename_out_com);
+ exit;
+ }
+
+ // Convert filename to uppercase and remove extension
+ str_to_upper(str_banks_name);
+ filename_remove_extension(str_banks_name);
+
+ // Then truncate it to 8 characters with no padding for bank filenames
+ int ret = snprintf(filename_banks_base, sizeof(filename_banks_base), "%s%.8s", str_path_only, get_filename_from_path(str_banks_name));
+ if (ret < 0) printf("makecom: Warning, banks output path truncated\n");
+ // Then with trailing space char padding for the overlay filename patch
+ snprintf(filename_overlay, sizeof(filename_overlay), "%-8.8s", get_filename_from_path(str_banks_name));
+}
+
+
+static void display_help(void) {
+
+ fprintf(stdout,
+ "makecom image.rom image.noi output.com\n"
+ "Use: convert a binary .rom file to .msxdos com format.\n"
+ );
+}
+
+
+int handle_args(int argc, char * argv[]) {
+
+ if (argc == 3) {
+ // Copy input and output filenames from arguments
+ snprintf(filename_in_bin, sizeof(filename_in_bin), "%s", argv[1]);
+ snprintf(filename_out_com, sizeof(filename_out_com), "%s", argv[2]);
+ // Generate .noi file name from input .bin file name
+ snprintf(filename_in_noi, sizeof(filename_in_noi), "%s", argv[1]);
+ filename_replace_extension(filename_in_noi, EXT_NOI, MAX_STR_LEN);
+ } else if (argc == 4) {
+ // Copy input and output filenames from arguments
+ snprintf(filename_in_bin, sizeof(filename_in_bin), "%s", argv[1]);
+ snprintf(filename_in_noi, sizeof(filename_in_noi), "%s", argv[2]);
+ snprintf(filename_out_com, sizeof(filename_out_com), "%s", argv[3]);
+ } else {
+ display_help();
+ return false;
+ }
+
+ filenames_out_prepare();
+
+
+ // printf("bin: %s\n",filename_in_bin);
+ // printf("noi: %s\n",filename_in_noi);
+ // printf("com: %s\n",filename_out_com);
+
+ // printf("banks base: _%s_\n",filename_banks_base);
+ // printf("overlay : _%s_\n",filename_overlay);
+
+
+ return true;
+}
+
+
+// Registered as atexit() handler
+// Free resources during normal shutdown or from a call to exit()
+void cleanup(void) {
+
+ banks_cleanup();
+ noi_cleanup();
+
+ if (p_rom_buf_in != NULL) {
+ free(p_rom_buf_in);
+ p_rom_buf_in = NULL;
+ }
+}
+
+
+int main( int argc, char *argv[] ) {
+
+ // Exit with failure by default
+ int ret = EXIT_FAILURE;
+
+ // Register cleanup with exit handler
+ atexit(cleanup);
+
+ if (handle_args(argc, argv)) {
+
+ p_rom_buf_in = file_read_into_buffer(filename_in_bin, &rom_buf_in_len);
+
+ if (p_rom_buf_in)
+ if (noi_file_load_symbols(filename_in_noi))
+ ret = bin2com();
+ }
+ cleanup();
+
+ return ret; // Exit with failure by default
+}