mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
4.0 KiB
105 lines
4.0 KiB
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <libgen.h>
|
|
|
|
void die(const char msg[]) {
|
|
perror(msg);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
for (int i = 1; i < argc; i++) {
|
|
// determine file size
|
|
FILE *input_file = fopen(argv[i], "rb");
|
|
if (!input_file) {
|
|
fprintf(stderr, "fail %s\n", argv[i]);
|
|
die("Couldn't open input file");
|
|
}
|
|
if (fseek(input_file, 0, SEEK_END) == -1) {
|
|
die("Error determining file size");
|
|
}
|
|
long file_size = ftell(input_file);
|
|
if (file_size == -1) {
|
|
die("Error determining file size (2)");
|
|
}
|
|
if (fseek(input_file, 0, SEEK_SET) == -1) {
|
|
die("Error determining file size (3)");
|
|
}
|
|
// get file name
|
|
char *name = basename(argv[i]);
|
|
char *dot = strrchr(name, '.');
|
|
if (dot) {
|
|
*dot = '\0';
|
|
}
|
|
|
|
// print header
|
|
#ifdef notdef
|
|
printf(" .section .rodata\r\n");
|
|
printf(" .global %s\r\n", name);
|
|
printf(" .align 2\r\n\r\n");
|
|
#endif
|
|
printf("%s:\r\n\r\n", name);
|
|
|
|
// write lines
|
|
while (file_size > 0) {
|
|
size_t bytes_read = (file_size > 8) ? 8 : (size_t)file_size;
|
|
unsigned char data_buf[8];
|
|
size_t actual_read = fread(data_buf, 1, bytes_read, input_file);
|
|
if (actual_read != bytes_read) {
|
|
fprintf(stderr, "Error while reading file, only %d read instead of %d\n", (int)actual_read, (int)bytes_read);
|
|
if (feof(input_file))
|
|
fprintf(stderr, "Reached end of file\n");
|
|
if (ferror(input_file))
|
|
fprintf(stderr, "An unknown error occured while reading the file\n");
|
|
perror("ERROR");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
switch (bytes_read) {
|
|
case 1:
|
|
printf(" .byte 0x%02X\r\n",
|
|
data_buf[0]);
|
|
break;
|
|
case 2:
|
|
printf(" .byte 0x%02X, 0x%02X\r\n",
|
|
data_buf[0], data_buf[1]);
|
|
break;
|
|
case 3:
|
|
printf(" .byte 0x%02X, 0x%02X, 0x%02X\r\n",
|
|
data_buf[0], data_buf[1], data_buf[2]);
|
|
break;
|
|
case 4:
|
|
printf(" .byte 0x%02X, 0x%02X, 0x%02X, 0x%02X\r\n",
|
|
data_buf[0], data_buf[1], data_buf[2], data_buf[3]);
|
|
break;
|
|
case 5:
|
|
printf(" .byte 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\r\n",
|
|
data_buf[0], data_buf[1], data_buf[2], data_buf[3], data_buf[4]);
|
|
break;
|
|
case 6:
|
|
printf(" .byte 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\r\n",
|
|
data_buf[0], data_buf[1], data_buf[2], data_buf[3], data_buf[4], data_buf[5]);
|
|
break;
|
|
case 7:
|
|
printf(" .byte 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\r\n",
|
|
data_buf[0], data_buf[1], data_buf[2], data_buf[3], data_buf[4], data_buf[5], data_buf[6]);
|
|
break;
|
|
case 8:
|
|
printf(" .byte 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\r\n",
|
|
data_buf[0], data_buf[1], data_buf[2], data_buf[3], data_buf[4], data_buf[5], data_buf[6], data_buf[7]);
|
|
break;
|
|
default:
|
|
fprintf(stderr, "Invalid program state\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
file_size -= (long)bytes_read;
|
|
}
|
|
|
|
printf("\r\n");
|
|
|
|
if (fclose(input_file)) {
|
|
die("Error while closing file");
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|