modem: better handling of reset register

This commit is contained in:
Flyinghead 2020-06-24 15:48:05 +02:00
parent 3694e8e87a
commit 89842c6d30
1 changed files with 55 additions and 73 deletions

View File

@ -167,7 +167,7 @@ static int modem_sched_func(int tag, int cycles, int jitter)
switch (connect_state) switch (connect_state)
{ {
case DIALING: case DIALING:
if (last_dial_time != 0 && sh4_sched_now64() - last_dial_time >= SH4_MAIN_CLOCK + jitter) if (last_dial_time != 0 && sh4_sched_now64() - last_dial_time >= (u64)(SH4_MAIN_CLOCK + jitter))
{ {
LOG("Switching to RINGING state"); LOG("Switching to RINGING state");
connect_state = RINGING; connect_state = RINGING;
@ -429,20 +429,23 @@ static void ControllerTestStart()
static void modem_reset(u32 v) static void modem_reset(u32 v)
{ {
if (v==0) if (v == 0)
{ {
memset(&modem_regs,0,sizeof(modem_regs)); memset(&modem_regs, 0, sizeof(modem_regs));
state=MS_RESET; state = MS_RESET;
LOG("Modem reset start ..."); LOG("Modem reset start ...");
} }
else else
{ {
stop_pppd(); if (state == MS_RESET)
memset(&modem_regs,0,sizeof(modem_regs)); {
state=MS_RESETING; stop_pppd();
modem_regs.ptr[0x20]=1; memset(&modem_regs, 0, sizeof(modem_regs));
ControllerTestStart(); state = MS_RESETING;
INFO_LOG(MODEM, "MODEM Reset"); ControllerTestStart();
INFO_LOG(MODEM, "MODEM Reset");
}
modem_regs.ptr[0x20] = v;
} }
} }
@ -647,21 +650,17 @@ static void ModemNormalWrite(u32 reg, u32 data)
u32 ModemReadMem_A0_006(u32 addr, u32 size) u32 ModemReadMem_A0_006(u32 addr, u32 size)
{ {
u32 reg=addr&0x7FF; u32 reg = (addr & 0x7FF) >> 2;
verify((reg&3)==0);
reg>>=2;
if (reg<0x100) if (reg < 0x100)
return MODEM_ID[reg & 1];
reg -= 0x100;
if (reg < 0x21)
{ {
verify(reg<=1); switch (state)
return MODEM_ID[reg];
}
else
{
reg-=0x100;
if (reg<0x21)
{ {
if (state==MS_NORMAL) case MS_NORMAL:
{ {
// Dial tone is detected if TONEA, TONEB and TONEC are set // Dial tone is detected if TONEA, TONEB and TONEC are set
//if (reg==0xF) //if (reg==0xF)
@ -696,73 +695,56 @@ u32 ModemReadMem_A0_006(u32 addr, u32 size)
return data; return data;
} }
else if (state==MS_ST_CONTROLER || state==MS_ST_DSP)
case MS_ST_CONTROLER:
case MS_ST_DSP:
if (reg==0x10)
{ {
if (reg==0x10) modem_regs.reg1e.TDBE=0;
{ return 0;
modem_regs.reg1e.TDBE=0;
return 0;
}
else
{
return modem_regs.ptr[reg];
}
}
else if (state==MS_RESETING)
{
return 0; //still reset
} }
else else
{ {
//LOG("Read (reset) reg %03x == %x", reg, modem_regs.ptr[reg]); return modem_regs.ptr[reg];
return 0;
} }
}
else case MS_RESETING:
{ return 0; //still reset
LOG("modem reg %03X read -- wtf is it ?",reg);
default:
//LOG("Read (reset) reg %03x == %x", reg, modem_regs.ptr[reg]);
return 0; return 0;
} }
} }
LOG("modem reg %03X read -- wtf is it ?",reg);
return 0;
} }
void ModemWriteMem_A0_006(u32 addr, u32 data, u32 size) void ModemWriteMem_A0_006(u32 addr, u32 data, u32 size)
{ {
u32 reg=addr&0x7FF; u32 reg = (addr & 0x7FF) >> 2;
verify((reg&3)==0); if (reg < 0x100)
reg>>=2;
if (reg<0x100)
{ {
verify(reg<=1);
LOG("modem reg %03X write -- MODEM ID?!",reg); LOG("modem reg %03X write -- MODEM ID?!",reg);
return;
} }
else
reg -= 0x100;
if (reg < 0x20)
{ {
reg-=0x100; if (state == MS_NORMAL)
if (reg<0x20) ModemNormalWrite(reg,data);
{
if (state==MS_NORMAL)
{
ModemNormalWrite(reg,data);
}
else
{
LOG("modem reg %03X write %X -- undef state?",reg,data);
}
return;
}
else if (reg==0x20)
{
//Hard reset
modem_reset(data);
}
else else
{ LOG("modem reg %03X write %X -- undef state?", reg, data);
LOG("modem reg %03X write %X -- wtf is it?",reg,data); return;
return;
}
} }
if (reg == 0x20)
{
//Hard reset
modem_reset(data);
return;
}
LOG("modem reg %03X write %X -- wtf is it?",reg,data);
} }