trunk/src/mess/drivers/a310.c
| r29538 | r29539 | |
| 15 | 15 | * \- some subtle memory paging fault |
| 16 | 16 | * \- missing RAM max size |
| 17 | 17 | * \- ARM bug? |
| 18 | * - 38776b8 |
| 18 | 19 | * |
| 19 | 20 | * |
| 20 | 21 | ======================================================================================= |
| r29538 | r29539 | |
| 58 | 59 | |
| 59 | 60 | |
| 60 | 61 | #include "emu.h" |
| 61 | | #include "machine/wd17xx.h" |
| 62 | | #include "imagedev/flopdrv.h" |
| 63 | 62 | #include "cpu/arm/arm.h" |
| 64 | 63 | #include "sound/dac.h" |
| 65 | 64 | #include "includes/archimds.h" |
| 66 | 65 | #include "machine/i2cmem.h" |
| 67 | 66 | //#include "machine/aakart.h" |
| 68 | 67 | #include "machine/ram.h" |
| 68 | #include "machine/wd_fdc.h" |
| 69 | #include "formats/applix_dsk.h" |
| 69 | 70 | |
| 70 | 71 | |
| 71 | 72 | class a310_state : public archimedes_state |
| r29538 | r29539 | |
| 87 | 88 | virtual void machine_start(); |
| 88 | 89 | virtual void machine_reset(); |
| 89 | 90 | DECLARE_INPUT_CHANGED_MEMBER(key_stroke); |
| 91 | DECLARE_FLOPPY_FORMATS( floppy_formats ); |
| 90 | 92 | |
| 91 | 93 | |
| 92 | 94 | protected: |
| r29538 | r29539 | |
| 296 | 298 | PORT_BIT (0xf8, 0x80, IPT_UNUSED) |
| 297 | 299 | INPUT_PORTS_END |
| 298 | 300 | |
| 299 | | static const wd17xx_interface a310_wd17xx_interface = |
| 300 | | { |
| 301 | | DEVCB_NULL, |
| 302 | | DEVCB_DRIVER_LINE_MEMBER(a310_state, a310_wd177x_intrq_w), |
| 303 | | DEVCB_DRIVER_LINE_MEMBER(a310_state, a310_wd177x_drq_w), |
| 304 | | {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3} |
| 305 | | }; |
| 301 | FLOPPY_FORMATS_MEMBER( a310_state::floppy_formats ) |
| 302 | FLOPPY_APPLIX_FORMAT |
| 303 | FLOPPY_FORMATS_END |
| 306 | 304 | |
| 305 | static SLOT_INTERFACE_START( a310_floppies ) |
| 306 | SLOT_INTERFACE( "35dd", FLOPPY_35_DD ) |
| 307 | SLOT_INTERFACE_END |
| 308 | |
| 307 | 309 | WRITE_LINE_MEMBER( archimedes_state::a310_kart_tx_w ) |
| 308 | 310 | { |
| 309 | 311 | if(state) |
| r29538 | r29539 | |
| 331 | 333 | ARM_COPRO_TYPE_VL86C020 |
| 332 | 334 | }; |
| 333 | 335 | |
| 336 | |
| 334 | 337 | static MACHINE_CONFIG_START( a310, a310_state ) |
| 335 | 338 | /* basic machine hardware */ |
| 336 | 339 | MCFG_CPU_ADD("maincpu", ARM, 8000000) /* 8 MHz */ |
| 337 | 340 | MCFG_CPU_PROGRAM_MAP(a310_mem) |
| 338 | 341 | MCFG_CPU_CONFIG(a310_config) |
| 339 | 342 | |
| 340 | | MCFG_AAKART_ADD("kart", 8000000/256, kart_interface) // TODO: frequency |
| 343 | MCFG_AAKART_ADD("kart", 8000000/256, kart_interface) |
| 341 | 344 | |
| 342 | 345 | MCFG_I2CMEM_ADD("i2cmem") |
| 343 | 346 | MCFG_I2CMEM_DATA_SIZE(0x100) |
| r29538 | r29539 | |
| 356 | 359 | MCFG_RAM_DEFAULT_SIZE("2M") |
| 357 | 360 | MCFG_RAM_EXTRA_OPTIONS("512K, 1M, 4M, 8M, 16M") |
| 358 | 361 | |
| 359 | | MCFG_WD1772_ADD("wd1772", a310_wd17xx_interface ) |
| 362 | MCFG_WD1772x_ADD("fdc", 8000000 / 2) |
| 363 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", a310_floppies, "35dd", a310_state::floppy_formats) |
| 364 | MCFG_FLOPPY_DRIVE_ADD("fdc:1", a310_floppies, "35dd", a310_state::floppy_formats) |
| 360 | 365 | |
| 361 | | //MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(a310_floppy_interface) |
| 362 | | |
| 363 | 366 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 364 | 367 | MCFG_SOUND_ADD("dac0", DAC, 0) |
| 365 | 368 | MCFG_SOUND_ROUTE(0, "mono", 0.10) |
trunk/src/mame/machine/archimds.c
| r29538 | r29539 | |
| 685 | 685 | { |
| 686 | 686 | case 0: return ioc_ctrl_r(space,offset,mem_mask); |
| 687 | 687 | case 1: |
| 688 | | if (m_wd1772) { |
| 688 | if (m_fdc) { |
| 689 | 689 | logerror("17XX: R @ addr %x mask %08x\n", offset*4, mem_mask); |
| 690 | | return m_wd1772->data_r(space, offset&0xf); |
| 690 | return m_fdc->data_r(space, offset&0xf); |
| 691 | 691 | } else { |
| 692 | 692 | logerror("Read from FDC device?\n"); |
| 693 | 693 | return 0; |
| r29538 | r29539 | |
| 702 | 702 | logerror("IOC: Internal Podule Read\n"); |
| 703 | 703 | return 0xffff; |
| 704 | 704 | case 5: |
| 705 | | if (m_wd1772) { |
| 705 | if (m_fdc) { |
| 706 | 706 | switch(ioc_addr & 0xfffc) |
| 707 | 707 | { |
| 708 | 708 | case 0x50: return 0; //fdc type, new model returns 5 here |
| r29538 | r29539 | |
| 740 | 740 | { |
| 741 | 741 | case 0: ioc_ctrl_w(space,offset,data,mem_mask); return; |
| 742 | 742 | case 1: |
| 743 | | if (m_wd1772) { |
| 743 | if (m_fdc) { |
| 744 | 744 | logerror("17XX: %x to addr %x mask %08x\n", data, offset*4, mem_mask); |
| 745 | | m_wd1772->data_w(space, offset&0xf, data&0xff); |
| 745 | m_fdc->data_w(space, offset&0xf, data&0xff); |
| 746 | 746 | } else { |
| 747 | 747 | logerror("Write to FDC device?\n"); |
| 748 | 748 | } |
| r29538 | r29539 | |
| 757 | 757 | logerror("IOC: Internal Podule Write\n"); |
| 758 | 758 | return; |
| 759 | 759 | case 5: |
| 760 | | if (m_wd1772) { |
| 760 | if (m_fdc) { |
| 761 | 761 | switch(ioc_addr & 0xfffc) |
| 762 | 762 | { |
| 763 | 763 | case 0x18: // latch B |
| 764 | | m_wd1772->dden_w(BIT(data, 1)); |
| 764 | m_fdc->dden_w(BIT(data, 1)); |
| 765 | 765 | return; |
| 766 | 766 | |
| 767 | 767 | case 0x40: // latch A |
| 768 | | if (data & 1) { m_wd1772->set_drive(0); } |
| 769 | | if (data & 2) { m_wd1772->set_drive(1); } |
| 770 | | if (data & 4) { m_wd1772->set_drive(2); } |
| 771 | | if (data & 8) { m_wd1772->set_drive(3); } |
| 768 | floppy_image_device *floppy = NULL; |
| 772 | 769 | |
| 773 | | m_wd1772->set_side((data & 0x10)>>4); |
| 770 | if (data & 1) { floppy = m_floppy0->get_device(); } |
| 771 | if (data & 2) { floppy = m_floppy1->get_device(); } |
| 772 | //if (data & 4) { m_fdc->set_drive(2); } |
| 773 | //if (data & 8) { m_fdc->set_drive(3); } |
| 774 | |
| 775 | m_fdc->set_floppy(floppy); |
| 776 | |
| 777 | if(floppy) |
| 778 | { |
| 779 | floppy->mon_w(BIT(data, 5)); |
| 780 | m_fdc->dden_w(BIT(data, 4)); |
| 781 | } |
| 774 | 782 | //bit 5 is motor on |
| 775 | 783 | return; |
| 776 | 784 | } |
| r29538 | r29539 | |
| 920 | 928 | |
| 921 | 929 | |
| 922 | 930 | //#ifdef MAME_DEBUG |
| 931 | if(0) |
| 923 | 932 | logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], m_vidc_regs[reg]); |
| 924 | 933 | //#endif |
| 925 | 934 | |
trunk/src/mame/includes/archimds.h
| r29538 | r29539 | |
| 10 | 10 | #include "machine/aakart.h" |
| 11 | 11 | #include "sound/dac.h" |
| 12 | 12 | #include "machine/i2cmem.h" |
| 13 | | #include "machine/wd17xx.h" |
| 13 | #include "machine/wd_fdc.h" |
| 14 | 14 | |
| 15 | 15 | // interrupt definitions. these are for the real Archimedes computer - arcade |
| 16 | 16 | // and gambling knockoffs likely are a bit different. |
| r29538 | r29539 | |
| 47 | 47 | m_kart(*this, "kart"), |
| 48 | 48 | m_maincpu(*this, "maincpu"), |
| 49 | 49 | m_i2cmem(*this, "i2cmem"), |
| 50 | | m_wd1772(*this, "wd1772"), |
| 50 | m_fdc(*this, "fdc"), |
| 51 | m_floppy0(*this, "fdc:0"), |
| 52 | m_floppy1(*this, "fdc:1"), |
| 51 | 53 | m_region_maincpu(*this, "maincpu"), |
| 52 | 54 | m_region_vram(*this, "vram"), |
| 53 | 55 | m_screen(*this, "screen"), |
| r29538 | r29539 | |
| 92 | 94 | protected: |
| 93 | 95 | required_device<cpu_device> m_maincpu; |
| 94 | 96 | optional_device<i2cmem_device> m_i2cmem; |
| 95 | | optional_device<wd1772_device> m_wd1772; |
| 97 | optional_device<wd1772_t> m_fdc; |
| 98 | optional_device<floppy_connector> m_floppy0; |
| 99 | optional_device<floppy_connector> m_floppy1; |
| 96 | 100 | required_memory_region m_region_maincpu; |
| 97 | 101 | required_memory_region m_region_vram; |
| 98 | 102 | required_device<screen_device> m_screen; |