shithub: psxe

Download patch

ref: c4e01fe1def3f7f124b478cdbabad3805c1da6d0
parent: 180a7d6669be0f46f98625b42ba16098c8faa60b
parent: 97363aeadb8c5a2dcca7aa82b9cafabc8d672ce5
author: Lisandro Alarcón <lisandroaalarcon@gmail.com>
date: Mon Mar 2 05:18:48 EST 2026

Merge pull request #9 from scmp2er/memorycard_fix

Fix memorycard access , and gpu clipping.

--- a/psx/dev/gpu.c
+++ b/psx/dev/gpu.c
@@ -425,11 +425,14 @@
 #define CLAMP(v, d, u) ((v) <= (d)) ? (d) : (((v) >= (u)) ? (u) : (v))
 
 void gpu_render_rect(psx_gpu_t* gpu, rect_data_t data) {
+
+#if 0 //PATCH2:Fix clipping bug.
     if ((data.v0.x >= 1024) || (data.v0.y >= 512))
         return;
 
     if ((data.v0.x <= -1024) || (data.v0.y <= -512))
         return;
+#endif
 
     uint16_t width, height;
 
@@ -450,7 +453,10 @@
     /* Offset coordinates */
     data.v0.x += gpu->off_x;
     data.v0.y += gpu->off_y;
-
+#if 1 //PATCH2:Fix clipping bug.
+    data.v0.x = SE10(data.v0.x);
+    data.v0.y = SE10(data.v0.y);
+#endif
     /* Calculate bounding box */
     int xmax = data.v0.x + width;
     int ymax = data.v0.y + height;
--- a/psx/dev/mcd.c
+++ b/psx/dev/mcd.c
@@ -1,6 +1,9 @@
 #include "mcd.h"
 #include "../log.h"
 
+#define PATCH1   1  // 1=Fix memory card access.
+
+
 psx_mcd_t* psx_mcd_create(void) {
     return (psx_mcd_t*)malloc(sizeof(psx_mcd_t));
 }
@@ -35,7 +38,16 @@
 uint8_t psx_mcd_read(psx_mcd_t* mcd) {
     switch (mcd->state) {
         case MCD_STATE_TX_HIZ: mcd->tx_data = 0xff; break;
-        case MCD_STATE_TX_FLG: mcd->tx_data = mcd->flag; mcd->flag = 0x00; break;
+        case MCD_STATE_TX_FLG: 
+#if PATCH1
+			if((mcd->rx_data == 0x81) ||(mcd->rx_data == 0x01) ) {
+	            mcd->tx_data_ready = 1;
+	            mcd->tx_data = 0xff;
+	            mcd->state = MCD_STATE_TX_HIZ;
+	            break;
+			}
+#endif
+        	mcd->tx_data = mcd->flag; mcd->flag = 0x00; break;
         case MCD_STATE_TX_ID1: mcd->tx_data = 0x5a; break;
         case MCD_STATE_TX_ID2: {
             mcd->tx_data_ready = 1;
@@ -45,6 +57,13 @@
                 case 'R': mcd->state = MCD_R_STATE_RX_MSB; break;
                 case 'W': mcd->state = MCD_W_STATE_RX_MSB; break;
                 case 'S': mcd->state = MCD_S_STATE_TX_ACK1; break;
+#if PATCH1
+				default:
+		            mcd->tx_data_ready = 0;
+		            mcd->tx_data = 0xff;
+		            mcd->state = MCD_STATE_TX_HIZ;
+				    return mcd->tx_data;
+#endif
             }
 
             // printf("mcd read %02x\n", mcd->tx_data);
@@ -102,7 +121,11 @@
         /* Write states */
         case MCD_W_STATE_RX_MSB: mcd->tx_data = 0x00; break;
         case MCD_W_STATE_RX_LSB: mcd->tx_data = mcd->msb;
+#if PATCH1
+                                 mcd->pending_bytes = 128; break;
+#else
                                  mcd->pending_bytes = 127; break;
+#endif
         case MCD_W_STATE_RX_DATA: {
              --mcd->pending_bytes;
 
@@ -123,6 +146,9 @@
             return mcd->rx_data;
         } break;
         case MCD_W_STATE_RX_CHK: mcd->tx_data = mcd->rx_data; break;
+#if PATCH1
+        case MCD_W_STATE_RX_CHK2: mcd->tx_data = mcd->rx_data; break;
+#endif
         case MCD_W_STATE_TX_ACK1: mcd->tx_data = 0x5c; break;
         case MCD_W_STATE_TX_ACK2: mcd->tx_data = 0x5d; break;
         case MCD_W_STATE_TX_MEB: {
@@ -156,7 +182,10 @@
     // log_fatal("mcd write %02x", data);
     // log_set_quiet(1);
 
-    printf("mcd write %02x\n", data);
+#if PATCH1
+	mcd->rx_data = data;
+#endif
+//  printf("mcd write %02x\n", data);
 
     switch (mcd->state) {
         case MCD_STATE_TX_FLG: mcd->mode = data; break;
@@ -191,4 +220,4 @@
 
     free(mcd->buf);
     free(mcd);
-}
\ No newline at end of file
+}
--- a/psx/dev/mcd.h
+++ b/psx/dev/mcd.h
@@ -26,6 +26,9 @@
     MCD_W_STATE_RX_LSB,
     MCD_W_STATE_RX_DATA,
     MCD_W_STATE_RX_CHK,
+#if 1  // add.
+    MCD_W_STATE_RX_CHK2,
+#endif
     MCD_W_STATE_TX_ACK1,
     MCD_W_STATE_TX_ACK2,
     MCD_W_STATE_TX_MEB,
--- a/psx/dev/pad.c
+++ b/psx/dev/pad.c
@@ -293,10 +293,12 @@
 }
 
 int psx_pad_attach_mcd(psx_pad_t* pad, int slot, const char* path) {
+
+#if 0
     printf("Memory Card support is disabled\n");
 
     return 0;
-
+#endif
     if (pad->mcd_slot[slot])
         psx_pad_detach_mcd(pad, slot);
 
--