git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-support/makecom/makecom.c

      1 // This is free and unencumbered software released into the public domain.
      2 // For more information, please refer to <https://unlicense.org>
      3 // bbbbbr 2022
      4 
      5 #include <stdio.h>
      6 #include <string.h>
      7 #include <stdlib.h>
      8 #include <stdbool.h>
      9 #include <stdint.h>
     10 #include <ctype.h>
     11 
     12 #include "path_ops.h"
     13 #include "common.h"
     14 #include "files.h"
     15 #include "noi_file.h"
     16 #include "bin_to_com.h"
     17 
     18 #define EXT_NOI "noi"
     19 
     20 char filename_in_bin[MAX_STR_LEN] = "";
     21 char filename_in_noi[MAX_STR_LEN] = "";
     22 char filename_out_com[MAX_STR_LEN] = "";
     23 char filename_banks_base[MAX_STR_LEN] = "";
     24 char filename_overlay[COM_OVERLAY_NAME_LEN] = "";
     25 
     26 uint8_t * p_rom_buf_in  = NULL;
     27 size_t    rom_buf_in_len = 0;
     28 
     29 static void str_to_upper(char * str);
     30 static void filenames_out_prepare(void);
     31 static void display_help(void);
     32 static int handle_args(int argc, char * argv[]);
     33 void cleanup(void);
     34 
     35 
     36 static void str_to_upper(char * str) {
     37     while (*str) {
     38         *str = toupper(*str);
     39         str++;
     40     }
     41 }
     42 
     43 
     44 
     45 // Generate names for the exported bank/overlay files
     46 // based on the output COM filename and path
     47 static void filenames_out_prepare(void) {
     48 
     49     char str_banks_name[MAX_STR_LEN];
     50     char str_path_only[MAX_STR_LEN];
     51 
     52     snprintf(str_banks_name,  sizeof(str_banks_name), "%s", filename_out_com);
     53 
     54     if (!get_path_without_filename(filename_out_com, str_path_only, sizeof(str_path_only))) {
     55         printf("makecom: Error: source path %s exceeds max length\n", filename_out_com);
     56         exit;
     57     }
     58 
     59     // Convert filename to uppercase and remove extension
     60     str_to_upper(str_banks_name);
     61     filename_remove_extension(str_banks_name);
     62 
     63     // Then truncate it to 8 characters with no padding for bank filenames
     64     int ret = snprintf(filename_banks_base, sizeof(filename_banks_base), "%s%.8s", str_path_only, get_filename_from_path(str_banks_name));
     65     if (ret < 0) printf("makecom: Warning, banks output path truncated\n");
     66     // Then with trailing space char padding for the overlay filename patch
     67     snprintf(filename_overlay, sizeof(filename_overlay), "%-8.8s", get_filename_from_path(str_banks_name));
     68 }
     69 
     70 
     71 static void display_help(void) {
     72 
     73     fprintf(stdout,
     74        "makecom image.rom image.noi output.com\n"
     75        "Use: convert a binary .rom file to .msxdos com format.\n"
     76        );
     77 }
     78 
     79 
     80 int handle_args(int argc, char * argv[]) {
     81 
     82     if (argc == 3) {
     83         // Copy input and output filenames from arguments
     84         snprintf(filename_in_bin,  sizeof(filename_in_bin),  "%s", argv[1]);
     85         snprintf(filename_out_com, sizeof(filename_out_com), "%s", argv[2]);
     86         // Generate .noi file name from input .bin file name
     87         snprintf(filename_in_noi,  sizeof(filename_in_noi),  "%s", argv[1]);
     88         filename_replace_extension(filename_in_noi, EXT_NOI, MAX_STR_LEN);
     89     } else if (argc == 4) {
     90         // Copy input and output filenames from arguments
     91         snprintf(filename_in_bin,  sizeof(filename_in_bin),  "%s", argv[1]);
     92         snprintf(filename_in_noi,  sizeof(filename_in_noi),  "%s", argv[2]);
     93         snprintf(filename_out_com, sizeof(filename_out_com), "%s", argv[3]);
     94     } else {
     95         display_help();
     96         return false;
     97     }
     98 
     99     filenames_out_prepare();
    100 
    101 
    102     // printf("bin: %s\n",filename_in_bin);
    103     // printf("noi: %s\n",filename_in_noi);
    104     // printf("com: %s\n",filename_out_com);
    105 
    106     // printf("banks base: _%s_\n",filename_banks_base);
    107     // printf("overlay   : _%s_\n",filename_overlay);
    108 
    109 
    110     return true;
    111 }
    112 
    113 
    114 // Registered as atexit() handler
    115 // Free resources during normal shutdown or from a call to exit()
    116 void cleanup(void) {
    117 
    118     banks_cleanup();
    119     noi_cleanup();
    120 
    121     if (p_rom_buf_in != NULL) {
    122         free(p_rom_buf_in);
    123         p_rom_buf_in = NULL;
    124     }
    125 }
    126 
    127 
    128 int main( int argc, char *argv[] )  {
    129 
    130     // Exit with failure by default
    131     int ret = EXIT_FAILURE;
    132 
    133     // Register cleanup with exit handler
    134     atexit(cleanup);
    135 
    136     if (handle_args(argc, argv)) {
    137 
    138         p_rom_buf_in = file_read_into_buffer(filename_in_bin, &rom_buf_in_len);
    139 
    140         if (p_rom_buf_in)
    141             if (noi_file_load_symbols(filename_in_noi))
    142                 ret = bin2com();
    143     }
    144     cleanup();
    145 
    146     return ret; // Exit with failure by default
    147 }

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.