⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 control.c

📁 话带数据中传真解调程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -