Add highlighting, fixed len instructions and more

This commit is contained in:
2025-02-09 21:15:50 +01:00
parent 45653b6372
commit e133c2df3a
17 changed files with 753 additions and 338 deletions

93
main.c
View File

@@ -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;
}