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); |