PCem

changeset 30:3afc5d31f5dc

Fixed some stupid serial issues - reading interrupt enable mask now works, and has an effect, and reading data when FIFO empty now returns last value instead of zero. Windows 9x setup now detects serial mouse correctly.
author TomW
date Sat Nov 02 19:38:59 2013 +0000
parents 626d3074b545
children 08a942c94a1d
files src/mouse_serial.c src/serial.c src/serial.h
diffstat 3 files changed, 16 insertions(+), 13 deletions(-) [+]
line diff
     1.1 --- a/src/mouse_serial.c	Thu Oct 31 19:57:25 2013 +0000
     1.2 +++ b/src/mouse_serial.c	Sat Nov 02 19:38:59 2013 +0000
     1.3 @@ -58,7 +58,6 @@
     1.4                  serial.linestat|=1;
     1.5                  if (serial.mctrl&8) picint(0x10);
     1.6          }
     1.7 -//        printf("Mouse callback\n");
     1.8  }
     1.9  
    1.10  void mouse_serial_init()
     2.1 --- a/src/serial.c	Thu Oct 31 19:57:25 2013 +0000
     2.2 +++ b/src/serial.c	Sat Nov 02 19:38:59 2013 +0000
     2.3 @@ -29,17 +29,20 @@
     2.4          if (!(serial.linestat & 1))
     2.5          {
     2.6                  serial.linestat|=1;
     2.7 -                if (serial.mctrl&8) picint(0x10);
     2.8 +                if ((serial.mctrl & 8) && (serial.ier & 1))
     2.9 +                        picint(0x10);
    2.10                  serial.iir=4;
    2.11          }
    2.12  }
    2.13  
    2.14  uint8_t serial_read_fifo()
    2.15  {
    2.16 -        uint8_t temp = serial_fifo[serial_fifo_read];
    2.17          if (serial_fifo_read != serial_fifo_write)
    2.18 -           serial_fifo_read = (serial_fifo_read + 1) & 0xFF;
    2.19 -        return temp;
    2.20 +        {
    2.21 +                serial.dat = serial_fifo[serial_fifo_read];
    2.22 +                serial_fifo_read = (serial_fifo_read + 1) & 0xFF;
    2.23 +        }
    2.24 +        return serial.dat;
    2.25  }
    2.26  
    2.27  void sendserial(uint8_t dat)
    2.28 @@ -52,7 +55,7 @@
    2.29  
    2.30  void serial_write(uint16_t addr, uint8_t val, void *priv)
    2.31  {
    2.32 -//        printf("Write serial %03X %02X %04X:%04X\n",addr,val,CS,pc);
    2.33 +//        pclog("Write serial %03X %02X %04X:%04X\n",addr,val,CS,pc);
    2.34          switch (addr&7)
    2.35          {
    2.36                  case 0:
    2.37 @@ -84,7 +87,7 @@
    2.38                  {
    2.39                          if (serial_rcr)
    2.40                             serial_rcr();
    2.41 -//                        printf("RCR raised! sending M\n");
    2.42 +//                        pclog("RCR raised! sending M\n");
    2.43                  }
    2.44                  serial.mctrl=val;
    2.45                  break;
    2.46 @@ -94,7 +97,7 @@
    2.47  uint8_t serial_read(uint16_t addr, void *priv)
    2.48  {
    2.49          uint8_t temp;
    2.50 -//        printf("Read serial %03X %04X(%08X):%04X %i %i  ", addr, CS, cs, pc, mousedelay, ins);
    2.51 +//        pclog("Read serial %03X %04X(%08X):%04X %i %i  ", addr, CS, cs, pc, mousedelay, ins);
    2.52          switch (addr&7)
    2.53          {
    2.54                  case 0:
    2.55 @@ -112,7 +115,7 @@
    2.56                  break;
    2.57                  case 1:
    2.58                  if (serial.lcr&0x80 && !AMSTRADIO) temp = serial.dlab2;
    2.59 -                else                               temp = 0;
    2.60 +                else                               temp = serial.ier;
    2.61                  break;
    2.62                  case 2: temp=serial.iir; break;
    2.63                  case 3: temp=serial.lcr; break;
    2.64 @@ -120,13 +123,13 @@
    2.65                  case 5: temp=serial.linestat; serial.linestat|=0x60; break;
    2.66                  default: temp=0;
    2.67          }
    2.68 -//        printf("%02X\n",temp);
    2.69 +//        pclog("%02X\n",temp);
    2.70          return temp;
    2.71  }
    2.72  
    2.73  void serial2_write(uint16_t addr, uint8_t val, void *priv)
    2.74  {
    2.75 -//        printf("Write serial2 %03X %02X %04X:%04X\n",addr,val,cs>>4,pc);
    2.76 +//        pclog("Write serial2 %03X %02X %04X:%04X\n",addr,val,cs>>4,pc);
    2.77          switch (addr&7)
    2.78          {
    2.79                  case 0:
    2.80 @@ -161,7 +164,7 @@
    2.81  uint8_t serial2_read(uint16_t addr, void *priv)
    2.82  {
    2.83          uint8_t temp;
    2.84 -//        printf("Read serial2 %03X %04X:%04X\n",addr,cs>>4,pc);
    2.85 +//        pclog("Read serial2 %03X %04X:%04X\n",addr,cs>>4,pc);
    2.86          switch (addr&7)
    2.87          {
    2.88                  case 0:
    2.89 @@ -180,7 +183,7 @@
    2.90                  case 5: temp=serial2.linestat; break;
    2.91                  default: temp=0;
    2.92          }
    2.93 -//        printf("%02X\n",temp);
    2.94 +//        pclog("%02X\n",temp);
    2.95          return temp;
    2.96  }
    2.97  
     3.1 --- a/src/serial.h	Thu Oct 31 19:57:25 2013 +0000
     3.2 +++ b/src/serial.h	Sat Nov 02 19:38:59 2013 +0000
     3.3 @@ -8,6 +8,7 @@
     3.4  {
     3.5          uint8_t linestat,thr,mctrl,rcr,iir,ier,lcr;
     3.6          uint8_t dlab1,dlab2;
     3.7 +        uint8_t dat;
     3.8  } SERIAL;
     3.9  
    3.10  extern SERIAL serial,serial2;