trunk/src/mess/drivers/excali64.c
| r242483 | r242484 | |
| 28 | 28 | |
| 29 | 29 | ****************************************************************************/ |
| 30 | 30 | |
| 31 | #define NEWFDC 0 |
| 32 | |
| 33 | |
| 31 | 34 | #include "emu.h" |
| 32 | 35 | #include "cpu/z80/z80.h" |
| 33 | 36 | #include "video/mc6845.h" |
| r242483 | r242484 | |
| 40 | 43 | #include "imagedev/cassette.h" |
| 41 | 44 | #include "sound/wave.h" |
| 42 | 45 | #include "sound/speaker.h" |
| 46 | #include "machine/z80dma.h" |
| 47 | #if NEWFDC |
| 48 | #include "machine/wd_fdc.h" |
| 49 | #include "formats/excali64_dsk.h" |
| 50 | #else |
| 51 | #include "machine/wd17xx.h" |
| 52 | #include "imagedev/flopdrv.h" |
| 53 | #include "formats/basicdsk.h" |
| 54 | #endif |
| 43 | 55 | |
| 44 | | |
| 45 | 56 | class excali64_state : public driver_device |
| 46 | 57 | { |
| 47 | 58 | public: |
| r242483 | r242484 | |
| 52 | 63 | , m_cass(*this, "cassette") |
| 53 | 64 | , m_crtc(*this, "crtc") |
| 54 | 65 | , m_io_keyboard(*this, "KEY") |
| 66 | , m_dma(*this, "dma") |
| 67 | , m_fdc(*this, "fdc") |
| 68 | #if NEWFDC |
| 69 | , m_floppy0(*this, "fdc:0") |
| 70 | , m_floppy1(*this, "fdc:1") |
| 71 | #endif |
| 55 | 72 | { } |
| 56 | 73 | |
| 57 | 74 | DECLARE_PALETTE_INIT(excali64); |
| r242483 | r242484 | |
| 61 | 78 | DECLARE_READ8_MEMBER(port00_r); |
| 62 | 79 | DECLARE_READ8_MEMBER(port50_r); |
| 63 | 80 | DECLARE_WRITE8_MEMBER(port70_w); |
| 81 | DECLARE_WRITE8_MEMBER(porte4_w); |
| 82 | DECLARE_READ8_MEMBER(porte8_r); |
| 83 | DECLARE_WRITE8_MEMBER(portec_w); |
| 84 | #if NEWFDC |
| 85 | DECLARE_FLOPPY_FORMATS(floppy_formats); |
| 86 | #endif |
| 87 | DECLARE_WRITE_LINE_MEMBER(busreq_w); |
| 88 | DECLARE_READ8_MEMBER(memory_read_byte); |
| 89 | DECLARE_WRITE8_MEMBER(memory_write_byte); |
| 90 | DECLARE_READ8_MEMBER(io_read_byte); |
| 91 | DECLARE_WRITE8_MEMBER(io_write_byte); |
| 64 | 92 | MC6845_UPDATE_ROW(update_row); |
| 65 | 93 | DECLARE_WRITE_LINE_MEMBER(crtc_de); |
| 66 | 94 | DECLARE_WRITE_LINE_MEMBER(crtc_vs); |
| r242483 | r242484 | |
| 79 | 107 | required_device<cassette_image_device> m_cass; |
| 80 | 108 | required_device<mc6845_device> m_crtc; |
| 81 | 109 | required_ioport_array<8> m_io_keyboard; |
| 110 | required_device<z80dma_device> m_dma; |
| 111 | #if NEWFDC |
| 112 | required_device<wd2793_t> m_fdc; |
| 113 | required_device<floppy_connector> m_floppy0; |
| 114 | required_device<floppy_connector> m_floppy1; |
| 115 | #else |
| 116 | required_device<wd2793_device> m_fdc; |
| 117 | #endif |
| 82 | 118 | }; |
| 83 | 119 | |
| 84 | 120 | static ADDRESS_MAP_START(excali64_mem, AS_PROGRAM, 8, excali64_state) |
| r242483 | r242484 | |
| 100 | 136 | AM_RANGE(0x50, 0x5f) AM_READ(port50_r) |
| 101 | 137 | AM_RANGE(0x60, 0x63) AM_MIRROR(0x0c) AM_DEVREADWRITE("ppi", i8255_device, read, write) |
| 102 | 138 | AM_RANGE(0x70, 0x7f) AM_WRITE(port70_w) |
| 139 | AM_RANGE(0xe0, 0xe3) AM_DEVREADWRITE("dma", z80dma_device, read, write) |
| 140 | AM_RANGE(0xe4, 0xe7) AM_WRITE(porte4_w) |
| 141 | AM_RANGE(0xe8, 0xeb) AM_READ(porte8_r) |
| 142 | AM_RANGE(0xec, 0xef) AM_WRITE(portec_w) |
| 143 | #if NEWFDC |
| 144 | AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE("fdc", wd2793_t, read, write) |
| 145 | #else |
| 146 | AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE("fdc", wd2793_device, read, write) |
| 147 | #endif |
| 103 | 148 | ADDRESS_MAP_END |
| 104 | 149 | |
| 105 | 150 | |
| r242483 | r242484 | |
| 185 | 230 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') |
| 186 | 231 | INPUT_PORTS_END |
| 187 | 232 | |
| 233 | #if NEWFDC |
| 234 | FLOPPY_FORMATS_MEMBER( excali64_state::floppy_formats ) |
| 235 | FLOPPY_EXCALI64_FORMAT |
| 236 | FLOPPY_FORMATS_END |
| 237 | |
| 238 | static SLOT_INTERFACE_START( excali64_floppies ) |
| 239 | SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) |
| 240 | SLOT_INTERFACE_END |
| 241 | #else |
| 242 | static LEGACY_FLOPPY_OPTIONS_START(excali64) |
| 243 | LEGACY_FLOPPY_OPTION(excali64_ds, "raw", "Excalibur 64 DS disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 244 | HEADS([2]) |
| 245 | TRACKS([80]) |
| 246 | SECTORS([5]) |
| 247 | SECTOR_LENGTH([1024]) |
| 248 | FIRST_SECTOR_ID([1])) |
| 249 | LEGACY_FLOPPY_OPTIONS_END |
| 250 | |
| 251 | static const floppy_interface excali64_floppy_interface = |
| 252 | { |
| 253 | FLOPPY_STANDARD_5_25_DSDD, |
| 254 | LEGACY_FLOPPY_OPTIONS_NAME(excali64), |
| 255 | NULL |
| 256 | }; |
| 257 | #endif |
| 258 | |
| 259 | READ8_MEMBER( excali64_state::porte8_r ) |
| 260 | { |
| 261 | return 0xff; |
| 262 | } |
| 263 | |
| 264 | WRITE8_MEMBER( excali64_state::porte4_w ) |
| 265 | { |
| 266 | //printf("%X ",data); |
| 267 | #if NEWFDC |
| 268 | floppy_image_device *floppy = NULL; |
| 269 | if (BIT(data, 0)) floppy = m_floppy0->get_device(); |
| 270 | //if (BIT(data, 1)) floppy = m_floppy1->get_device(); |
| 271 | m_fdc->set_floppy(floppy); |
| 272 | if (floppy) |
| 273 | floppy->ss_w(BIT(data, 4)); |
| 274 | #else |
| 275 | UINT8 i; |
| 276 | for (i = 0; i < 4; i++) |
| 277 | { |
| 278 | if BIT(data, i) |
| 279 | { |
| 280 | m_fdc->set_drive(i); |
| 281 | break; |
| 282 | } |
| 283 | } |
| 284 | //if (data & 0x01) m_fdc->set_drive(0); |
| 285 | //if (data & 0x02) m_fdc->set_drive(1); |
| 286 | //if (data & 0x04) m_fdc->set_drive(2); |
| 287 | //if (data & 0x08) m_fdc->set_drive(3); |
| 288 | //if (data & 0x10) m_fdc->set_side((data & 0x10) >> 4); |
| 289 | const char *floppy_tags[4] = { FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3 }; |
| 290 | |
| 291 | m_fdc->dden_w(1);//!BIT(data, 6)); // we want double density |
| 292 | //if ((data & 0x04) == 0) // reset |
| 293 | //m_fdc->reset(); |
| 294 | |
| 295 | // bit 3 connected to pin 23 "HRDY" of FDC |
| 296 | // TEMP HACK, FDD motor and RDY FDC pin controlled by HLD pin of FDC |
| 297 | legacy_floppy_image_device *flop = subdevice<legacy_floppy_image_device>(floppy_tags[i]); |
| 298 | flop->floppy_mon_w(0); // motor on |
| 299 | flop->floppy_drive_set_ready_state(1, 0); |
| 300 | #endif |
| 301 | } |
| 302 | |
| 303 | WRITE8_MEMBER( excali64_state::portec_w ) |
| 304 | { |
| 305 | } |
| 306 | |
| 307 | WRITE_LINE_MEMBER( excali64_state::busreq_w ) |
| 308 | { |
| 309 | // since our Z80 has no support for BUSACK, we assume it is granted immediately |
| 310 | m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state); |
| 311 | //m_maincpu->set_input_line(INPUT_LINE_HALT, state); // do we need this? |
| 312 | m_dma->bai_w(state); // tell dma that bus has been granted |
| 313 | } |
| 314 | |
| 315 | READ8_MEMBER( excali64_state::memory_read_byte ) |
| 316 | { |
| 317 | address_space& prog_space = m_maincpu->space(AS_PROGRAM); |
| 318 | return prog_space.read_byte(offset); |
| 319 | } |
| 320 | |
| 321 | WRITE8_MEMBER( excali64_state::memory_write_byte ) |
| 322 | { |
| 323 | address_space& prog_space = m_maincpu->space(AS_PROGRAM); |
| 324 | prog_space.write_byte(offset, data); |
| 325 | } |
| 326 | |
| 327 | READ8_MEMBER( excali64_state::io_read_byte ) |
| 328 | { |
| 329 | address_space& prog_space = m_maincpu->space(AS_IO); |
| 330 | return prog_space.read_byte(offset); |
| 331 | } |
| 332 | |
| 333 | WRITE8_MEMBER( excali64_state::io_write_byte ) |
| 334 | { |
| 335 | address_space& prog_space = m_maincpu->space(AS_IO); |
| 336 | prog_space.write_byte(offset, data); |
| 337 | } |
| 338 | |
| 188 | 339 | WRITE8_MEMBER( excali64_state::ppib_w ) |
| 189 | 340 | { |
| 190 | 341 | m_kbdrow = data; |
| r242483 | r242484 | |
| 461 | 612 | MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) |
| 462 | 613 | MCFG_PALETTE_ADD("palette", 40) |
| 463 | 614 | MCFG_PALETTE_INIT_OWNER(excali64_state, excali64) |
| 464 | | //MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") |
| 465 | 615 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", excali64) |
| 466 | 616 | MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_16MHz / 16) // 1MHz for lowres; 2MHz for highres |
| 467 | 617 | MCFG_MC6845_SHOW_BORDER_AREA(false) |
| r242483 | r242484 | |
| 472 | 622 | |
| 473 | 623 | /* Devices */ |
| 474 | 624 | MCFG_CASSETTE_ADD( "cassette" ) |
| 475 | | MACHINE_CONFIG_END |
| 625 | #if NEWFDC |
| 626 | MCFG_WD2793x_ADD("fdc", XTAL_16MHz / 16) |
| 627 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", excali64_floppies, "525dd", floppy_image_device::default_floppy_formats)// excali64_state::floppy_formats) |
| 628 | MCFG_FLOPPY_DRIVE_ADD("fdc:1", excali64_floppies, "525dd", floppy_image_device::default_floppy_formats) |
| 629 | #else |
| 630 | MCFG_DEVICE_ADD("fdc", WD2793, 0) |
| 631 | MCFG_WD17XX_DEFAULT_DRIVE4_TAGS |
| 632 | //MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(nascom1_state, nascom2_fdc_intrq_w)) |
| 633 | //MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(nascom1_state, nascom2_fdc_drq_w)) |
| 634 | //MCFG_WD17XX_DDEN_CALLBACK(VCC) |
| 635 | MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(excali64_floppy_interface) |
| 636 | #endif |
| 637 | MCFG_DEVICE_ADD("dma", Z80DMA, XTAL_16MHz/4) |
| 638 | MCFG_Z80DMA_OUT_BUSREQ_CB(WRITELINE(excali64_state, busreq_w)) |
| 639 | MCFG_Z80DMA_IN_MREQ_CB(READ8(excali64_state, memory_read_byte)) |
| 640 | MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(excali64_state, memory_write_byte)) |
| 641 | MCFG_Z80DMA_IN_IORQ_CB(READ8(excali64_state, io_read_byte)) |
| 642 | MCFG_Z80DMA_OUT_IORQ_CB(WRITE8(excali64_state, io_write_byte)) |
| 643 | MACHINE_CONFIG_END |
| 476 | 644 | |
| 477 | 645 | /* ROM definition */ |
| 478 | 646 | ROM_START( excali64 ) |