PCem
changeset 139:eee628bf93de
Serial controller is no longer reset when serial port/IRQ updated - fixes mouse on 430VX in Windows 98.
| author | TomW |
|---|---|
| date | Thu Jul 31 15:57:24 2014 +0100 |
| parents | 528f6c46c324 |
| children | 3bf6c44c8166 |
| files | src/serial.c src/serial.h src/um8669f.c src/wd76c10.c |
| diffstat | 4 files changed, 32 insertions(+), 22 deletions(-) [+] |
line diff
1.1 --- a/src/serial.c Mon Jul 28 21:14:13 2014 +0100 1.2 +++ b/src/serial.c Thu Jul 31 15:57:24 2014 +0100 1.3 @@ -249,6 +249,12 @@ 1.4 serial1.rcr_callback = NULL; 1.5 timer_add(serial_recieve_callback, &serial1.recieve_delay, &serial1.recieve_delay, &serial1); 1.6 } 1.7 +void serial1_set(uint16_t addr, int irq) 1.8 +{ 1.9 + serial1_remove(); 1.10 + io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial1); 1.11 + serial1.irq = irq; 1.12 +} 1.13 void serial1_remove() 1.14 { 1.15 io_removehandler(0x2e8, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial1); 1.16 @@ -265,6 +271,12 @@ 1.17 serial2.rcr_callback = NULL; 1.18 timer_add(serial_recieve_callback, &serial2.recieve_delay, &serial2.recieve_delay, &serial2); 1.19 } 1.20 +void serial2_set(uint16_t addr, int irq) 1.21 +{ 1.22 + serial2_remove(); 1.23 + io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial2); 1.24 + serial2.irq = irq; 1.25 +} 1.26 void serial2_remove() 1.27 { 1.28 io_removehandler(0x2e8, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial2);
2.1 --- a/src/serial.h Mon Jul 28 21:14:13 2014 +0100 2.2 +++ b/src/serial.h Thu Jul 31 15:57:24 2014 +0100 2.3 @@ -1,5 +1,7 @@ 2.4 void serial1_init(uint16_t addr, int irq); 2.5 void serial2_init(uint16_t addr, int irq); 2.6 +void serial1_set(uint16_t addr, int irq); 2.7 +void serial2_set(uint16_t addr, int irq); 2.8 void serial1_remove(); 2.9 void serial2_remove(); 2.10 void serial_reset();
3.1 --- a/src/um8669f.c Mon Jul 28 21:14:13 2014 +0100 3.2 +++ b/src/um8669f.c Thu Jul 31 15:57:24 2014 +0100 3.3 @@ -52,6 +52,7 @@ 3.4 void um8669f_write(uint16_t port, uint8_t val, void *priv) 3.5 { 3.6 int temp; 3.7 +// pclog("um8669f_write : port=%04x reg %02X = %02X locked=%i\n", port, um8669f_curreg, val, um8669f_locked); 3.8 if (um8669f_locked) 3.9 { 3.10 if (port == 0x108 && val == 0xaa) 3.11 @@ -69,13 +70,11 @@ 3.12 else 3.13 { 3.14 um8669f_regs[um8669f_curreg] = val; 3.15 - pclog("um8669f_write : reg %02X = %02X\n", um8669f_curreg, val); 3.16 3.17 fdc_remove(); 3.18 if (um8669f_regs[0xc0] & 1) 3.19 fdc_add(); 3.20 3.21 - serial1_remove(); 3.22 if (um8669f_regs[0xc0] & 2) 3.23 { 3.24 temp = um8669f_regs[0xc3] & 1; /*might be & 2*/ 3.25 @@ -83,14 +82,13 @@ 3.26 temp |= 2; 3.27 switch (temp) 3.28 { 3.29 - case 0: serial1_init(0x3f8, 4); break; 3.30 - case 1: serial1_init(0x2f8, 4); break; 3.31 - case 2: serial1_init(0x3e8, 4); break; 3.32 - case 3: serial1_init(0x2e8, 4); break; 3.33 + case 0: serial1_set(0x3f8, 4); break; 3.34 + case 1: serial1_set(0x2f8, 4); break; 3.35 + case 2: serial1_set(0x3e8, 4); break; 3.36 + case 3: serial1_set(0x2e8, 4); break; 3.37 } 3.38 } 3.39 3.40 - serial2_remove(); 3.41 if (um8669f_regs[0xc0] & 4) 3.42 { 3.43 temp = (um8669f_regs[0xc3] & 4) ? 0 : 1; /*might be & 8*/ 3.44 @@ -98,10 +96,10 @@ 3.45 temp |= 2; 3.46 switch (temp) 3.47 { 3.48 - case 0: serial2_init(0x3f8, 3); break; 3.49 - case 1: serial2_init(0x2f8, 3); break; 3.50 - case 2: serial2_init(0x3e8, 3); break; 3.51 - case 3: serial2_init(0x2e8, 3); break; 3.52 + case 0: serial2_set(0x3f8, 3); break; 3.53 + case 1: serial2_set(0x2f8, 3); break; 3.54 + case 2: serial2_set(0x3e8, 3); break; 3.55 + case 3: serial2_set(0x2e8, 3); break; 3.56 } 3.57 } 3.58 3.59 @@ -122,6 +120,7 @@ 3.60 3.61 uint8_t um8669f_read(uint16_t port, void *priv) 3.62 { 3.63 +// pclog("um8669f_read : port=%04x reg %02X locked=%i\n", port, um8669f_curreg, um8669f_locked); 3.64 if (um8669f_locked) 3.65 return 0xff; 3.66
4.1 --- a/src/wd76c10.c Mon Jul 28 21:14:13 2014 +0100 4.2 +++ b/src/wd76c10.c Thu Jul 31 15:57:24 2014 +0100 4.3 @@ -44,22 +44,19 @@ 4.4 case 0x2072: 4.5 wd76c10_2072 = val; 4.6 4.7 - serial1_remove(); 4.8 - serial2_remove(); 4.9 - 4.10 switch ((val >> 5) & 7) 4.11 { 4.12 - case 1: serial1_init(0x3f8, 4); break; 4.13 - case 2: serial1_init(0x2f8, 4); break; 4.14 - case 3: serial1_init(0x3e8, 4); break; 4.15 - case 4: serial1_init(0x2e8, 4); break; 4.16 + case 1: serial1_set(0x3f8, 4); break; 4.17 + case 2: serial1_set(0x2f8, 4); break; 4.18 + case 3: serial1_set(0x3e8, 4); break; 4.19 + case 4: serial1_set(0x2e8, 4); break; 4.20 } 4.21 switch ((val >> 1) & 7) 4.22 { 4.23 - case 1: serial2_init(0x3f8, 3); break; 4.24 - case 2: serial2_init(0x2f8, 3); break; 4.25 - case 3: serial2_init(0x3e8, 3); break; 4.26 - case 4: serial2_init(0x2e8, 3); break; 4.27 + case 1: serial2_set(0x3f8, 3); break; 4.28 + case 2: serial2_set(0x2f8, 3); break; 4.29 + case 3: serial2_set(0x3e8, 3); break; 4.30 + case 4: serial2_set(0x2e8, 3); break; 4.31 } 4.32 break; 4.33
