trunk/src/mess/drivers/mz2000.c
| r20515 | r20516 | |
| 38 | 38 | { |
| 39 | 39 | public: |
| 40 | 40 | mz2000_state(const machine_config &mconfig, device_type type, const char *tag) |
| 41 | | : driver_device(mconfig, type, tag), |
| 42 | | m_cass(*this, CASSETTE_TAG) |
| 43 | | { } |
| 41 | : driver_device(mconfig, type, tag) |
| 42 | , m_cass(*this, CASSETTE_TAG) |
| 43 | , m_maincpu(*this, "maincpu") |
| 44 | , m_mb8877a(*this, "mb8877a") |
| 45 | , m_pit8253(*this, "pit") |
| 46 | , m_beeper(*this, BEEPER_TAG) |
| 47 | , m_region_tvram(*this, "tvram") |
| 48 | , m_region_gvram(*this, "gvram") |
| 49 | , m_region_chargen(*this, "chargen") |
| 50 | , m_region_ipl(*this, "ipl") |
| 51 | , m_region_wram(*this, "wram") |
| 52 | , m_io_key0(*this, "KEY0") |
| 53 | , m_io_key1(*this, "KEY1") |
| 54 | , m_io_key2(*this, "KEY2") |
| 55 | , m_io_key3(*this, "KEY3") |
| 56 | , m_io_key4(*this, "KEY4") |
| 57 | , m_io_key5(*this, "KEY5") |
| 58 | , m_io_key6(*this, "KEY6") |
| 59 | , m_io_key7(*this, "KEY7") |
| 60 | , m_io_key8(*this, "KEY8") |
| 61 | , m_io_key9(*this, "KEY9") |
| 62 | , m_io_keya(*this, "KEYA") |
| 63 | , m_io_keyb(*this, "KEYB") |
| 64 | , m_io_keyc(*this, "KEYC") |
| 65 | , m_io_keyd(*this, "KEYD") |
| 66 | , m_io_unused(*this, "UNUSED") |
| 67 | , m_io_config(*this, "CONFIG") |
| 68 | { } |
| 44 | 69 | |
| 45 | 70 | required_device<cassette_image_device> m_cass; |
| 46 | 71 | |
| r20515 | r20516 | |
| 90 | 115 | DECLARE_WRITE8_MEMBER(mz2000_pio1_porta_w); |
| 91 | 116 | DECLARE_READ8_MEMBER(mz2000_pio1_portb_r); |
| 92 | 117 | DECLARE_READ8_MEMBER(mz2000_pio1_porta_r); |
| 118 | |
| 119 | protected: |
| 120 | required_device<cpu_device> m_maincpu; |
| 121 | required_device<device_t> m_mb8877a; |
| 122 | required_device<device_t> m_pit8253; |
| 123 | required_device<device_t> m_beeper; |
| 124 | required_memory_region m_region_tvram; |
| 125 | required_memory_region m_region_gvram; |
| 126 | required_memory_region m_region_chargen; |
| 127 | required_memory_region m_region_ipl; |
| 128 | required_memory_region m_region_wram; |
| 129 | required_ioport m_io_key0; |
| 130 | required_ioport m_io_key1; |
| 131 | required_ioport m_io_key2; |
| 132 | required_ioport m_io_key3; |
| 133 | required_ioport m_io_key4; |
| 134 | required_ioport m_io_key5; |
| 135 | required_ioport m_io_key6; |
| 136 | required_ioport m_io_key7; |
| 137 | required_ioport m_io_key8; |
| 138 | required_ioport m_io_key9; |
| 139 | required_ioport m_io_keya; |
| 140 | required_ioport m_io_keyb; |
| 141 | required_ioport m_io_keyc; |
| 142 | required_ioport m_io_keyd; |
| 143 | required_ioport m_io_unused; |
| 144 | required_ioport m_io_config; |
| 93 | 145 | }; |
| 94 | 146 | |
| 95 | 147 | void mz2000_state::video_start() |
| r20515 | r20516 | |
| 98 | 150 | |
| 99 | 151 | UINT32 mz2000_state::screen_update_mz2000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 100 | 152 | { |
| 101 | | UINT8 *tvram = machine().root_device().memregion("tvram")->base(); |
| 102 | | UINT8 *gvram = machine().root_device().memregion("gvram")->base(); |
| 103 | | UINT8 *gfx_data = memregion("chargen")->base(); |
| 153 | UINT8 *tvram = m_region_tvram->base(); |
| 154 | UINT8 *gvram = m_region_gvram->base(); |
| 155 | UINT8 *gfx_data = m_region_chargen->base(); |
| 104 | 156 | int x,y,xi,yi; |
| 105 | 157 | UINT8 x_size; |
| 106 | 158 | UINT32 count; |
| r20515 | r20516 | |
| 194 | 246 | |
| 195 | 247 | READ8_MEMBER(mz2000_state::mz2000_ipl_r) |
| 196 | 248 | { |
| 197 | | UINT8 *ipl = memregion("ipl")->base(); |
| 198 | | |
| 199 | | return ipl[offset]; |
| 249 | return m_region_ipl->base()[offset]; |
| 200 | 250 | } |
| 201 | 251 | |
| 202 | 252 | READ8_MEMBER(mz2000_state::mz2000_wram_r) |
| 203 | 253 | { |
| 204 | | UINT8 *wram = memregion("wram")->base(); |
| 205 | | |
| 206 | | return wram[offset]; |
| 254 | return m_region_wram->base()[offset]; |
| 207 | 255 | } |
| 208 | 256 | |
| 209 | 257 | WRITE8_MEMBER(mz2000_state::mz2000_wram_w) |
| 210 | 258 | { |
| 211 | | UINT8 *wram = memregion("wram")->base(); |
| 212 | | |
| 213 | | wram[offset] = data; |
| 259 | m_region_wram->base()[offset] = data; |
| 214 | 260 | } |
| 215 | 261 | |
| 216 | 262 | READ8_MEMBER(mz2000_state::mz2000_tvram_r) |
| 217 | 263 | { |
| 218 | | UINT8 *tvram = memregion("tvram")->base(); |
| 219 | | |
| 220 | | return tvram[offset]; |
| 264 | return m_region_tvram->base()[offset]; |
| 221 | 265 | } |
| 222 | 266 | |
| 223 | 267 | WRITE8_MEMBER(mz2000_state::mz2000_tvram_w) |
| 224 | 268 | { |
| 225 | | UINT8 *tvram = memregion("tvram")->base(); |
| 226 | | |
| 227 | | tvram[offset] = data; |
| 269 | m_region_tvram->base()[offset] = data; |
| 228 | 270 | } |
| 229 | 271 | |
| 230 | 272 | READ8_MEMBER(mz2000_state::mz2000_gvram_r) |
| 231 | 273 | { |
| 232 | | UINT8 *gvram = memregion("gvram")->base(); |
| 233 | | |
| 234 | | return gvram[offset+m_gvram_bank*0x4000]; |
| 274 | return m_region_gvram->base()[offset+m_gvram_bank*0x4000]; |
| 235 | 275 | } |
| 236 | 276 | |
| 237 | 277 | WRITE8_MEMBER(mz2000_state::mz2000_gvram_w) |
| 238 | 278 | { |
| 239 | | UINT8 *gvram = memregion("gvram")->base(); |
| 240 | | |
| 241 | | gvram[offset+m_gvram_bank*0x4000] = data; |
| 279 | m_region_gvram->base()[offset+m_gvram_bank*0x4000] = data; |
| 242 | 280 | } |
| 243 | 281 | |
| 244 | 282 | |
| r20515 | r20516 | |
| 301 | 339 | |
| 302 | 340 | READ8_MEMBER(mz2000_state::mz2000_wd17xx_r) |
| 303 | 341 | { |
| 304 | | device_t *device = machine().device("mb8877a"); |
| 305 | | |
| 306 | 342 | if(m_has_fdc) |
| 307 | | return wd17xx_r(device, space, offset) ^ 0xff; |
| 343 | return wd17xx_r(m_mb8877a, space, offset) ^ 0xff; |
| 308 | 344 | |
| 309 | 345 | return 0xff; |
| 310 | 346 | } |
| 311 | 347 | |
| 312 | 348 | WRITE8_MEMBER(mz2000_state::mz2000_wd17xx_w) |
| 313 | 349 | { |
| 314 | | device_t *device = machine().device("mb8877a"); |
| 315 | | |
| 316 | 350 | if(m_has_fdc) |
| 317 | | wd17xx_w(device, space, offset, data ^ 0xff); |
| 351 | wd17xx_w(m_mb8877a, space, offset, data ^ 0xff); |
| 318 | 352 | } |
| 319 | 353 | |
| 320 | 354 | WRITE8_MEMBER(mz2000_state::mz2000_fdc_w) |
| 321 | 355 | { |
| 322 | | device_t* dev = machine().device("mb8877a"); |
| 323 | | |
| 324 | 356 | switch(offset+0xdc) |
| 325 | 357 | { |
| 326 | 358 | case 0xdc: |
| 327 | | wd17xx_set_drive(dev,data & 3); |
| 359 | wd17xx_set_drive(m_mb8877a,data & 3); |
| 328 | 360 | floppy_mon_w(floppy_get_device(machine(), data & 3), (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); |
| 329 | 361 | floppy_drive_set_ready_state(floppy_get_device(machine(), data & 3), 1,0); |
| 330 | 362 | break; |
| 331 | 363 | case 0xdd: |
| 332 | | wd17xx_set_side(dev,(data & 1)); |
| 364 | wd17xx_set_side(m_mb8877a,(data & 1)); |
| 333 | 365 | break; |
| 334 | 366 | } |
| 335 | 367 | } |
| 336 | 368 | |
| 337 | 369 | WRITE8_MEMBER(mz2000_state::timer_w) |
| 338 | 370 | { |
| 339 | | device_t *pit8253 = machine().device("pit"); |
| 340 | | |
| 341 | | pit8253_gate0_w(pit8253, 1); |
| 342 | | pit8253_gate1_w(pit8253, 1); |
| 343 | | pit8253_gate0_w(pit8253, 0); |
| 344 | | pit8253_gate1_w(pit8253, 0); |
| 345 | | pit8253_gate0_w(pit8253, 1); |
| 346 | | pit8253_gate1_w(pit8253, 1); |
| 371 | pit8253_gate0_w(m_pit8253, 1); |
| 372 | pit8253_gate1_w(m_pit8253, 1); |
| 373 | pit8253_gate0_w(m_pit8253, 0); |
| 374 | pit8253_gate1_w(m_pit8253, 0); |
| 375 | pit8253_gate0_w(m_pit8253, 1); |
| 376 | pit8253_gate1_w(m_pit8253, 1); |
| 347 | 377 | } |
| 348 | 378 | |
| 349 | 379 | WRITE8_MEMBER(mz2000_state::mz2000_tvram_attr_w) |
| r20515 | r20516 | |
| 525 | 555 | m_tvram_enable = 0; |
| 526 | 556 | m_gvram_enable = 0; |
| 527 | 557 | |
| 528 | | beep_set_frequency(machine().device(BEEPER_TAG),4096); |
| 529 | | beep_set_state(machine().device(BEEPER_TAG),0); |
| 558 | beep_set_frequency(m_beeper,4096); |
| 559 | beep_set_state(m_beeper,0); |
| 530 | 560 | |
| 531 | | m_color_mode = machine().root_device().ioport("CONFIG")->read() & 1; |
| 532 | | m_has_fdc = (machine().root_device().ioport("CONFIG")->read() & 2) >> 1; |
| 533 | | m_hi_mode = (machine().root_device().ioport("CONFIG")->read() & 4) >> 2; |
| 561 | m_color_mode = m_io_config->read() & 1; |
| 562 | m_has_fdc = (m_io_config->read() & 2) >> 1; |
| 563 | m_hi_mode = (m_io_config->read() & 4) >> 2; |
| 534 | 564 | |
| 535 | 565 | { |
| 536 | 566 | int i; |
| r20515 | r20516 | |
| 699 | 729 | { |
| 700 | 730 | m_ipl_enable = 0; |
| 701 | 731 | /* correct? */ |
| 702 | | machine().device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
| 732 | m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
| 703 | 733 | } |
| 704 | 734 | |
| 705 | | beep_set_state(machine().device(BEEPER_TAG),data & 0x04); |
| 735 | beep_set_state(m_beeper,data & 0x04); |
| 706 | 736 | |
| 707 | 737 | m_old_portc = data; |
| 708 | 738 | } |
| r20515 | r20516 | |
| 729 | 759 | |
| 730 | 760 | READ8_MEMBER(mz2000_state::mz2000_pio1_portb_r) |
| 731 | 761 | { |
| 732 | | static const char *const keynames[] = { "KEY0", "KEY1", "KEY2", "KEY3", |
| 733 | | "KEY4", "KEY5", "KEY6", "KEY7", |
| 734 | | "KEY8", "KEY9", "KEYA", "KEYB", |
| 735 | | "KEYC", "KEYD", "UNUSED", "UNUSED" }; |
| 762 | ioport_port* keynames[] = { m_io_key0, m_io_key1, m_io_key2, m_io_key3, |
| 763 | m_io_key4, m_io_key5, m_io_key6, m_io_key7, |
| 764 | m_io_key8, m_io_key9, m_io_keya, m_io_keyb, |
| 765 | m_io_keyc, m_io_keyd, m_io_unused, m_io_unused }; |
| 736 | 766 | |
| 737 | 767 | if(((m_key_mux & 0x10) == 0x00) || ((m_key_mux & 0x0f) == 0x0f)) //status read |
| 738 | 768 | { |
| r20515 | r20516 | |
| 740 | 770 | |
| 741 | 771 | res = 0xff; |
| 742 | 772 | for(i=0;i<0xe;i++) |
| 743 | | res &= machine().root_device().ioport(keynames[i])->read(); |
| 773 | res &= keynames[i]->read(); |
| 744 | 774 | |
| 745 | 775 | return res; |
| 746 | 776 | } |
| 747 | 777 | |
| 748 | | return machine().root_device().ioport(keynames[m_key_mux & 0xf])->read(); |
| 778 | return keynames[m_key_mux & 0xf]->read(); |
| 749 | 779 | } |
| 750 | 780 | |
| 751 | 781 | READ8_MEMBER(mz2000_state::mz2000_pio1_porta_r) |