Common Source Code Project for Qt (a.k.a for FM-7).
Revision | 37621805de11031c659a4bb991ed1608d2419dcc (tree) |
---|---|
Zeit | 2019-02-21 04:34:44 |
Autor | K.Ohta <whatisthis.sowhat@gmai...> |
Commiter | K.Ohta |
[VM][PCENGINE][ADPCM] Reset written_size per resuming DMA transfer.
[VM][PCENGINE][ADPCM] Halt ADPCM sound same BANK (mask = $8000) both DMA transferring and read from ADPCM.
@@ -223,7 +223,7 @@ void ADPCM::write_signal(int ch, uint32_t data, uint32_t mask) | ||
223 | 223 | if((flag)/* && (flag != dma_enabled)*/) { |
224 | 224 | dma_connected = true; |
225 | 225 | reg_0c |= ADPCM_REMAIN_WRITE_BUF; |
226 | - //written_size = 0; | |
226 | + written_size = 0; | |
227 | 227 | if(d_pce->read_signal(SIG_PCE_CDROM_DATA_IN) != 0) { |
228 | 228 | do_dma(d_pce->read_signal(SIG_PCE_CDROM_RAW_DATA)); |
229 | 229 | out_debug_log(_T("Start DMA port $0B/ALREADY READ DATA ADPCM_WRITE_PTR=%04x ADPCM_READ_PTR=%04x MSM_START_ADDR=%04x\n"),write_ptr, read_ptr, msm_ptr); |
@@ -250,6 +250,7 @@ void ADPCM::write_signal(int ch, uint32_t data, uint32_t mask) | ||
250 | 250 | break; |
251 | 251 | case SIG_ADPCM_FORCE_DMA_TRANSFER: |
252 | 252 | if(flag) { |
253 | + if(!(dma_connected)) written_size = 0; | |
253 | 254 | dma_connected = true; |
254 | 255 | if(d_pce->read_signal(SIG_PCE_CDROM_DATA_IN) != 0) { |
255 | 256 | do_dma(d_pce->read_signal(SIG_PCE_CDROM_RAW_DATA)); |
@@ -260,6 +261,7 @@ void ADPCM::write_signal(int ch, uint32_t data, uint32_t mask) | ||
260 | 261 | if(flag) { |
261 | 262 | dma_connected = false; |
262 | 263 | } |
264 | + break; | |
263 | 265 | case SIG_ADPCM_ADDR_HI: // REG $09 |
264 | 266 | if((msm_last_cmd & 0x80) == 0) { |
265 | 267 | addr_reg.b.h = data; |
@@ -313,7 +315,7 @@ void ADPCM::write_signal(int ch, uint32_t data, uint32_t mask) | ||
313 | 315 | void ADPCM::update_length() |
314 | 316 | { |
315 | 317 | adpcm_length = (uint32_t)(addr_reg.w) & 0xffff; |
316 | - msm_length = adpcm_length; | |
318 | + msm_length = adpcm_length + 1; | |
317 | 319 | out_debug_log(_T("ADPCM SET LENGTH TO %04x\n"), adpcm_length); |
318 | 320 | } |
319 | 321 |
@@ -357,6 +359,7 @@ void ADPCM::do_cmd(uint8_t cmd) | ||
357 | 359 | } |
358 | 360 | if((cmd & 0x10) != 0) { |
359 | 361 | // It's ugly... (;_;) |
362 | +#if 1 | |
360 | 363 | uint32_t _clk = (ADPCM_CLOCK / 6) / adpcm_clock_divider; |
361 | 364 | if(((read_ptr & 0xffff) >= 0x4000) && |
362 | 365 | ((write_ptr & 0xffff) == 0x0000) && |
@@ -365,8 +368,9 @@ void ADPCM::do_cmd(uint8_t cmd) | ||
365 | 368 | (_clk < 16000)) { |
366 | 369 | adpcm_length = adpcm_length & 0x7fff; |
367 | 370 | } |
371 | +#endif | |
368 | 372 | half_addr = (read_ptr + ((adpcm_length + 1) >> 1)) & 0xffff; |
369 | - msm_length = adpcm_length; | |
373 | + msm_length = adpcm_length + 1; | |
370 | 374 | out_debug_log(_T("ADPCM SET LENGTH LENGTH=%04x\n"), adpcm_length); |
371 | 375 | } |
372 | 376 | if(((cmd & 0x02) != 0) && ((msm_last_cmd & 0x02) == 0)) { |
@@ -410,12 +414,15 @@ void ADPCM::do_cmd(uint8_t cmd) | ||
410 | 414 | msm_ptr = read_ptr; |
411 | 415 | msm_nibble = 0; |
412 | 416 | play_in_progress = true; |
413 | - msm_length = adpcm_length; // OK? | |
417 | + msm_length = adpcm_length + 1; // OK? | |
414 | 418 | do_play(); |
415 | 419 | d_msm->reset_w(0); |
416 | 420 | written_size = 0; // OK? |
417 | 421 | out_debug_log(_T("ADPCM START PLAY(%s) START=%04x LENGTH=%04x HALF=%04x STREAM=%s\n"), (dma_enabled) ? _T("DMA") : _T("PIO"), msm_ptr, msm_length, half_addr, (adpcm_stream) ? _T("YES") : _T("NO")); |
418 | 422 | } else { |
423 | + //msm_length = adpcm_length; | |
424 | + //write_ptr &= 0xffff; | |
425 | + //read_ptr &= 0xffff; | |
419 | 426 | // 20181213 K.O: Import from Ootake v2.83.Thanks to developers of Ootake. |
420 | 427 | if(((adpcm_length & 0xffff) >= 0x8000) && ((adpcm_length & 0xffff) <= 0x80ff)) { |
421 | 428 | half_addr = (read_ptr + 0x85) & 0xffff; |
@@ -461,7 +468,7 @@ void ADPCM::do_vclk(bool flag) | ||
461 | 468 | // 20190216 K.O: Must wait when dma enabled and PCM data will empty, when DMA transferring. |
462 | 469 | if((play_in_progress) && !(adpcm_paused)) { |
463 | 470 | if(((dma_enabled ) && (dma_connected)) && |
464 | - ((written_size < 0x40) /*&& (msm_length > 0)*/ | |
471 | + (/*(written_size < 0x200) && */((msm_ptr & 0x8000) == (write_ptr & 0x8000)) | |
465 | 472 | /*&& ((write_ptr & 0xffff) <= (msm_ptr & 0xffff))*/)) { // OK? |
466 | 473 | // ToDo: exception |
467 | 474 | d_msm->pause_w(1); |