PCem
view src/um8669f.c @ 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 | 923b243eba54 |
| children |
line source
1 /*um8669f :
3 aa to 108 unlocks
4 next 108 write is register select (Cx?)
5 data read/write to 109
6 55 to 108 locks
11 C0
12 bit 3 = LPT1 enable
13 bit 2 = COM2 enable
14 bit 1 = COM1 enable
15 bit 0 = FDC enable
17 C1
18 bits 7-6 = LPT1 mode : 11 = ECP/EPP, 01 = EPP, 10 = SPP
19 bit 3 = clear when LPT1 = 278
21 C3
22 bits 7-6 = LPT1 DMA mode : 11 = ECP/EPP DMA1, 10 = ECP/EPP DMA3, 01 = EPP/SPP, 00 = ECP
23 bits 5-4 = LPT1 addr : 10 = 278/IRQ5, 01 = 3BC/IRQ7, 00 = 378/IRQ7
25 COM1 :
26 3f8, IRQ4 - C1 = BF, C3 = 00
27 2f8, IRQ3 - C1 = BF, C3 = 03
28 3e8, IRQ4 - C1 = BD, C3 = 00
29 2e8, IRQ3 - B1 = BD, C3 = 03
31 COM2 :
32 3f8, IRQ4 - C1 = BF, C3 = 0C
33 2f8, IRQ3 - C1 = BF, C3 = 00
34 3e8, IRQ4 - C1 = BB, C3 = 0C
35 2e8, IRQ3 - C1 = BB, C3 = 00
37 */
39 #include "ibm.h"
41 #include "fdc.h"
42 #include "io.h"
43 #include "lpt.h"
44 #include "mouse_serial.h"
45 #include "serial.h"
46 #include "um8669f.h"
48 static int um8669f_locked;
49 static int um8669f_curreg;
50 static uint8_t um8669f_regs[256];
52 void um8669f_write(uint16_t port, uint8_t val, void *priv)
53 {
54 int temp;
55 // pclog("um8669f_write : port=%04x reg %02X = %02X locked=%i\n", port, um8669f_curreg, val, um8669f_locked);
56 if (um8669f_locked)
57 {
58 if (port == 0x108 && val == 0xaa)
59 um8669f_locked = 0;
60 }
61 else
62 {
63 if (port == 0x108)
64 {
65 if (val == 0x55)
66 um8669f_locked = 1;
67 else
68 um8669f_curreg = val;
69 }
70 else
71 {
72 um8669f_regs[um8669f_curreg] = val;
74 fdc_remove();
75 if (um8669f_regs[0xc0] & 1)
76 fdc_add();
78 if (um8669f_regs[0xc0] & 2)
79 {
80 temp = um8669f_regs[0xc3] & 1; /*might be & 2*/
81 if (!(um8669f_regs[0xc1] & 2))
82 temp |= 2;
83 switch (temp)
84 {
85 case 0: serial1_set(0x3f8, 4); break;
86 case 1: serial1_set(0x2f8, 4); break;
87 case 2: serial1_set(0x3e8, 4); break;
88 case 3: serial1_set(0x2e8, 4); break;
89 }
90 }
92 if (um8669f_regs[0xc0] & 4)
93 {
94 temp = (um8669f_regs[0xc3] & 4) ? 0 : 1; /*might be & 8*/
95 if (!(um8669f_regs[0xc1] & 4))
96 temp |= 2;
97 switch (temp)
98 {
99 case 0: serial2_set(0x3f8, 3); break;
100 case 1: serial2_set(0x2f8, 3); break;
101 case 2: serial2_set(0x3e8, 3); break;
102 case 3: serial2_set(0x2e8, 3); break;
103 }
104 }
106 mouse_serial_init();
108 lpt1_remove();
109 lpt2_remove();
110 temp = (um8669f_regs[0xc3] >> 4) & 3;
111 switch (temp)
112 {
113 case 0: lpt1_init(0x378); break;
114 case 1: lpt1_init(0x3bc); break;
115 case 2: lpt1_init(0x278); break;
116 }
117 }
118 }
119 }
121 uint8_t um8669f_read(uint16_t port, void *priv)
122 {
123 // pclog("um8669f_read : port=%04x reg %02X locked=%i\n", port, um8669f_curreg, um8669f_locked);
124 if (um8669f_locked)
125 return 0xff;
127 if (port == 0x108)
128 return um8669f_curreg; /*???*/
129 else
130 return um8669f_regs[um8669f_curreg];
131 }
133 void um8669f_init()
134 {
135 io_sethandler(0x0108, 0x0002, um8669f_read, NULL, NULL, um8669f_write, NULL, NULL, NULL);
136 um8669f_locked = 1;
137 }
