trunk/src/emu/machine/com8116.c
r22871 | r22872 | |
84 | 84 | |
85 | 85 | |
86 | 86 | //------------------------------------------------- |
| 87 | // device_reset - device-specific reset |
| 88 | //------------------------------------------------- |
| 89 | |
| 90 | void com8116_device::device_reset() |
| 91 | { |
| 92 | m_fr = 0; |
| 93 | m_ft = 0; |
| 94 | } |
| 95 | |
| 96 | |
| 97 | //------------------------------------------------- |
87 | 98 | // device_timer - handler timer events |
88 | 99 | //------------------------------------------------- |
89 | 100 | |
r22871 | r22872 | |
110 | 121 | // str_w - |
111 | 122 | //------------------------------------------------- |
112 | 123 | |
113 | | WRITE8_MEMBER( com8116_device::str_w ) |
| 124 | void com8116_device::str_w(UINT8 data) |
114 | 125 | { |
115 | | if (LOG) logerror("COM8116 '%s' Receiver Divider %01x\n", tag(), data & 0x0f); |
116 | | |
117 | 126 | m_fr = data & 0x0f; |
| 127 | int fr_clock = clock() / m_fr_divisors[m_fr]; |
118 | 128 | |
119 | | m_fr_timer->adjust(attotime::zero, 0, attotime::from_hz(clock() / m_fr_divisors[m_fr] / 2)); |
| 129 | if (LOG) logerror("COM8116 '%s' Receiver Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_fr_divisors[m_fr], fr_clock); |
| 130 | |
| 131 | m_fr_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(fr_clock)); |
120 | 132 | } |
121 | 133 | |
| 134 | WRITE8_MEMBER( com8116_device::str_w ) |
| 135 | { |
| 136 | str_w(data); |
| 137 | } |
122 | 138 | |
| 139 | |
123 | 140 | //------------------------------------------------- |
124 | 141 | // stt_w - |
125 | 142 | //------------------------------------------------- |
126 | 143 | |
127 | | WRITE8_MEMBER( com8116_device::stt_w ) |
| 144 | void com8116_device::stt_w(UINT8 data) |
128 | 145 | { |
129 | | if (LOG) logerror("COM8116 '%s' Transmitter Divider %01x\n", tag(), data & 0x0f); |
130 | | |
131 | 146 | m_ft = data & 0x0f; |
| 147 | int ft_clock = clock() / m_ft_divisors[m_ft]; |
132 | 148 | |
133 | | m_ft_timer->adjust(attotime::zero, 0, attotime::from_hz(clock() / m_ft_divisors[m_ft] / 2)); |
| 149 | if (LOG) logerror("COM8116 '%s' Transmitter Divisor Select %01x: %u (%u Hz)\n", tag(), data & 0x0f, m_ft_divisors[m_ft], ft_clock); |
| 150 | |
| 151 | m_ft_timer->adjust(attotime::from_nsec(3500), 0, attotime::from_hz(ft_clock)); |
134 | 152 | } |
| 153 | |
| 154 | WRITE8_MEMBER( com8116_device::stt_w ) |
| 155 | { |
| 156 | stt_w(data); |
| 157 | } |
trunk/src/emu/machine/com8116.h
r22871 | r22872 | |
42 | 42 | const com8116_interface (name) = |
43 | 43 | |
44 | 44 | |
| 45 | #define COM8116_DIVISORS_16X_5_0688MHz \ |
| 46 | { 6336, 4224, 2880, 2355, 2112, 1056, 528, 264, 176, 158, 132, 88, 66, 44, 33, 16 } |
45 | 47 | |
| 48 | #define COM8116_DIVISORS_16X_4_9152MHz \ |
| 49 | { 6144, 4096, 2793, 2284, 2048, 1024, 512, 256, 171, 154, 128, 85, 64, 43, 32, 16 } |
| 50 | |
| 51 | #define COM8116_DIVISORS_32X_5_0688MHz \ |
| 52 | { 3168, 2112, 1440, 1177, 1056, 792, 528, 264, 132, 88, 66, 44, 33, 22, 16, 8 } |
| 53 | |
| 54 | |
| 55 | |
46 | 56 | ///************************************************************************* |
47 | 57 | // TYPE DEFINITIONS |
48 | 58 | ///************************************************************************* |
r22871 | r22872 | |
72 | 82 | // construction/destruction |
73 | 83 | com8116_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
74 | 84 | |
| 85 | void str_w(UINT8 data); |
75 | 86 | DECLARE_WRITE8_MEMBER( str_w ); |
| 87 | void stt_w(UINT8 data); |
76 | 88 | DECLARE_WRITE8_MEMBER( stt_w ); |
77 | 89 | |
78 | 90 | protected: |
79 | 91 | // device-level overrides |
80 | 92 | virtual void device_config_complete(); |
81 | 93 | virtual void device_start(); |
| 94 | virtual void device_reset(); |
82 | 95 | virtual void device_timer(emu_timer &timer, device_timer_id id, int m_param, void *ptr); |
83 | 96 | |
84 | 97 | private: |
trunk/src/mess/machine/s100_dj2db.c
r22871 | r22872 | |
69 | 69 | DEVCB_NULL, |
70 | 70 | DEVCB_NULL, // S1602 RRC/TRC |
71 | 71 | DEVCB_NULL, |
72 | | { 6336, 4224, 2880, 2355, 2112, 1056, 528, 264, 176, 158, 132, 88, 66, 44, 33, 16 }, // from WD1943-00 datasheet |
73 | | { 6336, 4224, 2880, 2355, 2112, 1056, 528, 264, 176, 158, 132, 88, 66, 44, 33, 16 }, |
| 72 | COM8116_DIVISORS_16X_5_0688MHz, // receiver |
| 73 | COM8116_DIVISORS_16X_5_0688MHz // transmitter |
74 | 74 | }; |
75 | 75 | |
76 | 76 | |
trunk/src/mess/drivers/exp85.c
r22871 | r22872 | |
181 | 181 | |
182 | 182 | /* Terminal Interface */ |
183 | 183 | |
| 184 | static DEVICE_INPUT_DEFAULTS_START( terminal ) |
| 185 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x0f, 0x06 ) // 9600 |
| 186 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x30, 0x10 ) // 7E1 |
| 187 | DEVICE_INPUT_DEFAULTS_END |
| 188 | |
184 | 189 | static const serial_terminal_interface terminal_intf = |
185 | 190 | { |
186 | 191 | DEVCB_NULL |
r22871 | r22872 | |
227 | 232 | MCFG_I8155_ADD(I8155_TAG, XTAL_6_144MHz/2, i8155_intf) |
228 | 233 | MCFG_I8355_ADD(I8355_TAG, XTAL_6_144MHz/2, i8355_intf) |
229 | 234 | MCFG_CASSETTE_ADD("cassette", exp85_cassette_interface) |
230 | | MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, terminal_intf,9600) |
| 235 | MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, terminal_intf, 9600) |
| 236 | MCFG_DEVICE_INPUT_DEFAULTS(terminal) |
231 | 237 | |
232 | 238 | /* internal ram */ |
233 | 239 | MCFG_RAM_ADD(RAM_TAG) |
r22871 | r22872 | |
260 | 266 | |
261 | 267 | /* System Drivers */ |
262 | 268 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
263 | | COMP( 1979, exp85, 0, 0, exp85, exp85, driver_device, 0, "Netronics", "Explorer/85", GAME_NOT_WORKING ) |
| 269 | COMP( 1979, exp85, 0, 0, exp85, exp85, driver_device, 0, "Netronics", "Explorer/85", 0 ) |
trunk/src/mess/drivers/xerox820.c
r22871 | r22872 | |
502 | 502 | DEVCB_NULL, /* fX/4 output */ |
503 | 503 | DEVCB_NULL, /* fR output */ |
504 | 504 | DEVCB_NULL, /* fT output */ |
505 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* receiver divisor ROM */ |
506 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* transmitter divisor ROM */ |
| 505 | COM8116_DIVISORS_16X_5_0688MHz, // receiver |
| 506 | COM8116_DIVISORS_16X_5_0688MHz // transmitter |
507 | 507 | }; |
508 | 508 | |
509 | 509 | WRITE8_MEMBER( xerox820_state::kbd_w ) |
trunk/src/mess/drivers/kaypro.c
r22871 | r22872 | |
175 | 175 | DEVCB_NULL, /* fX/4 output */ |
176 | 176 | DEVCB_NULL, // DEVCB_DEVICE_LINE("z80sio", rx_tx_a_w), z80sio implementation has no clock pin |
177 | 177 | DEVCB_NULL, // DEVCB_DEVICE_LINE("z80sio", rx_tx_b_w), |
178 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* receiver divisor ROM */ |
179 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* transmitter divisor ROM */ |
| 178 | COM8116_DIVISORS_16X_5_0688MHz, // receiver |
| 179 | COM8116_DIVISORS_16X_5_0688MHz // transmitter |
180 | 180 | }; |
181 | 181 | |
182 | 182 | static COM8116_INTERFACE( kaypro2x_brg_intf ) |
r22871 | r22872 | |
184 | 184 | DEVCB_NULL, /* fX/4 output */ |
185 | 185 | DEVCB_NULL,//DEVCB_DEVICE_LINE("z80sio", rx_tx_a_w), |
186 | 186 | DEVCB_NULL,//DEVCB_DEVICE_LINE("z80sio_2x", rx_tx_a_w), |
187 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* receiver divisor ROM */ |
188 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* transmitter divisor ROM */ |
| 187 | COM8116_DIVISORS_16X_5_0688MHz, // receiver |
| 188 | COM8116_DIVISORS_16X_5_0688MHz // transmitter |
189 | 189 | }; |
190 | 190 | |
191 | 191 | |
trunk/src/mess/drivers/super6.c
r22871 | r22872 | |
255 | 255 | |
256 | 256 | */ |
257 | 257 | |
258 | | m_brg->str_w(space, 0, data & 0x0f); |
259 | | m_brg->stt_w(space, 0, data >> 4); |
| 258 | m_brg->str_w(data & 0x0f); |
| 259 | m_brg->stt_w(data >> 4); |
260 | 260 | } |
261 | 261 | |
262 | 262 | |
r22871 | r22872 | |
305 | 305 | |
306 | 306 | static INPUT_PORTS_START( super6 ) |
307 | 307 | PORT_START("J7") |
308 | | PORT_DIPNAME( 0x0f, 0x0e, "SIO Channel A Baud Rate" ) PORT_DIPLOCATION("J7:1,2,3,4") |
| 308 | PORT_DIPNAME( 0x0f, 0x0f, "SIO Channel A Baud Rate" ) PORT_DIPLOCATION("J7:1,2,3,4") |
309 | 309 | PORT_DIPSETTING( 0x00, "50" ) |
310 | 310 | PORT_DIPSETTING( 0x01, "75" ) |
311 | 311 | PORT_DIPSETTING( 0x02, "110" ) |
r22871 | r22872 | |
460 | 460 | DEVCB_NULL, |
461 | 461 | DEVCB_DRIVER_LINE_MEMBER(super6_state, fr_w), |
462 | 462 | DEVCB_DEVICE_LINE(Z80DART_TAG, z80dart_rxtxcb_w), |
463 | | { 6336, 4224, 2880, 2355, 2112, 1056, 528, 264, 176, 158, 132, 88, 66, 44, 33, 16 }, // from WD1943-00 datasheet |
464 | | { 6336, 4224, 2880, 2355, 2112, 1056, 528, 264, 176, 158, 132, 88, 66, 44, 33, 16 }, |
| 463 | COM8116_DIVISORS_16X_5_0688MHz, // receiver |
| 464 | COM8116_DIVISORS_16X_5_0688MHz // transmitter |
465 | 465 | }; |
466 | 466 | |
467 | 467 | |
r22871 | r22872 | |
505 | 505 | // GENERIC_TERMINAL_INTERFACE( terminal_intf ) |
506 | 506 | //------------------------------------------------- |
507 | 507 | |
| 508 | static DEVICE_INPUT_DEFAULTS_START( terminal ) |
| 509 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x0f, 0x08 ) // 19200 |
| 510 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x30, 0x00 ) // 8N1 |
| 511 | DEVICE_INPUT_DEFAULTS_END |
| 512 | |
508 | 513 | WRITE8_MEMBER( super6_state::dummy_w ) |
509 | 514 | { |
510 | 515 | // handled in Z80DART_INTERFACE |
r22871 | r22872 | |
547 | 552 | m_bank0 = m_bank1 = 0; |
548 | 553 | |
549 | 554 | bankswitch(); |
| 555 | |
| 556 | UINT8 baud = m_j7->read(); |
| 557 | |
| 558 | m_brg->str_w(baud & 0x0f); |
| 559 | m_brg->stt_w((baud >> 4) & 0x07); |
550 | 560 | } |
551 | 561 | |
552 | 562 | |
r22871 | r22872 | |
576 | 586 | MCFG_COM8116_ADD(BR1945_TAG, XTAL_5_0688MHz, brg_intf) |
577 | 587 | MCFG_FLOPPY_DRIVE_ADD(WD2793_TAG":0", super6_floppies, "525dd", NULL, floppy_image_device::default_floppy_formats) |
578 | 588 | MCFG_FLOPPY_DRIVE_ADD(WD2793_TAG":1", super6_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) |
579 | | MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, terminal_intf, 4800) |
| 589 | MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, terminal_intf, 19200) |
| 590 | MCFG_DEVICE_INPUT_DEFAULTS(terminal) |
580 | 591 | |
581 | 592 | // internal ram |
582 | 593 | MCFG_RAM_ADD(RAM_TAG) |
trunk/src/mess/drivers/xor100.c
r22871 | r22872 | |
149 | 149 | |
150 | 150 | WRITE8_MEMBER( xor100_state::baud_w ) |
151 | 151 | { |
152 | | m_dbrg->str_w(space, 0, data & 0x0f); |
153 | | m_dbrg->stt_w(space, 0, data >> 4); |
| 152 | m_dbrg->str_w(data & 0x0f); |
| 153 | m_dbrg->stt_w(data >> 4); |
154 | 154 | } |
155 | 155 | |
156 | 156 | WRITE8_MEMBER( xor100_state::i8251_b_data_w ) |
r22871 | r22872 | |
378 | 378 | DEVCB_NULL, /* fX/4 output */ |
379 | 379 | DEVCB_DRIVER_LINE_MEMBER(xor100_state, com5016_fr_w), /* fR output */ |
380 | 380 | DEVCB_DRIVER_LINE_MEMBER(xor100_state, com5016_ft_w), /* fT output */ |
381 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, // WRONG? |
382 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, // WRONG? |
| 381 | COM8116_DIVISORS_16X_5_0688MHz, // receiver |
| 382 | COM8116_DIVISORS_16X_5_0688MHz // transmitter |
383 | 383 | }; |
384 | 384 | |
385 | 385 | /* Printer 8251A Interface */ |
r22871 | r22872 | |
590 | 590 | MCFG_I8251_ADD(I8251_B_TAG, /*XTAL_8MHz/2,*/ terminal_8251_intf) |
591 | 591 | MCFG_I8255A_ADD(I8255A_TAG, printer_8255_intf) |
592 | 592 | MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_8MHz/2, ctc_intf) |
593 | | MCFG_COM8116_ADD(COM5016_TAG, 5000000, com5016_intf) |
| 593 | MCFG_COM8116_ADD(COM5016_TAG, XTAL_5_0688MHz, com5016_intf) |
594 | 594 | MCFG_FD1795x_ADD(WD1795_TAG, XTAL_8MHz/4) |
595 | 595 | MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":0", xor100_floppies, "8ssdd", NULL, floppy_image_device::default_floppy_formats) |
596 | 596 | MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":1", xor100_floppies, "8ssdd", NULL, floppy_image_device::default_floppy_formats) |
trunk/src/mess/drivers/ob68k1a.c
r22871 | r22872 | |
51 | 51 | |
52 | 52 | TODO: |
53 | 53 | |
54 | | - COM8116 dividers are wrong |
55 | 54 | - interrupts |
56 | 55 | - configuration switches |
57 | 56 | - PIA odd/even byte access |
r22871 | r22872 | |
73 | 72 | |
74 | 73 | WRITE8_MEMBER( ob68k1a_state::com8116_w ) |
75 | 74 | { |
76 | | m_dbrg->stt_w(space, 0, data & 0x0f); |
77 | | m_dbrg->str_w(space, 0, data >> 4); |
| 75 | m_dbrg->stt_w(data & 0x0f); |
| 76 | m_dbrg->str_w(data >> 4); |
78 | 77 | } |
79 | 78 | |
80 | 79 | |
r22871 | r22872 | |
205 | 204 | DEVCB_NULL |
206 | 205 | }; |
207 | 206 | |
| 207 | |
208 | 208 | //------------------------------------------------- |
209 | 209 | // ACIA6850_INTERFACE( acia0_intf ) |
210 | 210 | //------------------------------------------------- |
211 | 211 | |
212 | 212 | static ACIA6850_INTERFACE( acia0_intf ) |
213 | 213 | { |
214 | | 9600*16, // HACK for terminal |
215 | | 9600*16, // HACK for terminal |
| 214 | 0, |
| 215 | 0, |
216 | 216 | DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, serial_port_device, rx), |
217 | 217 | DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, serial_port_device, tx), |
218 | | DEVCB_LINE_GND, // HACK for terminal |
| 218 | DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, cts_r), |
219 | 219 | DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, rs232_port_device, rts_w), |
220 | | DEVCB_LINE_GND, // HACK for terminal |
| 220 | DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, dcd_r), |
221 | 221 | DEVCB_NULL |
222 | 222 | }; |
223 | 223 | |
r22871 | r22872 | |
260 | 260 | DEVCB_NULL, /* fX/4 output */ |
261 | 261 | DEVCB_DRIVER_LINE_MEMBER(ob68k1a_state, rx_tx_0_w), |
262 | 262 | DEVCB_DRIVER_LINE_MEMBER(ob68k1a_state, rx_tx_1_w), |
263 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* receiver divisor ROM */ |
264 | | { 101376, 67584, 46080, 37686, 33792, 16896, 8448, 4224, 2816, 2534, 2112, 1408, 1056, 704, 528, 264 }, /* transmitter divisor ROM */ |
| 263 | COM8116_DIVISORS_16X_5_0688MHz, // receiver |
| 264 | COM8116_DIVISORS_16X_5_0688MHz // transmitter |
265 | 265 | }; |
266 | 266 | |
267 | 267 | |
r22871 | r22872 | |
322 | 322 | |
323 | 323 | void ob68k1a_state::machine_reset() |
324 | 324 | { |
325 | | address_space &program = m_maincpu->space(AS_PROGRAM); |
326 | | |
327 | 325 | // initialize COM8116 |
328 | | com8116_w(program, 0, 0xee); |
329 | | // m_dbrg->stt_w(program, 0, 0x01); |
330 | | // m_dbrg->str_w(program, 0, 0x01); |
| 326 | m_dbrg->stt_w(0x0e); |
| 327 | m_dbrg->str_w(0x0e); |
331 | 328 | |
332 | 329 | // set reset vector |
333 | | void *ram = program.get_write_ptr(0); |
| 330 | void *ram = m_maincpu->space(AS_PROGRAM).get_write_ptr(0); |
334 | 331 | UINT8 *rom = memregion(MC68000L10_TAG)->base(); |
335 | 332 | |
336 | 333 | memcpy(ram, rom, 8); |