diff options
author | angelosa <salese_corp_ltd@email.it> | 2015-07-15 01:10:33 +0200 |
---|---|---|
committer | angelosa <salese_corp_ltd@email.it> | 2015-07-15 01:10:33 +0200 |
commit | b328d4ab16c750b274e270b784ff3f1d4d3ce4ad (patch) | |
tree | bd1da594c878430beb86b6f7d4b165594ac55433 | |
parent | bb850e76f98cd72a7e451846a36375cee7bb5c3a (diff) |
I accept bets about what was this bug ...
-rw-r--r-- | src/emu/machine/segacdblock.c | 85 | ||||
-rw-r--r-- | src/emu/machine/segacdblock.h | 2 |
2 files changed, 72 insertions, 15 deletions
diff --git a/src/emu/machine/segacdblock.c b/src/emu/machine/segacdblock.c index a3f19d8f66f..c7c4f7cf81c 100644 --- a/src/emu/machine/segacdblock.c +++ b/src/emu/machine/segacdblock.c @@ -160,6 +160,7 @@ void segacdblock_device::cd_defragblocks(partitionT *part) temp2 = part->bnum[i]; part->bnum[i] = part->bnum[j]; part->bnum[j] = temp2; + printf("Defrag %d %d\n",i,j); } } } @@ -186,13 +187,15 @@ READ32_MEMBER(segacdblock_device::datatrns32_r) // did we run out of sector? if (xferoffs >= transpart->blocks[xfersect]->size) { - //CDROM_LOG(("CD: finished xfer of block %d of %d\n", xfersect+1, xfersectnum)) + printf("CD: finished xfer of block %d of %d\n", xfersect+1, xfersectnum); xferoffs = 0; xfersect++; } } else // sectors are done, kill 'em all if we can { + m_TransferActive = false; + cd_standard_return(false); if (DeleteSectorMode == true) { INT32 i; @@ -402,12 +405,14 @@ void segacdblock_device::cd_free_block(blockT *blktofree) if (&blocks[i] == blktofree) { // CDROM_LOG(("CD: freeing block %d\n", i)) + blktofree->size = -1; + freeblocks++; + m_hirq &= ~BFUL; + printf("Free block %d\n",i); } } - blktofree->size = -1; - freeblocks++; - m_hirq &= ~BFUL; + } void segacdblock_device::cd_readblock(UINT32 fad, UINT8 *dat) @@ -613,10 +618,15 @@ void segacdblock_device::cd_getsectoroffsetnum(UINT32 bufnum, UINT32 *sectoffs, } } +int segacdblock_device::sega_cdrom_get_adr_control(cdrom_file *file, int track) +{ + return BITSWAP8(cdrom_get_adr_control(file, m_CurrentTrack),3,2,1,0,7,6,5,4); +} + void segacdblock_device::cd_standard_return(bool isPeri) { m_dr[0] = (isPeri == true ? CD_STAT_PERI : 0) | m_cd_state | ((m_playtype == true) ? 0x80 : 0); - m_dr[1] = /*(cur_track == 0xff) ? 0xffff : ((sega_cdrom_get_adr_control(cdrom, cur_track)<<8) |*/ (cdrom_get_track(cdrom, m_FAD-150)+1); + m_dr[1] = (m_CurrentTrack == 0xff) ? 0xffff : ((sega_cdrom_get_adr_control(cdrom, m_CurrentTrack)<<8) | (cdrom_get_track(cdrom, m_FAD-150)+1)); m_dr[2] = 0x0100 | ((m_FAD >> 16) & 0xff); m_dr[3] = m_FAD & 0xffff; } @@ -701,6 +711,7 @@ void segacdblock_device::cd_cmd_end_transfer() } else { + printf("no xferdum error\n"); m_dr[0] = m_cd_state | 0xff; m_dr[1] = 0xffff; } @@ -714,8 +725,11 @@ void segacdblock_device::cd_cmd_end_transfer() INT32 i; xfertype = CDDMA_STOPPED; + sourcetype = SOURCE_NONE; + DeleteSectorMode = false; // deallocate the blocks + //i = xfersectpos+xfersectnum; for (i = xfersectpos; i < xfersectpos+xfersectnum; i++) { cd_free_block(transpart->blocks[i]); @@ -734,7 +748,20 @@ void segacdblock_device::cd_cmd_end_transfer() { //m_hirq &= ~CSCT; } - + + printf("%d End T\n",freeblocks); + /*{ + int xxxx; + + xxxx = 0; + for(int gg=0;gg<200;gg++) + { + if(transpart->blocks[gg] == (blockT *)NULL) + xxxx++; + } + + printf("%d Real Count\n",xxxx); + }*/ set_flag(EHST); } } @@ -757,6 +784,7 @@ void segacdblock_device::cd_cmd_play_disc() return; // @todo intentional for debugging m_FAD = start_pos & 0xfffff; + m_CurrentTrack = cdrom_get_track(cdrom, m_FAD-150); } else return; // @todo intentional for debugging @@ -772,6 +800,7 @@ void segacdblock_device::cd_cmd_play_disc() return; // @todo intentional for debugging m_cd_state = CD_STAT_PLAY; + m_cd_timer->reset(); m_cd_timer->adjust(attotime::from_hz(150)); // @todo use the clock Luke m_playtype = false; @@ -876,10 +905,17 @@ void segacdblock_device::cd_cmd_get_sector_number(UINT8 buffer_number) m_dr[1] = 0; m_dr[2] = 0; if (partitions[buffer_number].size == -1) + { m_dr[3] = 0; + debugger_break(machine()); + } else m_dr[3] = partitions[buffer_number].numblks; + + + printf("%d\n",m_dr[3]); + set_flag(DRDY); set_flag(CMOK); } @@ -903,8 +939,16 @@ void segacdblock_device::cd_cmd_get_then_delete_sector() UINT32 sectnum = m_cr[3]; UINT32 sectofs = m_cr[1]; UINT32 bufnum = m_cr[2]>>8; -// if (partitions[bufnum].numblks < sectnum) + + if (partitions[bufnum].numblks < sectnum) + { + printf("CD: buffer is not full %08x %08x\n",partitions[bufnum].numblks,sectnum); + m_dr[0] = CD_STAT_REJECT; + set_flag(CMOK|EHST); + debugger_break(machine()); + return; + } // @todo reject states cd_getsectoroffsetnum(bufnum, §ofs, §num); // m_dma_src = 0; @@ -921,7 +965,7 @@ void segacdblock_device::cd_cmd_get_then_delete_sector() xfersectpos = sectofs; xfersectnum = sectnum; xfertype = CDDMA_INPROGRESS; -// sourcetype = SOURCE_DATA; + sourcetype = SOURCE_NONE; set_flag(EHST); set_flag(DRDY); set_flag(CMOK); @@ -962,7 +1006,7 @@ void segacdblock_device::cd_cmd_get_file_info(UINT32 fileid) if (fileid == 0xffffff) // special return; // @todo intentional - m_dr[0] = CD_STAT_TRANS | m_cd_state; + m_dr[0] = m_cd_state; m_dr[1] = 6; m_dr[2] = 0; m_dr[3] = 0; @@ -1403,6 +1447,9 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int SH1CommandExecute(); else if(id == PERI_TIMER) { + //printf("time left: %s\n", m_cd_timer->remaining().as_string()); + //if(m_cd_timer->remaining().as_double() != 1000000000.000000) + // return; dma_setup(); if(m_isDiscInTray == false) @@ -1420,8 +1467,8 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int { if((m_cd_state & 0x0f00) == CD_STAT_PAUSE) { - if(!(m_hirq & BFUL)) - m_cd_state = CD_STAT_PLAY; + //if(!(m_hirq & BFUL)) + // m_cd_state = CD_STAT_PLAY; m_cd_timer->adjust(attotime::from_hz(150)); @@ -1430,7 +1477,7 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int { UINT8 p_ok; - printf("%08x %08x\n",m_FAD,m_FADEnd); + printf("FAD %08x %08x\n",m_FAD,m_FADEnd); p_ok = 0; if (cdrom) @@ -1446,12 +1493,13 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int //machine().device<cdda_device>("cdda")->start_audio(cd_curfad, 1); } } - + + set_flag(CSCT); + if(p_ok) { m_FAD ++; m_FADEnd --; - set_flag(CSCT); if(!m_FADEnd) { @@ -1470,6 +1518,12 @@ void segacdblock_device::device_timer(emu_timer &timer, device_timer_id id, int printf("%04x\n",m_hirq); } m_cd_timer->adjust(attotime::from_hz(150)); + + + //if(m_TransferActive == true) + // m_cd_state|= CD_STAT_TRANS; + //cd_standard_return(true); + //set_flag(SCDQ); } } @@ -1517,7 +1571,8 @@ void segacdblock_device::device_reset() m_hirq = 0xffff; freeblocks = 200; m_LastBuffer = 0xff; - + m_CurrentTrack = 0xff; + // reset buffer partitions for (i = 0; i < MAX_FILTERS; i++) { diff --git a/src/emu/machine/segacdblock.h b/src/emu/machine/segacdblock.h index 5475d664797..aad114a0e34 100644 --- a/src/emu/machine/segacdblock.h +++ b/src/emu/machine/segacdblock.h @@ -254,6 +254,8 @@ private: bool DeleteSectorMode; void cd_defragblocks(partitionT *part); bool m_playtype; + sega_cdrom_get_adr_control(cdrom_file *file, int track); + int m_CurrentTrack; //bool m_BufferFull; }; |