trunk/src/mess/machine/psxcd.c
| r22084 | r22085 | |
| 58 | 58 | status_seeking=0x40, |
| 59 | 59 | status_reading=0x20, |
| 60 | 60 | status_shellopen=0x10, |
| 61 | status_invalid=0x08, |
| 61 | 62 | status_seekerror=0x04, |
| 62 | 63 | status_standby=0x02, |
| 63 | 64 | status_error=0x01 |
| r22084 | r22085 | |
| 130 | 131 | streaming = false; |
| 131 | 132 | sechead = 0; |
| 132 | 133 | sectail = 0; |
| 133 | | secin = 0; |
| 134 | 134 | secskip = 0; |
| 135 | 135 | next_read_event = -1; |
| 136 | 136 | cbp = cmdbuf; |
| 137 | | first_open = true; |
| 138 | 137 | |
| 139 | | status=status_standby; |
| 138 | status=status_shellopen; |
| 140 | 139 | sr=8|1; |
| 141 | 140 | res=0; |
| 142 | 141 | ir=0; |
| r22084 | r22085 | |
| 200 | 199 | stop_read(); |
| 201 | 200 | cdrom_image_device::call_unload(); |
| 202 | 201 | open = true; |
| 202 | status = status_shellopen; |
| 203 | 203 | send_result(intr_diskerror); |
| 204 | 204 | } |
| 205 | 205 | |
| r22084 | r22085 | |
| 416 | 416 | send_result(intr_acknowledge); |
| 417 | 417 | } |
| 418 | 418 | |
| 419 | | static int open_nops=10; |
| 420 | | |
| 421 | 419 | void psxcd_device::cdcmd_nop() |
| 422 | 420 | { |
| 423 | 421 | #ifdef debug_cdrom |
| r22084 | r22085 | |
| 427 | 425 | //stop_read(); |
| 428 | 426 | |
| 429 | 427 | if (!open) |
| 430 | | { |
| 431 | | if (open_nops!=0) |
| 432 | | open_nops--; |
| 433 | | } |
| 428 | status &= ~status_shellopen; |
| 434 | 429 | |
| 435 | 430 | send_result(intr_complete); |
| 436 | 431 | } |
| r22084 | r22085 | |
| 740 | 735 | send_result(intr_complete,data,3); |
| 741 | 736 | } |
| 742 | 737 | else |
| 738 | { |
| 739 | status |= status_error; |
| 743 | 740 | send_result(intr_diskerror); |
| 741 | } |
| 744 | 742 | } |
| 745 | 743 | |
| 746 | 744 | void psxcd_device::cdcmd_gettd() |
| r22084 | r22085 | |
| 830 | 828 | static unsigned char gamedata[8] = { 0x00, 0x00, 0x00, 0x00, 'S', 'C', 'E', 'A' }; |
| 831 | 829 | 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. |
| 832 | 830 | |
| 833 | | if (cdrom_get_track_type(m_cdrom_handle, 0) == CD_TRACK_AUDIO) |
| 831 | if(status & status_invalid) |
| 834 | 832 | { |
| 835 | | audiodata[0] = status | 8; |
| 833 | audiodata[0] = status; |
| 836 | 834 | send_result(intr_acknowledge,audiodata,8); |
| 837 | 835 | } |
| 838 | 836 | else |
| r22084 | r22085 | |
| 842 | 840 | } |
| 843 | 841 | } else |
| 844 | 842 | { |
| 845 | | status=status_error|status_shellopen; |
| 843 | status |= status_error; |
| 846 | 844 | send_result(intr_diskerror); |
| 847 | 845 | } |
| 848 | 846 | } |
| r22084 | r22085 | |
| 949 | 947 | const unsigned int sz, |
| 950 | 948 | const unsigned int delay) |
| 951 | 949 | { |
| 952 | | // Update shell open status |
| 953 | | |
| 954 | | if (open) |
| 955 | | { |
| 956 | | status=status_error|status_shellopen; |
| 957 | | } |
| 958 | | else |
| 959 | | { |
| 960 | | if (status&status_shellopen) |
| 961 | | status=status_standby; |
| 962 | | } |
| 963 | | |
| 964 | | |
| 965 | 950 | command_result *cr=global_alloc(command_result); |
| 966 | 951 | |
| 967 | 952 | cr->res=res; |
| r22084 | r22085 | |
| 1028 | 1013 | bool psxcd_device::read_next_sector() |
| 1029 | 1014 | { |
| 1030 | 1015 | UINT32 pos=msf_to_lba_ps(curpos.w); |
| 1031 | | unsigned char *buf=&secbuf[sechead*raw_sector_size]; |
| 1032 | | assert(secin<sector_buffer_size); |
| 1016 | unsigned char *buf=secbuf[sechead]; |
| 1033 | 1017 | |
| 1034 | 1018 | // printf("read_next_sector: sec %d, sechead %d, raw_sector_size %d\n", pos, sechead, raw_sector_size); |
| 1035 | 1019 | if (cdrom_read_data(m_cdrom_handle, pos, buf, CD_TRACK_RAW_DONTCARE)) |
| r22084 | r22085 | |
| 1037 | 1021 | // printf("buf contents = %02x %02x | %02x %02x\n", buf[0], buf[1], buf[0x20], buf[0x21]); |
| 1038 | 1022 | |
| 1039 | 1023 | sechead=(sechead+1)&(sector_buffer_size-1); |
| 1040 | | secin++; |
| 1041 | 1024 | |
| 1042 | | memcpy(lastsechdr,&secbuf[raw_sector_size*sectail]+12,8); |
| 1025 | memcpy(lastsechdr,&secbuf[sectail][12],8); |
| 1043 | 1026 | |
| 1044 | 1027 | return true; |
| 1045 | 1028 | } else |
| r22084 | r22085 | |
| 1066 | 1049 | |
| 1067 | 1050 | if ((mode&mode_adpcm) && (streaming)) |
| 1068 | 1051 | { |
| 1069 | | rawsec=&secbuf[raw_sector_size*sectail]; |
| 1052 | rawsec=secbuf[sectail]; |
| 1070 | 1053 | secptr=rawsec+24; |
| 1071 | 1054 | secleft=2048; |
| 1072 | 1055 | } |
| 1073 | 1056 | else |
| 1074 | 1057 | { |
| 1075 | | rawsec=&secbuf[raw_sector_size*sectail]; |
| 1058 | rawsec=secbuf[sectail]; |
| 1076 | 1059 | secptr=rawsec+secskip; |
| 1077 | 1060 | secleft=secsize; |
| 1078 | 1061 | } |
| 1079 | 1062 | |
| 1080 | | bool isxa=false; |
| 1081 | | |
| 1082 | | secin--; |
| 1083 | 1063 | sectail=(sectail+1)&(sector_buffer_size-1); |
| 1084 | 1064 | |
| 1085 | 1065 | subheader *sub=(subheader *)(rawsec+16); |
| r22084 | r22085 | |
| 1097 | 1077 | #endif |
| 1098 | 1078 | |
| 1099 | 1079 | status&=~status_playing; |
| 1100 | | isxa=((mode&mode_adpcm) && (sub->submode&submode_audio)); |
| 1080 | bool isxa=((mode&mode_adpcm) && (sub->submode&submode_audio)); |
| 1101 | 1081 | |
| 1102 | 1082 | if (((mode&mode_channel)==0) || |
| 1103 | 1083 | ((sub->file==filter_file) && (sub->channel==filter_channel))) |
| r22084 | r22085 | |
| 1168 | 1148 | // |
| 1169 | 1149 | // |
| 1170 | 1150 | |
| 1171 | | bool psxcd_device::play_cdda_sector(const unsigned int sector, unsigned char *rawsec) |
| 1172 | | { |
| 1173 | | return m_spu->play_cdda(sector,rawsec); |
| 1174 | | } |
| 1175 | | |
| 1176 | | // |
| 1177 | | // |
| 1178 | | // |
| 1179 | | |
| 1180 | 1151 | void psxcd_device::play_sector() |
| 1181 | 1152 | { |
| 1182 | 1153 | next_read_event=-1; |
| 1183 | 1154 | |
| 1184 | 1155 | if (status&status_playing) |
| 1185 | 1156 | { |
| 1186 | | unsigned char *rawsec=&secbuf[raw_sector_size*sectail]; |
| 1187 | | secin--; |
| 1188 | 1157 | sectail=(sectail+1)&(sector_buffer_size-1); |
| 1189 | | play_cdda_sector(0,rawsec); |
| 1158 | m_spu->play_cdda(0,secbuf[sectail]); |
| 1190 | 1159 | |
| 1191 | 1160 | curpos.b[F]++; |
| 1192 | 1161 | if (curpos.b[F]==75) |
| r22084 | r22085 | |
| 1284 | 1253 | // |
| 1285 | 1254 | |
| 1286 | 1255 | UINT32 pos=msf_to_lba_ps(curpos.w); |
| 1287 | | unsigned char *buf=&secbuf[sechead*raw_sector_size]; |
| 1256 | unsigned char *buf=secbuf[sechead]; |
| 1288 | 1257 | if (! cdrom_read_data(m_cdrom_handle, pos, buf, CD_TRACK_RAW_DONTCARE)) |
| 1289 | 1258 | { |
| 1290 | 1259 | next_clock=(m_sysclock/60); |
| r22084 | r22085 | |
| 1335 | 1304 | |
| 1336 | 1305 | status|=status_reading; |
| 1337 | 1306 | |
| 1338 | | secin=sechead=sectail=0; |
| 1307 | sechead=sectail=0; |
| 1339 | 1308 | |
| 1340 | 1309 | unsigned int cyc=read_sector_cycles; |
| 1341 | 1310 | if (mode&mode_double_speed) cyc>>=1; |
| r22084 | r22085 | |
| 1372 | 1341 | |
| 1373 | 1342 | status|=status_playing; |
| 1374 | 1343 | |
| 1375 | | secin=sechead=sectail=0; |
| 1344 | sechead=sectail=0; |
| 1376 | 1345 | |
| 1377 | 1346 | if (mode&mode_autopause) |
| 1378 | 1347 | { |
| r22084 | r22085 | |
| 1449 | 1418 | |
| 1450 | 1419 | case event_change_disk: |
| 1451 | 1420 | open = false; |
| 1421 | status |= status_standby; |
| 1422 | if(cdrom_get_track_type(m_cdrom_handle, 0) == CD_TRACK_AUDIO) |
| 1423 | status |= status_invalid; |
| 1452 | 1424 | break; |
| 1453 | 1425 | } |
| 1454 | 1426 | } |