+ // todo
+ if (!(s & 1))
+ log_unhandled("%s %x\n", __func__, s);
+
+ mips_return_c(s, 11);
+}
+
+static void psxBios__card_info() { // A ab
+ PSXBIOS_LOG("psxBios_%s %02x\n", biosA0n[0xab], a0);
+ u32 ret, port;
+ storeRam32(A_CARD_ACHAN, a0);
+ port = a0 >> 4;
+
+ switch (port) {
+ case 0x0:
+ case 0x1:
+ ret = 0x0004;
+ if (McdDisable[port & 1])
+ ret = 0x0100;
+ break;
+ default:
+ PSXBIOS_LOG("psxBios_%s: UNKNOWN PORT 0x%x\n", biosA0n[0xab], a0);
+ ret = 0x0302;
+ break;
+ }
+
+ if (McdDisable[0] && McdDisable[1])
+ ret = 0x0100;
+
+ if (ret == 4) {
+ // deliver from card_vint_handler()
+ storeRam8(A_CARD_STATUS1 + port, 8); // busy/info
+ storeRam32(A_CARD_HANDLER, CARD_HARDLER_INFO);
+ } else {
+ DeliverEvent(0xf4000001, ret);
+ DeliverEvent(0xf0000011, 0x0004); // ?
+ }
+ mips_return(1);
+}
+
+static void psxBios__card_load() { // A ac
+ PSXBIOS_LOG("psxBios_%s %02x\n", biosA0n[0xac], a0);
+
+ storeRam32(A_CARD_ACHAN, a0);
+
+// DeliverEvent(0xf0000011, 0x0004);
+ DeliverEvent(0xf4000001, 0x0004);
+
+ mips_return(1);
+}
+
+static void card_vint_handler(void) {
+ u8 select, status;
+ u32 handler;
+
+ if (card_io_delay) {
+ card_io_delay--;
+ return;
+ }
+ UnDeliverEvent(0xf0000011, 0x0004);
+ UnDeliverEvent(0xf0000011, 0x8000);
+ UnDeliverEvent(0xf0000011, 0x0100);
+ UnDeliverEvent(0xf0000011, 0x0200);
+ UnDeliverEvent(0xf0000011, 0x2000);
+
+#if 0
+ select = loadRam8(A_CARD_ISLOT);
+ select = (select ^ 1) & 1;
+ storeRam8(A_CARD_ISLOT, select);
+#else
+ select = loadRam8(A_CARD_ACHAN) >> 4;
+ storeRam8(A_CARD_ISLOT, select);
+#endif
+ status = loadRam8(A_CARD_STATUS1 + select);
+ if (status & 1)
+ return; // done
+
+ //psxBios_SysDeqIntRP_(0, 0x7540);
+ //psxBios_SysDeqIntRP_(0, 0x7540);
+ //card_state_machine = 0;
+ //card_error_flag = 0;
+ handler = loadRam32(A_CARD_HANDLER);
+ switch (handler) {
+ case CARD_HARDLER_INFO:
+ DeliverEvent(0xf4000001, 4);
+ DeliverEvent(0xf0000011, 4);
+ storeRam8(A_CARD_STATUS1 + select, 1);
+ storeRam32(A_CARD_HANDLER, 0);
+ break;
+ case CARD_HARDLER_WRITEM:
+ case CARD_HARDLER_READM:
+ DeliverEvent(0xf4000001, 4);
+ // fallthrough
+ case CARD_HARDLER_WRITE:
+ case CARD_HARDLER_READ:
+ DeliverEvent(0xf0000011, 4);
+ storeRam8(A_CARD_STATUS1 + select, 1);
+ storeRam32(A_CARD_HANDLER, 0);
+ break;
+ case 0:
+ break;
+ default:
+ log_unhandled("%s: unhandled handler %x\n", __func__, handler);
+ DeliverEvent(0xf0000011, 0x8000);
+ storeRam8(A_CARD_STATUS1 + select, 1);
+ storeRam32(A_CARD_HANDLER, 0);
+ }