wince: online support

Use default asyncmap for LCP control packets
Delay reading from picotcp ppp stream when connecting
Accept [PSH,SYN] as valid tcp connect packet

Add PBA Tour Bowling 2001 as wince game
Disable vmem32 for StarLancer and Maximum Pool (req'd for online support)
This commit is contained in:
Flyinghead 2019-07-07 20:31:36 +02:00
parent 18bcb81682
commit c3a42b0b22
6 changed files with 74 additions and 42 deletions

View File

@ -16,7 +16,7 @@
#define TIME_PRESCALE
#define PICO_SUPPORT_THREADING
*/
#ifdef RELEASE
#if defined(RELEASE) && !defined(DEBUGFAST)
#define dbg(...)
#else
#define dbg printf

View File

@ -543,7 +543,7 @@ static int ppp_fcs_verify(uint8_t *buf, uint32_t len)
}
/* Serial send (DTE->DCE) functions */
static int pico_ppp_ctl_send(struct pico_device *dev, uint16_t code, uint8_t *pkt, uint32_t len)
static int pico_ppp_ctl_send(struct pico_device *dev, uint16_t code, uint8_t *pkt, uint32_t len, uint32_t no_escape)
{
struct pico_device_ppp *ppp = (struct pico_device_ppp *) dev;
uint16_t fcs;
@ -567,7 +567,15 @@ static int pico_ppp_ctl_send(struct pico_device *dev, uint16_t code, uint8_t *pk
pkt[len - 3] = (uint8_t)(fcs & 0xFFu);
pkt[len - 2] = (uint8_t)((fcs & 0xFF00u) >> 8);
pkt[len - 1] = PPPF_FLAG_SEQ;
uint32_t asyncmap;
if (no_escape)
{
asyncmap = ppp->asyncmap;
ppp->asyncmap = 0xffffffff;
}
ppp_serial_send_escape(ppp, pkt, (int)len);
if (no_escape)
ppp->asyncmap = asyncmap;
return (int)len;
}
@ -912,7 +920,8 @@ static void lcp_send_configure_request(struct pico_device_ppp *ppp)
sizeof(struct pico_lcp_hdr) + /* LCP HDR */
optsize + /* Actual options size */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1u) /* STOP Byte */
1u), /* STOP Byte */
1 /* no escape */
);
PICO_FREE(lcpbuf);
ppp->timer_val = PICO_PPP_DEFAULT_TIMER;
@ -1007,8 +1016,9 @@ static void lcp_send_configure_ack(struct pico_device_ppp *ppp)
PPP_HDR_SIZE + PPP_PROTO_SLOT_SIZE + /* PPP Header, etc. */
short_be(lcpreq->len) + /* Actual options size + hdr (whole lcp packet) */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1 /* STOP Byte */
);
1, /* STOP Byte */
1 /* no escape */
);
}
static void lcp_send_terminate_request(struct pico_device_ppp *ppp)
@ -1023,7 +1033,8 @@ static void lcp_send_terminate_request(struct pico_device_ppp *ppp)
PPP_HDR_SIZE + PPP_PROTO_SLOT_SIZE + /* PPP Header, etc. */
sizeof(struct pico_lcp_hdr) + /* Actual options size + hdr (whole lcp packet) */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1 /* STOP Byte */
1, /* STOP Byte */
1 /* no escape */
);
lcp_timer_start(ppp, PPP_TIMER_ON_LCPTERM);
}
@ -1042,7 +1053,8 @@ static void lcp_send_terminate_ack(struct pico_device_ppp *ppp)
PPP_HDR_SIZE + PPP_PROTO_SLOT_SIZE + /* PPP Header, etc. */
short_be(lcpreq->len) + /* Actual options size + hdr (whole lcp packet) */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1 /* STOP Byte */
1, /* STOP Byte */
1 /* no escape */
);
}
@ -1088,7 +1100,8 @@ static void lcp_send_configure_nack(struct pico_device_ppp *ppp)
sizeof(struct pico_lcp_hdr) + /* LCP HDR */
dstopts_len + /* Actual options size */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1u) /* STOP Byte */
1u), /* STOP Byte */
1 /* no escape */
);
}
@ -1216,7 +1229,8 @@ static void ipcp_send_ack(struct pico_device_ppp *ppp)
PPP_HDR_SIZE + PPP_PROTO_SLOT_SIZE + /* PPP Header, etc. */
short_be(ipcpreq->len) + /* Actual options size + hdr (whole ipcp packet) */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1 /* STOP Byte */
1, /* STOP Byte */
0 /* escape */
);
}
@ -1267,7 +1281,8 @@ static void ipcp_send_req(struct pico_device_ppp *ppp)
(uint32_t)(prefix + /* PPP Header, etc. */
(uint32_t)len + /* IPCP Header + options */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1u) /* STOP Byte */
1u), /* STOP Byte */
0 /* escape */
);
}
@ -1295,7 +1310,8 @@ static void ipcp_reject_vj(struct pico_device_ppp *ppp, uint8_t *comp_req)
sizeof(struct pico_ipcp_hdr) + /* LCP HDR */
IPCP_VJ_LEN + /* Actual options size */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1u) /* STOP Byte */
1u), /* STOP Byte */
0 /* escape */
);
}
@ -1574,8 +1590,9 @@ static void lcp_send_echo_reply(struct pico_device_ppp *ppp)
PPP_HDR_SIZE + PPP_PROTO_SLOT_SIZE + /* PPP Header, etc. */
short_be(lcpreq->len) + /* Actual options size + hdr (whole lcp packet) */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1 /* STOP Byte */
);
1, /* STOP Byte */
0 /* escape */
);
}
static const struct pico_ppp_fsm ppp_lcp_fsm[PPP_LCP_STATE_MAX][PPP_LCP_EVENT_MAX] = {
@ -1618,7 +1635,7 @@ static const struct pico_ppp_fsm ppp_lcp_fsm[PPP_LCP_STATE_MAX][PPP_LCP_EVENT_MA
[PPP_LCP_STATE_CLOSED] = {
[PPP_LCP_EVENT_UP] = { PPP_LCP_STATE_CLOSED, {} },
[PPP_LCP_EVENT_DOWN] = { PPP_LCP_STATE_INITIAL, {} },
[PPP_LCP_EVENT_OPEN] = { PPP_LCP_STATE_REQ_SENT, { lcp_send_configure_request} },
[PPP_LCP_EVENT_OPEN] = { PPP_LCP_STATE_REQ_SENT, { lcp_send_configure_request } },
[PPP_LCP_EVENT_CLOSE] = { PPP_LCP_STATE_CLOSED, {} },
[PPP_LCP_EVENT_TO_POS] = { PPP_LCP_STATE_CLOSED, {} },
[PPP_LCP_EVENT_TO_NEG] = { PPP_LCP_STATE_CLOSED, {} },
@ -1871,7 +1888,8 @@ static void auth_req(struct pico_device_ppp *ppp)
PPP_HDR_SIZE + PPP_PROTO_SLOT_SIZE + /* PPP Header, etc. */
pap_len + /* Authentication packet len */
PPP_FCS_SIZE + /* FCS */
1) /* STOP Byte */
1), /* STOP Byte */
0 /* escape */
);
PICO_FREE(req);
}
@ -1916,7 +1934,8 @@ static void auth_rsp(struct pico_device_ppp *ppp)
1 + /* Value length */
CHAP_MD5_SIZE + /* Actual payload size */
PPP_FCS_SIZE + /* FCS at the end of the frame */
1) /* STOP Byte */
1), /* STOP Byte */
0 /* escape */
);
}
@ -2051,7 +2070,8 @@ static void ipcp_send_nack(struct pico_device_ppp *ppp)
ppp_dbg("Sending IPCP CONF NAK\n");
pico_ppp_ctl_send(&ppp->dev, PPP_PROTO_IPCP,
ipcp_req, /* Start of PPP packet */
(uint32_t)sizeof(ipcp_req));
(uint32_t)sizeof(ipcp_req),
0); /* escape */
}
static void ipcp_bring_up(struct pico_device_ppp *ppp)
@ -2329,6 +2349,7 @@ struct pico_device *pico_ppp_create(void)
ppp->lcp_state = PPP_LCP_STATE_INITIAL;
ppp->auth_state = PPP_AUTH_STATE_INITIAL;
ppp->ipcp_state = PPP_IPCP_STATE_INITIAL;
ppp->asyncmap = 0xffffffff;
ppp->timer = pico_timer_add(1000, pico_ppp_tick, ppp);
if (!ppp->timer) {

View File

@ -2770,7 +2770,7 @@ static uint8_t invalid_flags(struct pico_socket *s, uint8_t flags)
static const uint8_t valid_flags[PICO_SOCKET_STATE_TCP_ARRAYSIZ][MAX_VALID_FLAGS] = {
{ /* PICO_SOCKET_STATE_TCP_UNDEF */ 0, },
{ /* PICO_SOCKET_STATE_TCP_CLOSED */ 0, },
{ /* PICO_SOCKET_STATE_TCP_LISTEN */ PICO_TCP_SYN },
{ /* PICO_SOCKET_STATE_TCP_LISTEN */ PICO_TCP_SYN, PICO_TCP_SYN | PICO_TCP_PSH },
{ /* PICO_SOCKET_STATE_TCP_SYN_SENT */ PICO_TCP_SYNACK, PICO_TCP_RST, PICO_TCP_RSTACK},
{ /* PICO_SOCKET_STATE_TCP_SYN_RECV */ PICO_TCP_SYN, PICO_TCP_ACK, PICO_TCP_PSH, PICO_TCP_PSHACK, PICO_TCP_FINACK, PICO_TCP_FINPSHACK, PICO_TCP_RST},
{ /* PICO_SOCKET_STATE_TCP_ESTABLISHED*/ PICO_TCP_SYN, PICO_TCP_SYNACK, PICO_TCP_ACK, PICO_TCP_PSH, PICO_TCP_PSHACK, PICO_TCP_FIN, PICO_TCP_FINACK, PICO_TCP_FINPSHACK, PICO_TCP_RST, PICO_TCP_RSTACK},
@ -2850,7 +2850,7 @@ int pico_tcp_input(struct pico_socket *s, struct pico_frame *f)
if(invalid_flags(s, flags)) {
pico_tcp_reply_rst(f);
}
else if (flags == PICO_TCP_SYN) {
else if (flags == PICO_TCP_SYN || flags == (PICO_TCP_SYN | PICO_TCP_PSH)) {
tcp_action_call(action->syn, s, f);
} else if (flags == (PICO_TCP_SYN | PICO_TCP_ACK)) {
tcp_action_call(action->synack, s, f);

View File

@ -121,7 +121,8 @@ static void ControllerTestEnd();
static void DSPTestStart();
static void DSPTestEnd();
static double last_dial_time;
static u64 last_dial_time;
static u64 connected_time;
#ifndef RELEASE
static double last_comm_stats;
@ -131,7 +132,7 @@ static FILE *recv_fp;
static FILE *sent_fp;
#endif
static int modem_sched_func(int tag, int c, int j)
static int modem_sched_func(int tag, int cycles, int jitter)
{
#ifndef RELEASE
if (os_GetSeconds() - last_comm_stats >= 2)
@ -166,7 +167,7 @@ static int modem_sched_func(int tag, int c, int j)
switch (connect_state)
{
case DIALING:
if (last_dial_time != 0 && os_GetSeconds() - last_dial_time > 0.99)
if (last_dial_time != 0 && sh4_sched_now64() - last_dial_time >= SH4_MAIN_CLOCK + jitter)
{
LOG("Switching to RINGING state");
connect_state = RINGING;
@ -174,7 +175,7 @@ static int modem_sched_func(int tag, int c, int j)
}
else
{
last_dial_time = os_GetSeconds();
last_dial_time = sh4_sched_now64();
modem_regs.reg1e.TDBE = 1;
schedule_callback(1000); // To switch to Ringing state
@ -201,7 +202,7 @@ static int modem_sched_func(int tag, int c, int j)
SET_STATUS_BIT(0x0f, modem_regs.reg0f.RI, 0);
SET_STATUS_BIT(0x0b, modem_regs.reg0b.ATV25, 0);
callback_cycles = SH4_MAIN_CLOCK / 1000000 * 500; // 500 ms
callback_cycles = SH4_MAIN_CLOCK / 1000 * 500; // 500 ms
connect_state = PRE_CONNECTED;
break;
@ -214,10 +215,13 @@ static int modem_sched_func(int tag, int c, int j)
{
// V8 AUTO mode
dspram[0x302] |= 1 << 4; // protocol octet received
dspram[0x302] = (dspram[0x302] & 0x1f) | (dspram[0x304] & 0xe0); // Received Call Function
dspram[0x301] |= 1 << 4; // JM detected
dspram[0x303] |= 0xE0; // Received protocol bits (?)
dspram[0x2e3] |= 5; // Symbol rate 3429
dspram[0x239] |= 12; // RTD 0 @ 3429 sym rate
dspram[0x2e3] = 5; // Symbol rate 3429
dspram[0x2e4] = 0xe; // V.34 Receiver Speed 33.6
dspram[0x2e5] = 0xe; // V.34 Transmitter Speed 33.6
dspram[0x239] = 12; // RTD 0 @ 3429 sym rate
if (modem_regs.reg08.ASYN)
{
modem_regs.reg12 = 0xce; // CONF V34 - K56flex
@ -253,7 +257,7 @@ static int modem_sched_func(int tag, int c, int j)
if (modem_regs.reg02.v0.RTSDE)
SET_STATUS_BIT(0x0f, modem_regs.reg0f.RTSDT, 1);
// What is this? This is required for games to detect the connection
// Energy detected. Required for games to detect the connection
SET_STATUS_BIT(0x0f, modem_regs.reg0f.FED, 1);
// V.34 Remote Modem Data Rate Capability
@ -263,6 +267,7 @@ static int modem_sched_func(int tag, int c, int j)
start_pppd();
connect_state = CONNECTED;
callback_cycles = SH4_MAIN_CLOCK / 1000000 * 238; // 238 us
connected_time = 0;
break;
@ -276,10 +281,13 @@ static int modem_sched_func(int tag, int c, int j)
LOG("modem_regs %02x == %02x", i, modem_regs.ptr[i]);
}
#endif
if (connected_time == 0)
connected_time = sh4_sched_now64();
if (!modem_regs.reg1e.RDBF)
{
int c = read_pppd();
if (c >= 0)
// Delay reading from ppp to avoid choking WinCE
if (c >= 0 && sh4_sched_now64() - connected_time >= SH4_MAIN_CLOCK / 4)
{
//LOG("pppd received %02x", c);
#ifndef RELEASE
@ -572,10 +580,7 @@ static void ModemNormalWrite(u32 reg, u32 data)
u32 dspram_addr = modem_regs.reg1c_1d.MEMADD_l | (modem_regs.reg1c_1d.MEMADD_h << 8);
if (modem_regs.reg1c_1d.MEMW)
{
//LOG("DSP mem Write%s address %08x = %x",
// word_dspram_write ? " (w)" : "",
// dspram_addr,
// modem_regs.reg18_19 );
LOG("DSP mem Write%s address %08x = %x", word_dspram_write ? " (w)" : "", dspram_addr, modem_regs.reg18_19);
if (word_dspram_write)
{
if (dspram_addr & 1)
@ -595,9 +600,7 @@ static void ModemNormalWrite(u32 reg, u32 data)
modem_regs.reg18_19 = dspram[dspram_addr] | (dspram[dspram_addr + 1] << 8);
else
modem_regs.reg18_19 = *(u16*)&dspram[dspram_addr];
//LOG("DSP mem Read address %08x == %x",
// dspram_addr,
// modem_regs.reg18_19 );
LOG("DSP mem Read address %08x == %x", dspram_addr, modem_regs.reg18_19 );
}
}
break;
@ -631,7 +634,7 @@ static void ModemNormalWrite(u32 reg, u32 data)
break;
default:
//printf("ModemNormalWrite : undef %03X=%X\n",reg,data);
//LOG("ModemNormalWrite : undef %03X = %X", reg, data);
break;
}
update_interrupt();

View File

@ -22,7 +22,7 @@
*/
#pragma once
#pragma pack(1)
#pragma pack(push, 1)
union modemreg_t
{
u8 ptr[0x21];
@ -318,6 +318,7 @@ union modemreg_t
} reg1f;
};
};
#pragma pack(pop)
u8 regs_write_mask[] = {
//00 Receive Data Buffer (RBUFFER)/Voice Receive Data Buffer (VBUFR)
@ -433,7 +434,7 @@ static const u8 por_dspram[] =
/* 0x060 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x070 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x080 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x090 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x090 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9F avail mod type (wince): 80, 30, 00?
/* 0x0A0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x0B0 */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x0C0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -458,10 +459,10 @@ static const u8 por_dspram[] =
/* 0x1E0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x1F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x200 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x200 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 204-5 rate_seq_R2, 208-209 rate_seq_R3
/* 0x210 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xAD, 0x08, 0x07, 0x99, 0x00, 0x23, 0xA0,
/* 0x220 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00,
/* 0x230 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x230 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 239 Round Trip Far Echo Delay
/* 0x240 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x250 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0x260 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 26F Saved Filtered EQM (???)

View File

@ -141,7 +141,7 @@ void LoadSpecialSettings()
full_mmu_game = false;
disable_vmem32_game = false;
if (reios_windows_ce)
if (reios_windows_ce || !strncmp("T26702N", reios_product_number, 7)) // PBA Tour Bowling 2001
{
INFO_LOG(BOOT, "Enabling Full MMU and Extra depth scaling for Windows CE game");
settings.rend.ExtraDepthScale = 0.1;
@ -216,7 +216,14 @@ void LoadSpecialSettings()
// Marionette Company
|| !strncmp("T5202M", reios_product_number, 6)
// Marionette Company 2
|| !strncmp("T5203M", reios_product_number, 6))
|| !strncmp("T5203M", reios_product_number, 6)
// Maximum Pool (for online support)
|| !strncmp("T11010N", reios_product_number, 7)
// StarLancer (US) (for online support)
|| !strncmp("T40209N", reios_product_number, 7)
// StarLancer (EU) (for online support)
|| !strncmp("T17723D 05", reios_product_number, 10)
)
{
INFO_LOG(BOOT, "Disabling 32-bit virtual memory for game %s", reios_product_number);
settings.dynarec.disable_vmem32 = true;