trunk/src/mess/drivers/ng_aes.c
| r19375 | r19376 | |
| 21 | 21 | |
| 22 | 22 | Current status: |
| 23 | 23 | - Cartridges run. |
| 24 | - Riding Hero runs in slow-mo (probably related to comms HW / IO port handling) |
| 24 | 25 | |
| 25 | 26 | ToDo : |
| 26 | 27 | - Change input code to allow selection of the mahjong panel in PORT_CATEGORY. |
| 27 | 28 | - Clean up code, to reduce duplication of MAME source |
| 28 | 29 | |
| 30 | |
| 31 | Neo-Geo CD hardware |
| 32 | |
| 33 | Thanks to: |
| 34 | * The FBA team (Barry Harris) for much of the CDC / CDD code and system details. |
| 35 | ( http://www.barryharris.me.uk/ ) |
| 36 | * Mirko Buffoni for a commented disassembly of the NeoCD bios rom. |
| 37 | |
| 38 | Current status: |
| 39 | - NeoCDZ runs, the original NeoCD does not |
| 40 | - Might think the tray is open? (check) |
| 41 | - CDDA doesn't play |
| 42 | - Some unknown / unhandled CD commands, code is still a bit messy |
| 43 | - Games using Raster Effects are broken, even non-IRQ based ones like mosyougi |
| 44 | - Are we overloading the CPU with interrupts from the CDC, incorrect masking? or something else? |
| 45 | - Double Dragon doesn't load, it erases the IRQ table |
| 46 | - might need better handling of the Vector Table Mapping, or better interrupts (see point above) |
| 47 | - Softlist are based on an old Tosec set and should be updated to the TruRip set once we can convert CCD |
| 48 | without throwing away gap data etc. |
| 49 | - Backup RAM isn't saved? |
| 50 | |
| 29 | 51 | ****************************************************************************/ |
| 30 | 52 | |
| 31 | 53 | #include "emu.h" |
| r19375 | r19376 | |
| 93 | 115 | |
| 94 | 116 | |
| 95 | 117 | |
| 96 | | void NeoCDDoDMA(); |
| 118 | void NeoCDDoDMA(address_space& curr_space); |
| 97 | 119 | void set_DMA_regs(int offset, UINT16 wordValue); |
| 98 | 120 | |
| 99 | 121 | UINT8 *m_memcard_data; |
| r19375 | r19376 | |
| 131 | 153 | INT32 NeoCDDMAValue2; |
| 132 | 154 | INT32 NeoCDDMACount; |
| 133 | 155 | INT32 NeoCDDMAMode; |
| 134 | | void SekWriteWord(UINT32 a, UINT16 d); |
| 135 | | void SekWriteByte(UINT32 a, UINT8 d); |
| 136 | | UINT32 SekReadByte(UINT32 a); |
| 137 | | UINT32 SekReadWord(UINT32 a); |
| 138 | 156 | |
| 139 | 157 | UINT8 nTransferWriteEnable; |
| 140 | 158 | |
| 141 | 159 | address_space* curr_space; |
| 142 | | |
| 143 | | |
| 144 | 160 | }; |
| 145 | 161 | |
| 146 | 162 | |
| 147 | | #define LOG_VIDEO_SYSTEM (0) |
| 148 | | #define LOG_CPU_COMM (0) |
| 149 | | #define LOG_MAIN_CPU_BANKING (1) |
| 150 | | #define LOG_AUDIO_CPU_BANKING (1) |
| 151 | | |
| 152 | | #define NEOCD_AREA_SPR 0 |
| 153 | | #define NEOCD_AREA_PCM 1 |
| 154 | | #define NEOCD_AREA_AUDIO 4 |
| 155 | | #define NEOCD_AREA_FIX 5 |
| 156 | | |
| 157 | 163 | /************************************* |
| 158 | 164 | * |
| 159 | 165 | * Global variables |
| r19375 | r19376 | |
| 175 | 181 | |
| 176 | 182 | |
| 177 | 183 | |
| 178 | | /************************************* |
| 179 | | * |
| 180 | | * Audio CPU interrupt generation |
| 181 | | * |
| 182 | | *************************************/ |
| 183 | 184 | |
| 184 | | static void audio_cpu_irq(device_t *device, int assert) |
| 185 | | { |
| 186 | | neogeo_state *state = device->machine().driver_data<neogeo_state>(); |
| 187 | | state->m_audiocpu->set_input_line(0, assert ? ASSERT_LINE : CLEAR_LINE); |
| 188 | | } |
| 189 | 185 | |
| 190 | 186 | |
| 191 | | |
| 192 | | |
| 193 | | |
| 194 | | |
| 195 | | |
| 196 | | |
| 197 | | |
| 198 | | |
| 199 | 187 | /************************************* |
| 200 | 188 | * |
| 201 | 189 | * Memory card |
| r19375 | r19376 | |
| 251 | 239 | } |
| 252 | 240 | } |
| 253 | 241 | |
| 254 | | static MEMCARD_HANDLER( neogeo ) |
| 242 | static MEMCARD_HANDLER( neogeo_aes ) |
| 255 | 243 | { |
| 256 | 244 | ng_aes_state *state = machine.driver_data<ng_aes_state>(); |
| 257 | 245 | switch (action) |
| r19375 | r19376 | |
| 372 | 360 | |
| 373 | 361 | // LC8951 registers |
| 374 | 362 | case 0x0100: |
| 375 | | return m_tempcdc->segacd_cdc_mode_address_r(*curr_space, 0, 0xffff); |
| 363 | return m_tempcdc->segacd_cdc_mode_address_r(space, 0, 0xffff); |
| 376 | 364 | case 0x0102: |
| 377 | 365 | return m_tempcdc->CDC_Reg_r(); |
| 378 | 366 | |
| r19375 | r19376 | |
| 418 | 406 | // DMA controller |
| 419 | 407 | case 0x0060: |
| 420 | 408 | if (byteValue & 0x40) { |
| 421 | | NeoCDDoDMA(); |
| 409 | NeoCDDoDMA(space); |
| 422 | 410 | } |
| 423 | 411 | break; |
| 424 | 412 | |
| r19375 | r19376 | |
| 449 | 437 | |
| 450 | 438 | // LC8951 registers |
| 451 | 439 | case 0x0100: |
| 452 | | m_tempcdc->segacd_cdc_mode_address_w(*curr_space, 0, byteValue, 0xffff); |
| 440 | m_tempcdc->segacd_cdc_mode_address_w(space, 0, byteValue, 0xffff); |
| 453 | 441 | break; |
| 454 | 442 | case 0x0102: |
| 455 | 443 | m_tempcdc->CDC_Reg_w(byteValue); |
| r19375 | r19376 | |
| 468 | 456 | break; |
| 469 | 457 | case 0x0126: |
| 470 | 458 | // bprintf(PRINT_NORMAL, _T(" - NGCD Z80 BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1)); |
| 471 | | curr_space->machine().scheduler().synchronize(); |
| 459 | space.machine().scheduler().synchronize(); |
| 472 | 460 | m_audiocpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 473 | 461 | break; |
| 474 | 462 | case 0x0128: |
| r19375 | r19376 | |
| 484 | 472 | break; |
| 485 | 473 | case 0x0146: |
| 486 | 474 | // bprintf(PRINT_NORMAL, _T(" - NGCD Z80 BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1)); |
| 487 | | curr_space->machine().scheduler().synchronize(); |
| 475 | space.machine().scheduler().synchronize(); |
| 488 | 476 | m_audiocpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 489 | 477 | break; |
| 490 | 478 | case 0x0148: |
| r19375 | r19376 | |
| 654 | 642 | |
| 655 | 643 | |
| 656 | 644 | |
| 657 | | void ng_aes_state::SekWriteWord(UINT32 a, UINT16 d) |
| 658 | | { |
| 659 | | // printf("write word %08x %04x\n", a, d); |
| 660 | | curr_space->write_word(a,d); |
| 661 | | } |
| 662 | 645 | |
| 663 | | void ng_aes_state::SekWriteByte(UINT32 a, UINT8 d) |
| 664 | | { |
| 665 | | // printf("write byte %08x %02x\n", a, d); |
| 666 | | curr_space->write_byte(a,d); |
| 667 | | } |
| 668 | 646 | |
| 669 | | UINT32 ng_aes_state::SekReadByte(UINT32 a) |
| 670 | | { |
| 671 | | // printf("read byte %08x\n", a); |
| 672 | | return curr_space->read_byte(a); |
| 673 | | } |
| 674 | | |
| 675 | | |
| 676 | | UINT32 ng_aes_state::SekReadWord(UINT32 a) |
| 677 | | { |
| 678 | | // printf("read WORD %08x\n", a); |
| 679 | | return curr_space->read_word(a); |
| 680 | | } |
| 681 | | |
| 682 | | |
| 683 | | |
| 684 | 647 | static INT32 SekIdle(INT32 nCycles) |
| 685 | 648 | { |
| 686 | 649 | return nCycles; |
| r19375 | r19376 | |
| 734 | 697 | */ |
| 735 | 698 | |
| 736 | 699 | |
| 737 | | void ng_aes_state::NeoCDDoDMA() |
| 700 | void ng_aes_state::NeoCDDoDMA(address_space& curr_space) |
| 738 | 701 | { |
| 739 | 702 | |
| 740 | 703 | // The LC8953 chip has a programmable DMA controller, which is not properly emulated. |
| r19375 | r19376 | |
| 765 | 728 | SekIdle(NeoCDDMACount * 4); |
| 766 | 729 | |
| 767 | 730 | while (NeoCDDMACount--) { |
| 768 | | SekWriteWord(NeoCDDMAAddress1 + 0, NeoCDDMAAddress1 >> 24); |
| 769 | | SekWriteWord(NeoCDDMAAddress1 + 2, NeoCDDMAAddress1 >> 16); |
| 770 | | SekWriteWord(NeoCDDMAAddress1 + 4, NeoCDDMAAddress1 >> 8); |
| 771 | | SekWriteWord(NeoCDDMAAddress1 + 6, NeoCDDMAAddress1 >> 0); |
| 731 | curr_space.write_word(NeoCDDMAAddress1 + 0, NeoCDDMAAddress1 >> 24); |
| 732 | curr_space.write_word(NeoCDDMAAddress1 + 2, NeoCDDMAAddress1 >> 16); |
| 733 | curr_space.write_word(NeoCDDMAAddress1 + 4, NeoCDDMAAddress1 >> 8); |
| 734 | curr_space.write_word(NeoCDDMAAddress1 + 6, NeoCDDMAAddress1 >> 0); |
| 772 | 735 | NeoCDDMAAddress1 += 8; |
| 773 | 736 | } |
| 774 | 737 | |
| r19375 | r19376 | |
| 791 | 754 | SekIdle(NeoCDDMACount * 1); |
| 792 | 755 | |
| 793 | 756 | while (NeoCDDMACount--) { |
| 794 | | SekWriteWord(NeoCDDMAAddress2 + 0, SekReadByte(NeoCDDMAAddress1 + 0)); |
| 795 | | SekWriteWord(NeoCDDMAAddress2 + 2, SekReadByte(NeoCDDMAAddress1 + 1)); |
| 757 | curr_space.write_word(NeoCDDMAAddress2 + 0, curr_space.read_byte(NeoCDDMAAddress1 + 0)); |
| 758 | curr_space.write_word(NeoCDDMAAddress2 + 2, curr_space.read_byte(NeoCDDMAAddress1 + 1)); |
| 796 | 759 | NeoCDDMAAddress1 += 2; |
| 797 | 760 | NeoCDDMAAddress2 += 4; |
| 798 | 761 | } |
| r19375 | r19376 | |
| 821 | 784 | SekIdle(NeoCDDMACount * 4); |
| 822 | 785 | |
| 823 | 786 | while (NeoCDDMACount--) { |
| 824 | | SekWriteByte(NeoCDDMAAddress1 + 0, data[0]); |
| 825 | | SekWriteByte(NeoCDDMAAddress1 + 2, data[1]); |
| 787 | curr_space.write_byte(NeoCDDMAAddress1 + 0, data[0]); |
| 788 | curr_space.write_byte(NeoCDDMAAddress1 + 2, data[1]); |
| 826 | 789 | NeoCDDMAAddress1 += 4; |
| 827 | 790 | data += 2; |
| 828 | 791 | } |
| r19375 | r19376 | |
| 860 | 823 | SekIdle(NeoCDDMACount * 1); |
| 861 | 824 | |
| 862 | 825 | while (NeoCDDMACount--) { |
| 863 | | SekWriteWord(NeoCDDMAAddress2, SekReadWord(NeoCDDMAAddress1)); |
| 826 | curr_space.write_word(NeoCDDMAAddress2, curr_space.read_word(NeoCDDMAAddress1)); |
| 864 | 827 | NeoCDDMAAddress1 += 2; |
| 865 | 828 | NeoCDDMAAddress2 += 2; |
| 866 | 829 | } |
| r19375 | r19376 | |
| 890 | 853 | SekIdle(NeoCDDMACount * 2); |
| 891 | 854 | |
| 892 | 855 | while (NeoCDDMACount--) { |
| 893 | | SekWriteWord(NeoCDDMAAddress1 + 0, NeoCDDMAAddress1 >> 16); |
| 894 | | SekWriteWord(NeoCDDMAAddress1 + 2, NeoCDDMAAddress1 >> 0); |
| 856 | curr_space.write_word(NeoCDDMAAddress1 + 0, NeoCDDMAAddress1 >> 16); |
| 857 | curr_space.write_word(NeoCDDMAAddress1 + 2, NeoCDDMAAddress1 >> 0); |
| 895 | 858 | NeoCDDMAAddress1 += 4; |
| 896 | 859 | } |
| 897 | 860 | |
| r19375 | r19376 | |
| 919 | 882 | SekIdle(NeoCDDMACount * 4); |
| 920 | 883 | |
| 921 | 884 | while (NeoCDDMACount--) { |
| 922 | | SekWriteByte(NeoCDDMAAddress1 + 0, data[0]); |
| 923 | | SekWriteByte(NeoCDDMAAddress1 + 1, data[1]); |
| 885 | curr_space.write_byte(NeoCDDMAAddress1 + 0, data[0]); |
| 886 | curr_space.write_byte(NeoCDDMAAddress1 + 1, data[1]); |
| 924 | 887 | NeoCDDMAAddress1 += 2; |
| 925 | 888 | data += 2; |
| 926 | 889 | } |
| r19375 | r19376 | |
| 958 | 921 | SekIdle(NeoCDDMACount * 1); |
| 959 | 922 | |
| 960 | 923 | while (NeoCDDMACount--) { |
| 961 | | SekWriteWord(NeoCDDMAAddress1, NeoCDDMAValue1); |
| 924 | curr_space.write_word(NeoCDDMAAddress1, NeoCDDMAValue1); |
| 962 | 925 | NeoCDDMAAddress1 += 2; |
| 963 | 926 | } |
| 964 | 927 | |
| r19375 | r19376 | |
| 1204 | 1167 | YM2610ADPCMAROM = memregion("ymsnd")->base(); |
| 1205 | 1168 | NeoZ80ROMActive = memregion("audiocpu")->base(); |
| 1206 | 1169 | NeoTextRAM = memregion("fixed")->base(); |
| 1207 | | curr_space = &machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 1208 | 1170 | } |
| 1209 | 1171 | |
| 1210 | 1172 | MACHINE_RESET_MEMBER(ng_aes_state,neocd) |
| r19375 | r19376 | |
| 1226 | 1188 | * |
| 1227 | 1189 | *************************************/ |
| 1228 | 1190 | |
| 1229 | | static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, ng_aes_state ) |
| 1191 | static ADDRESS_MAP_START( aes_main_map, AS_PROGRAM, 16, ng_aes_state ) |
| 1230 | 1192 | AM_RANGE(0x000000, 0x00007f) AM_ROMBANK(NEOGEO_BANK_VECTORS) |
| 1231 | 1193 | AM_RANGE(0x000080, 0x0fffff) AM_ROM |
| 1232 | 1194 | AM_RANGE(0x100000, 0x10ffff) AM_MIRROR(0x0f0000) AM_RAM |
| r19375 | r19376 | |
| 1282 | 1244 | ADDRESS_MAP_END |
| 1283 | 1245 | |
| 1284 | 1246 | |
| 1285 | | /************************************* |
| 1286 | | * |
| 1287 | | * Audio CPU memory handlers |
| 1288 | | * |
| 1289 | | *************************************/ |
| 1290 | 1247 | |
| 1291 | | static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8, ng_aes_state ) |
| 1292 | | AM_RANGE(0x0000, 0x7fff) AM_ROMBANK(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK) |
| 1293 | | AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK3) |
| 1294 | | AM_RANGE(0xc000, 0xdfff) AM_ROMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK2) |
| 1295 | | AM_RANGE(0xe000, 0xefff) AM_ROMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK1) |
| 1296 | | AM_RANGE(0xf000, 0xf7ff) AM_ROMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK0) |
| 1297 | | AM_RANGE(0xf800, 0xffff) AM_RAM |
| 1298 | | ADDRESS_MAP_END |
| 1299 | 1248 | |
| 1300 | 1249 | |
| 1301 | | |
| 1302 | 1250 | /************************************* |
| 1303 | 1251 | * |
| 1304 | 1252 | * Audio CPU port handlers |
| 1305 | 1253 | * |
| 1306 | 1254 | *************************************/ |
| 1307 | 1255 | |
| 1308 | | static ADDRESS_MAP_START( audio_io_map, AS_IO, 8, ng_aes_state ) |
| 1309 | | /*AM_RANGE(0x00, 0x00) AM_MIRROR(0xff00) AM_READWRITE(audio_command_r, audio_cpu_clear_nmi_w);*/ /* may not and NMI clear */ |
| 1310 | | AM_RANGE(0x00, 0x00) AM_MIRROR(0xff00) AM_READ(audio_command_r) |
| 1311 | | AM_RANGE(0x04, 0x07) AM_MIRROR(0xff00) AM_DEVREADWRITE_LEGACY("ymsnd", ym2610_r, ym2610_w) |
| 1312 | | AM_RANGE(0x08, 0x08) AM_MIRROR(0xff00) /* write - NMI enable / acknowledge? (the data written doesn't matter) */ |
| 1313 | | AM_RANGE(0x08, 0x08) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_f000_f7ff_r) |
| 1314 | | AM_RANGE(0x09, 0x09) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_e000_efff_r) |
| 1315 | | AM_RANGE(0x0a, 0x0a) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_c000_dfff_r) |
| 1316 | | AM_RANGE(0x0b, 0x0b) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_8000_bfff_r) |
| 1317 | | AM_RANGE(0x0c, 0x0c) AM_MIRROR(0xff00) AM_WRITE(audio_result_w) |
| 1318 | | AM_RANGE(0x18, 0x18) AM_MIRROR(0xff00) /* write - NMI disable? (the data written doesn't matter) */ |
| 1319 | | ADDRESS_MAP_END |
| 1320 | 1256 | |
| 1321 | | |
| 1322 | | |
| 1323 | | |
| 1324 | 1257 | static ADDRESS_MAP_START( neocd_audio_map, AS_PROGRAM, 8, ng_aes_state ) |
| 1325 | 1258 | AM_RANGE(0x0000, 0xffff) AM_RAM AM_REGION("audiocpu", 0x00000) |
| 1326 | 1259 | ADDRESS_MAP_END |
| r19375 | r19376 | |
| 1348 | 1281 | |
| 1349 | 1282 | /************************************* |
| 1350 | 1283 | * |
| 1351 | | * Audio interface |
| 1352 | | * |
| 1353 | | *************************************/ |
| 1354 | | |
| 1355 | | static const ym2610_interface ym2610_config = |
| 1356 | | { |
| 1357 | | audio_cpu_irq |
| 1358 | | }; |
| 1359 | | |
| 1360 | | |
| 1361 | | |
| 1362 | | /************************************* |
| 1363 | | * |
| 1364 | 1284 | * Standard Neo-Geo DIPs and |
| 1365 | 1285 | * input port definition |
| 1366 | 1286 | * |
| r19375 | r19376 | |
| 1599 | 1519 | * |
| 1600 | 1520 | *************************************/ |
| 1601 | 1521 | |
| 1602 | | static MACHINE_CONFIG_START( neogeo, ng_aes_state ) |
| 1603 | 1522 | |
| 1604 | | /* basic machine hardware */ |
| 1605 | | MCFG_CPU_ADD("maincpu", M68000, NEOGEO_MAIN_CPU_CLOCK) |
| 1606 | | MCFG_CPU_PROGRAM_MAP(main_map) |
| 1523 | static MACHINE_CONFIG_DERIVED_CLASS( aes, neogeo_base, ng_aes_state ) |
| 1524 | MCFG_CPU_MODIFY("maincpu") |
| 1525 | MCFG_CPU_PROGRAM_MAP(aes_main_map) // some different input handling, probably also responsible for Riding Hero not running properly |
| 1526 | |
| 1527 | MCFG_MEMCARD_HANDLER(neogeo_aes) |
| 1607 | 1528 | |
| 1608 | | MCFG_CPU_ADD("audiocpu", Z80, NEOGEO_AUDIO_CPU_CLOCK) |
| 1609 | | MCFG_CPU_PROGRAM_MAP(audio_map) |
| 1610 | | MCFG_CPU_IO_MAP(audio_io_map) |
| 1611 | | |
| 1612 | 1529 | MCFG_MACHINE_START_OVERRIDE(ng_aes_state, neogeo) |
| 1613 | 1530 | MCFG_MACHINE_RESET_OVERRIDE(ng_aes_state, neogeo) |
| 1614 | 1531 | |
| 1615 | | // temporary until things are cleaned up |
| 1616 | | MCFG_DEVICE_ADD("tempcdc", LC89510_TEMP, 0) // cd controller |
| 1617 | | MCFG_SEGACD_HACK_SET_NEOCD |
| 1618 | | |
| 1619 | | /* video hardware */ |
| 1620 | | MCFG_DEFAULT_LAYOUT(layout_neogeo) |
| 1621 | | |
| 1622 | | MCFG_SCREEN_ADD("screen", RASTER) |
| 1623 | | MCFG_SCREEN_RAW_PARAMS(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART) |
| 1624 | | MCFG_SCREEN_UPDATE_DRIVER(ng_aes_state, screen_update_neogeo) |
| 1625 | | |
| 1626 | | /* audio hardware */ |
| 1627 | | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 1628 | | |
| 1629 | | MCFG_SOUND_ADD("ymsnd", YM2610, NEOGEO_YM2610_CLOCK) |
| 1630 | | MCFG_SOUND_CONFIG(ym2610_config) |
| 1631 | | MCFG_SOUND_ROUTE(0, "lspeaker", 0.60) |
| 1632 | | MCFG_SOUND_ROUTE(0, "rspeaker", 0.60) |
| 1633 | | MCFG_SOUND_ROUTE(1, "lspeaker", 1.0) |
| 1634 | | MCFG_SOUND_ROUTE(2, "rspeaker", 1.0) |
| 1635 | | |
| 1636 | | /* NEC uPD4990A RTC */ |
| 1637 | | MCFG_UPD4990A_ADD("upd4990a") |
| 1638 | | MACHINE_CONFIG_END |
| 1639 | | |
| 1640 | | static MACHINE_CONFIG_DERIVED( aes, neogeo ) |
| 1641 | | |
| 1642 | | MCFG_MEMCARD_HANDLER(neogeo) |
| 1643 | | |
| 1644 | 1532 | MCFG_CARTSLOT_ADD("cart") |
| 1645 | 1533 | MCFG_CARTSLOT_LOAD(neo_cartridge) |
| 1646 | 1534 | MCFG_CARTSLOT_INTERFACE("neo_cart") |
| r19375 | r19376 | |
| 1651 | 1539 | MACHINE_CONFIG_END |
| 1652 | 1540 | |
| 1653 | 1541 | |
| 1654 | | |
| 1655 | 1542 | /* NeoCD uses custom vectors on IRQ4 to handle various events from the CDC */ |
| 1656 | 1543 | |
| 1657 | 1544 | static IRQ_CALLBACK(neocd_int_callback) |
| r19375 | r19376 | |
| 1677 | 1564 | NULL |
| 1678 | 1565 | }; |
| 1679 | 1566 | |
| 1680 | | static MACHINE_CONFIG_DERIVED( neocd, neogeo ) |
| 1567 | static MACHINE_CONFIG_DERIVED_CLASS( neocd, neogeo_base, ng_aes_state ) |
| 1681 | 1568 | |
| 1682 | 1569 | MCFG_CPU_MODIFY("maincpu") |
| 1683 | 1570 | MCFG_CPU_PROGRAM_MAP(neocd_main_map) |
| r19375 | r19376 | |
| 1686 | 1573 | MCFG_CPU_PROGRAM_MAP(neocd_audio_map) |
| 1687 | 1574 | MCFG_CPU_IO_MAP(neocd_audio_io_map) |
| 1688 | 1575 | |
| 1576 | // temporary until things are cleaned up |
| 1577 | MCFG_DEVICE_ADD("tempcdc", LC89510_TEMP, 0) // cd controller |
| 1578 | MCFG_SEGACD_HACK_SET_NEOCD |
| 1689 | 1579 | |
| 1580 | MCFG_MEMCARD_HANDLER(neogeo_aes) |
| 1581 | |
| 1690 | 1582 | MCFG_MACHINE_START_OVERRIDE(ng_aes_state,neocd) |
| 1691 | 1583 | MCFG_MACHINE_RESET_OVERRIDE(ng_aes_state,neocd) |
| 1692 | 1584 | |