shithub: psxe

Download patch

ref: 447b748dee0431007c9ec8899da38768060232e1
parent: b12a6380928caa21ca2feca485a9adaa096008a0
author: allkern <lisandroaalarcon@gmail.com>
date: Mon Sep 25 14:40:32 EDT 2023

Reimplement joypad (for MCD compat)

Fix screenshots

--- a/frontend/screen.c
+++ b/frontend/screen.c
@@ -146,7 +146,7 @@
                         SDL_RenderReadPixels(
                             screen->renderer,
                             NULL,
-                            SDL_PIXELFORMAT_RGBA8888,
+                            SDL_PIXELFORMAT_BGR555,
                             surface->pixels, surface->pitch
                         );
 
--- a/psx/bus.c
+++ b/psx/bus.c
@@ -62,7 +62,7 @@
 
     log_fatal("Unhandled 32-bit read from %08x:%08x", vaddr, addr);
 
-    exit(1);
+    //exit(1);
 
     return 0x00000000;
 }
@@ -160,7 +160,7 @@
 
     log_fatal("Unhandled 32-bit write to %08x:%08x (%08x)", vaddr, addr, value);
 
-    exit(1);
+    //exit(1);
 }
 
 void psx_bus_write16(psx_bus_t* bus, uint32_t addr, uint16_t value) {
--- a/psx/dev/pad.c
+++ b/psx/dev/pad.c
@@ -8,12 +8,28 @@
 uint32_t pad_read_rx(psx_pad_t* pad) {
     psx_input_t* current_slot = pad->slot[(pad->ctrl >> 13) & 1];
 
-    if (!current_slot)
+    if (!current_slot || !pad->dest)
         return 0xffffffff;
 
-    if ((pad->ctrl & CTRL_JOUT) || (pad->ctrl & CTRL_RXEN))
-        return current_slot->read_func(current_slot->udata);
+    if ((pad->ctrl & CTRL_JOUT) || (pad->ctrl & CTRL_RXEN)) {
+        switch (pad->dest) {
+            case DEST_JOY: {
+                uint8_t data = current_slot->read_func(current_slot->udata);
 
+                if (!current_slot->query_fifo_func(current_slot->udata))
+                    pad->dest = 0;
+
+                return data;
+            } break;
+
+            case DEST_MCD: {
+                pad->dest = 0;
+
+                /* To-do */
+            } break;
+        }
+    }
+
     return 0xffffffff;
 }
 
@@ -25,7 +41,25 @@
     
     pad->cycles_until_irq = 512;
 
-    current_slot->write_func(current_slot->udata, data);
+    if (!pad->dest) {
+        if ((data == DEST_JOY) || (data == DEST_MCD))
+            pad->dest = data;
+    } else {
+        switch (pad->dest) {
+            case DEST_JOY: {
+                current_slot->write_func(current_slot->udata, data);
+
+                if (!current_slot->query_fifo_func(current_slot->udata))
+                    pad->dest = 0;
+            } break;
+
+            case DEST_MCD: {
+                pad->dest = 0;
+
+                /* To-do */
+            } break;
+        }
+    }
 }
 
 uint32_t pad_handle_stat_read(psx_pad_t* pad) {
--- a/psx/input/sda.c
+++ b/psx/input/sda.c
@@ -18,8 +18,9 @@
     memset(sda, 0, sizeof(psxi_sda_t));
 
     sda->tx_data = 0xff;
+    sda->tx_data_ready = 1;
     sda->model = model;
-    sda->state = SDA_STATE_WFC;
+    sda->state = SDA_STATE_TX_HIZ;
     sda->sw = 0xffff;
 }
 
@@ -26,65 +27,31 @@
 uint32_t psxi_sda_read(void* udata) {
     psxi_sda_t* sda = (psxi_sda_t*)udata;
 
-    return sda->tx_data;
-}
-
-void psxi_sda_write(void* udata, uint16_t data) {
-    psxi_sda_t* sda = (psxi_sda_t*)udata;
-
     switch (sda->state) {
-        case SDA_STATE_WFC: {
-            if (data == 0x01) {
-                sda->tx_data_ready = 1;
-                sda->tx_data = 0xff;
-                sda->state = SDA_STATE_WFR;
-            }
+        case SDA_STATE_TX_HIZ: sda->tx_data = 0xff; break;
+        case SDA_STATE_TX_IDL: sda->tx_data = sda->model; break;
+        case SDA_STATE_TX_IDH: sda->tx_data = 0x5a; break;
+        case SDA_STATE_TX_SWL: sda->tx_data = sda->sw & 0xff; break;
 
-            // Memory card access
-            if (data == 0x81) {
-                sda->tx_data_ready = 1;
-                sda->tx_data = 0xff;
-                sda->state = SDA_STATE_WFR;
-            }
-        } break;
+        // Last state
+        case SDA_STATE_TX_SWH: {
+            sda->tx_data_ready = 0;
+            sda->state = 0;
 
-        case SDA_STATE_WFR: {
-            if (data == 'B') {
-                sda->tx_data = sda->model;
-                sda->state = SDA_STATE_TX_IDH;
-            } else if (data == 'R') {
-                sda->tx_data = 0xff;
-                sda->state = SDA_STATE_WFR;
-            }
+            return sda->sw >> 8;
         } break;
+    }
 
-        case SDA_STATE_TX_IDH: {
-            // To-do: Handle MOT
-            sda->tx_data = 0x5a;
-            sda->state = SDA_STATE_TX_SWL;
-        } break;
+    sda->tx_data_ready = 1;
+    sda->state++;
 
-        case SDA_STATE_TX_SWL: {
-            sda->tx_data = sda->sw & 0xff;
-            sda->state = SDA_STATE_TX_SWH;
-        } break;
+    return sda->tx_data;
+}
 
-        case SDA_STATE_TX_SWH: {
-            sda->tx_data = sda->sw >> 8;
+void psxi_sda_write(void* udata, uint16_t data) {
+    // To-do: Handle TAP and MOT bytes here
 
-            switch (sda->model) {
-                case 0x41:
-                    sda->state = SDA_STATE_WFC;
-                break;
-
-                // To-do: Implement analog mode
-                case 0x73:
-                case 0x53:
-                    sda->state = SDA_STATE_WFC;
-                break;
-            }
-        } break;
-    }
+    return;
 }
 
 void psxi_sda_on_button_press(void* udata, uint16_t data) {
--- a/psx/input/sda.h
+++ b/psx/input/sda.h
@@ -32,8 +32,8 @@
 #define PSXI_SW_SDA_SQUARE      0x8000
 
 enum {
-    SDA_STATE_WFC = 0,
-    SDA_STATE_WFR,
+    SDA_STATE_TX_HIZ = 0,
+    SDA_STATE_TX_IDL,
     SDA_STATE_TX_IDH,
     SDA_STATE_TX_SWL,
     SDA_STATE_TX_SWH
--