Add highlighting, fixed len instructions and more
This commit is contained in:
93
main.c
93
main.c
@@ -72,24 +72,26 @@ char *read_file_as_string(const char *filename) {
|
||||
return buffer; // Caller must free the memory
|
||||
}
|
||||
|
||||
void updateState() {
|
||||
cpuStatsTexture = renderVals(&cpu, &smallFont, &smallerFont, renderer);
|
||||
cpuStateTexture = renderState(&cpu, &biggerFont, renderer);
|
||||
char *dump = hexdump_to_string(cpu.memory, sizeof(cpu.memory));
|
||||
fill_editor_from_string(&memoryViewer, dump, renderer);
|
||||
void updateState(bool full) {
|
||||
renderVals(&cpu, &smallFont, &smallerFont, renderer, &cpuStatsTexture);
|
||||
renderState(&cpu, &biggerFont, renderer, &cpuStateTexture);
|
||||
char *dump = hexdump_to_string(cpu.memory, full ? 0 : memoryViewer.cursor_line_offset * 16,
|
||||
full ? MEM_SIZE : (memoryViewer.cursor_line_offset * 16) +
|
||||
(memoryViewer.displayLineCount * 16));
|
||||
fill_editor_from_string(&memoryViewer, dump, full ? 0 : memoryViewer.cursor_line_offset, full, renderer);
|
||||
free(dump);
|
||||
}
|
||||
|
||||
void compile(bool erase) {
|
||||
generate_string(&codeEditor);
|
||||
completePass(codeEditor.outputString, &cpu, erase);
|
||||
updateState();
|
||||
updateState(true);
|
||||
}
|
||||
|
||||
|
||||
int init() {
|
||||
//Initialize SDL
|
||||
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
|
||||
return 1;
|
||||
}
|
||||
@@ -108,17 +110,21 @@ int init() {
|
||||
return 1;
|
||||
}
|
||||
//Get window surface
|
||||
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
|
||||
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
|
||||
if (renderer == NULL) {
|
||||
printf("Renderer could not be created SDL_Error: %s\n", SDL_GetError());
|
||||
return 1;
|
||||
}
|
||||
|
||||
SDL_Rect viewport = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};
|
||||
SDL_RenderSetViewport(renderer, &viewport);
|
||||
|
||||
SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
|
||||
biggerFont = prepText(renderer, 16, "../PublicPixel.ttf", 255, 255, 255, 255);
|
||||
smallFont = prepText(renderer, 12, "../PublicPixel.ttf", 255, 255, 255, 255);
|
||||
smallerFont = prepText(renderer, 8, "../PublicPixel.ttf", 255, 255, 255, 255);
|
||||
init_editor(&codeEditor, &smallFont, 10, 80, renderer, 34, 1000, 48, false);
|
||||
init_editor(&memoryViewer, &smallerFont, 550, 80, renderer, 80, MEM_SIZE / 16 + 2, 70, true);
|
||||
init_editor(&codeEditor, &smallFont, 10, 80, renderer, 54, 1000, 48, false);
|
||||
init_editor(&memoryViewer, &smallerFont, 738, 80, renderer, 59, MEM_SIZE / 16 + 2, 70, true);
|
||||
SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, NULL);
|
||||
for (int i = 0; i < editorCount; i++) {
|
||||
@@ -135,7 +141,7 @@ int render() {
|
||||
SDL_RenderClear(renderer);
|
||||
|
||||
for (int i = 0; i < editorCount; i++) {
|
||||
editor_render(&editors[i], renderer, activeEditorIndex == i, cursor);
|
||||
editor_render(&editors[i], renderer, &cpu, i, activeEditorIndex == i, cursor);
|
||||
}
|
||||
|
||||
SDL_Rect rect2;
|
||||
@@ -146,7 +152,6 @@ int render() {
|
||||
|
||||
SDL_QueryTexture(cpuStatsTexture, NULL, NULL, &rect2.w, &rect2.h);
|
||||
|
||||
|
||||
SDL_RenderCopy(renderer, cpuStatsTexture, NULL, &rect2);
|
||||
|
||||
rect2.x = 100;
|
||||
@@ -156,7 +161,6 @@ int render() {
|
||||
|
||||
SDL_QueryTexture(cpuStateTexture, NULL, NULL, &rect2.w, &rect2.h);
|
||||
|
||||
|
||||
SDL_RenderCopy(renderer, cpuStateTexture, NULL, &rect2);
|
||||
|
||||
SDL_RenderPresent(renderer);
|
||||
@@ -292,43 +296,54 @@ int processEvent(SDL_Event e) {
|
||||
int keySym = ConvertKPToNonKP(e.key.keysym.sym);
|
||||
int keyMod = e.key.keysym.mod;
|
||||
cursor = true;
|
||||
bool moved = false;
|
||||
switch (keySym) {
|
||||
case SDLK_UP:
|
||||
move_cursor_relative(&activeEditor, -1, 0, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_PAGEUP:
|
||||
move_cursor_relative(&activeEditor, -activeEditor.max_lines_display, -1, true, renderer);
|
||||
move_cursor_relative(&activeEditor, -activeEditor.displayLineCount, -1, true, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_DOWN:
|
||||
move_cursor_relative(&activeEditor, 1, 0, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_PAGEDOWN:
|
||||
move_cursor_relative(&activeEditor, activeEditor.max_lines_display, 0, true, renderer);
|
||||
move_cursor_relative(&activeEditor, activeEditor.displayLineCount, 0, true, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_LEFT:
|
||||
move_cursor_relative(&activeEditor, 0, -1, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_HOME:
|
||||
if (keyMod & KMOD_CTRL) {
|
||||
move_cursor(&activeEditor, 0, 0, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
}
|
||||
move_cursor(&activeEditor, activeEditor.cursor_line, 0, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_RIGHT:
|
||||
move_cursor_relative(&activeEditor, 0, 1, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_END:
|
||||
int lineLen = strlen(activeEditor.lines[activeEditor.cursor_line].text);
|
||||
if (keyMod & KMOD_CTRL) {
|
||||
move_cursor(&activeEditor, activeEditor.line_count, lineLen, false, renderer);
|
||||
move_cursor(&activeEditor, activeEditor.maxLines - 1, lineLen, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
}
|
||||
move_cursor(&activeEditor, activeEditor.cursor_line, lineLen, false, renderer);
|
||||
moved = true;
|
||||
break;
|
||||
case SDLK_F9:
|
||||
cpu.mode ^= CPU_MODE_LOOP;
|
||||
updateState();
|
||||
updateState(false);
|
||||
return 1;
|
||||
case SDLK_F8:
|
||||
if (++cpuSpeedTemp == 3) {
|
||||
@@ -336,7 +351,7 @@ int processEvent(SDL_Event e) {
|
||||
}
|
||||
cpu.mode &= ~(CPU_MODE_SECOND | CPU_MODE_STEP);
|
||||
cpu.mode |= cpuSpeedTemp << 4;
|
||||
updateState();
|
||||
updateState(false);
|
||||
return 1;
|
||||
case SDLK_F5:
|
||||
compile(!(keyMod & KMOD_CTRL));
|
||||
@@ -345,7 +360,7 @@ int processEvent(SDL_Event e) {
|
||||
cpu.pc = 0;
|
||||
}
|
||||
cpu.mode &= ~(CPU_MODE_HALTED | CPU_MODE_PAUSED | CPU_MODE_ERROR);
|
||||
updateState();
|
||||
updateState(false);
|
||||
break;
|
||||
|
||||
case SDLK_ESCAPE:
|
||||
@@ -353,7 +368,7 @@ int processEvent(SDL_Event e) {
|
||||
if (keyMod & (KMOD_CTRL | KMOD_SHIFT)) {
|
||||
cpu.mode |= CPU_MODE_HALTED;
|
||||
}
|
||||
updateState();
|
||||
updateState(false);
|
||||
break;
|
||||
|
||||
case SDLK_s:
|
||||
@@ -373,26 +388,30 @@ int processEvent(SDL_Event e) {
|
||||
if (keyMod & KMOD_CTRL) {
|
||||
FILE *fptr;
|
||||
char fname[20];
|
||||
sscanf(editors[0].lines[0].text, "%s", fname);
|
||||
sscanf(editors[0].lines[editors[0].cursor_line].text, "%s", fname);
|
||||
toLowerCase(fname);
|
||||
strcat(fname, ".bsm");
|
||||
fptr = fopen(fname, "r");
|
||||
char *prog = read_file_as_string(fname);
|
||||
fill_editor_from_string(&editors[0], prog, renderer);
|
||||
free(prog);
|
||||
fputs(editors[0].outputString, fptr);
|
||||
fclose(fptr);
|
||||
if (fptr) {
|
||||
char *prog = read_file_as_string(fname);
|
||||
toUpperCase(prog);
|
||||
fill_editor_from_string(&editors[0], prog, 0, true, renderer);
|
||||
free(prog);
|
||||
fclose(fptr);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case SDLK_BACKSPACE:
|
||||
if (!activeEditor.readOnly) {
|
||||
remove_character(&activeEditor, false, renderer);
|
||||
moved = true;
|
||||
}
|
||||
break;
|
||||
case SDLK_DELETE:
|
||||
if (!activeEditor.readOnly) {
|
||||
remove_character(&activeEditor, true, renderer);
|
||||
moved = true;
|
||||
}
|
||||
break;
|
||||
case SDLK_RETURN:
|
||||
@@ -403,6 +422,7 @@ int processEvent(SDL_Event e) {
|
||||
}
|
||||
if (!activeEditor.readOnly) {
|
||||
insert_line_rel(&activeEditor, renderer);
|
||||
moved = true;
|
||||
}
|
||||
break;
|
||||
case SDLK_TAB:
|
||||
@@ -415,6 +435,9 @@ int processEvent(SDL_Event e) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (moved && &activeEditor == &memoryViewer) {
|
||||
updateState(false);
|
||||
}
|
||||
} else if (e.type == SDL_TEXTINPUT) {
|
||||
for (int i = 0; e.text.text[i] != '\0'; i++) { // Iterate over the input string
|
||||
char keySym = e.text.text[i];
|
||||
@@ -458,18 +481,18 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *args[])
|
||||
|
||||
if (!(cpu.mode & (CPU_MODE_HALTED | CPU_MODE_PAUSED | CPU_MODE_ERROR))) {
|
||||
if (cpu.mode & CPU_MODE_SECOND) {
|
||||
if (frames % 60) {
|
||||
if (!(frames % 60)) {
|
||||
step(&cpu);
|
||||
updateState();
|
||||
updateState(false);
|
||||
}
|
||||
} else {
|
||||
step(&cpu);
|
||||
updateState();
|
||||
updateState(false);
|
||||
}
|
||||
|
||||
if (cpu.mode & CPU_MODE_STEP) {
|
||||
cpu.mode |= CPU_MODE_PAUSED;
|
||||
updateState();
|
||||
updateState(false);
|
||||
}
|
||||
}
|
||||
end = SDL_GetTicks64();
|
||||
@@ -477,7 +500,7 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *args[])
|
||||
if (timeNeeded < delayNeeded) {
|
||||
SDL_Delay(delayNeeded - timeNeeded);
|
||||
} else {
|
||||
printf("%lu", timeNeeded);
|
||||
printf("%lu\n", timeNeeded);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -489,11 +512,15 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *args[])
|
||||
destroyFont(&fonts[i]);
|
||||
}
|
||||
|
||||
puts(SDL_GetError());
|
||||
|
||||
//SDL_DestroyRenderer(renderer);
|
||||
|
||||
//Destroy window
|
||||
SDL_DestroyWindow(window);
|
||||
//SDL_DestroyWindow(window);
|
||||
|
||||
//Quit SDL subsystems
|
||||
SDL_Quit();
|
||||
//SDL_Quit();
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user