89 lines
2.2 KiB
C
89 lines
2.2 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
long GetFileSize(FILE* f){
|
|
fseek(f, 0, SEEK_END);
|
|
long size = ftell(f);
|
|
fseek(f, 0, SEEK_SET);
|
|
return size;
|
|
}
|
|
|
|
void DumpMemory(char *memory, char *filename){
|
|
FILE *dump = fopen(filename, "wb");
|
|
fwrite(memory, 1, mem_size, dump);
|
|
fclose(dump);
|
|
}
|
|
|
|
int main(int argc, char **argv){
|
|
|
|
long mem_size = 0;
|
|
char filename[255];
|
|
|
|
FILE *rom = fopen("ROM.bin","rb");
|
|
mem_size = mem_size + GetFileSize(rom);
|
|
|
|
//Handling arguments
|
|
if(argc < 2){
|
|
printf("too few arguments\n");
|
|
return 1;
|
|
}
|
|
for(int i = 1; i < argc; i++){
|
|
if(strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "--memory") == 0){
|
|
char *endptr;
|
|
long convert = strtol(argv[i+1], &endptr, 10);
|
|
mem_size = &endptr != NULL ? mem_size + convert : mem_size;
|
|
}
|
|
if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0){
|
|
printf("Usage: %s [OPTIONS] --file filename\nOptions:\n%s-m, --memory: specify RAM size\n%s-h, --help: print this message\n\n",argv[0]," "," ");
|
|
return 0;
|
|
}
|
|
if(strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--file") == 0){
|
|
for(int j = 0; j < strlen(argv[i+1]); j++){
|
|
filename[j] = argv[i+1][j];
|
|
}
|
|
}
|
|
}
|
|
|
|
FILE *program = fopen(filename, "rb");
|
|
if(program == NULL){
|
|
printf("ERROR: file does not exist");
|
|
return 2;
|
|
}
|
|
long program_size = GetFileSize(program);
|
|
mem_size = mem_size + program_size;
|
|
|
|
//Intializing memory and stuff
|
|
|
|
long PC = 0; //program counter
|
|
char *memory = (char *)malloc(mem_size * sizeof(char)); //Allocating RAM
|
|
if(memory == NULL){
|
|
printf("ERROR: Memory allocation failed (Buy more RAM)");
|
|
return 3;
|
|
}
|
|
//Copying program to memory
|
|
{
|
|
char buffer[program_size];
|
|
fread(buffer, 1, program_size, program);
|
|
for(int i = 0; i <= program_size; i++){
|
|
memory[mem_size-i] = buffer[program_size-i];
|
|
}
|
|
}
|
|
fclose(program);
|
|
//Copying ROM to memory
|
|
{
|
|
long size = GetFileSize(rom);
|
|
char buffer[size];
|
|
fread(buffer, 1, size, rom);
|
|
for(int i = 0; i < size; i++){
|
|
memory[mem_size-program_size-1-i] = buffer[size-i];
|
|
}
|
|
}
|
|
fclose(rom);
|
|
|
|
DumpMemory(memory, "out.bin");
|
|
|
|
free(memory);
|
|
return 0;
|
|
}
|