Common Source Code Project for Qt (a.k.a for FM-7).
Révision | ad8027459894b28f3d20f0a15e4e987977a7cf26 (tree) |
---|---|
l'heure | 2021-01-14 14:01:27 |
Auteur | K.Ohta <whatisthis.sowhat@gmai...> |
Commiter | K.Ohta |
[VM][FMTOWNS][CDROM] Falldown intr even stat_reply_intr (04C2:bit6) == 0 on MCU interrupt.
[VM][FMTOWNS][CDROM] Reply error when reading beyond track on READ_SECTOR.
@@ -211,6 +211,9 @@ void TOWNS_CDROM::set_mcu_intr(bool val) | ||
211 | 211 | write_mcuint_signals((val) ? 0xffffffff : 0); |
212 | 212 | } else { |
213 | 213 | mcu_intr = val; |
214 | + if(!(val)) { | |
215 | + write_mcuint_signals(0); | |
216 | + } | |
214 | 217 | } |
215 | 218 | } |
216 | 219 |
@@ -700,6 +703,7 @@ void TOWNS_CDROM::write_dma_io8(uint32_t addr, uint32_t data) | ||
700 | 703 | void TOWNS_CDROM::read_cdrom() |
701 | 704 | { |
702 | 705 | // read_pos = 0; |
706 | + databuffer->clear(); | |
703 | 707 | if((cdda_status != CDDA_OFF) && (cdda_status != CDDA_ENDED)) { |
704 | 708 | // @note In SUPER REAL MAHJONG PIV, use PAUSE (A5h) command before reading. |
705 | 709 | // @note 20201110 K.O |
@@ -747,7 +751,7 @@ void TOWNS_CDROM::read_cdrom() | ||
747 | 751 | status_parameter_error(false); |
748 | 752 | return; |
749 | 753 | } |
750 | - databuffer->clear(); | |
754 | +// databuffer->clear(); | |
751 | 755 | cdrom_debug_log(_T("READ_CDROM TRACK=%d LBA1=%d LBA2=%d M1/S1/F1=%02X/%02X/%02X M2/S2/F2=%02X/%02X/%02X PAD=%02X DCMD=%02X"), track, lba1, lba2, |
752 | 756 | param_queue[0], param_queue[1], param_queue[2], |
753 | 757 | param_queue[3], param_queue[4], param_queue[5], |
@@ -766,6 +770,7 @@ void TOWNS_CDROM::read_cdrom() | ||
766 | 770 | // Kick a first |
767 | 771 | double usec = get_seek_time(lba1); |
768 | 772 | status_seek = true; |
773 | + if(usec < 1100.0) usec = 1100.0; | |
769 | 774 | register_event(this, EVENT_CDROM_SEEK_COMPLETED, usec, false, &event_seek_completed); |
770 | 775 | if(req_status) { |
771 | 776 | // May not need extra status, integrated after reading. 20200906 K.O |
@@ -1985,11 +1990,8 @@ double TOWNS_CDROM::get_seek_time(uint32_t lba) | ||
1985 | 1990 | } else { |
1986 | 1991 | distance = abs((int)lba - (int)(cur_position / ((is_iso) ? 2048 : physical_block_size()))); |
1987 | 1992 | } |
1988 | -// if(distance < 100) { | |
1989 | -// distance = 100; // Seek penalty. | |
1990 | -// } | |
1991 | - if(distance < 4) { | |
1992 | - distance = 4; // Seek penalty. | |
1993 | + if(distance < 0) { | |
1994 | + distance = 0; // Seek penalty. | |
1993 | 1995 | } |
1994 | 1996 | double _seek = (double)distance / 333000.0 ; // 333000: sectors in media |
1995 | 1997 | _seek = 400.0e3 * _seek; |
@@ -2088,9 +2090,10 @@ bool TOWNS_CDROM::seek_relative_frame_in_image(uint32_t frame_no) | ||
2088 | 2090 | FILEIO_SEEK_SET) != 0) { |
2089 | 2091 | return false; |
2090 | 2092 | } |
2093 | + return true; | |
2091 | 2094 | } |
2092 | 2095 | } |
2093 | - return true; | |
2096 | + return false; | |
2094 | 2097 | } |
2095 | 2098 | |
2096 | 2099 |
@@ -3161,8 +3164,12 @@ void TOWNS_CDROM::write_io8(uint32_t addr, uint32_t data) | ||
3161 | 3164 | } |
3162 | 3165 | break; |
3163 | 3166 | case 0x04: // Param |
3164 | - param_queue[param_ptr] = data; | |
3165 | - param_ptr = (param_ptr + 1) & 0x07; | |
3167 | +// param_queue[param_ptr] = data; | |
3168 | +// param_ptr = (param_ptr + 1) & 0x07; | |
3169 | + for(int xx = 1; xx < 8; xx++) { | |
3170 | + param_queue[xx - 1] = param_queue[xx]; | |
3171 | + } | |
3172 | + param_queue[7] = data; | |
3166 | 3173 | break; |
3167 | 3174 | case 0x06: |
3168 | 3175 | if((data & 0x08) != 0) { |