• R/O
  • HTTP
  • SSH
  • HTTPS

common_source_project-fm7: Commit

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


Commit MetaInfo

Revisione1999e69c01c38ed62520492980178331523f3f6 (tree)
Time2018-12-11 05:12:35
AuthorK.Ohta <whatisthis.sowhat@gmai...>
CommiterK.Ohta

Log Message

[VM][PCENGINE][ADPCM][WIP] Porting from Ootake v2.83.This still WORK-IN-PROGRESS.

Change Summary

Incremental Difference

--- a/source/src/vm/pcengine/pce.cpp
+++ b/source/src/vm/pcengine/pce.cpp
@@ -1887,8 +1887,11 @@ void PCE::cdrom_write(uint16_t addr, uint8_t data)
18871887 d_scsi_host->write_signal(SIG_SCSI_SEL, 0, 1);
18881888 adpcm_dma_enabled = false;
18891889 // From Ootake v2.38
1890+ //d_scsi_host->write_signal(SIG_SCSI_RST, 0xff, 0xff);
1891+ //d_scsi_cdrom->reset_device();
18901892 cdrom_regs[0x03] = 0x00; // Reset IRQ status at al.
1891- set_cdrom_irq_line(0x70, CLEAR_LINE);
1893+ //set_cdrom_irq_line(0x70, CLEAR_LINE);
1894+ set_cdrom_irq_line(0x0, 0x0); // Update IRQ
18921895 break;
18931896
18941897 case 0x01: /* CDC command / status / data */
@@ -1921,6 +1924,8 @@ void PCE::cdrom_write(uint16_t addr, uint8_t data)
19211924 // Reset ADPCM hardware
19221925 reset_adpcm();
19231926 set_cdrom_irq_line(0x70, CLEAR_LINE);
1927+ adpcm_dma_enabled = false;
1928+ out_debug_log(_T("ADPCM CMD=$04 RESET\n"));
19241929
19251930 }
19261931 d_scsi_host->write_signal(SIG_SCSI_RST, data, 0x02);
@@ -1952,6 +1957,7 @@ void PCE::cdrom_write(uint16_t addr, uint8_t data)
19521957 if(data & 3) {
19531958 /* Start CD to ADPCM transfer */
19541959 adpcm_dma_enabled = true;
1960+ cdrom_regs[0x0c] |= 0x04;
19551961 if(d_scsi_cdrom->get_cur_command() == SCSI_CMD_READ6 &&
19561962 d_scsi_host->read_signal(SIG_SCSI_BSY) != 0 &&
19571963 d_scsi_host->read_signal(SIG_SCSI_REQ) != 0 &&
@@ -1962,9 +1968,11 @@ void PCE::cdrom_write(uint16_t addr, uint8_t data)
19621968 adpcm_do_dma();
19631969 out_debug_log(_T("Start DMA port $0B/ALREADY READ DATA ADPCM_WRITE_PTR=%04x ADPCM_READ_PTR=%04x MSM_START_ADDR=%04x\n"),adpcm_write_ptr, adpcm_read_ptr, msm_start_addr);
19641970 } else {
1965- cdrom_regs[0x0c] |= 0x04;
1971+ //cdrom_regs[0x0c] |= 0x04;
19661972 out_debug_log(_T("Start DMA port $0B/WAIT FOR DATA\n"));
19671973 }
1974+ } else {
1975+ //adpcm_dma_enabled = false;
19681976 }
19691977 break;
19701978
@@ -1975,6 +1983,8 @@ void PCE::cdrom_write(uint16_t addr, uint8_t data)
19751983 if((cdrom_regs[0x0d] & 0x80) && !(data & 0x80)) {
19761984 // Reset ADPCM hardware
19771985 reset_adpcm();
1986+ adpcm_stop(true);
1987+ out_debug_log(_T("ADPCM CMD=$0D RESET\n"));
19781988 }
19791989 if(data & 0x02) {
19801990 // ADPCM set write address
@@ -1992,9 +2002,19 @@ void PCE::cdrom_write(uint16_t addr, uint8_t data)
19922002 if(data & 0x10) {
19932003 // ADPCM set length
19942004 adpcm_length = (cdrom_regs[0x09] << 8) | cdrom_regs[0x08];
2005+ uint32_t _clk = (ADPCM_CLOCK / 6) / adpcm_clock_divider;
2006+
2007+ if(((adpcm_read_ptr & 0xffff) >= 0x4000) &&
2008+ ((adpcm_write_ptr & 0xffff) == 0x0000) &&
2009+ (adpcm_length != 0x8000) &&
2010+ (adpcm_length != 0xffff) &&
2011+ (_clk < 16000)) {
2012+ adpcm_length = adpcm_length & 0x7fff;
2013+ }
19952014 out_debug_log(_T("ADPCM SET LENGTH LENGTH=%04x\n"), adpcm_length);
19962015 }
1997- if((data & 0x40) && ((cdrom_regs[0x0D] & 0x40) == 0)) {
2016+ if((((data & 0x40) != 0) && ((cdrom_regs[0x0D] & 0x40) == 0)) ||
2017+ (!(adpcm_play_in_progress) && ((data & 0x20 != 0)))) { // From Ootake v2.83
19982018 // ADPCM play
19992019 msm_start_addr = (adpcm_read_ptr) & 0xffff;
20002020 msm_end_addr = (adpcm_read_ptr + adpcm_length) & 0xffff;
@@ -2005,7 +2025,13 @@ void PCE::cdrom_write(uint16_t addr, uint8_t data)
20052025 adpcm_play();
20062026 d_msm->reset_w(0);
20072027 out_debug_log(_T("ADPCM START PLAY START=%04x END=%04x HALF=%04x\n"), msm_start_addr, msm_end_addr, msm_half_addr);
2008- } else if ((data & 0x40) == 0) {
2028+ } /*else if(((data & 0x40) == 0) && ((cdrom_regs[0x0D] & 0x40) != 0) && (adpcm_play_in_progress)) {
2029+ if(((data & 0x20) != 0) && ((adpcm_length & 0xffff) >= 0x8000) && ((adpcm_length & 0xffff) <= 0x80ff)) {
2030+ msm_half_addr = (adpcm_read_ptr + 0x85) & 0xffff;
2031+ } else {
2032+ msm_half_addr = (adpcm_read_ptr + (adpcm_length >> 1)) & 0xffff;
2033+ }
2034+ } */else if ((data & 0x40) == 0) {
20092035 // used by Buster Bros to cancel an in-flight sample
20102036 // if repeat flag (bit5) is high, ADPCM should be fully played (from Ootake)
20112037 if(!(data & 0x20)) {
@@ -2068,11 +2094,24 @@ uint8_t PCE::cdrom_read(uint16_t addr)
20682094 case 0xc6: return 0x55;
20692095 case 0xc7: return 0x03;
20702096 }
2097+ return 0xff; // From Ootake v2.83.
20712098 }
20722099 uint8_t data = cdrom_regs[addr & 0x0f];
20732100
20742101 switch(addr & 0x0f) {
20752102 case 0x00: /* CDC status */
2103+ if((cdrom_regs[0x02] & 0x80) != 0) {
2104+ // ToDo: Imprement read_1801() at Ootake v2.83.
2105+ // ToDo: Implement _CheckCountAfterRead at CDROM.cpp of Ootake v2.83.
2106+ if((d_scsi_host->read_signal(SIG_SCSI_CD) != 0) &&
2107+ (d_scsi_host->read_signal(SIG_SCSI_MSG) == 0) &&
2108+ (d_scsi_host->read_signal(SIG_SCSI_IO) != 0)) { // STATUS PHASE: Porting from Ootake v2.83.
2109+ // // busy = false;
2110+ cdrom_regs[0x02] = cdrom_regs[0x02] & ~(0x80 | PCE_CD_IRQ_TRANSFER_READY | PCE_CD_IRQ_TRANSFER_DONE);
2111+ set_cdrom_irq_line(PCE_CD_IRQ_TRANSFER_DONE, CLEAR_LINE);
2112+ }
2113+ return data & ~0x40; // Clear REQ
2114+ }
20762115 data = 0;
20772116 if(d_cpu->get_pc() == 0xf34b) {
20782117 // XXX: Hack to wait the CD-DA will be finished for the Manhole
@@ -2083,7 +2122,28 @@ uint8_t PCE::cdrom_read(uint16_t addr)
20832122 data |= d_scsi_host->read_signal(SIG_SCSI_MSG) ? 0x20 : 0;
20842123 data |= d_scsi_host->read_signal(SIG_SCSI_CD ) ? 0x10 : 0;
20852124 data |= d_scsi_host->read_signal(SIG_SCSI_IO ) ? 0x08 : 0;
2086-
2125+ cdrom_regs[0x00] = data;
2126+ if(false){
2127+ // Import from Ootake v2.83 20181211 K.O
2128+ if(((data & 0x10) != 0) &&
2129+ ((data & 0x20) == 0) &&
2130+ ((data & 0x08) == 0)){ // Command phase
2131+ if((data & 0x80) != 0) { // Busy
2132+ // data = (data & ~0x40) | 0x08; // (data & ~REQ) | IO
2133+ } else {
2134+ //data = data & ~0x40; // (data & ~REQ)
2135+ }
2136+ } else if((data & 0x80) != 0) { // BUSY
2137+ data = (data & ~0x40) | 0x10 | 0x80; // (data & ~REQ) | BUSY | CD
2138+ } /*else if(_CheckCountAfterRead == 0) && (Status phase) && (cmd == read6)){
2139+ data = data & ~0x40;
2140+ } else */ /* if(_bCDReqWait) {
2141+ _bCDReqWait = false;
2142+ if(data boundary) {
2143+ data = data & ~0x40;
2144+ }
2145+ }*/
2146+ }
20872147 break;
20882148
20892149 case 0x01: /* CDC command / status / data */
@@ -2100,7 +2160,6 @@ uint8_t PCE::cdrom_read(uint16_t addr)
21002160 read6_data_in = true;
21012161 }
21022162 data = read_cdrom_data();
2103-
21042163 if(read6_data_in) {
21052164 // set ack automatically and immediately for correct transfer speed
21062165 set_ack();
@@ -2108,6 +2167,11 @@ uint8_t PCE::cdrom_read(uint16_t addr)
21082167 // XXX: Hack to wait until next REQ signal is raised
21092168 // because PCE does not check REQ signal before reads next byte
21102169 d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
2170+ } else {
2171+ if((addr & 0x0f) == 0x01) {
2172+ // ToDo: Imprement read_1801() at Ootake v2.83.
2173+ // ToDo: Implement _CheckCountAfterRead at CDROM.cpp of Ootake v2.83.
2174+ }
21112175 }
21122176 }
21132177 break;
@@ -2154,8 +2218,17 @@ uint8_t PCE::cdrom_read(uint16_t addr)
21542218 break;
21552219
21562220 case 0x0c: /* ADPCM status */
2221+ // Hack from Ootake v2.83.
2222+ if(adpcm_play_in_progress) {
2223+ data = data & ~0x85;
2224+ data = data | 0x08;
2225+ } else {
2226+ data = data | 0x01;
2227+ data = data & ~0x0c;
2228+ }
2229+ cdrom_regs[0x0c] = data;
2230+ // ToDo: HuVideo
21572231 break;
2158-
21592232 case 0x09: /* ADPCM address (MSB) */
21602233 case 0x0d: /* ADPCM address control */
21612234 case 0x0e: /* ADPCM playback rate */
@@ -2173,6 +2246,7 @@ void PCE::write_cdrom_data(uint8_t data)
21732246
21742247 uint8_t PCE::read_cdrom_data()
21752248 {
2249+
21762250 return d_scsi_host->read_dma_io8(0);
21772251 }
21782252
@@ -2234,6 +2308,7 @@ void PCE::adpcm_stop(bool do_irq)
22342308 cdrom_regs[0x0d] &= ~0x60;
22352309 msm_idle = 1;
22362310 adpcm_play_in_progress = false;
2311+// adpcm_dma_enabled = false;
22372312 out_debug_log(_T("ADPCM STOP PLAY PTR=%04x IRQ=%s\n"), msm_start_addr, (do_irq) ? _T("YES") : _T("NO"));
22382313 }
22392314
@@ -2338,8 +2413,10 @@ void PCE::write_signal(int id, uint32_t data, uint32_t mask)
23382413 d_cpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
23392414
23402415 if(adpcm_dma_enabled) {
2341- if(!(msm_idle) && (adpcm_write_ptr >= msm_start_addr)) {
2416+ if(!(msm_idle) && ((adpcm_write_ptr & 0xffff) >= (msm_start_addr & 0xffff))) {
23422417 // now streaming, wait dma not to overwrite buffer before it is played
2418+ cdrom_regs[0x0b] = 0x00; // From Ootake v2.38.
2419+ //adpcm_do_dma();
23432420 } else {
23442421 adpcm_do_dma();
23452422 }
@@ -2411,6 +2488,7 @@ void PCE::write_signal(int id, uint32_t data, uint32_t mask)
24112488 // restart streaming
24122489 set_cdrom_irq_line(PCE_CD_IRQ_SAMPLE_HALF_PLAY, CLEAR_LINE);
24132490 set_cdrom_irq_line(PCE_CD_IRQ_SAMPLE_FULL_PLAY, CLEAR_LINE);
2491+ //set_cdrom_irq_line(PCE_CD_IRQ_SAMPLE_FULL_PLAY, ASSERT_LINE);
24142492 out_debug_log(_T("END ADDRESS(DMA) READ_PTR=%04x WRITE_PTR=%04x\n"), adpcm_read_ptr, adpcm_write_ptr);
24152493 } else {
24162494 // stop playing adpcm
--- a/source/src/vm/scsi_cdrom.cpp
+++ b/source/src/vm/scsi_cdrom.cpp
@@ -17,8 +17,8 @@
1717 #define CDDA_PLAYING 1
1818 #define CDDA_PAUSED 2
1919
20-//#define _SCSI_DEBUG_LOG
21-//#define _CDROM_DEBUG_LOG
20+#define _SCSI_DEBUG_LOG
21+#define _CDROM_DEBUG_LOG
2222
2323 // 0-99 is reserved for SCSI_DEV class
2424 #define EVENT_CDDA 100
Show on old repository browser