src/mess/machine/pce.c
| r9158 | r9159 | |
| 153 | 153 | emu_timer *adpcm_dma_timer; |
| 154 | 154 | |
| 155 | 155 | emu_timer *cdda_fadeout_timer; |
| 156 | emu_timer *cdda_fadein_timer; |
| 156 | 157 | double cdda_volume; |
| 157 | | // emu_timer *cdda_fadeout_timer; |
| 158 | emu_timer *adpcm_fadeout_timer; |
| 159 | emu_timer *adpcm_fadein_timer; |
| 160 | double adpcm_volume; |
| 158 | 161 | } pce_cd; |
| 159 | 162 | |
| 160 | 163 | /* MSM5205 ADPCM decoder definition */ |
| r9158 | r9159 | |
| 181 | 184 | static void pce_cd_set_irq_line( running_machine *machine, int num, int state ); |
| 182 | 185 | static TIMER_CALLBACK( pce_cd_adpcm_dma_timer_callback ); |
| 183 | 186 | static TIMER_CALLBACK( pce_cd_cdda_fadeout_callback ); |
| 187 | static TIMER_CALLBACK( pce_cd_cdda_fadein_callback ); |
| 188 | static TIMER_CALLBACK( pce_cd_adpcm_fadeout_callback ); |
| 189 | static TIMER_CALLBACK( pce_cd_adpcm_fadein_callback ); |
| 184 | 190 | |
| 185 | | |
| 186 | 191 | static WRITE8_HANDLER( pce_sf2_banking_w ) |
| 187 | 192 | { |
| 188 | 193 | memory_set_bankptr( space->machine, "bank2", memory_region(space->machine, "user1") + offset * 0x080000 + 0x080000 ); |
| r9158 | r9159 | |
| 1244 | 1249 | timer_adjust_oneshot(pce_cd.data_timer, attotime_never, 0); |
| 1245 | 1250 | pce_cd.adpcm_dma_timer = timer_alloc(machine, pce_cd_adpcm_dma_timer_callback , NULL); |
| 1246 | 1251 | timer_adjust_oneshot(pce_cd.adpcm_dma_timer, attotime_never, 0); |
| 1252 | |
| 1247 | 1253 | pce_cd.cdda_fadeout_timer = timer_alloc(machine, pce_cd_cdda_fadeout_callback , NULL); |
| 1248 | 1254 | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, attotime_never, 0); |
| 1255 | pce_cd.cdda_fadein_timer = timer_alloc(machine, pce_cd_cdda_fadein_callback , NULL); |
| 1256 | timer_adjust_oneshot(pce_cd.cdda_fadein_timer, attotime_never, 0); |
| 1257 | |
| 1258 | pce_cd.adpcm_fadeout_timer = timer_alloc(machine, pce_cd_adpcm_fadeout_callback , NULL); |
| 1259 | timer_adjust_oneshot(pce_cd.adpcm_fadeout_timer, attotime_never, 0); |
| 1260 | pce_cd.adpcm_fadein_timer = timer_alloc(machine, pce_cd_adpcm_fadein_callback , NULL); |
| 1261 | timer_adjust_oneshot(pce_cd.adpcm_fadein_timer, attotime_never, 0); |
| 1249 | 1262 | } |
| 1250 | 1263 | |
| 1251 | 1264 | WRITE8_HANDLER( pce_cd_bram_w ) |
| r9158 | r9159 | |
| 1272 | 1285 | |
| 1273 | 1286 | static TIMER_CALLBACK( pce_cd_cdda_fadeout_callback ) |
| 1274 | 1287 | { |
| 1275 | | pce_cd.cdda_volume-= 1.0; //TODO: step here could be wrong |
| 1276 | | cdda_set_volume(machine->device("cdda"), pce_cd.cdda_volume); |
| 1288 | pce_cd.cdda_volume-= 0.1; |
| 1277 | 1289 | |
| 1278 | 1290 | if(pce_cd.cdda_volume <= 0) |
| 1291 | { |
| 1292 | pce_cd.cdda_volume = 0.0; |
| 1293 | cdda_set_volume(machine->device("cdda"), 0.0); |
| 1279 | 1294 | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, attotime_never, NULL); |
| 1295 | } |
| 1280 | 1296 | else |
| 1297 | { |
| 1298 | cdda_set_volume(machine->device("cdda"), pce_cd.cdda_volume); |
| 1281 | 1299 | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, ATTOTIME_IN_USEC(param), param); |
| 1300 | } |
| 1282 | 1301 | } |
| 1283 | 1302 | |
| 1303 | static TIMER_CALLBACK( pce_cd_cdda_fadein_callback ) |
| 1304 | { |
| 1305 | pce_cd.cdda_volume+= 0.1; |
| 1306 | |
| 1307 | if(pce_cd.cdda_volume >= 100.0) |
| 1308 | { |
| 1309 | pce_cd.cdda_volume = 100.0; |
| 1310 | cdda_set_volume(machine->device("cdda"), 100.0); |
| 1311 | timer_adjust_oneshot(pce_cd.cdda_fadein_timer, attotime_never, NULL); |
| 1312 | } |
| 1313 | else |
| 1314 | { |
| 1315 | cdda_set_volume(machine->device("cdda"), pce_cd.cdda_volume); |
| 1316 | timer_adjust_oneshot(pce_cd.cdda_fadein_timer, ATTOTIME_IN_USEC(param), param); |
| 1317 | } |
| 1318 | } |
| 1319 | |
| 1320 | static TIMER_CALLBACK( pce_cd_adpcm_fadeout_callback ) |
| 1321 | { |
| 1322 | pce_cd.adpcm_volume-= 0.1; |
| 1323 | |
| 1324 | if(pce_cd.adpcm_volume <= 0) |
| 1325 | { |
| 1326 | pce_cd.adpcm_volume = 0.0; |
| 1327 | msm5205_set_volume(machine->device("msm5205"), 0.0); |
| 1328 | timer_adjust_oneshot(pce_cd.adpcm_fadeout_timer, attotime_never, NULL); |
| 1329 | } |
| 1330 | else |
| 1331 | { |
| 1332 | msm5205_set_volume(machine->device("msm5205"), pce_cd.adpcm_volume); |
| 1333 | timer_adjust_oneshot(pce_cd.adpcm_fadeout_timer, ATTOTIME_IN_USEC(param), param); |
| 1334 | } |
| 1335 | } |
| 1336 | |
| 1337 | static TIMER_CALLBACK( pce_cd_adpcm_fadein_callback ) |
| 1338 | { |
| 1339 | pce_cd.adpcm_volume+= 0.1; |
| 1340 | |
| 1341 | if(pce_cd.adpcm_volume >= 100.0) |
| 1342 | { |
| 1343 | pce_cd.adpcm_volume = 100.0; |
| 1344 | msm5205_set_volume(machine->device("msm5205"), 100.0); |
| 1345 | timer_adjust_oneshot(pce_cd.adpcm_fadein_timer, attotime_never, NULL); |
| 1346 | } |
| 1347 | else |
| 1348 | { |
| 1349 | msm5205_set_volume(machine->device("msm5205"), pce_cd.adpcm_volume); |
| 1350 | timer_adjust_oneshot(pce_cd.adpcm_fadein_timer, ATTOTIME_IN_USEC(param), param); |
| 1351 | } |
| 1352 | } |
| 1353 | |
| 1354 | |
| 1284 | 1355 | WRITE8_HANDLER( pce_cd_intf_w ) |
| 1285 | 1356 | { |
| 1286 | 1357 | pce_cd_update(space->machine); |
| r9158 | r9159 | |
| 1403 | 1474 | case 0x0F: /* ADPCM and CD audio fade timer */ |
| 1404 | 1475 | printf("%02x FADE\n",data); |
| 1405 | 1476 | |
| 1406 | | if(data == 0x0c) //CD-DA short step (2500 msecs) fade out |
| 1477 | /* TODO: timers needs HW tests */ |
| 1478 | switch(data & 0xf) |
| 1407 | 1479 | { |
| 1408 | | pce_cd.cdda_volume = 100.0; |
| 1409 | | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, ATTOTIME_IN_USEC(2500), 2500); |
| 1480 | case 0x00: //CD-DA / ADPCM enable (100 msecs) |
| 1481 | pce_cd.cdda_volume = 0.0; |
| 1482 | timer_adjust_oneshot(pce_cd.cdda_fadein_timer, ATTOTIME_IN_USEC(100), 100); |
| 1483 | pce_cd.adpcm_volume = 0.0; |
| 1484 | timer_adjust_oneshot(pce_cd.adpcm_fadein_timer, ATTOTIME_IN_USEC(100), 100); |
| 1485 | break; |
| 1486 | case 0x01: //CD-DA enable (100 msecs) |
| 1487 | pce_cd.cdda_volume = 0.0; |
| 1488 | timer_adjust_oneshot(pce_cd.cdda_fadein_timer, ATTOTIME_IN_USEC(100), 100); |
| 1489 | break; |
| 1490 | case 0x08: //CD-DA short (1500 msecs) fade out / ADPCM enable |
| 1491 | pce_cd.cdda_volume = 100.0; |
| 1492 | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, ATTOTIME_IN_USEC(1500), 1500); |
| 1493 | pce_cd.adpcm_volume = 0.0; |
| 1494 | timer_adjust_oneshot(pce_cd.adpcm_fadein_timer, ATTOTIME_IN_USEC(100), 100); |
| 1495 | break; |
| 1496 | case 0x09: //CD-DA long (5000 msecs) fade out |
| 1497 | pce_cd.cdda_volume = 100.0; |
| 1498 | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, ATTOTIME_IN_USEC(5000), 5000); |
| 1499 | break; |
| 1500 | case 0x0a: //ADPCM long (5000 msecs) fade out |
| 1501 | pce_cd.adpcm_volume = 100.0; |
| 1502 | timer_adjust_oneshot(pce_cd.adpcm_fadeout_timer, ATTOTIME_IN_USEC(5000), 5000); |
| 1503 | break; |
| 1504 | case 0x0c: //CD-DA short (1500 msecs) fade out / ADPCM enable |
| 1505 | pce_cd.cdda_volume = 100.0; |
| 1506 | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, ATTOTIME_IN_USEC(1500), 1500); |
| 1507 | pce_cd.adpcm_volume = 0.0; |
| 1508 | timer_adjust_oneshot(pce_cd.adpcm_fadein_timer, ATTOTIME_IN_USEC(100), 100); |
| 1509 | break; |
| 1510 | case 0x0d: //CD-DA short (1500 msecs) fade out |
| 1511 | pce_cd.cdda_volume = 100.0; |
| 1512 | timer_adjust_oneshot(pce_cd.cdda_fadeout_timer, ATTOTIME_IN_USEC(1500), 1500); |
| 1513 | break; |
| 1514 | case 0x0e: //ADPCM short (1500 msecs) fade out |
| 1515 | pce_cd.adpcm_volume = 100.0; |
| 1516 | timer_adjust_oneshot(pce_cd.adpcm_fadeout_timer, ATTOTIME_IN_USEC(1500), 1500); |
| 1517 | break; |
| 1410 | 1518 | } |
| 1411 | | |
| 1412 | | if(data == 0x00) //CD-DA fade in (TODO) |
| 1413 | | { |
| 1414 | | pce_cd.cdda_volume = 100.0; |
| 1415 | | cdda_set_volume(space->machine->device("cdda"), 100.0); |
| 1416 | | } |
| 1417 | 1519 | break; |
| 1418 | 1520 | default: |
| 1419 | 1521 | return; |