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
