trunk/src/mess/machine/psxcd.c
r22560 | r22561 | |
148 | 148 | m_regs.sr = 0x18; |
149 | 149 | m_regs.ir = 0; |
150 | 150 | m_regs.imr = 0x1f; |
151 | | sechead = 0; |
152 | 151 | sectail = 0; |
| 152 | m_cursec = 0; |
153 | 153 | m_mute = false; |
154 | 154 | m_dmaload = false; |
| 155 | m_int1 = NULL; |
155 | 156 | curpos.w = 0; |
156 | 157 | } |
157 | 158 | |
r22560 | r22561 | |
281 | 282 | case 0x03: |
282 | 283 | if((data & 0x80) && !m_dmaload) |
283 | 284 | { |
284 | | if(sechead == sectail) |
285 | | break; |
286 | | |
287 | 285 | m_dmaload = true; |
288 | | memcpy(m_transbuf, secbuf[sechead], raw_sector_size); |
| 286 | memcpy(m_transbuf, secbuf[m_cursec], raw_sector_size); |
289 | 287 | m_regs.sr |= 0x40; |
290 | | sechead++; |
291 | | sechead %= sector_buffer_size; |
292 | 288 | |
| 289 | m_cursec++; |
| 290 | m_cursec %= sector_buffer_size; |
| 291 | |
293 | 292 | switch(mode & mode_size_mask) |
294 | 293 | { |
295 | 294 | case 0x00: |
r22560 | r22561 | |
325 | 324 | if(res_queue && !m_regs.ir) |
326 | 325 | { |
327 | 326 | command_result *res = res_queue; |
| 327 | if(res == m_int1) |
| 328 | m_int1 = NULL; |
| 329 | |
328 | 330 | res_queue = res->next; |
329 | 331 | global_free(res); |
330 | 332 | m_regs.sr &= ~0x20; |
r22560 | r22561 | |
935 | 937 | } |
936 | 938 | else |
937 | 939 | { |
938 | | cmd_complete(prepare_result(intr_dataready)); |
| 940 | if(!m_int1) |
| 941 | m_cursec = sectail; |
| 942 | |
| 943 | m_int1 = prepare_result(intr_dataready); |
| 944 | cmd_complete(m_int1); |
939 | 945 | sectail++; |
940 | 946 | sectail %= sector_buffer_size; |
941 | | |
942 | | if(sectail == sechead) |
943 | | verboselog(machine(), 0, "psxcd: sector buffer overrun\n"); |
944 | 947 | } |
945 | 948 | |
946 | 949 | curpos.b[F]++; |
r22560 | r22561 | |
1083 | 1086 | send_result(intr_complete); |
1084 | 1087 | status |= status_reading; |
1085 | 1088 | |
1086 | | sechead=sectail=0; |
| 1089 | m_cursec=sectail=0; |
1087 | 1090 | |
1088 | 1091 | unsigned int cyc=read_sector_cycles; |
1089 | 1092 | if (mode&mode_double_speed) cyc>>=1; |
r22560 | r22561 | |
1105 | 1108 | |
1106 | 1109 | status|=status_playing; |
1107 | 1110 | |
1108 | | sechead=sectail=0; |
| 1111 | m_cursec=sectail=0; |
1109 | 1112 | |
1110 | 1113 | if (mode&mode_autopause) |
1111 | 1114 | { |