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