trunk/src/mame/drivers/zn.c
| r23801 | r23802 | |
| 20 | 20 | #include "machine/znsec.h" |
| 21 | 21 | #include "machine/zndip.h" |
| 22 | 22 | #include "machine/ataintf.h" |
| 23 | | #include "machine/idectrl.h" |
| 23 | #include "machine/vt83c461.h" |
| 24 | 24 | #include "audio/taitosnd.h" |
| 25 | 25 | #include "sound/2610intf.h" |
| 26 | 26 | #include "sound/ymz280b.h" |
| r23801 | r23802 | |
| 46 | 46 | m_cbaj_fifo1(*this, "cbaj_fifo1"), |
| 47 | 47 | m_cbaj_fifo2(*this, "cbaj_fifo2"), |
| 48 | 48 | m_mb3773(*this, "mb3773"), |
| 49 | | m_ide(*this, "ide") |
| 49 | m_vt83c461(*this, "ide") |
| 50 | 50 | { |
| 51 | 51 | } |
| 52 | 52 | |
| r23801 | r23802 | |
| 83 | 83 | DECLARE_WRITE8_MEMBER(coh1002m_bank_w); |
| 84 | 84 | DECLARE_READ8_MEMBER(cbaj_sound_main_status_r); |
| 85 | 85 | DECLARE_READ8_MEMBER(cbaj_sound_z80_status_r); |
| 86 | DECLARE_READ16_MEMBER(vt83c461_16_r); |
| 87 | DECLARE_WRITE16_MEMBER(vt83c461_16_w); |
| 88 | DECLARE_READ16_MEMBER(vt83c461_32_r); |
| 89 | DECLARE_WRITE16_MEMBER(vt83c461_32_w); |
| 86 | 90 | DECLARE_DRIVER_INIT(coh1000ta); |
| 87 | 91 | DECLARE_DRIVER_INIT(coh1000tb); |
| 88 | 92 | DECLARE_DRIVER_INIT(coh1000c); |
| r23801 | r23802 | |
| 116 | 120 | size_t m_nbajamex_eeprom_size; |
| 117 | 121 | UINT8 *m_nbajamex_eeprom; |
| 118 | 122 | |
| 123 | UINT16 vt83c461_latch; |
| 124 | |
| 119 | 125 | required_device<psxgpu_device> m_gpu; |
| 120 | 126 | required_device<znsec_device> m_znsec0; |
| 121 | 127 | required_device<znsec_device> m_znsec1; |
| r23801 | r23802 | |
| 126 | 132 | optional_device<fifo7200_device> m_cbaj_fifo1; |
| 127 | 133 | optional_device<fifo7200_device> m_cbaj_fifo2; |
| 128 | 134 | optional_device<mb3773_device> m_mb3773; |
| 129 | | optional_device<ide_controller_device> m_ide; |
| 135 | optional_device<vt83c461_device> m_vt83c461; |
| 130 | 136 | }; |
| 131 | 137 | |
| 132 | 138 | inline void ATTR_PRINTF(3,4) zn_state::verboselog( int n_level, const char *s_fmt, ... ) |
| r23801 | r23802 | |
| 1343 | 1349 | n_size <<= 1; |
| 1344 | 1350 | while( n_size > 0 ) |
| 1345 | 1351 | { |
| 1346 | | psxwriteword( p_n_psxram, n_address, m_ide->read_cs0(space, 0, 0xffff) ); |
| 1352 | psxwriteword( p_n_psxram, n_address, m_vt83c461->read_cs0(space, (UINT32) 0, (UINT32) 0xffff) ); |
| 1347 | 1353 | n_address += 2; |
| 1348 | 1354 | n_size--; |
| 1349 | 1355 | } |
| r23801 | r23802 | |
| 1354 | 1360 | logerror("DMA write from %08x for %d bytes\n", n_address, n_size<<2); |
| 1355 | 1361 | } |
| 1356 | 1362 | |
| 1363 | READ16_MEMBER(zn_state::vt83c461_16_r) |
| 1364 | { |
| 1365 | int shift = (16 * (offset & 1)); |
| 1366 | |
| 1367 | if( offset >= 0x30 / 2 && offset < 0x40 / 2 ) |
| 1368 | { |
| 1369 | return m_vt83c461->read_config( space, ( offset / 2 ) & 3, mem_mask << shift ) >> shift; |
| 1370 | } |
| 1371 | else if( offset >= 0x1f0 / 2 && offset < 0x1f8 / 2 ) |
| 1372 | { |
| 1373 | return m_vt83c461->read_cs0( space, ( offset / 2 ) & 1, (UINT32) mem_mask << shift ) >> shift; |
| 1374 | } |
| 1375 | else if( offset >= 0x3f0 / 2 && offset < 0x3f8 / 2 ) |
| 1376 | { |
| 1377 | return m_vt83c461->read_cs1( space, ( offset / 2 ) & 1, (UINT32) mem_mask << shift ) >> shift; |
| 1378 | } |
| 1379 | else |
| 1380 | { |
| 1381 | logerror( "unhandled 16 bit read %04x %04x\n", offset, mem_mask ); |
| 1382 | return 0xffff; |
| 1383 | } |
| 1384 | } |
| 1385 | |
| 1386 | WRITE16_MEMBER(zn_state::vt83c461_16_w) |
| 1387 | { |
| 1388 | int shift = (16 * (offset & 1)); |
| 1389 | |
| 1390 | if( offset >= 0x30 / 2 && offset < 0x40 / 2 ) |
| 1391 | { |
| 1392 | m_vt83c461->write_config( space, ( offset / 2 ) & 3, data << shift, mem_mask << shift ); |
| 1393 | } |
| 1394 | else if( offset >= 0x1f0 / 2 && offset < 0x1f8 / 2 ) |
| 1395 | { |
| 1396 | m_vt83c461->write_cs0( space, ( offset / 2 ) & 1, (UINT32) data << shift, (UINT32) mem_mask << shift ); |
| 1397 | } |
| 1398 | else if( offset >= 0x3f0 / 2 && offset < 0x3f8 / 2 ) |
| 1399 | { |
| 1400 | m_vt83c461->write_cs1( space, ( offset / 2 ) & 1, (UINT32) data << shift, (UINT32) mem_mask << shift ); |
| 1401 | } |
| 1402 | else |
| 1403 | { |
| 1404 | logerror( "unhandled 16 bit write %04x %04x %04x\n", offset, data, mem_mask ); |
| 1405 | } |
| 1406 | } |
| 1407 | |
| 1408 | READ16_MEMBER(zn_state::vt83c461_32_r) |
| 1409 | { |
| 1410 | if( offset == 0x1f0/2 ) |
| 1411 | { |
| 1412 | UINT32 data = m_vt83c461->read_cs0(space, 0, 0xffffffff); |
| 1413 | vt83c461_latch = data >> 16; |
| 1414 | return data & 0xffff; |
| 1415 | } |
| 1416 | else if( offset == 0x1f2/2 ) |
| 1417 | { |
| 1418 | return vt83c461_latch; |
| 1419 | } |
| 1420 | else |
| 1421 | { |
| 1422 | logerror( "unhandled 32 bit read %04x %04x\n", offset, mem_mask ); |
| 1423 | return 0xffff; |
| 1424 | } |
| 1425 | } |
| 1426 | |
| 1427 | WRITE16_MEMBER(zn_state::vt83c461_32_w) |
| 1428 | { |
| 1429 | logerror( "unhandled 32 bit write %04x %04x %04x\n", offset, data, mem_mask ); |
| 1430 | } |
| 1431 | |
| 1357 | 1432 | static ADDRESS_MAP_START(coh1000w_map, AS_PROGRAM, 32, zn_state) |
| 1358 | 1433 | AM_RANGE(0x1f000000, 0x1f1fffff) AM_ROM AM_REGION("roms", 0) |
| 1359 | 1434 | AM_RANGE(0x1f000000, 0x1f000003) AM_WRITENOP |
| 1360 | 1435 | AM_RANGE(0x1f7e8000, 0x1f7e8003) AM_NOP |
| 1361 | | // 8/16 |
| 1362 | | AM_RANGE(0x1f7e4030, 0x1f7e403f) AM_DEVREADWRITE8("ide", ide_controller_device, read_via_config, write_via_config, 0xffffffff) |
| 1363 | | AM_RANGE(0x1f7e41f0, 0x1f7e41f7) AM_DEVREADWRITE16("ide", ide_controller_device, read_cs0, write_cs0, 0xffffffff) |
| 1364 | | AM_RANGE(0x1f7e43f0, 0x1f7e43f7) AM_DEVREADWRITE16("ide", ide_controller_device, read_cs1, write_cs1, 0xffffffff) |
| 1365 | | // 32 |
| 1366 | | AM_RANGE(0x1f7f41f0, 0x1f7f41f7) AM_DEVREADWRITE16("ide", ide_controller_device, read_cs0, write_cs0, 0xffffffff) |
| 1367 | | AM_RANGE(0x1f7f43f0, 0x1f7f43f7) AM_DEVREADWRITE16("ide", ide_controller_device, read_cs1, write_cs1, 0xffffffff) |
| 1368 | | |
| 1436 | AM_RANGE(0x1f7e4000, 0x1f7e4fff) AM_READWRITE16(vt83c461_16_r, vt83c461_16_w, 0xffffffff) |
| 1437 | AM_RANGE(0x1f7f4000, 0x1f7f4fff) AM_READWRITE16(vt83c461_32_r, vt83c461_32_w, 0xffffffff) |
| 1369 | 1438 | AM_IMPORT_FROM(zn_map) |
| 1370 | 1439 | ADDRESS_MAP_END |
| 1371 | 1440 | |
| r23801 | r23802 | |
| 1376 | 1445 | MCFG_RAM_MODIFY("maincpu:ram") |
| 1377 | 1446 | MCFG_RAM_DEFAULT_SIZE("8M") |
| 1378 | 1447 | |
| 1379 | | MCFG_IDE_CONTROLLER_ADD("ide", ata_devices, "hdd", NULL, true) |
| 1448 | MCFG_VT83C461_ADD("ide", ata_devices, "hdd", NULL, true) |
| 1380 | 1449 | MCFG_ATA_INTERFACE_IRQ_HANDLER(DEVWRITELINE("maincpu:irq", psxirq_device, intin10)) |
| 1381 | 1450 | MCFG_PSX_DMA_CHANNEL_READ( "maincpu", 5, psx_dma_read_delegate( FUNC( zn_state::atpsx_dma_read ), (zn_state *) owner ) ) |
| 1382 | 1451 | MCFG_PSX_DMA_CHANNEL_WRITE( "maincpu", 5, psx_dma_write_delegate( FUNC( zn_state::atpsx_dma_write ), (zn_state *) owner ) ) |
trunk/src/mame/drivers/jaguar.c
| r23801 | r23802 | |
| 334 | 334 | #include "cpu/m68000/m68000.h" |
| 335 | 335 | #include "cpu/mips/r3000.h" |
| 336 | 336 | #include "cpu/jaguar/jaguar.h" |
| 337 | | #include "machine/idectrl.h" |
| 337 | #include "machine/vt83c461.h" |
| 338 | 338 | #include "sound/dac.h" |
| 339 | 339 | #include "includes/jaguar.h" |
| 340 | 340 | #include "emuopts.h" |
| r23801 | r23802 | |
| 1077 | 1077 | AM_RANGE(0xf1d000, 0xf1dfff) AM_READWRITE(wave_rom_r16, wave_rom_w16 ) |
| 1078 | 1078 | ADDRESS_MAP_END |
| 1079 | 1079 | |
| 1080 | | /// hack for 32 big endian bus talking to 16 bit little endian ide |
| 1081 | | READ32_MEMBER(jaguar_state::vt83c461_r) |
| 1082 | | { |
| 1083 | | UINT32 data = 0; |
| 1084 | 1080 | |
| 1085 | | if(offset >= 0x30/4 && offset < 0x40/4) |
| 1086 | | { |
| 1087 | | if (ACCESSING_BITS_0_7) |
| 1088 | | data = m_ide->read_via_config(space, (offset * 4) & 0xf, mem_mask); |
| 1089 | | } |
| 1090 | | else if( offset >= 0x1f0/4 && offset < 0x1f8/4 ) |
| 1091 | | { |
| 1092 | | if (ACCESSING_BITS_0_15) |
| 1093 | | data |= m_ide->read_cs0(space, (offset * 2) & 7, mem_mask); |
| 1094 | | if (ACCESSING_BITS_16_31) |
| 1095 | | data |= m_ide->read_cs0(space, ((offset * 2) & 7) + 1, mem_mask >> 16) << 16; |
| 1096 | | } |
| 1097 | | else if( offset >= 0x3f0/4 && offset < 0x3f8/4 ) |
| 1098 | | { |
| 1099 | | if (ACCESSING_BITS_0_15) |
| 1100 | | data |= m_ide->read_cs1(space, (offset * 2) & 7, mem_mask); |
| 1101 | | if (ACCESSING_BITS_16_31) |
| 1102 | | data |= m_ide->read_cs1(space, ((offset * 2) & 7) + 1, mem_mask >> 16) << 16; |
| 1103 | | } |
| 1104 | 1081 | |
| 1105 | | return data; |
| 1106 | | } |
| 1107 | | |
| 1108 | | WRITE32_MEMBER(jaguar_state::vt83c461_w) |
| 1109 | | { |
| 1110 | | if(offset >= 0x30/4 && offset < 0x40/4) |
| 1111 | | { |
| 1112 | | if (ACCESSING_BITS_0_7) |
| 1113 | | m_ide->write_via_config(space, (offset * 4) & 0xf, data, mem_mask); |
| 1114 | | } |
| 1115 | | else if( offset >= 0x1f0/4 && offset < 0x1f8/4 ) |
| 1116 | | { |
| 1117 | | if (ACCESSING_BITS_0_15) |
| 1118 | | m_ide->write_cs0(space, (offset * 2) & 7, data, mem_mask); |
| 1119 | | if (ACCESSING_BITS_16_31) |
| 1120 | | m_ide->write_cs0(space, ((offset * 2) & 7) + 1, data >> 16, mem_mask >> 16); |
| 1121 | | } |
| 1122 | | else if( offset >= 0x3f0/4 && offset < 0x3f8/4 ) |
| 1123 | | { |
| 1124 | | if (ACCESSING_BITS_0_15) |
| 1125 | | m_ide->write_cs1(space, (offset * 2) & 7, data, mem_mask); |
| 1126 | | if (ACCESSING_BITS_16_31) |
| 1127 | | m_ide->write_cs1(space, ((offset * 2) & 7) + 1, data >> 16, mem_mask >> 16); |
| 1128 | | } |
| 1129 | | } |
| 1130 | | |
| 1131 | | |
| 1132 | | |
| 1133 | 1082 | /************************************* |
| 1134 | 1083 | * |
| 1135 | 1084 | * Main CPU memory handlers |
| r23801 | r23802 | |
| 1140 | 1089 | AM_RANGE(0x04000000, 0x047fffff) AM_RAM AM_SHARE("sharedram") |
| 1141 | 1090 | AM_RANGE(0x04800000, 0x04bfffff) AM_ROMBANK("maingfxbank") |
| 1142 | 1091 | AM_RANGE(0x04c00000, 0x04dfffff) AM_ROMBANK("mainsndbank") |
| 1143 | | AM_RANGE(0x04e00000, 0x04e003ff) AM_READWRITE(vt83c461_r, vt83c461_w) |
| 1092 | AM_RANGE(0x04e00030, 0x04e0003f) AM_DEVREADWRITE("ide", vt83c461_device, read_config, write_config) |
| 1093 | AM_RANGE(0x04e001f0, 0x04e001f7) AM_DEVREADWRITE("ide", vt83c461_device, read_cs0, write_cs0) |
| 1094 | AM_RANGE(0x04e003f0, 0x04e003f7) AM_DEVREADWRITE("ide", vt83c461_device, read_cs1, write_cs1) |
| 1144 | 1095 | AM_RANGE(0x04f00000, 0x04f003ff) AM_READWRITE16(tom_regs_r, tom_regs_w, 0xffffffff) |
| 1145 | 1096 | AM_RANGE(0x04f00400, 0x04f007ff) AM_RAM AM_SHARE("gpuclut") |
| 1146 | 1097 | AM_RANGE(0x04f02100, 0x04f021ff) AM_READWRITE(gpuctrl_r, gpuctrl_w) |
| r23801 | r23802 | |
| 1174 | 1125 | AM_RANGE(0xa40000, 0xa40003) AM_WRITE(eeprom_enable_w) |
| 1175 | 1126 | AM_RANGE(0xb70000, 0xb70003) AM_READWRITE(misc_control_r, misc_control_w) |
| 1176 | 1127 | AM_RANGE(0xc00000, 0xdfffff) AM_ROMBANK("mainsndbank") |
| 1177 | | AM_RANGE(0xe00000, 0xe003ff) AM_READWRITE(vt83c461_r, vt83c461_w) |
| 1128 | AM_RANGE(0xe00030, 0xe0003f) AM_DEVREADWRITE("ide", vt83c461_device, read_config, write_config) |
| 1129 | AM_RANGE(0xe001f0, 0xe001f7) AM_DEVREADWRITE("ide", vt83c461_device, read_cs0, write_cs0) |
| 1130 | AM_RANGE(0xe003f0, 0xe003f7) AM_DEVREADWRITE("ide", vt83c461_device, read_cs1, write_cs1) |
| 1178 | 1131 | AM_RANGE(0xf00000, 0xf003ff) AM_READWRITE16(tom_regs_r, tom_regs_w, 0xffffffff) |
| 1179 | 1132 | AM_RANGE(0xf00400, 0xf007ff) AM_RAM AM_SHARE("gpuclut") |
| 1180 | 1133 | AM_RANGE(0xf02100, 0xf021ff) AM_READWRITE(gpuctrl_r, gpuctrl_w) |
| r23801 | r23802 | |
| 1202 | 1155 | AM_RANGE(0x000000, 0x7fffff) AM_RAM AM_SHARE("sharedram") |
| 1203 | 1156 | AM_RANGE(0x800000, 0xbfffff) AM_ROMBANK("gpugfxbank") |
| 1204 | 1157 | AM_RANGE(0xc00000, 0xdfffff) AM_ROMBANK("dspsndbank") |
| 1205 | | AM_RANGE(0xe00000, 0xe003ff) AM_READWRITE(vt83c461_r, vt83c461_w) |
| 1158 | AM_RANGE(0xe00030, 0xe0003f) AM_DEVREADWRITE("ide", vt83c461_device, read_config, write_config) |
| 1159 | AM_RANGE(0xe001f0, 0xe001f7) AM_DEVREADWRITE("ide", vt83c461_device, read_cs0, write_cs0) |
| 1160 | AM_RANGE(0xe003f0, 0xe003f7) AM_DEVREADWRITE("ide", vt83c461_device, read_cs1, write_cs1) |
| 1206 | 1161 | AM_RANGE(0xf00000, 0xf003ff) AM_READWRITE16(tom_regs_r, tom_regs_w, 0xffffffff) |
| 1207 | 1162 | AM_RANGE(0xf00400, 0xf007ff) AM_RAM AM_SHARE("gpuclut") |
| 1208 | 1163 | AM_RANGE(0xf02100, 0xf021ff) AM_READWRITE(gpuctrl_r, gpuctrl_w) |
| r23801 | r23802 | |
| 1601 | 1556 | |
| 1602 | 1557 | MCFG_NVRAM_ADD_1FILL("nvram") |
| 1603 | 1558 | |
| 1604 | | MCFG_IDE_CONTROLLER_ADD("ide", ata_devices, "hdd", NULL, true) |
| 1559 | MCFG_VT83C461_ADD("ide", ata_devices, "hdd", NULL, true) |
| 1605 | 1560 | MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(jaguar_state, external_int)) |
| 1606 | 1561 | |
| 1607 | 1562 | /* video hardware */ |
trunk/src/emu/machine/idectrl.c
| r23801 | r23802 | |
| 25 | 25 | CONSTANTS |
| 26 | 26 | ***************************************************************************/ |
| 27 | 27 | |
| 28 | | #define IDE_BANK2_CONFIG_UNK 4 |
| 29 | | #define IDE_BANK2_CONFIG_REGISTER 8 |
| 30 | | #define IDE_BANK2_CONFIG_DATA 0xc |
| 31 | | |
| 32 | 28 | const device_type IDE_CONTROLLER = &device_creator<ide_controller_device>; |
| 33 | 29 | |
| 34 | 30 | ide_controller_device::ide_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 35 | | ata_interface_device(mconfig, IDE_CONTROLLER, "IDE Controller", tag, owner, clock), |
| 36 | | m_config_unknown(0), |
| 37 | | m_config_register_num(0) |
| 31 | ata_interface_device(mconfig, IDE_CONTROLLER, "IDE Controller", tag, owner, clock) |
| 38 | 32 | { |
| 39 | 33 | } |
| 40 | 34 | |
| 41 | 35 | ide_controller_device::ide_controller_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : |
| 42 | | ata_interface_device(mconfig, type, name, tag, owner, clock), |
| 43 | | m_config_unknown(0), |
| 44 | | m_config_register_num(0) |
| 36 | ata_interface_device(mconfig, type, name, tag, owner, clock) |
| 45 | 37 | { |
| 46 | 38 | } |
| 47 | 39 | |
| 48 | | //------------------------------------------------- |
| 49 | | // device_start - device-specific startup |
| 50 | | //------------------------------------------------- |
| 51 | | |
| 52 | | void ide_controller_device::device_start() |
| 53 | | { |
| 54 | | ata_interface_device::device_start(); |
| 55 | | |
| 56 | | /* register ide states */ |
| 57 | | save_item(NAME(m_config_unknown)); |
| 58 | | save_item(NAME(m_config_register)); |
| 59 | | save_item(NAME(m_config_register_num)); |
| 60 | | } |
| 61 | | |
| 62 | | READ8_MEMBER( ide_controller_device::read_via_config ) |
| 63 | | { |
| 64 | | UINT16 result = 0; |
| 65 | | |
| 66 | | /* logit */ |
| 67 | | LOG(("%s:IDE via config read at %X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask)); |
| 68 | | |
| 69 | | switch(offset) |
| 70 | | { |
| 71 | | /* unknown config register */ |
| 72 | | case IDE_BANK2_CONFIG_UNK: |
| 73 | | result = m_config_unknown; |
| 74 | | break; |
| 75 | | |
| 76 | | /* active config register */ |
| 77 | | case IDE_BANK2_CONFIG_REGISTER: |
| 78 | | result = m_config_register_num; |
| 79 | | break; |
| 80 | | |
| 81 | | /* data from active config register */ |
| 82 | | case IDE_BANK2_CONFIG_DATA: |
| 83 | | if (m_config_register_num < IDE_CONFIG_REGISTERS) |
| 84 | | result = m_config_register[m_config_register_num]; |
| 85 | | break; |
| 86 | | |
| 87 | | default: |
| 88 | | logerror("%s:unknown IDE via config read at %03X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask); |
| 89 | | break; |
| 90 | | } |
| 91 | | |
| 92 | | // printf( "read via config %04x %04x %04x\n", offset, result, mem_mask ); |
| 93 | | return result; |
| 94 | | } |
| 95 | | |
| 96 | 40 | READ16_MEMBER( ide_controller_device::read_cs0 ) |
| 97 | 41 | { |
| 98 | | if (mem_mask == 0xffff && offset == 1 ) offset = 0; // hack for 32 bit read of data register |
| 99 | 42 | if (mem_mask == 0xff00) |
| 100 | 43 | { |
| 101 | 44 | return ata_interface_device::read_cs0(space, (offset * 2) + 1, 0xff) << 8; |
| r23801 | r23802 | |
| 118 | 61 | } |
| 119 | 62 | } |
| 120 | 63 | |
| 121 | | WRITE8_MEMBER( ide_controller_device::write_via_config ) |
| 122 | | { |
| 123 | | // printf( "write via config %04x %04x %04x\n", offset, data, mem_mask ); |
| 124 | | |
| 125 | | /* logit */ |
| 126 | | LOG(("%s:IDE via config write to %X = %08X, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask)); |
| 127 | | |
| 128 | | switch (offset) |
| 129 | | { |
| 130 | | /* unknown config register */ |
| 131 | | case IDE_BANK2_CONFIG_UNK: |
| 132 | | m_config_unknown = data; |
| 133 | | break; |
| 134 | | |
| 135 | | /* active config register */ |
| 136 | | case IDE_BANK2_CONFIG_REGISTER: |
| 137 | | m_config_register_num = data; |
| 138 | | break; |
| 139 | | |
| 140 | | /* data from active config register */ |
| 141 | | case IDE_BANK2_CONFIG_DATA: |
| 142 | | if (m_config_register_num < IDE_CONFIG_REGISTERS) |
| 143 | | m_config_register[m_config_register_num] = data; |
| 144 | | break; |
| 145 | | } |
| 146 | | } |
| 147 | | |
| 148 | 64 | WRITE16_MEMBER( ide_controller_device::write_cs0 ) |
| 149 | 65 | { |
| 150 | | if (mem_mask == 0xffff && offset == 1 ) offset = 0; // hack for 32 bit write to data register |
| 151 | 66 | if (mem_mask == 0xff00) |
| 152 | 67 | { |
| 153 | 68 | return ata_interface_device::write_cs0(space, (offset * 2) + 1, data >> 8, 0xff); |
trunk/src/emu/machine/vt83c461.c
| r0 | r23802 | |
| 1 | #include "vt83c461.h" |
| 2 | |
| 3 | /*************************************************************************** |
| 4 | DEBUGGING |
| 5 | ***************************************************************************/ |
| 6 | |
| 7 | #define VERBOSE 0 |
| 8 | |
| 9 | #define LOG(x) do { if (VERBOSE) logerror x; } while (0) |
| 10 | |
| 11 | |
| 12 | #define VT83C461_CONFIG_UNK 1 |
| 13 | #define VT83C461_CONFIG_REGISTER 2 |
| 14 | #define VT83C461_CONFIG_DATA 3 |
| 15 | |
| 16 | |
| 17 | const device_type VT83C461 = &device_creator<vt83c461_device>; |
| 18 | |
| 19 | vt83c461_device::vt83c461_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 20 | ide_controller_device(mconfig, VT83C461, "VIA VT83C461", tag, owner, clock), |
| 21 | m_config_unknown(0), |
| 22 | m_config_register_num(0) |
| 23 | { |
| 24 | } |
| 25 | |
| 26 | //------------------------------------------------- |
| 27 | // device_start - device-specific startup |
| 28 | //------------------------------------------------- |
| 29 | |
| 30 | void vt83c461_device::device_start() |
| 31 | { |
| 32 | ide_controller_device::device_start(); |
| 33 | |
| 34 | /* register ide states */ |
| 35 | save_item(NAME(m_config_unknown)); |
| 36 | save_item(NAME(m_config_register)); |
| 37 | save_item(NAME(m_config_register_num)); |
| 38 | } |
| 39 | |
| 40 | READ32_MEMBER( vt83c461_device::read_config ) |
| 41 | { |
| 42 | UINT32 result = 0; |
| 43 | |
| 44 | /* logit */ |
| 45 | LOG(("%s:IDE via config read at %X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask)); |
| 46 | |
| 47 | switch(offset) |
| 48 | { |
| 49 | /* unknown config register */ |
| 50 | case VT83C461_CONFIG_UNK: |
| 51 | result = m_config_unknown; |
| 52 | break; |
| 53 | |
| 54 | /* active config register */ |
| 55 | case VT83C461_CONFIG_REGISTER: |
| 56 | result = m_config_register_num; |
| 57 | break; |
| 58 | |
| 59 | /* data from active config register */ |
| 60 | case VT83C461_CONFIG_DATA: |
| 61 | if (m_config_register_num < IDE_CONFIG_REGISTERS) |
| 62 | result = m_config_register[m_config_register_num]; |
| 63 | break; |
| 64 | |
| 65 | default: |
| 66 | logerror("%s:unknown IDE via config read at %03X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask); |
| 67 | break; |
| 68 | } |
| 69 | |
| 70 | // printf( "vt83c461 read config %04x %08x %04x\n", offset, result, mem_mask ); |
| 71 | return result; |
| 72 | } |
| 73 | |
| 74 | WRITE32_MEMBER( vt83c461_device::write_config ) |
| 75 | { |
| 76 | // printf( "vt83c461 write config %04x %08x %04x\n", offset, data, mem_mask ); |
| 77 | |
| 78 | /* logit */ |
| 79 | LOG(("%s:IDE via config write to %X = %08X, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask)); |
| 80 | |
| 81 | switch (offset) |
| 82 | { |
| 83 | /* unknown config register */ |
| 84 | case VT83C461_CONFIG_UNK: |
| 85 | m_config_unknown = data; |
| 86 | break; |
| 87 | |
| 88 | /* active config register */ |
| 89 | case VT83C461_CONFIG_REGISTER: |
| 90 | m_config_register_num = data; |
| 91 | break; |
| 92 | |
| 93 | /* data from active config register */ |
| 94 | case VT83C461_CONFIG_DATA: |
| 95 | if (m_config_register_num < IDE_CONFIG_REGISTERS) |
| 96 | m_config_register[m_config_register_num] = data; |
| 97 | break; |
| 98 | |
| 99 | default: |
| 100 | logerror("%s:unknown IDE via config write at %03X = %08x, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask); |
| 101 | break; |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | READ32_MEMBER(vt83c461_device::read_cs0) |
| 106 | { |
| 107 | UINT32 data = 0; |
| 108 | |
| 109 | if (ACCESSING_BITS_0_15) |
| 110 | { |
| 111 | data = ide_controller_device::read_cs0(space, (offset * 2), mem_mask); |
| 112 | |
| 113 | if (offset == 0 && ACCESSING_BITS_16_31) |
| 114 | data |= ide_controller_device::read_cs0(space, (offset * 2), mem_mask >> 16) << 16; |
| 115 | } |
| 116 | else if (ACCESSING_BITS_16_31) |
| 117 | { |
| 118 | data = ide_controller_device::read_cs0(space, (offset * 2) + 1, mem_mask >> 16) << 16; |
| 119 | } |
| 120 | |
| 121 | // printf( "vt83c461 read cs0 %08x %08x %08x\n", offset, data, mem_mask ); |
| 122 | |
| 123 | return data; |
| 124 | } |
| 125 | |
| 126 | READ32_MEMBER(vt83c461_device::read_cs1) |
| 127 | { |
| 128 | UINT32 data = 0; |
| 129 | |
| 130 | if (ACCESSING_BITS_0_15) |
| 131 | { |
| 132 | data = ide_controller_device::read_cs1(space, (offset * 2), mem_mask); |
| 133 | } |
| 134 | else if (ACCESSING_BITS_16_23) |
| 135 | { |
| 136 | data = ide_controller_device::read_cs1(space, (offset * 2) + 1, mem_mask >> 16) << 16; |
| 137 | } |
| 138 | |
| 139 | // printf( "vt83c461 read cs1 %08x %08x %08x\n", offset, data, mem_mask ); |
| 140 | |
| 141 | return data; |
| 142 | } |
| 143 | |
| 144 | WRITE32_MEMBER(vt83c461_device::write_cs0) |
| 145 | { |
| 146 | // printf( "vt83c461 write cs0 %08x %08x %08x\n", offset, data, mem_mask ); |
| 147 | |
| 148 | if (ACCESSING_BITS_0_15) |
| 149 | { |
| 150 | ide_controller_device::write_cs0(space, (offset * 2), data, mem_mask); |
| 151 | |
| 152 | if (offset == 0 && ACCESSING_BITS_16_31) |
| 153 | ata_interface_device::write_cs0(space, (offset * 2), data >> 16, mem_mask >> 16); |
| 154 | } |
| 155 | else if (ACCESSING_BITS_16_31) |
| 156 | { |
| 157 | ide_controller_device::write_cs0(space, (offset * 2) + 1, data >> 16, mem_mask >> 16); |
| 158 | } |
| 159 | } |
| 160 | |
| 161 | WRITE32_MEMBER(vt83c461_device::write_cs1) |
| 162 | { |
| 163 | // printf( "vt83c461 write cs1 %08x %08x %08x\n", offset, data, mem_mask ); |
| 164 | |
| 165 | if (ACCESSING_BITS_0_7) |
| 166 | { |
| 167 | ide_controller_device::write_cs1(space, (offset * 2), data, mem_mask); |
| 168 | } |
| 169 | else if (ACCESSING_BITS_16_23) |
| 170 | { |
| 171 | ide_controller_device::write_cs1(space, (offset * 2) + 1, data >> 16, mem_mask >> 16); |
| 172 | } |
| 173 | } |
trunk/src/emu/machine/vt83c461.h
| r0 | r23802 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | vt83c461.h |
| 4 | |
| 5 | VIA VT83C461 (IDE Hard Drive controller). |
| 6 | |
| 7 | Copyright Nicola Salmoria and the MAME Team. |
| 8 | Visit http://mamedev.org for licensing and usage restrictions. |
| 9 | |
| 10 | ***************************************************************************/ |
| 11 | |
| 12 | #pragma once |
| 13 | |
| 14 | #ifndef __VT83C461_H__ |
| 15 | #define __VT83C461_H__ |
| 16 | |
| 17 | #include "idectrl.h" |
| 18 | |
| 19 | /*************************************************************************** |
| 20 | DEVICE CONFIGURATION MACROS |
| 21 | ***************************************************************************/ |
| 22 | |
| 23 | #define MCFG_VT83C461_ADD(_tag, _slotintf, _master, _slave, _fixed) \ |
| 24 | MCFG_DEVICE_ADD(_tag, VT83C461, 0) \ |
| 25 | MCFG_ATA_SLOT_ADD(_tag ":0", _slotintf, _master, _fixed) \ |
| 26 | MCFG_ATA_SLOT_ADD(_tag ":1", _slotintf, _slave, _fixed) \ |
| 27 | MCFG_DEVICE_MODIFY(_tag) |
| 28 | |
| 29 | #define IDE_CONFIG_REGISTERS 0x10 |
| 30 | |
| 31 | class vt83c461_device : public ide_controller_device |
| 32 | { |
| 33 | public: |
| 34 | vt83c461_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 35 | |
| 36 | DECLARE_READ32_MEMBER(read_config); |
| 37 | DECLARE_WRITE32_MEMBER(write_config); |
| 38 | |
| 39 | virtual DECLARE_READ32_MEMBER(read_cs0); |
| 40 | virtual DECLARE_READ32_MEMBER(read_cs1); |
| 41 | virtual DECLARE_WRITE32_MEMBER(write_cs0); |
| 42 | virtual DECLARE_WRITE32_MEMBER(write_cs1); |
| 43 | |
| 44 | protected: |
| 45 | virtual void device_start(); |
| 46 | |
| 47 | private: |
| 48 | using ide_controller_device::read_cs0; |
| 49 | using ide_controller_device::read_cs1; |
| 50 | using ide_controller_device::write_cs0; |
| 51 | using ide_controller_device::write_cs1; |
| 52 | |
| 53 | UINT8 m_config_unknown; |
| 54 | UINT8 m_config_register[IDE_CONFIG_REGISTERS]; |
| 55 | UINT8 m_config_register_num; |
| 56 | }; |
| 57 | |
| 58 | extern const device_type VT83C461; |
| 59 | |
| 60 | #endif |