shithub: psxe

Download patch

ref: c91880b26ad27dc315baac8ef5e61976c7e9cc79
parent: 28ba742580f5315eb7681ed8ed9ee7291317268e
author: allkern <lisandroaalarcon@gmail.com>
date: Wed Aug 23 15:26:27 EDT 2023

Implement GP0(3Ch)

--- a/psx/dev/gpu.c
+++ b/psx/dev/gpu.c
@@ -572,6 +572,54 @@
 }
 
 // Monochrome Opaque Quadrilateral
+void gpu_cmd_3c(psx_gpu_t* gpu) {
+    switch (gpu->state) {
+        case GPU_STATE_RECV_CMD: {
+            gpu->state = GPU_STATE_RECV_ARGS;
+            gpu->cmd_args_remaining = 11;
+        } break;
+
+        case GPU_STATE_RECV_ARGS: {
+            if (!gpu->cmd_args_remaining) {
+                gpu->state = GPU_STATE_RECV_DATA;
+
+                uint32_t texp = gpu->buf[5] >> 16;
+                gpu->color = gpu->buf[0] & 0xffffff;
+                gpu->pal   = gpu->buf[2] >> 16;
+                gpu->v0.tx = gpu->buf[2] & 0xff;
+                gpu->v0.ty = (gpu->buf[2] >> 8) & 0xff;
+                gpu->v1.tx = gpu->buf[5] & 0xff;
+                gpu->v1.ty = (gpu->buf[5] >> 8) & 0xff;
+                gpu->v2.tx = gpu->buf[8] & 0xff;
+                gpu->v2.ty = (gpu->buf[8] >> 8) & 0xff;
+                gpu->v3.tx = gpu->buf[11] & 0xff;
+                gpu->v3.ty = (gpu->buf[11] >> 8) & 0xff;
+                gpu->v0.x = gpu->buf[1] & 0xffff;
+                gpu->v0.y = gpu->buf[1] >> 16;
+                gpu->v1.x = gpu->buf[4] & 0xffff;
+                gpu->v1.y = gpu->buf[4] >> 16;
+                gpu->v2.x = gpu->buf[7] & 0xffff;
+                gpu->v2.y = gpu->buf[7] >> 16;
+                gpu->v3.x = gpu->buf[10] & 0xffff;
+                gpu->v3.y = gpu->buf[10] >> 16;
+
+                gpu->clut_x = (gpu->pal & 0x3f) << 4;
+                gpu->clut_y = (gpu->pal >> 6) & 0x1ff;
+
+                uint32_t tpx = (texp & 0xf) << 6;
+                uint32_t tpy = (texp & 0x10) << 4;
+                uint32_t depth = (texp >> 7) & 0x3;
+
+                gpu_render_textured_triangle(gpu, gpu->v0, gpu->v1, gpu->v2, tpx, tpy, depth);
+                gpu_render_textured_triangle(gpu, gpu->v1, gpu->v2, gpu->v3, tpx, tpy, depth);
+
+                gpu->state = GPU_STATE_RECV_CMD;
+            }
+        } break;
+    }
+}
+
+// Monochrome Opaque Quadrilateral
 void gpu_cmd_2c(psx_gpu_t* gpu) {
     switch (gpu->state) {
         case GPU_STATE_RECV_CMD: {
@@ -966,6 +1014,8 @@
         case 0x30: gpu_cmd_30(gpu); break;
         case 0x32: gpu_cmd_30(gpu); break;
         case 0x38: gpu_cmd_38(gpu); break;
+        case 0x3c: gpu_cmd_3c(gpu); break;
+        case 0x3e: gpu_cmd_3c(gpu); break;
         case 0x40: gpu_cmd_40(gpu); break;
         case 0x60: gpu_cmd_60(gpu); break;
         case 0x62: gpu_cmd_60(gpu); break;
@@ -1010,9 +1060,7 @@
             /* To-do: Implement mask bit thing */
         } break;
         default: {
-            log_set_quiet(0);
             log_fatal("Unhandled GP0(%02Xh)", gpu->buf[0] >> 24);
-            log_set_quiet(1);
         } break;
     }
 }
--