shithub: psxe

Download patch

ref: 9c19cb06926127b63b0f0cd444b3d57075e84839
parent: f045f88884bbcce444bb87bdab6b8c67dbc088ec
author: Lycoder <aurealinbox@gmail.com>
date: Fri Jun 16 07:54:37 EDT 2023

Improve display API

--- a/frontend/main.c
+++ b/frontend/main.c
@@ -24,7 +24,7 @@
 }
 
 int main(int argc, const char* argv[]) {
-    log_set_level(LOG_FATAL);
+    log_set_level(LOG_WARN);
 
     signal(SIGINT, sigint_handler);
 
--- a/frontend/screen.c
+++ b/frontend/screen.c
@@ -6,7 +6,7 @@
     return (psxe_screen_t*)malloc(sizeof(psxe_screen_t));
 }
 
-void psxe_screen_init(psxe_screen_t* screen, psx_gpu_t* gpu) {
+void psxe_screen_init(psxe_screen_t* screen, psx_t* psx) {
     memset(screen, 0, sizeof(psxe_screen_t));
 
 #ifdef PSXE_SCREEN_DEBUG
@@ -17,11 +17,8 @@
     screen->height = 240;
 #endif
     screen->scale = 1;
-    screen->format = SDL_PIXELFORMAT_BGR555;
-    screen->mode = 60;
-    screen->buf = gpu->vram;
     screen->open = 1;
-    screen->gpu = gpu;
+    screen->psx = psx;
 
     SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
 }
@@ -47,7 +44,7 @@
 
     screen->texture = SDL_CreateTexture(
         screen->renderer,
-        screen->format,
+        SDL_PIXELFORMAT_BGR555,
         SDL_TEXTUREACCESS_STREAMING,
         PSX_GPU_FB_WIDTH, PSX_GPU_FB_HEIGHT
     );
@@ -60,9 +57,9 @@
 }
 
 void psxe_screen_update(psxe_screen_t* screen) {
-    uint32_t disp_offset = screen->gpu->disp_x + (screen->gpu->disp_y * 1024);
+    void* display_buf = psx_get_display_buffer(screen->psx);
 
-    SDL_UpdateTexture(screen->texture, NULL, screen->buf + disp_offset, PSX_GPU_FB_WIDTH * sizeof(uint16_t));
+    SDL_UpdateTexture(screen->texture, NULL, display_buf, PSX_GPU_FB_STRIDE);
     SDL_RenderCopy(screen->renderer, screen->texture, NULL, NULL);
     SDL_RenderPresent(screen->renderer);
 
@@ -102,17 +99,10 @@
     screen->width = PSX_GPU_FB_WIDTH; // dmode_hres_table[gpu->display_mode & 0x3];
     screen->height = PSX_GPU_FB_HEIGHT; // (gpu->display_mode & 0x4) ? 480 : 240;
 #else
-    static int dmode_hres_table[] = {
-        256, 320, 512, 640
-    };
-
-    screen->width = dmode_hres_table[gpu->display_mode & 0x3];
-    screen->height = (gpu->display_mode & 0x4) ? 480 : 240;
+    screen->width = psx_get_display_width(screen->psx);
+    screen->height = psx_get_display_height(screen->psx);
 #endif
     
-    screen->format = gpu->display_mode & 0x10 ? SDL_PIXELFORMAT_BGR888 : SDL_PIXELFORMAT_BGR555;
-    screen->mode = gpu->display_mode & 0x8 ? 60 : 50;
-
     if (screen->width >= 512) {
         screen->saved_scale = screen->scale;
         screen->scale = 1;
@@ -124,7 +114,7 @@
 
     screen->texture = SDL_CreateTexture(
         screen->renderer,
-        screen->format,
+        SDL_PIXELFORMAT_BGR555,
         SDL_TEXTUREACCESS_STREAMING,
         screen->width, screen->height
     );
--- a/frontend/screen.h
+++ b/frontend/screen.h
@@ -1,7 +1,7 @@
 #ifndef SCREEN_H
 #define SCREEN_H
 
-#include "psx/dev/gpu.h"
+#include "psx/psx.h"
 
 #include <string.h>
 
@@ -12,19 +12,16 @@
     SDL_Renderer* renderer;
     SDL_Texture* texture;
 
-    psx_gpu_t* gpu;
+    psx_t* psx;
 
     unsigned int saved_scale;
     unsigned int width, height, scale;
-    unsigned int format;
-    unsigned int mode;
-    int open;
 
-    uint16_t* buf;
+    int open;
 } psxe_screen_t;
 
 psxe_screen_t* psxe_screen_create();
-void psxe_screen_init(psxe_screen_t*, psx_gpu_t*);
+void psxe_screen_init(psxe_screen_t*, psx_t*);
 void psxe_screen_reload(psxe_screen_t*);
 int psxe_screen_is_open(psxe_screen_t*);
 void psxe_screen_update(psxe_screen_t*);
--- a/psx/dev/gpu.c
+++ b/psx/dev/gpu.c
@@ -721,6 +721,10 @@
     }
 }
 
+void* psx_gpu_get_display_buffer(psx_gpu_t* gpu) {
+    return gpu->vram + (gpu->disp_x + (gpu->disp_y * 1024));
+}
+
 void psx_gpu_destroy(psx_gpu_t* gpu) {
     free(gpu->vram);
     free(gpu);
--- a/psx/dev/gpu.h
+++ b/psx/dev/gpu.h
@@ -14,6 +14,9 @@
 #define PSX_GPU_FB_WIDTH 1024
 #define PSX_GPU_FB_HEIGHT 512
 
+// Use this when updating your texture
+#define PSX_GPU_FB_STRIDE 2048
+
 #define PSX_GPU_VRAM_SIZE (0x100000)
 
 #define PSX_GPU_CLOCK_NTSC 53693175 // 53.693175 MHz
@@ -115,6 +118,7 @@
 void psx_gpu_destroy(psx_gpu_t*);
 void psx_gpu_set_udata(psx_gpu_t*, int, void*);
 void psx_gpu_set_event_callback(psx_gpu_t*, int, psx_gpu_event_callback_t);
+void* psx_gpu_get_display_buffer(psx_gpu_t*);
 void psx_gpu_update(psx_gpu_t*, int);
 
 #endif
\ No newline at end of file
--- a/psx/dev/timer.c
+++ b/psx/dev/timer.c
@@ -17,35 +17,33 @@
 }
 
 uint32_t psx_timer_read32(psx_timer_t* timer, uint32_t offset) {
-    if (offset == 0x20) return 0x000016b0;
+    log_fatal("Unhandled 32-bit TIMER read at offset %08x", offset);
 
-    log_warn("Unhandled 32-bit TIMER read at offset %08x", offset);
-
     return 0x0;
 }
 
 uint16_t psx_timer_read16(psx_timer_t* timer, uint32_t offset) {
-    log_warn("Unhandled 16-bit TIMER read at offset %08x", offset);
+    log_fatal("Unhandled 16-bit TIMER read at offset %08x", offset);
 
     return 0x0;
 }
 
 uint8_t psx_timer_read8(psx_timer_t* timer, uint32_t offset) {
-    log_warn("Unhandled 8-bit TIMER read at offset %08x", offset);
+    log_fatal("Unhandled 8-bit TIMER read at offset %08x", offset);
 
     return 0x0;
 }
 
 void psx_timer_write32(psx_timer_t* timer, uint32_t offset, uint32_t value) {
-    log_warn("Unhandled 32-bit TIMER write at offset %08x (%08x)", offset, value);
+    log_fatal("Unhandled 32-bit TIMER write at offset %08x (%08x)", offset, value);
 }
 
 void psx_timer_write16(psx_timer_t* timer, uint32_t offset, uint16_t value) {
-    log_warn("Unhandled 16-bit TIMER write at offset %08x (%04x)", offset, value);
+    log_fatal("Unhandled 16-bit TIMER write at offset %08x (%04x)", offset, value);
 }
 
 void psx_timer_write8(psx_timer_t* timer, uint32_t offset, uint8_t value) {
-    log_warn("Unhandled 8-bit TIMER write at offset %08x (%02x)", offset, value);
+    log_fatal("Unhandled 8-bit TIMER write at offset %08x (%02x)", offset, value);
 }
 
 void psx_timer_destroy(psx_timer_t* timer) {
--- a/psx/psx.c
+++ b/psx/psx.c
@@ -41,6 +41,22 @@
     }
 }
 
+void* psx_get_display_buffer(psx_t* psx) {
+    psx_gpu_get_display_buffer(psx->gpu);
+}
+
+uint32_t psx_get_display_width(psx_t* psx) {
+    static int dmode_hres_table[] = {
+        256, 320, 512, 640
+    };
+
+    return dmode_hres_table[psx->gpu->display_mode & 0x3];
+}
+
+uint32_t psx_get_display_height(psx_t* psx) {
+    return (psx->gpu->display_mode & 0x4) ? 480 : 240;
+}
+
 void psx_init(psx_t* psx, const char* bios_path) {
     memset(psx, 0, sizeof(psx_t));
 
--- a/psx/psx.h
+++ b/psx/psx.h
@@ -36,6 +36,9 @@
 void psx_load_exe(psx_t*, const char*);
 void psx_update(psx_t*);
 void psx_run_frame(psx_t*);
+void* psx_get_display_buffer(psx_t*);
+uint32_t psx_get_display_width(psx_t*);
+uint32_t psx_get_display_height(psx_t*);
 uint32_t* psx_take_screenshot(psx_t*);
 psx_bios_t* psx_get_bios(psx_t*);
 psx_ram_t* psx_get_ram(psx_t*);
--