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