?? control.c
字號:
esi = 0x10;
}
else {
//loc_2C9B3:
ebp = 0x8FF0;
esi = 0x801F;
}
// loc_2C98D:
edi = 0xb1;
x_line_rate = 9;
break; //goto loc_2CB9B;
case 9:
// loc_2C9D1 9
if (S_auto_rate == 0){
ebp = 0x9990;
esi = 0x20;
}
else {
//loc_2C9E4:
ebp = 0x9FF0;
esi = 0x803F;
}
// loc_2C9EE
edi = 0xb1;
x_line_rate = 10;
break; //goto loc_2CB9B;
case 10:
// loc_2CA02 10
if (S_auto_rate == 0){
ebp = 0x0A990;
esi = 0x40;
}
else {
//loc_2C9E4:
ebp = 0xBFF0;
esi = 0x807F;
}
// loc_2C9EE
edi = 0xb1;
x_line_rate = 11;
break; //goto loc_2CB9B;
case 11:
//loc_2CA33 11
if (S_auto_rate == 0){
ebp = 0x0C990;
esi = 0x80;
}
else {
//loc_2CA48:
ebp = 0xFFF0;
esi = 0x80FF;
}
// loc_2CA52
edi = 0xb1;
x_line_rate = 12;
break; //goto loc_2CB9B;
case 12:
//loc_2CA66 12
ebp = 0xFFF0;
if (S_auto_rate)
eax = 0xffffffff; // -1
else
eax = 0;
edi = 0xb1;
eax = eax & 0x80FF;
x_line_rate = 13;
eax = eax + 0x100;
esi = eax;
break; //goto loc_2CB9B;
case 13:
//loc_2CA94 13
ebp = 0xFFF0;
if (S_auto_rate)
eax = 0xffffffff; // -1
else
eax = 0;
edi = 0xb1;
eax = eax & 0x81FF;
x_line_rate = 14;
eax = eax + 0x200;
esi = eax;
break; //goto loc_2CB9B;
case 14:
// loc_2CAC2 14
ebp = 0xFFF0;
if (S_auto_rate)
eax = 0xffffffff; // -1
else
eax = 0;
edi = 0xb1;
eax = eax & 0x83FF;
x_line_rate = 15;
eax = eax + 0x400;
esi = eax;
break; //goto loc_2CB9B;
case 15:
// loc_2CAF0 15
ebp = 0xFFF0;
if (S_auto_rate)
eax = 0xffffffff; // -1
else
eax = 0;
edi = 0xb1;
eax = eax & 0x87FF;
x_line_rate = 16;
eax = eax + 0x800;
esi = eax;
break; //goto loc_2CB9B;
case 16:
// loc_2CB72 16
ebp = 0xFFF0;
if (S_auto_rate)
eax = 0xffffffff; // -1
else
eax = 0;
edi = 0xb1;
eax = eax & 0x8FFF;
x_line_rate = 17;
eax = eax + 0x1000;
esi = eax;
break; //goto loc_2CB9B;
}
//end switch.
// This stuff is very different to what's in Jamie's and
// the 568 version!
//loc_2CB9B:
if (S_auto_mode) goto loc_2CBAF;
if (bl == 0) goto loc_2CBAD;
if (bl < 7) goto loc_2CBAF;
loc_2CBAD:
edi = 0;
loc_2CBAF:
//ebx = 0x821;
if (ETC_mode == 0) goto loc_2CC2E;
if (ETC_mode & 0x80) goto loc_2CBF6;
al = S(0x28);
if (al != 2) goto loc_2CBDD;
ebp = ebp & 0x8BF0;
esi = esi & 0x800F;
goto loc_2CBED;
loc_2CBDD:
if (al != 1) goto loc_2CBED;
ebp = ebp & 0x89B0;
esi = esi & 0x8003;
loc_2CBED:
ETC_mode = ETC_mode & 0x80;
goto loc_2CC0C;
loc_2CBF6:
ebp = ebp | 0x9ff0;
esi = esi | 0x83ff;
S_0x5d = dp_read_dsp_ram(0x821);
loc_2CC0C:
if (wSymbolRate != 1)
wSymbolRate = S(0x64);
//loc_2CC22:
dp_write_dsp_ram(0x824, 0);
loc_2CC2E:
if ((S(0x75) & 0xf0) == 0x30)
edi = edi & 0xFF7F;
//loc_2CC3F: // Similar to 32292: in Jamies dis.
dp_write_dsp_ram(1, ebp);
dp_write_dsp_ram(2, edi);
ax = S(0x5D);
if ((0xffff & edi) != 0)
ax = ax | 8;
else //loc_2CC5D:
ax = ax & 0xfff7;
//loc_2CC61:
dp_wV34Option = ax & 0xefff;
if (S_V34_enable == 0) {
//loc_2CCEB:
dp_write_dsp_ram(0x80D, 0);
goto loc_2CCED;
}
if (x_modem_state != 7) goto loc_2CCB8;
if ((esi & 0x3000) == 0) goto loc_2CC9F;
wSymbolRate = 0x400;
ax = ax | 0x800;
esi = esi | 0x800;
dp_wV34Option = ax;
goto loc_2CCB8;
loc_2CC9F:
if (esi == 1)
dp_wV34Option = 0;
else //loc_2CCAF:
wSymbolRate = 0x100;
loc_2CCB8:
if (wSymbolRate & 0x400)
dp_write_dsp_ram(0x810, 0x21FF);
else //loc_2CCC8:
dp_write_dsp_ram(0x810, 0x217F);
dp_write_dsp_ram(0x823, wSymbolRate);
dp_write_dsp_ram(0x80D, esi);
loc_2CCED:
dp_write_dsp_ram (0x821, dp_wV34Option);
dp_write_dsp_ram (0x3c, 0x122);
dp_write_dsp_ram (0x47, 0x123);
//printf(" xSymbolRate: 0x%04x, x_line_rate: %d.\n",
// wSymbolRate, x_line_rate);
}
void dp_update_modem_options(void)
{
unsigned int bl, ax, esi, edi = 0;
if (x_modem_mode != 0) return;
//printf("dp_update_modem_options: setting options in DSP RAM.\n");
bl = 0x27;
loc_2CD9D:
ax = bl;
ax = ax + 0x800;
dp_write_dsp_ram(ax, edi);
ax = bl;
bl--;
if (ax != 0) goto loc_2CD9D;
dp_write_dsp_ram(0x0c, edi);
dp_write_dsp_ram(0x39, edi);
dp_write_dsp_ram(0x48, 0x7d0);
ax = H_data_or_fax_carrier_rx_threshold_dB; // 59f26
dp_write_dsp_ram (0x37, ax);
esi = 0;
if (cell_active) {
dp_write_dsp_ram(0x37, 0x2b);
esi = 0x4000;
}
ETC_mode = ETC_mode & 0x7f;
dp_update_rate();
ax = S_dial_line_rate;
ax--;
ax--;
if (ax == 0) goto loc_2CE24;
ax = ax - 3;
if (ax != 0) goto loc_2CE30;
if (S(0x3a) == 1) esi = esi | 1;
goto loc_2CE30;
loc_2CE24:
if (S(0x3b) != 0) esi = esi | 0x10;
loc_2CE30:
ax = S(0x35);
ax--;
if (ax == 0) goto loc_2CE42;
ax--;
if (ax != 0) goto loc_2CE45;
esi = esi | 4;
goto loc_2CE45;
loc_2CE42:
esi = esi | 2;
loc_2CE45:
dp_write_dsp_ram(0x38, esi);
dp_async_user_mode();
esi = 0x825;
dp_write_dsp_ram(esi, 0x3000);
bl = S(0x54);
ax = S(0x38);
bl = bl/2;
bl = bl & 0x70;
if ((ax < 2) || (ax > 7))
dp_write_dsp_ram(esi, 0x2333);
else
if (bl == 0x60)
bl = bl + 4;
//loc_2CE9F:
ax = bl;
dp_write_dsp_ram(0x822, ax);
dp_write_dsp_ram(0x827, 2);
if ((S_dial_line_rate != 2) | (S(0x3b) != 1) | (x_modem_state != 3))
ax = H_transmit_level_ndB;
else
ax = H_transmit_level_ndB + 1;
dp_transmit_level(ax);
dp_write_dsp_ram(0x3a, edi);
dp_bV34WkState = 1;
}
void dp_update_diagnostics (void)
{
if (V34Mode != 0)
dp_get_line_rate ();
x_status[6] = x_line_rate_tx;
x_status[8] = x_line_rate;
x_status[0x10] = dp_read_dsp_ram (0x4c);
x_status[0x0c] = x_modem_ec;
x_status[0x12] = dp_read_dsp_ram (0x4a);
x_status[0x14] = dp_read_dsp_ram (0x03);
x_status[0x16] = dp_read_dsp_ram (0x54);
x_status[0x18] = dp_read_dsp_ram (0x55);
x_status[0x1a] = dp_read_dsp_ram (0x56);
x_status[0x32] = dp_read_dsp_ram (0x80a);
x_status[0x34] = dp_read_dsp_ram (0x80b);
x_status[0x38] = x_dial_residual;
}
void dp_get_line_rate (void)
{
unsigned short word = dp_read_dsp_ram (0x36);
x_line_rate_tx = ((word >> 8) & 0x1f) + 2;
x_line_rate = (word & 0x1f) + 2;
}
void dp_v8_originate_msg(void)
{
printf("dp_v8_originate_msg: warning not yet implemented!\n");
}
// Taken from version 568.
void dp_disable_workaround(void)
{
if (x_dsp_mars3 != 0) {
// Mars3 chipset.
dp_write_dsp_ram(0xf20, 0x4228);
dp_write_dsp_ram(0x311, 0xb9a7);
}
else {
dp_write_dsp_ram(0xf20, 0x42f8);
dp_write_dsp_ram(0x311, 0xb994);
}
}
void dp_transmit_level (unsigned int level)
{
dp_write_dsp_ram(3, level);
}
void dp_async_user_mode(void)
{
unsigned int var_4 = 0x080;
switch(S(13)){
case 5:
break;
case 6:
var_4 = 0x82;
break;
case 7:
var_4 = 0x84;
break;
default:
var_4 = 0x86;
break;
}
//loc_2C7D2:
if (S(15) != 0)
var_4 = var_4 | 1;
switch (S(0x13)) {
case 1:
var_4 = var_4 | 0x38;
break;
case 2:
var_4 = var_4 | 0x30;
break;
case 3:
var_4 = var_4 | 1;
break;
case 4:
var_4 = var_4 | 0x28;
break;
default:
break;
}
// loc_2C808:
DpIdleFillChar = 0xff;
dp_modem_command_long(0x29, 0xff, 1, var_4, 0);
}
void dp_sleep_mode(unsigned char arg1)
{
printf("dp_sleep_mode(%d): warning not yet implemented!\n", arg1);
}
void dp_over_current_alert (void)
{
printf("dp_over_current_alert: warning not yet implemented!\n");
}
// I wonder what this does? ;)
void dp_disable_33600 (void)
{
dp_write_dsp_ram(0x801, 0x217F);
dp_write_dsp_ram(0x823, wSymbolRate & 0x0FBFF);
dp_write_dsp_ram(0x80D, (dp_read_dsp_ram(0x80D) & 0x0DFFF));
}
void dp_v34_workaround(void)
{
printf("dp_v34_workaround: warning not yet implemented!\n");
}
void
dp_enable_ring_int(void)
{
dp_regwrite(0xd8, 0xff);
dp_bamil_rd7 &= 0xf1;
dp_regwrite(0xd7, dp_bamil_rd7);
}
void dp_modem_idle_cmd (void)
{
dp_modem_command (0x13, 0, 0);
dp_write_dsp_ram (0xf20, 0x42f8);
}
bool dp_init_modem_connection(void)
{
unsigned int ecx;
unsigned short ax;
dp_count = 0;
if (V34Mode) {
dp_get_line_rate(); // Set line rate var's from value read from DSP.
if (x_line_rate == 2) return false;
ax = (V34Mode & dp_read_dsp_ram(80));
x_status[1] = 2;
dp_max_line_rate = 18;
//loc_2D43C: // Loop
while ((ax & 0x2000) == 0){
ecx = dp_max_line_rate;
dp_max_line_rate--;
if (ecx == 0) break;
ax = ax << 1;
}
//goto loc_2D49E;
}
else{
//loc_2D455:
dp_max_line_rate = x_line_rate;
dp_modem_rate();
x_status[1] = 1;
x_line_rate_tx = x_line_rate;
if ((S_auto_mode == false) && (S_auto_rate == 0)
&& (dp_max_line_rate != x_line_rate)) return 0;
//loc_2D491:
dp_wV32bisRcvRate = dp_read_dsp_ram(0x35);
//goto loc_2D49E;
}
//loc_2D49E:
dp_bFallForward = 1;
if (x_line_rate >= 6)
dp_write_dsp_ram(0xA60, 0);
//loc_2D4B9:
if ((S_speaker_enable == 1) ||
(S_speaker_enable == 3))
x_output(7);
//loc_2D4CD:
if (x_modem_mode != 0) goto loc_2D505;
if (S_dial_line_rate == 2) goto loc_2D4FE;
if (dp_read_dsp_ram(0x3b) == 9) goto loc_2D4FE;
S(0x1b) = 0;
if (dp_read_dsp_ram(0x3b) != 0x86) goto loc_2D505;
loc_2D4FE:
S(0x1b) = 1;
loc_2D505:
if (((S(0x53) == 5) || (S(0x55) == 6))
&& (!V34Mode)) return false;
//loc_2D524:
if ((wSymbolRate & 0x400) != 0) // Test bit 4 of MSB.
dp_disable_33600();
//loc_2D532:
x_status[0x2] = (x_line_rate_tx & 0xff);
x_status[0x3] = (unsigned char)((x_line_rate_tx & 0xff00)/256);
x_status[0x4] = (x_line_rate & 0xff);
x_status[0x5] = (unsigned char)((x_line_rate & 0xff00)/256);
dp_update_diagnostics();
return true;
}
// ** WARNING! the Lucent 568 version is very different and has some
// DSP code patches (RT_FIX_MARS3 or RT_FIX) depending on whether it's
// a mars3 chipset. See ll_set_pci_id in 568 version for device specific
// settings.
bool dp_dial_connect_success(void)
{
printf("dp_dial_connect_success: called\n");
dp_v34_workaround();
if ((dp_read_dsp_ram(0x8e) & 2) == 0) goto loc_2D620;
if ((dp_read_dsp_ram(0x3a) & 8) == 0) goto loc_2D620;
dp_dsp_status = (unsigned char)(dp_read_dsp_ram(0x32) & 0xff);
if ((dp_dsp_status & 0x10) != 0) goto loc_2D620;
dp_bGoodAuto = false;
dp_bFallForward = true;
V34Mode = dp_read_dsp_ram(0x817);
if (V34Mode){
if (dp_read_dsp_ram(0x80) != 0x70EA) goto loc_2D620;
if (dp_read_dsp_ram(0xCF) != 0x6B69) goto loc_2D620;
}
if (ETC_mode){
dp_count = 0;
if (V34Mode)
dp_write_dsp_ram(0x80D, (dp_read_dsp_ram(0x80D) & 0x8003));
else
dp_write_dsp_ram(1, (dp_read_dsp_ram(1) & 0x89B0));
}
dp_lapm_error_check_init();
return dp_init_modem_connection();
loc_2D620:
// Debug
printf("dp_dial_connect_success: failed!\n");
return false;
}
void dp_rate_change_cmd(unsigned int rate)
{
// 568 version, rate arg is not used!
sprintf(NULL, "%d", rate); // Bodge to consume arg.
dp_disable_workaround();
dp_bGoodAuto = 0;
dp_count = 0;
*(unsigned short*)(x_status + 0x24) = *(unsigned short*)(x_status + 0x24) + 1;
dp_lapm_error_check_init();
if ((x_dsp_mars3 != 4) &&
(dp_read_dsp_ram(0x60) > 16))
dp_transmit_level(18);
dp_modem_command(15, 0, 0);
}
void dp_auto_rate (void)
{
printf("dp_auto_rate: Warning not yet implemented!\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -