trunk/src/mess/drivers/wicat.c
| r26553 | r26554 | |
| 10 | 10 | |
| 11 | 11 | #include "emu.h" |
| 12 | 12 | #include "cpu/m68000/m68000.h" |
| 13 | | #include "machine/terminal.h" |
| 13 | #include "cpu/z8000/z8000.h" |
| 14 | #include "machine/serial.h" |
| 14 | 15 | #include "machine/6522via.h" |
| 15 | 16 | #include "machine/mm58274c.h" |
| 16 | 17 | #include "machine/mc2661.h" |
| 18 | #include "machine/im6402.h" |
| 19 | #include "video/i8275x.h" |
| 20 | #include "machine/am9517a.h" |
| 17 | 21 | #include "wicat.lh" |
| 18 | 22 | |
| 19 | 23 | class wicat_state : public driver_device |
| r26553 | r26554 | |
| 21 | 25 | public: |
| 22 | 26 | wicat_state(const machine_config &mconfig, device_type type, const char *tag) |
| 23 | 27 | : driver_device(mconfig, type, tag) |
| 24 | | // , m_p_base(*this, "rambase") |
| 28 | , m_vram(*this, "vram") |
| 25 | 29 | , m_maincpu(*this, "maincpu") |
| 26 | | , m_terminal(*this, TERMINAL_TAG) |
| 27 | 30 | , m_rtc(*this, "rtc") |
| 28 | 31 | , m_uart0(*this,"uart0") |
| 29 | 32 | , m_uart1(*this,"uart1") |
| r26553 | r26554 | |
| 32 | 35 | , m_uart4(*this,"uart4") |
| 33 | 36 | , m_uart5(*this,"uart5") |
| 34 | 37 | , m_uart6(*this,"uart6") |
| 38 | , m_videocpu(*this,"videocpu") |
| 39 | , m_videoctrl(*this,"video") |
| 40 | , m_videodma(*this,"videodma") |
| 35 | 41 | { } |
| 36 | 42 | |
| 37 | 43 | //DECLARE_WRITE8_MEMBER(kbd_put); |
| r26553 | r26554 | |
| 43 | 49 | DECLARE_READ8_MEMBER(via_b_r); |
| 44 | 50 | DECLARE_WRITE8_MEMBER(via_a_w); |
| 45 | 51 | DECLARE_WRITE8_MEMBER(via_b_w); |
| 52 | DECLARE_READ8_MEMBER(video_r); |
| 53 | DECLARE_WRITE8_MEMBER(video_w); |
| 54 | |
| 55 | UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return 0; } |
| 46 | 56 | private: |
| 47 | 57 | UINT8 m_term_data; |
| 48 | 58 | virtual void machine_start(); |
| 49 | 59 | virtual void machine_reset(); |
| 50 | | // required_shared_ptr<UINT16> m_p_base; |
| 60 | required_shared_ptr<UINT8> m_vram; |
| 51 | 61 | required_device<cpu_device> m_maincpu; |
| 52 | | required_device<serial_terminal_device> m_terminal; |
| 53 | 62 | required_device<mm58274c_device> m_rtc; |
| 54 | 63 | required_device<mc2661_device> m_uart0; |
| 55 | 64 | required_device<mc2661_device> m_uart1; |
| r26553 | r26554 | |
| 58 | 67 | required_device<mc2661_device> m_uart4; |
| 59 | 68 | required_device<mc2661_device> m_uart5; |
| 60 | 69 | required_device<mc2661_device> m_uart6; |
| 70 | required_device<cpu_device> m_videocpu; |
| 71 | required_device<i8275x_device> m_videoctrl; |
| 72 | required_device<am9517a_device> m_videodma; |
| 61 | 73 | |
| 62 | 74 | UINT8 m_portA; |
| 63 | 75 | UINT8 m_portB; |
| r26553 | r26554 | |
| 67 | 79 | static ADDRESS_MAP_START(wicat_mem, AS_PROGRAM, 16, wicat_state) |
| 68 | 80 | ADDRESS_MAP_UNMAP_HIGH |
| 69 | 81 | ADDRESS_MAP_GLOBAL_MASK(0xffffff) |
| 70 | | // AM_RANGE(0x000000, 0x01efff) AM_RAM AM_SHARE("rambase") |
| 71 | 82 | AM_RANGE(0x000000, 0x001fff) AM_ROM AM_REGION("c2", 0x0000) |
| 72 | 83 | AM_RANGE(0x020000, 0x1fffff) AM_RAM |
| 73 | 84 | AM_RANGE(0x200000, 0x2fffff) AM_RAM |
| r26553 | r26554 | |
| 86 | 97 | AM_RANGE(0xf00f00, 0xf00fff) AM_READWRITE(invalid_r,invalid_w) |
| 87 | 98 | ADDRESS_MAP_END |
| 88 | 99 | |
| 100 | static ADDRESS_MAP_START(wicat_video_mem, AS_PROGRAM, 16, wicat_state) |
| 101 | AM_RANGE(0x0000, 0x7fff) AM_ROM AM_REGION("g2", 0x0000) |
| 102 | AM_RANGE(0x8000, 0xffff) AM_RAM |
| 103 | ADDRESS_MAP_END |
| 89 | 104 | |
| 105 | static ADDRESS_MAP_START(wicat_video_io, AS_PROGRAM, 8, wicat_state) |
| 106 | // yet to figure out... |
| 107 | // 0x0100 - INS2651 USART #1 ? |
| 108 | // 0x0200 - INS2651 USART #2 ? |
| 109 | AM_RANGE(0x0700,0x0700) AM_DEVREADWRITE("videouart",im6402_device,read,write) // UART? |
| 110 | AM_RANGE(0x0800,0x080f) AM_DEVREADWRITE("videodma",am9517a_device,read,write) // DMA? |
| 111 | AM_RANGE(0x0b00,0x0b03) AM_READWRITE(video_r,video_w) |
| 112 | AM_RANGE(0x4000,0x5fff) AM_RAM AM_SHARE("vram") // video RAM? |
| 113 | AM_RANGE(0x8000,0x8fff) AM_ROM AM_REGION("g2char",0x0000) |
| 114 | AM_RANGE(0x9000,0x9fff) AM_ROM AM_REGION("g2char",0x0000) |
| 115 | ADDRESS_MAP_END |
| 116 | |
| 117 | |
| 90 | 118 | /* Input ports */ |
| 91 | 119 | static INPUT_PORTS_START( wicat ) |
| 92 | 120 | INPUT_PORTS_END |
| r26553 | r26554 | |
| 169 | 197 | m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); |
| 170 | 198 | } |
| 171 | 199 | |
| 172 | | static serial_terminal_interface terminal_intf = |
| 200 | READ8_MEMBER(wicat_state::video_r) |
| 173 | 201 | { |
| 174 | | DEVCB_NULL |
| 175 | | }; |
| 202 | switch(offset) |
| 203 | { |
| 204 | case 0x00: |
| 205 | return m_videoctrl->read(space,0); |
| 206 | case 0x02: |
| 207 | return m_videoctrl->read(space,1); |
| 208 | default: |
| 209 | return 0xff; |
| 210 | } |
| 211 | } |
| 176 | 212 | |
| 213 | WRITE8_MEMBER(wicat_state::video_w) |
| 214 | { |
| 215 | switch(offset) |
| 216 | { |
| 217 | case 0x00: |
| 218 | m_videoctrl->write(space,0,data); |
| 219 | break; |
| 220 | case 0x02: |
| 221 | m_videoctrl->write(space,1,data); |
| 222 | break; |
| 223 | } |
| 224 | } |
| 225 | |
| 226 | I8275_DISPLAY_PIXELS(wicat_display_pixels) |
| 227 | { |
| 228 | //wicat_state *state = device->machine().driver_data<wicat_state>(); |
| 229 | |
| 230 | // TODO |
| 231 | } |
| 232 | |
| 233 | // internal terminal |
| 177 | 234 | static mc2661_interface wicat_uart0_intf = |
| 178 | 235 | { |
| 179 | 236 | 0, // RXC |
| 180 | 237 | 0, // TXC |
| 181 | | DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, rx), // RXD in |
| 182 | | DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, tx), // RXD out |
| 238 | DEVCB_NULL, // RXD in |
| 239 | DEVCB_NULL, // RXD out |
| 183 | 240 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // RXRDY out |
| 184 | 241 | DEVCB_NULL, // TXRDY out |
| 185 | 242 | DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, rts_w), // RTS out |
| r26553 | r26554 | |
| 189 | 246 | DEVCB_NULL // XSYNC out |
| 190 | 247 | }; |
| 191 | 248 | |
| 192 | | static mc2661_interface wicat_unused_intf = |
| 249 | // RS232C ports (x5) |
| 250 | static mc2661_interface wicat_uart1_intf = |
| 193 | 251 | { |
| 194 | 252 | 0, |
| 195 | 253 | 0, |
| 254 | DEVCB_DEVICE_LINE_MEMBER("serial1", serial_port_device, rx), |
| 255 | DEVCB_DEVICE_LINE_MEMBER("serial1", serial_port_device, tx), |
| 256 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // RXRDY out |
| 196 | 257 | DEVCB_NULL, |
| 258 | DEVCB_DEVICE_LINE_MEMBER("serial1", rs232_port_device, rts_w), |
| 259 | DEVCB_DEVICE_LINE_MEMBER("serial1", rs232_port_device, dtr_w), |
| 260 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // TXEMT out |
| 197 | 261 | DEVCB_NULL, |
| 262 | DEVCB_NULL |
| 263 | }; |
| 264 | |
| 265 | static mc2661_interface wicat_uart2_intf = |
| 266 | { |
| 267 | 0, |
| 268 | 0, |
| 269 | DEVCB_DEVICE_LINE_MEMBER("serial2", serial_port_device, rx), |
| 270 | DEVCB_DEVICE_LINE_MEMBER("serial2", serial_port_device, tx), |
| 271 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // RXRDY out |
| 198 | 272 | DEVCB_NULL, |
| 273 | DEVCB_DEVICE_LINE_MEMBER("serial2", rs232_port_device, rts_w), |
| 274 | DEVCB_DEVICE_LINE_MEMBER("serial2", rs232_port_device, dtr_w), |
| 275 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // TXEMT out |
| 199 | 276 | DEVCB_NULL, |
| 277 | DEVCB_NULL |
| 278 | }; |
| 279 | |
| 280 | static mc2661_interface wicat_uart3_intf = |
| 281 | { |
| 282 | 0, |
| 283 | 0, |
| 284 | DEVCB_DEVICE_LINE_MEMBER("serial3", serial_port_device, rx), |
| 285 | DEVCB_DEVICE_LINE_MEMBER("serial3", serial_port_device, tx), |
| 286 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // RXRDY out |
| 200 | 287 | DEVCB_NULL, |
| 288 | DEVCB_DEVICE_LINE_MEMBER("serial3", rs232_port_device, rts_w), |
| 289 | DEVCB_DEVICE_LINE_MEMBER("serial3", rs232_port_device, dtr_w), |
| 290 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // TXEMT out |
| 201 | 291 | DEVCB_NULL, |
| 292 | DEVCB_NULL |
| 293 | }; |
| 294 | |
| 295 | static mc2661_interface wicat_uart4_intf = |
| 296 | { |
| 297 | 0, |
| 298 | 0, |
| 299 | DEVCB_DEVICE_LINE_MEMBER("serial4", serial_port_device, rx), |
| 300 | DEVCB_DEVICE_LINE_MEMBER("serial4", serial_port_device, tx), |
| 301 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // RXRDY out |
| 202 | 302 | DEVCB_NULL, |
| 303 | DEVCB_DEVICE_LINE_MEMBER("serial4", rs232_port_device, rts_w), |
| 304 | DEVCB_DEVICE_LINE_MEMBER("serial4", rs232_port_device, dtr_w), |
| 305 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // TXEMT out |
| 203 | 306 | DEVCB_NULL, |
| 204 | 307 | DEVCB_NULL |
| 205 | 308 | }; |
| 206 | 309 | |
| 310 | static mc2661_interface wicat_uart5_intf = |
| 311 | { |
| 312 | 0, |
| 313 | 0, |
| 314 | DEVCB_DEVICE_LINE_MEMBER("serial5", serial_port_device, rx), |
| 315 | DEVCB_DEVICE_LINE_MEMBER("serial5", serial_port_device, tx), |
| 316 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // RXRDY out |
| 317 | DEVCB_NULL, |
| 318 | DEVCB_DEVICE_LINE_MEMBER("serial5", rs232_port_device, rts_w), |
| 319 | DEVCB_DEVICE_LINE_MEMBER("serial5", rs232_port_device, dtr_w), |
| 320 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // TXEMT out |
| 321 | DEVCB_NULL, |
| 322 | DEVCB_NULL |
| 323 | }; |
| 324 | |
| 325 | // modem |
| 326 | static mc2661_interface wicat_uart6_intf = |
| 327 | { |
| 328 | 0, // RXC |
| 329 | 0, // TXC |
| 330 | DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, rx), // RXD in |
| 331 | DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, tx), // RXD out |
| 332 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // RXRDY out |
| 333 | DEVCB_NULL, // TXRDY out |
| 334 | DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, rts_w), // RTS out |
| 335 | DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, dtr_w), // DTR out |
| 336 | DEVCB_CPU_INPUT_LINE("maincpu",M68K_IRQ_2), // TXEMT out |
| 337 | DEVCB_NULL, // BKDET out |
| 338 | DEVCB_NULL // XSYNC out |
| 339 | }; |
| 340 | |
| 341 | struct im6402_interface wicat_video_uart_intf = |
| 342 | { |
| 343 | 0, // RRC |
| 344 | 0, // TRC |
| 345 | |
| 346 | DEVCB_NULL, //m_in_rri_cb; |
| 347 | DEVCB_NULL, //m_out_tro_cb; |
| 348 | DEVCB_NULL, //m_out_dr_cb; |
| 349 | DEVCB_NULL, //m_out_tbre_cb; |
| 350 | DEVCB_NULL, //m_out_tre_cb; |
| 351 | }; |
| 352 | |
| 207 | 353 | static via6522_interface wicat_via_intf = |
| 208 | 354 | { |
| 209 | 355 | DEVCB_DRIVER_MEMBER(wicat_state,via_a_r), // Port A in |
| r26553 | r26554 | |
| 227 | 373 | 1 // first day |
| 228 | 374 | }; |
| 229 | 375 | |
| 376 | struct rs232_port_interface wicat_serial_intf = |
| 377 | { |
| 378 | DEVCB_NULL, // RX out |
| 379 | DEVCB_NULL, // DCD out |
| 380 | DEVCB_NULL, // DSR out |
| 381 | DEVCB_NULL, // RI out |
| 382 | DEVCB_NULL // CTS out |
| 383 | }; |
| 384 | |
| 385 | AM9517A_INTERFACE( wicat_videodma_intf ) |
| 386 | { |
| 387 | DEVCB_NULL, // m_out_hreq_cb; |
| 388 | DEVCB_NULL, // m_out_eop_cb; |
| 389 | |
| 390 | DEVCB_NULL, // m_in_memr_cb; |
| 391 | DEVCB_NULL, // m_out_memw_cb; |
| 392 | |
| 393 | { DEVCB_NULL,DEVCB_NULL,DEVCB_NULL,DEVCB_NULL }, // m_in_ior_cb[4]; |
| 394 | { DEVCB_NULL,DEVCB_NULL,DEVCB_NULL,DEVCB_NULL }, // m_out_iow_cb[4]; |
| 395 | { DEVCB_NULL,DEVCB_NULL,DEVCB_NULL,DEVCB_NULL } // m_out_dack_cb[4]; |
| 396 | }; |
| 397 | |
| 230 | 398 | static MACHINE_CONFIG_START( wicat, wicat_state ) |
| 231 | 399 | /* basic machine hardware */ |
| 232 | 400 | MCFG_CPU_ADD("maincpu", M68000, XTAL_8MHz) // unknown clock |
| 233 | 401 | MCFG_CPU_PROGRAM_MAP(wicat_mem) |
| 234 | 402 | |
| 235 | | /* video hardware */ |
| 236 | | MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, terminal_intf, XTAL_5_0688MHz) |
| 237 | | |
| 238 | 403 | MCFG_VIA6522_ADD("via",XTAL_4MHz,wicat_via_intf) |
| 239 | 404 | |
| 240 | 405 | MCFG_MM58274C_ADD("rtc",wicat_rtc_intf) // actually an MM58174AN, but should be compatible |
| 241 | 406 | |
| 242 | 407 | MCFG_MC2661_ADD("uart0", XTAL_5_0688MHz, wicat_uart0_intf) // connected to terminal board (TODO) |
| 243 | | MCFG_MC2661_ADD("uart1", XTAL_5_0688MHz, wicat_unused_intf) |
| 244 | | MCFG_MC2661_ADD("uart2", XTAL_5_0688MHz, wicat_unused_intf) |
| 245 | | MCFG_MC2661_ADD("uart3", XTAL_5_0688MHz, wicat_unused_intf) |
| 246 | | MCFG_MC2661_ADD("uart4", XTAL_5_0688MHz, wicat_unused_intf) |
| 247 | | MCFG_MC2661_ADD("uart5", XTAL_5_0688MHz, wicat_unused_intf) |
| 248 | | MCFG_MC2661_ADD("uart6", XTAL_5_0688MHz, wicat_unused_intf) // connected to modem port |
| 408 | MCFG_MC2661_ADD("uart1", XTAL_5_0688MHz, wicat_uart1_intf) |
| 409 | MCFG_MC2661_ADD("uart2", XTAL_5_0688MHz, wicat_uart2_intf) |
| 410 | MCFG_MC2661_ADD("uart3", XTAL_5_0688MHz, wicat_uart3_intf) |
| 411 | MCFG_MC2661_ADD("uart4", XTAL_5_0688MHz, wicat_uart4_intf) |
| 412 | MCFG_MC2661_ADD("uart5", XTAL_5_0688MHz, wicat_uart5_intf) |
| 413 | MCFG_MC2661_ADD("uart6", XTAL_5_0688MHz, wicat_uart6_intf) // connected to modem port |
| 249 | 414 | |
| 415 | MCFG_RS232_PORT_ADD("serial1",wicat_serial_intf,default_rs232_devices,NULL) |
| 416 | MCFG_RS232_PORT_ADD("serial2",wicat_serial_intf,default_rs232_devices,NULL) |
| 417 | MCFG_RS232_PORT_ADD("serial3",wicat_serial_intf,default_rs232_devices,NULL) |
| 418 | MCFG_RS232_PORT_ADD("serial4",wicat_serial_intf,default_rs232_devices,NULL) |
| 419 | MCFG_RS232_PORT_ADD("serial5",wicat_serial_intf,default_rs232_devices,NULL) |
| 420 | |
| 421 | /* video hardware */ |
| 422 | MCFG_CPU_ADD("videocpu",Z8002,XTAL_8MHz) // AMD AMZ8002DC |
| 423 | MCFG_CPU_PROGRAM_MAP(wicat_video_mem) |
| 424 | MCFG_CPU_IO_MAP(wicat_video_io) |
| 425 | |
| 426 | MCFG_AM9517A_ADD("videodma", XTAL_8MHz, wicat_videodma_intf) // clock is a bit of guess |
| 427 | MCFG_IM6402_ADD("videouart", wicat_video_uart_intf) |
| 428 | // Also 2x INS2651 USARTs, not yet emulated |
| 429 | |
| 430 | MCFG_SCREEN_ADD("screen",RASTER) |
| 431 | MCFG_SCREEN_SIZE(400,300) |
| 432 | MCFG_SCREEN_VISIBLE_AREA(0,400-1,0,300-1) |
| 433 | MCFG_SCREEN_REFRESH_RATE(60) |
| 434 | MCFG_SCREEN_UPDATE_DEVICE("video",i8275x_device,screen_update) |
| 435 | |
| 436 | MCFG_I8275_ADD("video",XTAL_19_6608MHz/8,9,wicat_display_pixels,DEVWRITELINE("videodma",am9517a_device, dreq0_w)) |
| 437 | |
| 250 | 438 | MCFG_DEFAULT_LAYOUT(layout_wicat) |
| 439 | |
| 251 | 440 | MACHINE_CONFIG_END |
| 252 | 441 | |
| 253 | 442 | /* ROM definition */ |
| r26553 | r26554 | |
| 313 | 502 | ROM_LOAD ("ascii.chr", 0x00000, 0x0800, CRC(43e26e37) SHA1(f3d5d16040c66f0e827f72a35d4694ca62950949) ) |
| 314 | 503 | ROM_LOAD ("apl.chr", 0x00800, 0x0800, CRC(8c6d698e) SHA1(147dd9296fe2efc6140fa148a6edf673c33f9371) ) |
| 315 | 504 | |
| 505 | // Winchester Floppy Controller (Signetics N8X300I + FD1795) |
| 316 | 506 | ROM_REGION(0x1800, "wd3", 0) |
| 317 | 507 | ROM_LOAD ("wd3.u95", 0x00000, 0x0800, CRC(80bb0617) SHA1(ac0f3194fcbef77532571baa3fec78b3010528bf) ) |
| 318 | 508 | ROM_LOAD ("wd3.u96", 0x00800, 0x0800, CRC(52736e61) SHA1(71c7c9170c733c483393969cb1cb3798b3eb980c) ) |