diff --git a/src/main.c b/src/main.c index 7e0ee6f..feb1cd9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include @@ -9,8 +11,8 @@ #include "config.h" /* Preset Values */ -static float displayScale = 2; -static int cpuSpeed = 100000; // 100 kHz +static float displayScale = 1; +static int cpuSpeed = 1000000; // 1 MHz static int singleStep = 0; static int clockSteps = 1; @@ -28,6 +30,7 @@ uint8_t showDebug = 0; uint8_t fpsCount = 0; uint8_t displayMmap = 0; uint8_t documentReload = 0; +uint8_t randomize = 0; uint8_t fpsStore = 60; uint8_t FPS = 30; @@ -36,12 +39,11 @@ uint8_t cpuHealth; unsigned long cpuTicks = 0; unsigned long tickTrigger = 0; - - char debugString[512]; char snapshotFile[32]; char *reloadExecute; char *inputFile; +char *displaySpeed; int openFile(){ FILE *file = fopen(inputFile, "rb"); @@ -61,25 +63,52 @@ int openFile(){ } void resetSystem(){ + srand((unsigned)time(NULL)); + + if (randomize) { + for (int i = 0; i < RAMSIZE + 1; i++) ram[i] = rand(); + } + initVideo(); updateVideo(); reset6502(); } -void fetchArgs(int argc, char *argv[]){ - printf(PREAMBLE); +int parseFormat(char *format){ + float retVal = 0; + int i = 0; + for (;isdigit(format[i]) || format[i] == '.'; i++); + char tmp = format[i]; + format[i] = 0; + retVal = atof(format); + format[i] = tmp; + + if (!strcasecmp((format + i), "hz")); + else if (!strcasecmp((format + i), "khz")) retVal *= 1000; + else if (!strcasecmp((format + i), "mhz")) retVal *= 1000000; + else { + printf("\"%s\" is not a supported format\nSupported formats include: Hz, KHz and MHz\n", (format + i)); + exit(EXIT_FAILURE); + } + + return (int)retVal; +} + +void fetchArgs(int argc, char *argv[]){ for (int i = 1; i < argc; i++) { - if (!strcmp(argv[i], "--help")) printf(HELP); - else if (!strcmp(argv[i], "--help-keys")) printf(HELPKEYS); - else if (!strcmp(argv[i], "--cpuspeed")) cpuSpeed = atoi(argv[++i]); + if (!strcmp(argv[i], "--help")) { printf(PREAMBLE); printf(HELP); exit(0); } + else if (!strcmp(argv[i], "--help-keys")) { printf(PREAMBLE); printf(HELPKEYS); exit(0); } + else if (!strcmp(argv[i], "--cpuspeed")) { cpuSpeed = parseFormat(argv[++i]); displaySpeed = argv[i]; } else if (!strcmp(argv[i], "--scale")) displayScale = atof(argv[++i]); else if (!strcmp(argv[i], "--singlestep")) singleStep = 1; else if (!strcmp(argv[i], "--clocksteps")) clockSteps = atoi(argv[++i]); //else if (!strcmp(argv[i], "--snapshot")) snapshotFile = &argv[i]; - else if (!strcmp(argv[i], "--fps")) FPS = atoi(argv[++i]); - else if (!strcmp(argv[i], "--enable-reload")) documentReload = 1; - else if (!strcmp(argv[i], "--reload-execute")) reloadExecute = argv[++i]; + else if (!strcmp(argv[i], "--fps")) FPS = atoi(argv[++i]); + else if (!strcmp(argv[i], "--reload-program")) documentReload = 1; + else if (!strcmp(argv[i], "--script")) reloadExecute = argv[++i]; + else if (!strcmp(argv[i], "--resizable")) WINMODE |= SDL_WINDOW_RESIZABLE; + else if (!strcmp(argv[i], "--randomize")) randomize = 1; else { inputFile = argv[i]; if (openFile()){ @@ -90,6 +119,7 @@ void fetchArgs(int argc, char *argv[]){ } } + int main(int argc, char *argv[]){ fetchArgs(argc, argv); initWindow(); @@ -129,34 +159,32 @@ int main(int argc, char *argv[]){ if (halt) { drawString("!CPU Haltet!", renderMemory, - SDL_X_SIZE, 0x000000FF, time(NULL) % 2 ? 0xAAAAAAFF : 0xFFFFFFFF, 16, vStack, 2); + SDL_X_SIZE, 0x000000FF, time(NULL) % 2 ? 0xAAAAAAFF : 0xFFFFFFFF, 16, vStack, 1); - vStack += (FONT_HEIGHT * 2 * 2); + vStack += (FONT_HEIGHT * 2); } if (showDebug){ sprintf(debugString, "LOADED BINARY: \"%s\"\nSCREENSIZE: %dx%d\nFPS: %d\nSCALE: %d", inputFile, SDL_X_SIZE, SDL_Y_SIZE, fpsStore, (int)displayScale); drawString(debugString, renderMemory, - SDL_X_SIZE, 0x000000FF, 0xAAAAAAFF, 16, vStack, 2); + SDL_X_SIZE, 0x000000FF, 0xAAAAAAFF, 16, vStack, 1); - vStack += (FONT_HEIGHT * 4 * 2); + vStack += (FONT_HEIGHT * 4); - sprintf(debugString, "CPU: %d%%", cpuHealth); + sprintf(debugString, "CPU: %d%% @ %s", cpuHealth, displaySpeed); drawString(debugString, renderMemory, SDL_X_SIZE, 0x000000FF, time(NULL) % 2 ? 0xAAAAAAFF : cpuHealth < 10 ? - 0xFF0000FF : cpuHealth < 50 ? 0xFFFF00FF : 0xAAAAAAFF, 16, vStack, 2); + 0xFF0000FF : cpuHealth < 50 ? 0xFFFF00FF : 0xAAAAAAFF, 16, vStack, 1); - vStack += (FONT_HEIGHT * 2 * 2); + vStack += (FONT_HEIGHT * 2); } if (displayMmap){ sprintf(debugString, "RAM: $%04X - $%04X\nROM: $%04X - $%04X\nVIAADDRS: $%04X\nKBDADDRS: $%04X\nVIDADDRS: $%04X", RAMLOC, RAMLOC + RAMSIZE, ROMLOC, ROMLOC + ROMSIZE, VIAADDRS, KBDADDRS, VIDADDRS); - drawString(debugString, renderMemory, SDL_X_SIZE, 0x000000FF, 0xAAAAAAFF, 16, vStack, 2); + drawString(debugString, renderMemory, SDL_X_SIZE, 0x000000FF, 0xAAAAAAFF, 16, vStack, 1); - vStack += (FONT_HEIGHT * 6 * 2); + vStack += (FONT_HEIGHT * 6); } if (showHelp) { - drawString(HELPKEYS, renderMemory, SDL_X_SIZE, 0x000000FF, 0xAAAAAAFF, 16, vStack, 2); + drawString(HELPKEYS, renderMemory, SDL_X_SIZE, 0x000000FF, 0xAAAAAAFF, 16, vStack, 1); - vStack += (FONT_HEIGHT * 2 * 2); + vStack += (FONT_HEIGHT * 2); } - - if (SDL_UpdateTexture(texture, NULL, renderMemory, (sizeof(uint32_t) * SDL_X_SIZE))) { fprintf(stderr, "Could not update SDL texture: %s.\n", SDL_GetError());