trunk/src/mess/machine/rmnimbus.c
| r18308 | r18309 | |
| 62 | 62 | #include "machine/i8251.h" |
| 63 | 63 | #include "machine/ctronics.h" |
| 64 | 64 | #include "machine/6522via.h" |
| 65 | #include "machine/scsibus.h" |
| 65 | 66 | #include "sound/ay8910.h" |
| 66 | 67 | #include "sound/msm5205.h" |
| 67 | 68 | |
| r18308 | r18309 | |
| 2292 | 2293 | { |
| 2293 | 2294 | int result = 0; |
| 2294 | 2295 | device_t *fdc = machine().device(FDC_TAG); |
| 2295 | | scsibus_device *hdc = machine().device<scsibus_device>(SCSIBUS_TAG); |
| 2296 | 2296 | |
| 2297 | 2297 | int pc=space.device().safe_pc(); |
| 2298 | 2298 | rmnimbus_state *state = machine().driver_data<rmnimbus_state>(); |
| r18308 | r18309 | |
| 2323 | 2323 | result=m_nimbus_drives.reg410_in ^ INV_BITS_410; |
| 2324 | 2324 | break; |
| 2325 | 2325 | case 0x18 : |
| 2326 | | result = hdc->scsi_data_r(); |
| 2326 | result = m_scsibus->scsi_data_r(); |
| 2327 | 2327 | hdc_post_rw(machine()); |
| 2328 | 2328 | default: |
| 2329 | 2329 | break; |
| r18308 | r18309 | |
| 2360 | 2360 | WRITE8_MEMBER(rmnimbus_state::nimbus_disk_w) |
| 2361 | 2361 | { |
| 2362 | 2362 | device_t *fdc = machine().device(FDC_TAG); |
| 2363 | | scsibus_device *hdc = machine().device<scsibus_device>(SCSIBUS_TAG); |
| 2364 | 2363 | int pc=space.device().safe_pc(); |
| 2365 | 2364 | UINT8 reg400_old = m_nimbus_drives.reg400; |
| 2366 | 2365 | |
| r18308 | r18309 | |
| 2403 | 2402 | break; |
| 2404 | 2403 | |
| 2405 | 2404 | case 0x18 : |
| 2406 | | hdc->scsi_data_w(data); |
| 2405 | m_scsibus->scsi_data_w(data); |
| 2407 | 2406 | hdc_post_rw(machine()); |
| 2408 | 2407 | break; |
| 2409 | 2408 | } |
| r18308 | r18309 | |
| 2412 | 2411 | static void hdc_reset(running_machine &machine) |
| 2413 | 2412 | { |
| 2414 | 2413 | rmnimbus_state *state = machine.driver_data<rmnimbus_state>(); |
| 2415 | | scsibus_device *hdc = machine.device<scsibus_device>(SCSIBUS_TAG); |
| 2416 | 2414 | |
| 2417 | 2415 | state->m_nimbus_drives.reg410_in=0; |
| 2418 | | state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_REQ) ? HDC_REQ_MASK : 0); |
| 2419 | | state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_CD) ? HDC_CD_MASK : 0); |
| 2420 | | state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_IO) ? HDC_IO_MASK : 0); |
| 2421 | | state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_BSY) ? HDC_BSY_MASK : 0); |
| 2422 | | state->m_nimbus_drives.reg410_in |= (hdc->get_scsi_line(SCSI_LINE_MSG) ? HDC_MSG_MASK : 0); |
| 2416 | state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_req_r() ? HDC_REQ_MASK : 0); |
| 2417 | state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_cd_r() ? HDC_CD_MASK : 0); |
| 2418 | state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_io_r() ? HDC_IO_MASK : 0); |
| 2419 | state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_bsy_r() ? HDC_BSY_MASK : 0); |
| 2420 | state->m_nimbus_drives.reg410_in |= (state->m_scsibus->scsi_msg_r() ? HDC_MSG_MASK : 0); |
| 2423 | 2421 | |
| 2424 | 2422 | state->m_nimbus_drives.drq_ff=0; |
| 2425 | 2423 | } |
| r18308 | r18309 | |
| 2427 | 2425 | static void hdc_ctrl_write(running_machine &machine, UINT8 data) |
| 2428 | 2426 | { |
| 2429 | 2427 | rmnimbus_state *state = machine.driver_data<rmnimbus_state>(); |
| 2430 | | scsibus_device *hdc = machine.device<scsibus_device>(SCSIBUS_TAG); |
| 2431 | 2428 | |
| 2432 | 2429 | // If we enable the HDC interupt, and an interrupt is pending, go deal with it. |
| 2433 | 2430 | if(((data & HDC_IRQ_MASK) && (~state->m_nimbus_drives.reg410_out & HDC_IRQ_MASK)) && |
| r18308 | r18309 | |
| 2436 | 2433 | |
| 2437 | 2434 | state->m_nimbus_drives.reg410_out=data; |
| 2438 | 2435 | |
| 2439 | | hdc->set_scsi_line(SCSI_LINE_RESET, (data & HDC_RESET_MASK) ? 0 : 1); |
| 2440 | | hdc->set_scsi_line(SCSI_LINE_SEL, (data & HDC_SEL_MASK) ? 0 : 1); |
| 2436 | state->m_scsibus->scsi_rst_w((data & HDC_RESET_MASK) ? 0 : 1); |
| 2437 | state->m_scsibus->scsi_sel_w((data & HDC_SEL_MASK) ? 0 : 1); |
| 2441 | 2438 | } |
| 2442 | 2439 | |
| 2443 | 2440 | static void hdc_post_rw(running_machine &machine) |
| 2444 | 2441 | { |
| 2445 | 2442 | rmnimbus_state *state = machine.driver_data<rmnimbus_state>(); |
| 2446 | | scsibus_device *hdc = machine.device<scsibus_device>(SCSIBUS_TAG); |
| 2447 | 2443 | |
| 2448 | 2444 | if((state->m_nimbus_drives.reg410_in & HDC_REQ_MASK)==0) |
| 2449 | | hdc->set_scsi_line(SCSI_LINE_ACK,0); |
| 2445 | state->m_scsibus->scsi_ack_w(0); |
| 2450 | 2446 | |
| 2451 | 2447 | state->m_nimbus_drives.drq_ff=0; |
| 2452 | 2448 | } |
| r18308 | r18309 | |
| 2500 | 2496 | } |
| 2501 | 2497 | else |
| 2502 | 2498 | { |
| 2503 | | scsibus_device *hdc = downcast<scsibus_device *>(device); |
| 2504 | | hdc->set_scsi_line(SCSI_LINE_ACK,1); |
| 2499 | drvstate->m_scsibus->scsi_ack_w(1); |
| 2505 | 2500 | } |
| 2506 | 2501 | } |
| 2507 | 2502 | } |
trunk/src/mess/includes/rmnimbus.h
| r18308 | r18309 | |
| 8 | 8 | |
| 9 | 9 | #include "machine/z80sio.h" |
| 10 | 10 | #include "machine/wd17xx.h" |
| 11 | | #include "machine/scsibus.h" |
| 11 | #include "machine/scsicb.h" |
| 12 | 12 | #include "machine/6522via.h" |
| 13 | 13 | |
| 14 | 14 | #define MAINCPU_TAG "maincpu" |
| r18308 | r18309 | |
| 172 | 172 | }; |
| 173 | 173 | |
| 174 | 174 | |
| 175 | | class rmnimbus_state : public driver_device |
| 176 | | { |
| 177 | | public: |
| 178 | | rmnimbus_state(const machine_config &mconfig, device_type type, const char *tag) |
| 179 | | : driver_device(mconfig, type, tag) { } |
| 180 | | |
| 181 | | UINT32 m_debug_machine; |
| 182 | | i186_state m_i186; |
| 183 | | keyboard_t m_keyboard; |
| 184 | | nimbus_drives_t m_nimbus_drives; |
| 185 | | ipc_interface_t m_ipc_interface; |
| 186 | | UINT8 m_mcu_reg080; |
| 187 | | UINT8 m_iou_reg092; |
| 188 | | UINT8 m_last_playmode; |
| 189 | | mouse_joy_state m_nimbus_mouse; |
| 190 | | UINT8 m_ay8910_a; |
| 191 | | UINT16 m_IOPorts[num_ioports]; |
| 192 | | UINT8 m_sio_int_state; |
| 193 | | UINT8 m_video_mem[SCREEN_WIDTH_PIXELS][SCREEN_HEIGHT_LINES]; |
| 194 | | UINT16 m_vidregs[NO_VIDREGS]; |
| 195 | | UINT8 m_bpp; |
| 196 | | UINT16 m_pixel_mask; |
| 197 | | UINT8 m_hs_count; |
| 198 | | UINT32 m_debug_video; |
| 199 | | DECLARE_READ16_MEMBER(nimbus_i186_internal_port_r); |
| 200 | | DECLARE_WRITE16_MEMBER(nimbus_i186_internal_port_w); |
| 201 | | DECLARE_READ8_MEMBER(nimbus_mcu_r); |
| 202 | | DECLARE_WRITE8_MEMBER(nimbus_mcu_w); |
| 203 | | DECLARE_READ16_MEMBER(nimbus_io_r); |
| 204 | | DECLARE_WRITE16_MEMBER(nimbus_io_w); |
| 205 | | DECLARE_READ8_MEMBER(nimbus_disk_r); |
| 206 | | DECLARE_WRITE8_MEMBER(nimbus_disk_w); |
| 207 | | DECLARE_READ8_MEMBER(nimbus_pc8031_r); |
| 208 | | DECLARE_WRITE8_MEMBER(nimbus_pc8031_w); |
| 209 | | DECLARE_READ8_MEMBER(nimbus_pc8031_iou_r); |
| 210 | | DECLARE_WRITE8_MEMBER(nimbus_pc8031_iou_w); |
| 211 | | DECLARE_READ8_MEMBER(nimbus_pc8031_port_r); |
| 212 | | DECLARE_WRITE8_MEMBER(nimbus_pc8031_port_w); |
| 213 | | DECLARE_READ8_MEMBER(nimbus_iou_r); |
| 214 | | DECLARE_WRITE8_MEMBER(nimbus_iou_w); |
| 215 | | DECLARE_READ8_MEMBER(nimbus_sound_ay8910_r); |
| 216 | | DECLARE_WRITE8_MEMBER(nimbus_sound_ay8910_w); |
| 217 | | DECLARE_WRITE8_MEMBER(nimbus_sound_ay8910_porta_w); |
| 218 | | DECLARE_WRITE8_MEMBER(nimbus_sound_ay8910_portb_w); |
| 219 | | DECLARE_READ8_MEMBER(nimbus_mouse_js_r); |
| 220 | | DECLARE_WRITE8_MEMBER(nimbus_mouse_js_w); |
| 221 | | DECLARE_READ16_MEMBER(nimbus_video_io_r); |
| 222 | | DECLARE_WRITE16_MEMBER(nimbus_video_io_w); |
| 223 | | DECLARE_DRIVER_INIT(nimbus); |
| 224 | | virtual void machine_start(); |
| 225 | | virtual void machine_reset(); |
| 226 | | virtual void video_start(); |
| 227 | | virtual void video_reset(); |
| 228 | | virtual void palette_init(); |
| 229 | | UINT32 screen_update_nimbus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 230 | | void screen_eof_nimbus(screen_device &screen, bool state); |
| 231 | | TIMER_CALLBACK_MEMBER(internal_timer_int); |
| 232 | | TIMER_CALLBACK_MEMBER(dma_timer_callback); |
| 233 | | TIMER_CALLBACK_MEMBER(keyscan_callback); |
| 234 | | TIMER_CALLBACK_MEMBER(mouse_callback); |
| 235 | | DECLARE_WRITE_LINE_MEMBER(sio_interrupt); |
| 236 | | DECLARE_WRITE8_MEMBER(sio_dtr_w); |
| 237 | | DECLARE_WRITE16_MEMBER(sio_serial_transmit); |
| 238 | | DECLARE_READ16_MEMBER(sio_serial_receive); |
| 239 | | DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_intrq_w); |
| 240 | | DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_drq_w); |
| 241 | | DECLARE_READ8_MEMBER(nimbus_via_read_portb); |
| 242 | | DECLARE_WRITE8_MEMBER(nimbus_via_write_portb); |
| 243 | | DECLARE_WRITE_LINE_MEMBER(nimbus_via_irq_w); |
| 244 | | DECLARE_WRITE_LINE_MEMBER(nimbus_ack_w); |
| 245 | | }; |
| 246 | | |
| 247 | | |
| 248 | 175 | /*----------- defined in drivers/rmnimbus.c -----------*/ |
| 249 | 176 | |
| 250 | 177 | extern const unsigned char nimbus_palette[SCREEN_NO_COLOURS][3]; |
| r18308 | r18309 | |
| 461 | 388 | #define LINEAR_ADDR(seg,ofs) ((seg<<4)+ofs) |
| 462 | 389 | |
| 463 | 390 | #define OUTPUT_SEGOFS(mess,seg,ofs) logerror("%s=%04X:%04X [%08X]\n",mess,seg,ofs,((seg<<4)+ofs)) |
| 391 | |
| 392 | class rmnimbus_state : public driver_device |
| 393 | { |
| 394 | public: |
| 395 | rmnimbus_state(const machine_config &mconfig, device_type type, const char *tag) |
| 396 | : driver_device(mconfig, type, tag), |
| 397 | m_scsibus(*this, SCSIBUS_TAG ":host") |
| 398 | { |
| 399 | } |
| 400 | |
| 401 | required_device<scsicb_device> m_scsibus; |
| 402 | UINT32 m_debug_machine; |
| 403 | i186_state m_i186; |
| 404 | keyboard_t m_keyboard; |
| 405 | nimbus_drives_t m_nimbus_drives; |
| 406 | ipc_interface_t m_ipc_interface; |
| 407 | UINT8 m_mcu_reg080; |
| 408 | UINT8 m_iou_reg092; |
| 409 | UINT8 m_last_playmode; |
| 410 | mouse_joy_state m_nimbus_mouse; |
| 411 | UINT8 m_ay8910_a; |
| 412 | UINT16 m_IOPorts[num_ioports]; |
| 413 | UINT8 m_sio_int_state; |
| 414 | UINT8 m_video_mem[SCREEN_WIDTH_PIXELS][SCREEN_HEIGHT_LINES]; |
| 415 | UINT16 m_vidregs[NO_VIDREGS]; |
| 416 | UINT8 m_bpp; |
| 417 | UINT16 m_pixel_mask; |
| 418 | UINT8 m_hs_count; |
| 419 | UINT32 m_debug_video; |
| 420 | DECLARE_READ16_MEMBER(nimbus_i186_internal_port_r); |
| 421 | DECLARE_WRITE16_MEMBER(nimbus_i186_internal_port_w); |
| 422 | DECLARE_READ8_MEMBER(nimbus_mcu_r); |
| 423 | DECLARE_WRITE8_MEMBER(nimbus_mcu_w); |
| 424 | DECLARE_READ16_MEMBER(nimbus_io_r); |
| 425 | DECLARE_WRITE16_MEMBER(nimbus_io_w); |
| 426 | DECLARE_READ8_MEMBER(nimbus_disk_r); |
| 427 | DECLARE_WRITE8_MEMBER(nimbus_disk_w); |
| 428 | DECLARE_READ8_MEMBER(nimbus_pc8031_r); |
| 429 | DECLARE_WRITE8_MEMBER(nimbus_pc8031_w); |
| 430 | DECLARE_READ8_MEMBER(nimbus_pc8031_iou_r); |
| 431 | DECLARE_WRITE8_MEMBER(nimbus_pc8031_iou_w); |
| 432 | DECLARE_READ8_MEMBER(nimbus_pc8031_port_r); |
| 433 | DECLARE_WRITE8_MEMBER(nimbus_pc8031_port_w); |
| 434 | DECLARE_READ8_MEMBER(nimbus_iou_r); |
| 435 | DECLARE_WRITE8_MEMBER(nimbus_iou_w); |
| 436 | DECLARE_READ8_MEMBER(nimbus_sound_ay8910_r); |
| 437 | DECLARE_WRITE8_MEMBER(nimbus_sound_ay8910_w); |
| 438 | DECLARE_WRITE8_MEMBER(nimbus_sound_ay8910_porta_w); |
| 439 | DECLARE_WRITE8_MEMBER(nimbus_sound_ay8910_portb_w); |
| 440 | DECLARE_READ8_MEMBER(nimbus_mouse_js_r); |
| 441 | DECLARE_WRITE8_MEMBER(nimbus_mouse_js_w); |
| 442 | DECLARE_READ16_MEMBER(nimbus_video_io_r); |
| 443 | DECLARE_WRITE16_MEMBER(nimbus_video_io_w); |
| 444 | DECLARE_DRIVER_INIT(nimbus); |
| 445 | virtual void machine_start(); |
| 446 | virtual void machine_reset(); |
| 447 | virtual void video_start(); |
| 448 | virtual void video_reset(); |
| 449 | virtual void palette_init(); |
| 450 | UINT32 screen_update_nimbus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 451 | void screen_eof_nimbus(screen_device &screen, bool state); |
| 452 | TIMER_CALLBACK_MEMBER(internal_timer_int); |
| 453 | TIMER_CALLBACK_MEMBER(dma_timer_callback); |
| 454 | TIMER_CALLBACK_MEMBER(keyscan_callback); |
| 455 | TIMER_CALLBACK_MEMBER(mouse_callback); |
| 456 | DECLARE_WRITE_LINE_MEMBER(sio_interrupt); |
| 457 | DECLARE_WRITE8_MEMBER(sio_dtr_w); |
| 458 | DECLARE_WRITE16_MEMBER(sio_serial_transmit); |
| 459 | DECLARE_READ16_MEMBER(sio_serial_receive); |
| 460 | DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_intrq_w); |
| 461 | DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_drq_w); |
| 462 | DECLARE_READ8_MEMBER(nimbus_via_read_portb); |
| 463 | DECLARE_WRITE8_MEMBER(nimbus_via_write_portb); |
| 464 | DECLARE_WRITE_LINE_MEMBER(nimbus_via_irq_w); |
| 465 | DECLARE_WRITE_LINE_MEMBER(nimbus_ack_w); |
| 466 | }; |