src/mess/machine/pce.c
| r9091 | r9092 | |
| 90 | 90 | int adpcm_write_ptr; |
| 91 | 91 | UINT8 adpcm_write_buf; |
| 92 | 92 | int adpcm_length; |
| 93 | UINT16 msm_start_addr; |
| 94 | UINT16 msm_end_addr; |
| 95 | UINT8 msm_nibble; |
| 93 | 96 | int adpcm_clock_count; |
| 94 | 97 | int adpcm_clock_divider; |
| 95 | 98 | /* SCSI signals */ |
| r9091 | r9092 | |
| 422 | 425 | */ |
| 423 | 426 | static void pce_cd_msm5205_int(running_device *device) |
| 424 | 427 | { |
| 425 | | pce_cd.adpcm_clock_count = ( pce_cd.adpcm_clock_count + 1 ) % pce_cd.adpcm_clock_divider; |
| 428 | static UINT8 msm_data; |
| 429 | |
| 426 | 430 | if ( ! pce_cd.adpcm_clock_count ) |
| 427 | 431 | { |
| 428 | 432 | /* Supply new ADPCM data */ |
| 433 | msm_data = (pce_cd.msm_nibble) ? (pce_cd.adpcm_ram[pce_cd.msm_start_addr] & 0x0f) : ((pce_cd.adpcm_ram[pce_cd.msm_start_addr] & 0xf0) >> 4); |
| 434 | |
| 435 | pce_cd.msm_nibble ^= 1; |
| 436 | |
| 437 | if(pce_cd.msm_nibble == 0) |
| 438 | { |
| 439 | pce_cd.msm_start_addr++; |
| 440 | if(pce_cd.msm_start_addr > pce_cd.msm_end_addr) |
| 441 | msm5205_reset_w(device, 1); |
| 442 | } |
| 429 | 443 | } |
| 430 | 444 | else |
| 431 | 445 | { |
| 432 | 446 | /* Make sure the sample does not change */ |
| 447 | msm5205_data_w(device, msm_data); |
| 433 | 448 | } |
| 449 | |
| 450 | pce_cd.adpcm_clock_count = ( pce_cd.adpcm_clock_count + 1 ) % pce_cd.adpcm_clock_divider; |
| 434 | 451 | } |
| 435 | 452 | |
| 436 | 453 | #define SCSI_STATUS_OK 0x00 |
| r9091 | r9092 | |
| 1170 | 1187 | break; |
| 1171 | 1188 | case 0x0D: /* ADPCM address control */ |
| 1172 | 1189 | //printf("%02x\n",data); |
| 1173 | | if ( ( pce_cd.regs[0x0D] & 0x80 ) && ! ( data & 0x80 ) ) |
| 1190 | if ( ( pce_cd.regs[0x0D] & 0x80 ) && ! ( data & 0x80 ) ) // ADPCM reset |
| 1174 | 1191 | { |
| 1175 | 1192 | /* Reset ADPCM hardware */ |
| 1176 | 1193 | pce_cd.adpcm_read_ptr = 0; |
| 1177 | 1194 | pce_cd.adpcm_write_ptr = 0; |
| 1195 | msm5205_reset_w( space->machine->device( "msm5205"), 1 ); |
| 1196 | } |
| 1197 | |
| 1198 | if ( data & 0x40 ) // ADPCM play |
| 1199 | { |
| 1200 | pce_cd.msm_start_addr = (pce_cd.adpcm_read_ptr); |
| 1201 | pce_cd.msm_end_addr = (pce_cd.adpcm_read_ptr + pce_cd.adpcm_length) & 0xffff; |
| 1202 | pce_cd.msm_nibble = 0; |
| 1178 | 1203 | msm5205_reset_w( space->machine->device( "msm5205"), 0 ); |
| 1204 | |
| 1205 | //popmessage("%08x %08x",pce_cd.adpcm_read_ptr,pce_cd.adpcm_length); |
| 1179 | 1206 | } |
| 1180 | | if ( data & 0x10 ) |
| 1207 | |
| 1208 | if ( data & 0x10 ) //ADPCM set length |
| 1181 | 1209 | { |
| 1182 | 1210 | pce_cd.adpcm_length = ( pce_cd.regs[0x09] << 8 ) | pce_cd.regs[0x08]; |
| 1183 | 1211 | } |
| 1184 | | if ( data & 0x08 ) |
| 1212 | if ( data & 0x08 ) //ADPCM set read address |
| 1185 | 1213 | { |
| 1186 | 1214 | pce_cd.adpcm_read_ptr = ( pce_cd.regs[0x09] << 8 ) | pce_cd.regs[0x08]; |
| 1187 | 1215 | pce_cd.adpcm_read_buf = 2; |
| 1188 | 1216 | } |
| 1189 | | if ( ( data & 0x02 ) == 0x02 ) |
| 1217 | if ( ( data & 0x02 ) == 0x02 ) //ADPCM set write address |
| 1190 | 1218 | { |
| 1191 | 1219 | pce_cd.adpcm_write_ptr = ( pce_cd.regs[0x09] << 8 ) | pce_cd.regs[0x08]; |
| 1192 | 1220 | pce_cd.adpcm_write_buf = data & 1; |
src/mess/drivers/pce.c
| r9091 | r9092 | |
| 49 | 49 | *********************************************************************** |
| 50 | 50 | - Benkei Gaiden: hangs after a few Sunsoft logo spins. |
| 51 | 51 | - Busou Keiji Cyber Cross: hangs on attract mode |
| 52 | - Cadash: After choosing character and name, the game starts and the display 'jiggles' like tracking if off a VCR |
| 52 | 53 | - Fighting Run: has color and sprite issues during gameplay; |
| 53 | 54 | - Hisou Kihei - Xserd: black screen; |
| 54 | 55 | **********************************************************************/ |
| r9091 | r9092 | |
| 303 | 304 | |
| 304 | 305 | MDRV_SOUND_ADD( "msm5205", MSM5205, PCE_CD_CLOCK / 6 ) |
| 305 | 306 | MDRV_SOUND_CONFIG( pce_cd_msm5205_interface ) |
| 306 | | MDRV_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 0.00 ) |
| 307 | | MDRV_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 0.00 ) |
| 307 | MDRV_SOUND_ROUTE( ALL_OUTPUTS, "lspeaker", 0.50 ) |
| 308 | MDRV_SOUND_ROUTE( ALL_OUTPUTS, "rspeaker", 0.50 ) |
| 308 | 309 | |
| 309 | 310 | MDRV_SOUND_ADD( "cdda", CDDA, 0 ) |
| 310 | 311 | MDRV_SOUND_ROUTE( 0, "lspeaker", 1.00 ) |