trunk/src/emu/sound/spu.c
| r22100 | r22101 | |
| 1047 | 1047 | |
| 1048 | 1048 | cdda_cnt=0; |
| 1049 | 1049 | cdda_playing=false; |
| 1050 | m_cd_out_ptr = 0; |
| 1050 | 1051 | |
| 1051 | 1052 | memset(spu_ram,0,spu_ram_size); |
| 1052 | 1053 | memset(reg,0,0x200); |
| r22100 | r22101 | |
| 2478 | 2479 | |
| 2479 | 2480 | while ((cdda_buffer->get_bytes_in()) && (n--)) |
| 2480 | 2481 | { |
| 2481 | | dp[0]=clamp(dp[0]+((sp[0]*voll)>>15)); |
| 2482 | | dp[1]=clamp(dp[1]+((sp[1]*volr)>>15)); |
| 2482 | |
| 2483 | INT16 vl = ((sp[0]*voll)>>15); |
| 2484 | INT16 vr = ((sp[1]*volr)>>15); |
| 2485 | |
| 2486 | *(signed short *)(spu_ram+m_cd_out_ptr)=vl; |
| 2487 | *(signed short *)(spu_ram+m_cd_out_ptr+0x400)=vr; |
| 2488 | m_cd_out_ptr=(m_cd_out_ptr+2)&0x3ff; |
| 2489 | |
| 2490 | if((m_cd_out_ptr == (spureg.irq_addr & ~0x401)) && (spureg.ctrl & spuctrl_irq_enable)) |
| 2491 | m_irq_handler(1); |
| 2492 | |
| 2493 | dp[0]=clamp(dp[0]+vl); |
| 2494 | dp[1]=clamp(dp[1]+vr); |
| 2483 | 2495 | dp+=2; |
| 2484 | 2496 | |
| 2485 | 2497 | cdda_cnt+=freq; |
| r22100 | r22101 | |
| 2502 | 2514 | |
| 2503 | 2515 | // if (n>0) printf("cdda buffer underflow (n=%d cdda_in=%d spf=%d)\n",n,cdda_buffer->get_bytes_in(),cdda_spf); |
| 2504 | 2516 | } |
| 2517 | else if((spureg.irq_addr < 0x800) && (spureg.ctrl & spuctrl_irq_enable)) |
| 2518 | { |
| 2519 | UINT16 irq_addr = spureg.irq_addr & ~0x401; |
| 2520 | UINT32 end = m_cd_out_ptr + (sz >> 1); |
| 2521 | if((m_cd_out_ptr < irq_addr) && (end > irq_addr)) |
| 2522 | m_irq_handler(1); |
| 2523 | m_cd_out_ptr = end & 0x3fe; |
| 2524 | } |
| 2505 | 2525 | } |
| 2506 | 2526 | |
| 2507 | 2527 | // |
trunk/src/mess/machine/psxcd.c
| r22100 | r22101 | |
| 134 | 134 | secskip = 0; |
| 135 | 135 | next_read_event = -1; |
| 136 | 136 | cbp = cmdbuf; |
| 137 | m_mute = false; |
| 137 | 138 | |
| 138 | 139 | status=status_shellopen; |
| 139 | 140 | sr=8|1; |
| r22100 | r22101 | |
| 556 | 557 | printf("cdrom: mute\n"); |
| 557 | 558 | #endif |
| 558 | 559 | |
| 560 | m_mute = true; |
| 559 | 561 | send_result(intr_acknowledge); |
| 560 | 562 | } |
| 561 | 563 | |
| r22100 | r22101 | |
| 565 | 567 | printf("cdrom: demute\n"); |
| 566 | 568 | #endif |
| 567 | 569 | |
| 570 | m_mute = false; |
| 568 | 571 | send_result(intr_acknowledge); |
| 569 | 572 | } |
| 570 | 573 | |
| r22100 | r22101 | |
| 828 | 831 | static unsigned char gamedata[8] = { 0x00, 0x00, 0x00, 0x00, 'S', 'C', 'E', 'A' }; |
| 829 | 832 | static unsigned char audiodata[8] = { 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // drops into the audio CD player. 08 80 goes to the menu. |
| 830 | 833 | |
| 831 | | if(status & status_invalid) |
| 834 | if(cdrom_get_track_type(m_cdrom_handle, 0) == CD_TRACK_AUDIO) |
| 832 | 835 | { |
| 833 | | audiodata[0] = status; |
| 836 | audiodata[0] = status | status_invalid; |
| 834 | 837 | send_result(intr_acknowledge,audiodata,8); |
| 835 | 838 | } |
| 836 | 839 | else |
| r22100 | r22101 | |
| 1138 | 1141 | //read_next_sector(); |
| 1139 | 1142 | } else |
| 1140 | 1143 | { |
| 1144 | #ifdef debug_cdrom |
| 1141 | 1145 | printf("autopause xa\n"); |
| 1146 | #endif |
| 1142 | 1147 | stop_read(); |
| 1143 | 1148 | } |
| 1144 | 1149 | } |
| r22100 | r22101 | |
| 1154 | 1159 | |
| 1155 | 1160 | if (status&status_playing) |
| 1156 | 1161 | { |
| 1157 | | m_spu->play_cdda(0,secbuf[sectail]); |
| 1162 | if(!m_mute) |
| 1163 | m_spu->play_cdda(0,secbuf[sectail]); |
| 1158 | 1164 | sectail=(sectail+1)&(sector_buffer_size-1); |
| 1159 | 1165 | |
| 1160 | 1166 | curpos.b[F]++; |
| r22100 | r22101 | |
| 1179 | 1185 | { |
| 1180 | 1186 | if (sector>=autopause_sector) |
| 1181 | 1187 | { |
| 1188 | #ifdef debug_cdrom |
| 1182 | 1189 | printf("autopause cdda\n"); |
| 1183 | | |
| 1190 | #endif |
| 1191 | stop_read(); |
| 1184 | 1192 | command_result *res=global_alloc(command_result); |
| 1185 | 1193 | res->res=intr_dataend; |
| 1186 | | res->data[0]=status_standby; |
| 1194 | res->data[0]=status; |
| 1187 | 1195 | res->sz=1; |
| 1188 | 1196 | cmd_complete(res); |
| 1189 | | stop_read(); |
| 1190 | 1197 | return; |
| 1191 | 1198 | } |
| 1192 | 1199 | } |
| r22100 | r22101 | |
| 1197 | 1204 | UINT8 track = cdrom_get_track(m_cdrom_handle, sector) + 1; |
| 1198 | 1205 | res->res=intr_dataready; |
| 1199 | 1206 | |
| 1200 | | res->data[0]=status_playing|status_standby; |
| 1207 | res->data[0]=status; |
| 1201 | 1208 | res->data[1]=decimal_to_bcd(track); |
| 1202 | 1209 | res->data[2]=1; |
| 1203 | 1210 | if(sector & 0x10) |
| r22100 | r22101 | |
| 1229 | 1236 | |
| 1230 | 1237 | if(!read_next_sector()) |
| 1231 | 1238 | { |
| 1239 | stop_read(); // assume we've reached the end |
| 1232 | 1240 | command_result *res=global_alloc(command_result); |
| 1233 | 1241 | res->res=intr_dataend; |
| 1234 | | res->data[0]=status_standby; |
| 1242 | res->data[0]=status; |
| 1235 | 1243 | res->sz=1; |
| 1236 | 1244 | cmd_complete(res); |
| 1237 | | stop_read(); // assume we've reached the end |
| 1238 | 1245 | } |
| 1239 | 1246 | } |
| 1240 | 1247 | } |
| r22100 | r22101 | |
| 1250 | 1257 | int type; |
| 1251 | 1258 | next_read_event=-1; |
| 1252 | 1259 | |
| 1260 | UINT32 pos=msf_to_lba_ps(curpos.w); |
| 1253 | 1261 | // |
| 1262 | if(!(mode & mode_cdda) && (cdrom_get_track_type(m_cdrom_handle, cdrom_get_track(m_cdrom_handle, pos + 150)) == CD_TRACK_AUDIO)) |
| 1263 | { |
| 1264 | command_result *res=global_alloc(command_result); |
| 1265 | res->res=intr_diskerror; |
| 1266 | res->data[0]=status | status_error; |
| 1267 | res->data[1]=0x40; |
| 1268 | res->sz=2; |
| 1269 | cmd_complete(res); |
| 1270 | return; |
| 1271 | } |
| 1254 | 1272 | |
| 1255 | | UINT32 pos=msf_to_lba_ps(curpos.w); |
| 1256 | 1273 | unsigned char *buf=secbuf[sechead]; |
| 1257 | 1274 | if (! cdrom_read_data(m_cdrom_handle, pos, buf, CD_TRACK_RAW_DONTCARE)) |
| 1258 | 1275 | { |
| r22100 | r22101 | |
| 1419 | 1436 | case event_change_disk: |
| 1420 | 1437 | open = false; |
| 1421 | 1438 | status |= status_standby; |
| 1422 | | if(cdrom_get_track_type(m_cdrom_handle, 0) == CD_TRACK_AUDIO) |
| 1423 | | status |= status_invalid; |
| 1424 | 1439 | break; |
| 1425 | 1440 | } |
| 1426 | 1441 | } |