trunk/src/mame/drivers/ksys573.c
| r18672 | r18673 | |
| 443 | 443 | #include "sound/spu.h" |
| 444 | 444 | #include "sound/cdda.h" |
| 445 | 445 | #include "sound/mas3507d.h" |
| 446 | #include "cdrom.h" |
| 446 | 447 | |
| 447 | 448 | #define VERBOSE_LEVEL ( 0 ) |
| 448 | 449 | |
| r18672 | r18673 | |
| 479 | 480 | { |
| 480 | 481 | public: |
| 481 | 482 | ksys573_state(const machine_config &mconfig, device_type type, const char *tag) |
| 482 | | : psx_state(mconfig, type, tag) { } |
| 483 | : psx_state(mconfig, type, tag), |
| 484 | m_cr589(*this, ":cdrom") { } |
| 483 | 485 | |
| 484 | 486 | int m_flash_bank; |
| 485 | 487 | fujitsu_29f016a_device *m_flash_device[5][16]; |
| r18672 | r18673 | |
| 488 | 490 | UINT32 m_control; |
| 489 | 491 | |
| 490 | 492 | emu_timer *m_atapi_timer; |
| 491 | | scsihle_device *m_inserted_cdrom; |
| 492 | | scsihle_device *m_available_cdroms[ 2 ]; |
| 493 | required_device<scsihle_device> m_cr589; |
| 494 | cdrom_file *m_available_cdroms[ 2 ]; |
| 493 | 495 | int m_atapi_data_ptr; |
| 494 | 496 | int m_atapi_data_len; |
| 495 | 497 | int m_atapi_xferlen; |
| r18672 | r18673 | |
| 710 | 712 | while( m_atapi_xferlen > 0 ) |
| 711 | 713 | { |
| 712 | 714 | // get a sector from the SCSI device |
| 713 | | m_inserted_cdrom->ReadData( sector_buffer, 2048 ); |
| 715 | m_cr589->ReadData( sector_buffer, 2048 ); |
| 714 | 716 | |
| 715 | 717 | m_atapi_xferlen -= 2048; |
| 716 | 718 | |
| r18672 | r18673 | |
| 776 | 778 | // get the data from the device |
| 777 | 779 | if( m_atapi_xferlen > 0 ) |
| 778 | 780 | { |
| 779 | | m_inserted_cdrom->ReadData( m_atapi_data, m_atapi_xferlen ); |
| 781 | m_cr589->ReadData( m_atapi_data, m_atapi_xferlen ); |
| 780 | 782 | m_atapi_data_len = m_atapi_xferlen; |
| 781 | 783 | } |
| 782 | 784 | |
| r18672 | r18673 | |
| 905 | 907 | if (m_atapi_data_ptr == m_atapi_cdata_wait) |
| 906 | 908 | { |
| 907 | 909 | // send it to the device |
| 908 | | m_inserted_cdrom->WriteData( atapi_data, m_atapi_cdata_wait ); |
| 910 | m_cr589->WriteData( atapi_data, m_atapi_cdata_wait ); |
| 909 | 911 | |
| 910 | 912 | // assert IRQ |
| 911 | 913 | psx_irq_set(machine(), 0x400); |
| r18672 | r18673 | |
| 926 | 928 | m_atapi_data_len = 0; |
| 927 | 929 | |
| 928 | 930 | // send it to the SCSI device |
| 929 | | m_inserted_cdrom->SetCommand( m_atapi_data, 12 ); |
| 930 | | m_inserted_cdrom->ExecCommand( &m_atapi_xferlen ); |
| 931 | | m_inserted_cdrom->GetPhase( &phase ); |
| 931 | m_cr589->SetCommand( m_atapi_data, 12 ); |
| 932 | m_cr589->ExecCommand( &m_atapi_xferlen ); |
| 933 | m_cr589->GetPhase( &phase ); |
| 932 | 934 | |
| 933 | 935 | if (m_atapi_xferlen != -1) |
| 934 | 936 | { |
| r18672 | r18673 | |
| 1134 | 1136 | state->m_atapi_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(ksys573_state::atapi_xfer_end),state)); |
| 1135 | 1137 | state->m_atapi_timer->adjust(attotime::never); |
| 1136 | 1138 | |
| 1137 | | state->m_available_cdroms[ 0 ] = machine.device<scsihle_device>( ":cdrom0" ); |
| 1138 | | if( get_disk_handle( machine, ":cdrom1" ) != NULL ) |
| 1139 | | { |
| 1140 | | state->m_available_cdroms[ 1 ] = machine.device<scsihle_device>( ":cdrom1" ); |
| 1141 | | } |
| 1142 | | else |
| 1143 | | { |
| 1144 | | state->m_available_cdroms[ 1 ] = NULL; |
| 1145 | | } |
| 1139 | state->m_available_cdroms[ 0 ] = cdrom_open( get_disk_handle( machine, ":cdrom0" ) ); |
| 1140 | state->m_available_cdroms[ 1 ] = cdrom_open( get_disk_handle( machine, ":cdrom1" ) ); |
| 1146 | 1141 | |
| 1147 | 1142 | state->save_item( NAME(state->m_atapi_regs) ); |
| 1148 | 1143 | state->save_item( NAME(state->m_atapi_data) ); |
| r18672 | r18673 | |
| 1352 | 1347 | state->save_item( NAME(state->m_control) ); |
| 1353 | 1348 | } |
| 1354 | 1349 | |
| 1355 | | static void *atapi_get_device(running_machine &machine) |
| 1356 | | { |
| 1357 | | ksys573_state *state = machine.driver_data<ksys573_state>(); |
| 1358 | | void *ret; |
| 1359 | | state->m_inserted_cdrom->GetDevice( &ret ); |
| 1360 | | return ret; |
| 1361 | | } |
| 1362 | | |
| 1363 | 1350 | static void update_mode( running_machine &machine ) |
| 1364 | 1351 | { |
| 1365 | 1352 | ksys573_state *state = machine.driver_data<ksys573_state>(); |
| 1366 | 1353 | int cart = state->ioport("CART")->read(); |
| 1367 | 1354 | int cd = state->ioport( "CD" )->read(); |
| 1368 | | scsihle_device *new_cdrom; |
| 1355 | cdrom_file *new_cdrom; |
| 1369 | 1356 | |
| 1370 | 1357 | if( state->machine().device<device_secure_serial_flash>("game_eeprom") ) |
| 1371 | 1358 | { |
| r18672 | r18673 | |
| 1385 | 1372 | new_cdrom = state->m_available_cdroms[ 0 ]; |
| 1386 | 1373 | } |
| 1387 | 1374 | |
| 1388 | | if( state->m_inserted_cdrom != new_cdrom ) |
| 1375 | void *current_cdrom; |
| 1376 | state->m_cr589->GetDevice( ¤t_cdrom ); |
| 1377 | |
| 1378 | if( current_cdrom != new_cdrom ) |
| 1389 | 1379 | { |
| 1390 | | state->m_inserted_cdrom = new_cdrom; |
| 1391 | | cdda_set_cdrom(machine.device("cdda"), atapi_get_device(machine)); |
| 1380 | current_cdrom = new_cdrom; |
| 1381 | |
| 1382 | state->m_cr589->SetDevice( new_cdrom ); |
| 1383 | cdda_set_cdrom(machine.device("cdda"), new_cdrom); |
| 1392 | 1384 | } |
| 1393 | 1385 | } |
| 1394 | 1386 | |
| r18672 | r18673 | |
| 3051 | 3043 | |
| 3052 | 3044 | MCFG_MACHINE_RESET_OVERRIDE(ksys573_state, konami573 ) |
| 3053 | 3045 | |
| 3054 | | // multiple cd's are handled by switching drives instead of discs. |
| 3055 | | MCFG_DEVICE_ADD("cdrom0", CR589, 0) |
| 3056 | | MCFG_DEVICE_ADD("cdrom1", CR589, 0) |
| 3046 | MCFG_DEVICE_ADD("cdrom", CR589, 0) |
| 3057 | 3047 | |
| 3058 | 3048 | // onboard flash |
| 3059 | 3049 | MCFG_FUJITSU_29F016A_ADD("onboard.0") |
| r18672 | r18673 | |
| 3827 | 3817 | DISK_IMAGE_READONLY( "845jaa02", 0, BAD_DUMP SHA1(37ca16be25bee39a5692dee2fa5f0fa0addfaaca) ) |
| 3828 | 3818 | |
| 3829 | 3819 | DISK_REGION( "cdrom1" ) |
| 3830 | | DISK_IMAGE_READONLY( "845jaa01", 1, NO_DUMP ) // if this even exists |
| 3820 | DISK_IMAGE_READONLY( "845jaa01", 0, NO_DUMP ) // if this even exists |
| 3831 | 3821 | ROM_END |
| 3832 | 3822 | |
| 3833 | 3823 | ROM_START( ddrjb ) |
| r18672 | r18673 | |
| 3857 | 3847 | DISK_IMAGE_READONLY( "845jab02", 0, BAD_DUMP SHA1(7bdcef37bf376c23153dfd1580de5666cc681335) ) |
| 3858 | 3848 | |
| 3859 | 3849 | DISK_REGION( "cdrom1" ) |
| 3860 | | DISK_IMAGE_READONLY( "845jab01", 1, NO_DUMP ) // if this even exists |
| 3850 | DISK_IMAGE_READONLY( "845jab01", 0, NO_DUMP ) // if this even exists |
| 3861 | 3851 | ROM_END |
| 3862 | 3852 | |
| 3863 | 3853 | ROM_START( ddra ) |
| r18672 | r18673 | |
| 3890 | 3880 | DISK_IMAGE_READONLY( "896jaa01", 0, BAD_DUMP SHA1(f802a0e2ba0147eb71c54d92af409c3010a5715f) ) |
| 3891 | 3881 | |
| 3892 | 3882 | DISK_REGION( "cdrom1" ) |
| 3893 | | DISK_IMAGE_READONLY( "895jaa02", 1, BAD_DUMP SHA1(cfe3a6f3ed62ba388b07045e29e22472d17dcfe4) ) |
| 3883 | DISK_IMAGE_READONLY( "895jaa02", 0, BAD_DUMP SHA1(cfe3a6f3ed62ba388b07045e29e22472d17dcfe4) ) |
| 3894 | 3884 | ROM_END |
| 3895 | 3885 | |
| 3896 | 3886 | ROM_START( ddr2mc2 ) |
| r18672 | r18673 | |
| 3903 | 3893 | DISK_IMAGE_READONLY( "984jaa01", 0, BAD_DUMP SHA1(5505c28be27bfa9648060fd799bcf0c2c5f608ed) ) |
| 3904 | 3894 | |
| 3905 | 3895 | DISK_REGION( "cdrom1" ) |
| 3906 | | DISK_IMAGE_READONLY( "895jaa02", 1, BAD_DUMP SHA1(cfe3a6f3ed62ba388b07045e29e22472d17dcfe4) ) |
| 3896 | DISK_IMAGE_READONLY( "895jaa02", 0, BAD_DUMP SHA1(cfe3a6f3ed62ba388b07045e29e22472d17dcfe4) ) |
| 3907 | 3897 | ROM_END |
| 3908 | 3898 | |
| 3909 | 3899 | ROM_START( ddr2ml ) |
| r18672 | r18673 | |
| 4185 | 4175 | DISK_IMAGE_READONLY( "892jaa01", 0, BAD_DUMP SHA1(46ace0feef48a2a6643c3cb4ac9164ba0beeea94) ) |
| 4186 | 4176 | |
| 4187 | 4177 | DISK_REGION( "cdrom1" ) |
| 4188 | | DISK_IMAGE_READONLY( "895jaa02", 1, BAD_DUMP SHA1(cfe3a6f3ed62ba388b07045e29e22472d17dcfe4) ) |
| 4178 | DISK_IMAGE_READONLY( "895jaa02", 0, BAD_DUMP SHA1(cfe3a6f3ed62ba388b07045e29e22472d17dcfe4) ) |
| 4189 | 4179 | ROM_END |
| 4190 | 4180 | |
| 4191 | 4181 | ROM_START( ddrs2k ) |
| r18672 | r18673 | |
| 4302 | 4292 | DISK_IMAGE_READONLY( "881jad01", 0, BAD_DUMP SHA1(7d9d47bef636dbaa8d578f34ea9489e349d3d6df) ) // upgrade or bootleg? |
| 4303 | 4293 | |
| 4304 | 4294 | DISK_REGION( "cdrom1" ) |
| 4305 | | DISK_IMAGE_READONLY( "881jaa02", 1, NO_DUMP ) |
| 4295 | DISK_IMAGE_READONLY( "881jaa02", 0, NO_DUMP ) |
| 4306 | 4296 | ROM_END |
| 4307 | 4297 | |
| 4308 | 4298 | ROM_START( drmn2m ) |
| r18672 | r18673 | |
| 4345 | 4335 | DISK_IMAGE_READONLY( "912jab02", 0, BAD_DUMP SHA1(19dfae94b63468d3e16d3cc4a3eeae60d5dff1d7) ) |
| 4346 | 4336 | |
| 4347 | 4337 | DISK_REGION( "cdrom1" ) |
| 4348 | | DISK_IMAGE_READONLY( "912za01", 1, BAD_DUMP SHA1(033a310006efe164cc6a8276de42a5d555f9fea9) ) |
| 4338 | DISK_IMAGE_READONLY( "912za01", 0, BAD_DUMP SHA1(033a310006efe164cc6a8276de42a5d555f9fea9) ) |
| 4349 | 4339 | ROM_END |
| 4350 | 4340 | |
| 4351 | 4341 | ROM_START( drmn3m ) |
| r18672 | r18673 | |
| 4924 | 4914 | DISK_IMAGE_READONLY( "949jac01", 0, BAD_DUMP SHA1(ff017dd5c0ecbdb8935d0d4656a45e9fab10ef82) ) |
| 4925 | 4915 | |
| 4926 | 4916 | DISK_REGION( "cdrom1" ) |
| 4927 | | DISK_IMAGE_READONLY( "949jab02", 1, BAD_DUMP SHA1(ad629c9bafbdc4bf6c679918a5fae2bcfdb39332) ) |
| 4917 | DISK_IMAGE_READONLY( "949jab02", 0, BAD_DUMP SHA1(ad629c9bafbdc4bf6c679918a5fae2bcfdb39332) ) |
| 4928 | 4918 | ROM_END |
| 4929 | 4919 | |
| 4930 | 4920 | ROM_START( gtfrk3ma ) |
| r18672 | r18673 | |
| 5099 | 5089 | DISK_IMAGE_READONLY( "d10jab01", 0, BAD_DUMP SHA1(c84858b412f0798a65cf3059c743501f32ad7280) ) |
| 5100 | 5090 | |
| 5101 | 5091 | DISK_REGION( "cdrom1" ) |
| 5102 | | DISK_IMAGE_READONLY( "d10jaa02", 1, BAD_DUMP SHA1(d4e4460ca3edc1b365af593757557c6cf5b7b3ec) ) |
| 5092 | DISK_IMAGE_READONLY( "d10jaa02", 0, BAD_DUMP SHA1(d4e4460ca3edc1b365af593757557c6cf5b7b3ec) ) |
| 5103 | 5093 | ROM_END |
| 5104 | 5094 | |
| 5105 | 5095 | ROM_START( gtfrk10ma ) |