ref: 97363aeadb8c5a2dcca7aa82b9cafabc8d672ce5
parent: 180a7d6669be0f46f98625b42ba16098c8faa60b
author: scmp2er <scmp2er@dipx.net>
date: Wed Feb 25 18:31:05 EST 2026
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);
--
⑨