?? portio.c,v
字號:
@d4 5a8 1 * Copyright 1999 Pavel Machek and R.J.M. Close, distribute under GPL
d20 2d104 2a105 1 WRITE_PORT_ULONG (PCIOutAddr, ecx);
d107 1a107 1 return (READ_PORT_ULONG (PCIInAddr));
d119 1a119 1 WRITE_PORT_ULONG (PCIOutAddr, dataOut);
d122 1a122 1 return (READ_PORT_USHORT (readPort));
d136 1a136 1 WRITE_PORT_ULONG (PCIOutAddr, eax);
d139 6a144 1 WRITE_PORT_ULONG (PCIInAddr, Value);
d150 1a150 1 WRITE_PORT_UCHAR ((BaseAddress + portOffset), value);
d156 1a156 1 WRITE_PORT_USHORT ((BaseAddress + portOffset), value);
d161 1a161 1 WRITE_PORT_UCHAR (BaseAddressIndex, BaseValue);
d164 1a164 1 WRITE_PORT_UCHAR (BaseAddressData, arg);
d169 2a170 2 WRITE_PORT_UCHAR (BaseAddressIndex, BaseValue);
return READ_PORT_UCHAR (BaseAddressData);
d201 2a202 2 WRITE_PORT_UCHAR(BaseAddress, port);
WRITE_PORT_UCHAR(BaseAddressData, val);
d208 2a209 2 WRITE_PORT_UCHAR(BaseAddress, port);
return READ_PORT_UCHAR(BaseAddressData);
d212 2a213 2 WRITE_PORT_UCHAR(BaseAddress + 2, port);
return READ_PORT_UCHAR(BaseAddressData);
d216 2a217 2 WRITE_PORT_UCHAR(BaseAddress, port);
return READ_PORT_UCHAR(BaseAddressData);
d219 2a220 2 WRITE_PORT_UCHAR(BaseAddress + 2, port);
return READ_PORT_UCHAR(BaseAddressData);
d288 2a289 1void dp_modem_command (unsigned int a0, unsigned int a4, unsigned int a8)
d291 21a311 20 if (1 /* FIXME */ || (a0 == 0x0c) || (a0 == 0x0e)) {
if (!(dp_dsp_regread(0xB5) && 1)) {
printf( "modem command: should read 0xb0?\n" );
dp_regread(0xB0);
}
/* 2EC73 */
if (!(dp_dsp_regread(0xB5) && 0x10)) {
printf("modem command: something active at 0xb5?\n");
dp_regwrite(0xB6, 0xEF);
dp_dsp_regread(0xB0);
dp_regwrite(0xB0, 0);
}
/* 2EC9B */
dp_regwrite(0xB7, 0xFF);
dp_regwrite(0xB6, 0xEE);
dp_bamil_rd7 = 0xF3;
dp_regwrite(0xD7, 0xF3);
expect_irq();
dp_dsp_data_in_progress = 0;
}
d315 1a315 1 dp_regwrite(0x37, a0);
d444 1a444 1 dp_change_mercury_gain (0, 2, byte_59F32, (byte_59F33 | 1));
d656 9a664 3 case 0x38: // loc_2E6A2 needs completing.
if (x_dsp_mars)
al = readbio(0x1120);
d666 2a667 2 al = readbio(0xffff);
break;
d670 11a680 1 break;
d683 1a683 1 break;
d686 1a686 1 die( "x_input: 0x%x - not implemented\n", arg );
d709 1a710 1 printf( "x_input: unimplemented %x\n", arg );
d769 1a769 1#if 0
d775 1a775 1 init_local_phone_timer();
a785 22void
process_v34(void)
{
printf( "Process v34?\n" );
#if 0
if (!(dp_int_regread(0xb6) & 0x10))
goto lE07;
if (byte_59ECB != 1)
goto lE02;
if (V34Mode != 0)
goto lE02;
io_dual_port_rx();
goto lE07;
lE02:
dual_port_rx();
lE07:
if (dp_int_regread(0xb6) & 1)
dual_port_tx();
#endif
}
d798 2d804 1d843 1a843 1 WRITE_PORT_UCHAR(BaseAddressIndex, BaseValue);
d847 1a847 1 WRITE_PORT_UCHAR(BaseAddressIndex, BaseValue);
d908 4a911 1 dp_change_mercury_gain(byte_59F30, byte_59F31, byte_59F32, byte_59F33);
d929 1d931 1d992 1a992 1 byte_59F33 &= ~al;
d998 1a998 1 byte_59F33 |= al;
a1005 12// Fake functions!
void expect_irq(void)
{
usleep(1000); // Wait 1 milliseconds.
// call ISR directly.
dp_dsp_isr();
}
//=================================================================
d1036 1d1041 1a1041 1 expect_irq(); // Bodge for use with 'soft' IRQ!
a1045 1 //return (time(NULL)-from) * 0x70;
a1050 1 expect_irq();
a1051 1 expect_irq();
d1054 1a1054 2void
wait_for_core_read(void)
d1056 8a1063 1 x_sleep(100);
d1106 1a1106 1 // Read reg D5h until result != 2, or time has exceeded 500 milliseconds.
d1109 4a1112 3 while (x_elapsed_time(startTime) < 0x1f4) {
if (dp_regread(0xd5) != 2) break;
}
a1117 1
d1121 94@1.2log@Revised for 0.0.6, added more code (especially x_output) and moved some stuff outto initialise and control.@text@d278 3a280 2 if (a0 != 0x0c) {
if (!(dp_dsp_regread(0xB5) && 1))
d282 1d285 1d295 1@1.1log@Initial revision
@text@a45 19volatile unsigned char dp_byte_f, dp_byte_e, dp_byte_d, dp_byte_c;
volatile unsigned int dp_bamil_rd7, dp_bamil_rbc, dp_dsp_data_in_progress, dp_sleep, dp_state;
bool CpqFlag = false;
bool x_dsp_mars = false;
int dp_cmd_timer;
unsigned char byte_59F18 = 0, byte_59EF3 = 0x12, byte_59EF4 = 0x50;
unsigned int x_chip_version = 0, dp_version;
unsigned char byte_59F30 = 0x88, byte_59F31 = 0x80, byte_59F32 = 0x6B, byte_59F33 = 0x1E; /* Mercury */
unsigned char byte_59E96 = 2, byte_59E97 = 1, byte_59F0B = 0x82, byte_59F04 = 2 /* or maybe 0? */,
byte_59F2D = 0, byte_59F2E = 0;
int dp_dialing_status = 0, dp_timer = 0, x_modem_mode = 0, x_status = 0;
// Assume inactive for now.
unsigned char cell_active = 0;
d49 1d58 2a59 1void port_io_init(unsigned int Portbase1, unsigned int Portbase2, bool IsMarsChipset)
a60 6
char chipMessage[3];
// Set the mars chipset flag.
x_dsp_mars = IsMarsChipset;
d62 1a62 6 portbase = Portbase2;
if (IsMarsChipset)
strcpy(chipMessage, "a");
else
strcpy(chipMessage, "no");
d64 3a66 3 printf( "Initialising with ports at %x and %x, with %s mars chipset detected.\n",
Portbase1, Portbase2, chipMessage );
printf( "Assuming portbase at %x\n", portbase );
d72 1a76 3 printf( "Initializing modem\n" );
dp_init_modem();
printf( "Modem init done\n" );
d147 1a147 1void dp_out_port (int arg) /* ??? This looks like having no args in disassembly */
d150 2d161 1a161 1void dp_regwrite (unsigned char val, unsigned int port)
d163 1a163 1 BaseValue = val;
d165 1a165 1 dp_out_port(port);
d168 1a168 1int dp_regread (unsigned int port)
d227 1d260 1d331 1d334 3a336 1 unsigned int ebx = 1;
d341 4a344 2 switch(arg) {
// 0002EAF0 off_2EAF0 dd offset loc_2E71C 0
d347 5a351 4 //set_boardid();
//x_set_hardware_options();
break;
// 0002EAF8 dd offset loc_2E73A
d353 5d360 3a362 2// 0002EAFC dd offset loc_2E740 2
case 2:
d366 10a375 5// 0002EB00 dd offset loc_2EAEA
case 3: case 4: case 5: return;
// 0002EB0C dd offset loc_2E706 6
// 0002EB10 dd offset loc_2E6F8
// 0002EB14 dd offset loc_2E7DC 8
d377 14a390 2 if (!x_dsp_mars)
die( "implement me: 2e7e6\n" );
d393 2a394 3
// 0002EB18 dd offset loc_2E7B8 9
// 0002EB1C dd offset off_2E7B1 10
d396 16a411 2 /* something _very_ strange */
/* 0x68, 0x30, 0x01, 0x00, (nop?!), */
d414 18a431 5
// 0002EB20 dd offset off_2E7AA 11
// 0002EB24 dd offset loc_2E74E 12
// 0002EB28 dd offset loc_2E77E 13
// 0002EB2C dd offset loc_2E9E4 14
d433 10a442 1 if (!byte_59F0B)
d444 1d447 1d454 5a458 5
// 0002EB30 dd offset loc_2EA07 15
/* Similar to 14 with minor difference! (, 1 -> , 0) */
case 15:
if (!byte_59F0B)
d460 1d463 1d471 1a471 2// 0002EB34 dd offset loc_2EA34 16
// 0002EB38 dd offset loc_2EA55 17
d473 10d484 26d511 70a580 4 if (CpqFlag == ((ebx & 0xff) > 0))
return;
// loc_2EABC:
writebio(0x302, ebx & 0xff);
d582 2a583 8 case 18: case 19: case 20: case 21: return;
// 0002EB4C dd offset loc_2E807 22
// 0002EB50 dd offset loc_2E89B
// 0002EB54 dd offset loc_2EACF 24
// 0002EB58 dd offset loc_2EAC3
// 0002EB5C dd offset loc_2EA72
// 0002EB60 dd offset loc_2EA7C 27
// 0002EB64 dd offset loc_2EA8D
d586 1a586 1 writebio(0x308, ebx);
d588 1a588 1 writebio(0x304, ebx);
d590 11a600 4
// 0002EB68 dd offset loc_2EA97 29
/* (hmm, like 28 but use ", 0" instead */
// 0002EB6C dd offset loc_2EAA8
d603 17a619 1 writebio(0xffff, ebx);
d621 1a621 1 writebio(0x308, ebx);
d624 4a627 11// 0002EB70 dd offset loc_2EAB2 31
case 32: case 33: case 36: case 37: return;
// 0002EB7C dd offset loc_2E9BA 34
// 0002EB80 dd offset loc_2E9BD 35
// 0002EB8C dd offset loc_2E9C8 38
// 0002EB90 dd offset loc_2E9CB
// 0002EB94 dd offset loc_2E9D9
// 0002EB98 dd offset loc_2E9D6
// 0002EB9C dd offset loc_2E964 42
// 0002EBA0 dd offset loc_2E99D
default: die( "x_output: %d - not implemented\n", arg );
d631 3a633 2int
x_input(int arg)
d680 8a691 10void go_offhook(void) /* Ouch, is it real command for going offhook? It looks like it is used only in some tests! */
{
printf( "Going offhook..." );
x_output(0x13);
x_output(0x11);
x_output(0x02);
dp_state = 0x14;
printf( "ok\n" );
}
d695 11a705 11 if (CpqFlag) {
if (ComAddress == BaseAddress) {
if ((word_59ED7 != 0xCCB0) && (word_59ED7 != 0xCDB0))
BaseAddress = 0xEC;
else
BaseAddress = 0xBC;
}
else if ((BaseAddress != 0xEC) && (BaseAddress != 0xBC))
BaseAddress = BaseAddress & 0xFFF8;
d732 1a732 88int
dp_init_modem(void)
{
dp_dsp_data_in_progress = 0;
dp_sleep = 0;
printf( "Enabling board\n" );
dp_board_enable();
dp_regwrite(0xd8, 0xff);
dp_regwrite(0xd7, 0xff);
dp_regwrite(0xcb, 8);
printf( "Sending commands" );
dp_modem_command(0x13, 0, 0);
printf( "." );
dp_modem_command(0x12, 0, 0);
printf( "." );
dp_modem_command_long(0x29, 0xff, 1, 0x87, 0);
printf( ":" );
dp_bamil_rbc |= 0xff;
dp_regwrite(0xbc, 0xff);
dp_regwrite(0xbd, 0xff);
dp_regwrite(0xbd, 0);
dp_regwrite(0xbe, 0);
dp_regwrite(0xb7, 0xff);
dp_regwrite(0xd8, 0xff);
dp_regwrite(0xb6, 0xee);
dp_bamil_rd7 = 0xf3;
dp_regwrite(0xd7, 0xf3);
x_sleep(0x64);
printf( "." );
dp_modem_command(0x13, 0, 0);
printf( "." );
dp_modem_command(0x2d, 0, 0);
printf( "." );
dp_modem_command_long(0x2e, 1, 0x23, 7, 0);
printf( "." );
dp_modem_command(0x13, 0, 0);
printf( "\n" );
dp_byte_f = 0;
dp_read_dsp_ram(0x3a);
dp_read_dsp_ram(0x3a);
if (dp_byte_f != 1) {
printf( "Init: read_dsp_ram did not set dsp_byte_f\n" );
return 0;
}
printf( "\nRom checksum is %x.\n", dp_dsp_rom_checksum() );
/* some code looking around rom checksums */
if (x_dsp_mars) {
int version;
version = dp_dsp_regread(0x0b);
printf( "\nChip version is %x (mars).\n", version );
x_chip_version = version>>6;
if (x_chip_version) {
dp_regwrite(0xa0, 0x21);
dp_regwrite(0xa4, 0);
}
}
x_output(0);
{
int shift = (byte_59F18 != 0);
dp_write_dsp_ram(0x40, byte_59EF3 >> shift);
dp_write_dsp_ram(0x41, byte_59EF4 >> shift);
}
dp_write_dsp_ram(0x43, 2);
if ((!x_chip_version) && (!x_dsp_mars)) {
/* ... */
}
/* ... */
if (x_dsp_mars == 1)
dp_modem_command_long(3, 0xc0, 0, 8, 0);
/* dp_tad_downloaded = dp_fax_downloaded = 0;
dp_init_local_phone_timer();
dp_first_call = 1; */
dp_set_mercury_gain();
printf( "Modem init complete\n" );
return 1;
}
void
process_ring(void)
d741 1a741 1 // init_local_phone_timer();
d785 6a790 1 printf( "[ ISR called, todo is %x]", todo );
d806 1d882 1a882 1 printf( "Change mercury gain: %x, %x, %x, %x =", a0, a4, a8, aC );
d886 1a886 1 printf( "%x\n", res );
d921 1a921 1 printf( "writebio(%x, %x)\n", val, strange);
a983 75unsigned char
dp_offhook_cmd(void)
{
int esi;
#if 0
if (cell_active)
{ ... }
dp_timer = x_current_time();
if (dp_ring_detected())
{ ... }
#endif
/* 2CFB8 */
if (byte_59E97) {
switch (byte_59E96) {
case 3: x_output(0x0b); break;
case 2: x_output(0x0a); break;
default: x_output(0x09); break;
}
dp_modem_command(0x13, 0, 0);
x_output(0x08);
}
x_output(0x0e);
x_output(0x11);
x_output(0x02);
if (byte_59F0B != 0xff)
x_output(0x0f);
if (((byte_59F04 != 0) && (dp_dialing_status == 0))) {
x_output(0x1c);
x_output(0x1e);
dp_timer = x_current_time();
esi = x_current_time();
while (1) {
if (x_elapsed_time(esi)>0x0a)
break;
if (!x_input(0x41))
continue;
esi = dp_timer = x_current_time();
if (x_elapsed_time(esi) < 0x50 /* strange_table_lookup()*/ )
continue;
x_output(0x03);
/* x_send_mail(7, 1, 0, 0); */
return 0;
}
/* 0A6 */
if (byte_59F2E)
x_output(0x1b);
if (byte_59F2D)
x_output(0x1d);
}
if ((x_modem_mode != 2) && (x_modem_mode != 3)) {
x_output(0x13);
/* at_init_diagnostics(); */
x_status = 0;
} else {
x_output(0x14);
if (CpqFlag)
x_output(0x0d);
}
/* 0FE */
if (byte_59F0B == 0xff) {
/* dp_init_local_phone_timer(); */
return 1;
}
dp_timer = x_current_time();
/* Ouch, another strange table lookup */
#if 0
if (maybe)
x_output(0x10);
#endif
return 1;
}
d990 2d1028 2d1032 1a1032 1 expect_irq(); // Why ? (not in machine code?)
d1040 1d1053 38a1090 1
d1092 4d1097 13@
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -