• R/O
  • HTTP
  • SSH
  • HTTPS

common_source_project-fm7: Commit

Common Source Code Project for Qt (a.k.a for FM-7).


Commit MetaInfo

Revision37621805de11031c659a4bb991ed1608d2419dcc (tree)
Zeit2019-02-21 04:34:44
AutorK.Ohta <whatisthis.sowhat@gmai...>
CommiterK.Ohta

Log Message

[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.

Ändern Zusammenfassung

Diff

--- a/source/src/vm/pcengine/adpcm.cpp
+++ b/source/src/vm/pcengine/adpcm.cpp
@@ -223,7 +223,7 @@ void ADPCM::write_signal(int ch, uint32_t data, uint32_t mask)
223223 if((flag)/* && (flag != dma_enabled)*/) {
224224 dma_connected = true;
225225 reg_0c |= ADPCM_REMAIN_WRITE_BUF;
226- //written_size = 0;
226+ written_size = 0;
227227 if(d_pce->read_signal(SIG_PCE_CDROM_DATA_IN) != 0) {
228228 do_dma(d_pce->read_signal(SIG_PCE_CDROM_RAW_DATA));
229229 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)
250250 break;
251251 case SIG_ADPCM_FORCE_DMA_TRANSFER:
252252 if(flag) {
253+ if(!(dma_connected)) written_size = 0;
253254 dma_connected = true;
254255 if(d_pce->read_signal(SIG_PCE_CDROM_DATA_IN) != 0) {
255256 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)
260261 if(flag) {
261262 dma_connected = false;
262263 }
264+ break;
263265 case SIG_ADPCM_ADDR_HI: // REG $09
264266 if((msm_last_cmd & 0x80) == 0) {
265267 addr_reg.b.h = data;
@@ -313,7 +315,7 @@ void ADPCM::write_signal(int ch, uint32_t data, uint32_t mask)
313315 void ADPCM::update_length()
314316 {
315317 adpcm_length = (uint32_t)(addr_reg.w) & 0xffff;
316- msm_length = adpcm_length;
318+ msm_length = adpcm_length + 1;
317319 out_debug_log(_T("ADPCM SET LENGTH TO %04x\n"), adpcm_length);
318320 }
319321
@@ -357,6 +359,7 @@ void ADPCM::do_cmd(uint8_t cmd)
357359 }
358360 if((cmd & 0x10) != 0) {
359361 // It's ugly... (;_;)
362+#if 1
360363 uint32_t _clk = (ADPCM_CLOCK / 6) / adpcm_clock_divider;
361364 if(((read_ptr & 0xffff) >= 0x4000) &&
362365 ((write_ptr & 0xffff) == 0x0000) &&
@@ -365,8 +368,9 @@ void ADPCM::do_cmd(uint8_t cmd)
365368 (_clk < 16000)) {
366369 adpcm_length = adpcm_length & 0x7fff;
367370 }
371+#endif
368372 half_addr = (read_ptr + ((adpcm_length + 1) >> 1)) & 0xffff;
369- msm_length = adpcm_length;
373+ msm_length = adpcm_length + 1;
370374 out_debug_log(_T("ADPCM SET LENGTH LENGTH=%04x\n"), adpcm_length);
371375 }
372376 if(((cmd & 0x02) != 0) && ((msm_last_cmd & 0x02) == 0)) {
@@ -410,12 +414,15 @@ void ADPCM::do_cmd(uint8_t cmd)
410414 msm_ptr = read_ptr;
411415 msm_nibble = 0;
412416 play_in_progress = true;
413- msm_length = adpcm_length; // OK?
417+ msm_length = adpcm_length + 1; // OK?
414418 do_play();
415419 d_msm->reset_w(0);
416420 written_size = 0; // OK?
417421 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"));
418422 } else {
423+ //msm_length = adpcm_length;
424+ //write_ptr &= 0xffff;
425+ //read_ptr &= 0xffff;
419426 // 20181213 K.O: Import from Ootake v2.83.Thanks to developers of Ootake.
420427 if(((adpcm_length & 0xffff) >= 0x8000) && ((adpcm_length & 0xffff) <= 0x80ff)) {
421428 half_addr = (read_ptr + 0x85) & 0xffff;
@@ -461,7 +468,7 @@ void ADPCM::do_vclk(bool flag)
461468 // 20190216 K.O: Must wait when dma enabled and PCM data will empty, when DMA transferring.
462469 if((play_in_progress) && !(adpcm_paused)) {
463470 if(((dma_enabled ) && (dma_connected)) &&
464- ((written_size < 0x40) /*&& (msm_length > 0)*/
471+ (/*(written_size < 0x200) && */((msm_ptr & 0x8000) == (write_ptr & 0x8000))
465472 /*&& ((write_ptr & 0xffff) <= (msm_ptr & 0xffff))*/)) { // OK?
466473 // ToDo: exception
467474 d_msm->pause_w(1);
Show on old repository browser