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
--
⑨