diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-05-07 23:57:23 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-05-07 23:57:23 +0100 |
commit | fdd6efd9ad3e0e213a50ed962ec628c17779794a (patch) | |
tree | 2c4bb3fbb6e20bfcbca0e58c4051ce74ba3e30b2 /tr8vm.c | |
parent | 856a86a7f7796e34efaeada0dc11f771fedf2c67 (diff) | |
download | tr8vm-ui-test.tar.gz tr8vm-ui-test.zip |
Report non recoverable errors on the playerui-test
Diffstat (limited to 'tr8vm.c')
-rw-r--r-- | tr8vm.c | 123 |
1 files changed, 107 insertions, 16 deletions
@@ -30,7 +30,9 @@ #include "vm.h" -#define ARGB(r, g, b) ((uint32_t)(((r)<<16)|((g)<<8)|(b))) +#include "font.h" + +#define ARGB(r, g, b) ((uint32_t)(0xff000000|((r)<<16)|((g)<<8)|(b))) #define APP_NAME "TR8 VM Player" #define APP_VERSION "0.1-alpha" @@ -91,6 +93,47 @@ static uint32_t palette[] = ARGB(0xff, 0xff, 0xff), }; +uint32_t *ui_data = NULL; + +static void ui_put_glyph(uint32_t x, uint32_t y, uint8_t c) +{ + uint32_t *p = ui_data + x + (y * WINDOW_W); + + for (uint8_t j = 0; j < 8; j++) + for (uint8_t i = 0; i < 8; i++) + if (font[c][j] & (128 >> i)) + p[i + j * WINDOW_W] = palette[12]; +} + +static void ui_put_text(uint32_t x, uint32_t y, char *text) +{ + uint32_t ox = x; + + while (*text) + { + uint8_t c = *text++; + + if (c == '\n') + { + y += 12; + if (y > WINDOW_H) + break; + + x = ox; + continue; + } + + ui_put_glyph(x, y, c); + + x += 8; + if (x > WINDOW_W) + { + x = 0; + y += 12; + } + } +} + uint8_t ram[UINT16_MAX + 1] = { 0 }; uint32_t *fb_data = NULL; @@ -234,6 +277,14 @@ int main(int argc, char *argv[]) } SDL_SetTextureBlendMode(fb, SDL_BLENDMODE_NONE); + SDL_Texture *ui = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, WINDOW_W, WINDOW_H); + if (!ui) + { + fprintf(stderr, "Failed to create the UI: %s\n", SDL_GetError()); + return 1; + } + SDL_SetTextureBlendMode(ui, SDL_BLENDMODE_BLEND); + int fullscreen = 0; SDL_Rect dst; resize_full_screen(screen, renderer, fullscreen, &dst); @@ -244,7 +295,7 @@ int main(int argc, char *argv[]) Tr8 vm; tr8_init(&vm, write_m, read_m, port); int pitch = 0; - uint8_t rc; + uint8_t rc = 1; /* update full fb once to sync with RAM */ pitch = 0; @@ -253,6 +304,13 @@ int main(int argc, char *argv[]) update_fb(); SDL_UnlockTexture(fb); + /* prepare UI layer */ + pitch = 0; + ui_data = NULL; + SDL_LockTexture(ui, NULL, (void **)&ui_data, &pitch); + memset(ui_data, 0x20202080, sizeof(uint32_t) * WINDOW_W * WINDOW_H); + SDL_UnlockTexture(ui); + SDL_Event ev; while (1) { @@ -278,14 +336,29 @@ int main(int argc, char *argv[]) } } - pitch = 0; - fb_data = NULL; - SDL_LockTexture(fb, NULL, (void **)&fb_data, &pitch); - rc = tr8_eval(&vm); - SDL_UnlockTexture(fb); + if (rc) + { + pitch = 0; + fb_data = NULL; + SDL_LockTexture(fb, NULL, (void **)&fb_data, &pitch); + rc = tr8_eval(&vm); + SDL_UnlockTexture(fb); - if (!rc) - break; + if (!rc) + { + /* non recoverable error */ + pitch = 0; + ui_data = NULL; + SDL_LockTexture(ui, NULL, (void **)&ui_data, &pitch); + ui_put_text(10, 10, "[VM HALT]"); + + char buffer[256]; + tr8_dump(&vm, buffer); + ui_put_text(10, 22, buffer); + + SDL_UnlockTexture(ui); + } + } /* render to the canvas */ SDL_SetRenderTarget(renderer, canvas); @@ -298,16 +371,34 @@ int main(int argc, char *argv[]) SDL_RenderClear(renderer); SDL_RenderCopy(renderer, canvas, NULL, &dst); + if (!rc) + SDL_RenderCopy(renderer, ui, NULL, &dst); + SDL_RenderPresent(renderer); - pitch = 0; - fb_data = NULL; - SDL_LockTexture(fb, NULL, (void **)&fb_data, &pitch); - rc = tr8_frame_int(&vm); - SDL_UnlockTexture(fb); + if (rc) + { + pitch = 0; + fb_data = NULL; + SDL_LockTexture(fb, NULL, (void **)&ui_data, &pitch); + rc = tr8_frame_int(&vm); + SDL_UnlockTexture(fb); - if (!rc) - break; + if (!rc) + { + /* non recoverable error */ + pitch = 0; + ui_data = NULL; + SDL_LockTexture(ui, NULL, (void **)&fb_data, &pitch); + ui_put_text(10, 10, "[VM HALT]"); + + char buffer[256]; + tr8_dump(&vm, buffer); + ui_put_text(10, 22, buffer); + + SDL_UnlockTexture(ui); + } + } } if (canvas) |