Common Source Code Project for Qt (a.k.a for FM-7).
修訂 | 7b1c8f2b85e41cbfa8bb08813bd8011cba372007 (tree) |
---|---|
時間 | 2018-02-24 01:20:59 |
作者 | K.Ohta <whatisthis.sowhat@gmai...> |
Commiter | K.Ohta |
[VM][MB8877] SEEK COMMAND: Fix seek target what difference betweeen track register and physical drive.Thank to Haserin.
@@ -822,19 +822,20 @@ void MB8877::event_callback(int event_id, int err) | ||
822 | 822 | //#ifdef _FDC_DEBUG_LOG |
823 | 823 | //this->out_debug_log(_T("FDC\tSEEK START\n")); |
824 | 824 | //#endif |
825 | - if(seektrk > (uint8_t)(fdc[drvreg].track & 0xff)) { | |
826 | - if((fdc[drvreg].track < 0xff) && (fdc[drvreg].track >= 0)) fdc[drvreg].track++; | |
825 | + if(seektrk > fdc[drvreg].track) { | |
826 | + fdc[drvreg].track++; | |
827 | 827 | if(d_noise_seek != NULL) d_noise_seek->play(); |
828 | 828 | //need_after_irq = true; |
829 | - } else if(seektrk < (uint8_t)(fdc[drvreg].track & 0xff)) { | |
830 | - if((fdc[drvreg].track <= 0xff) && (fdc[drvreg].track > 0)) fdc[drvreg].track--; | |
829 | + } else if(seektrk < fdc[drvreg].track) { | |
830 | + fdc[drvreg].track--; | |
831 | 831 | if(d_noise_seek != NULL) d_noise_seek->play(); |
832 | 832 | //need_after_irq = true; |
833 | 833 | } |
834 | - if((cmdreg & 0x10) || ((cmdreg & 0xf0) == 0)) { | |
834 | + // Not update track register if "SEEK" command.Thanks to Haserin. 20180224 K.O. | |
835 | + if((((cmdreg & 0x10) != 0) && (cmdreg >= 0x20)) || ((cmdreg & 0xf0) == 0)) { | |
835 | 836 | trkreg = fdc[drvreg].track; |
836 | 837 | } |
837 | - if(seektrk != (uint8_t)(fdc[drvreg].track & 0xff)) { | |
838 | + if((uint8_t)seektrk != (uint8_t)fdc[drvreg].track) { | |
838 | 839 | //if(need_after_irq) { |
839 | 840 | //set_drq(false); |
840 | 841 | //set_irq(true); // 20180118 K.O Turn ON IRQ -> Turn OFF DRQ |
@@ -1123,7 +1124,6 @@ void MB8877::process_cmd() | ||
1123 | 1124 | }; |
1124 | 1125 | if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (%s) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, cmdstr[cmdreg >> 4], datareg, drvreg, trkreg, sidereg, secreg); |
1125 | 1126 | //#endif |
1126 | - | |
1127 | 1127 | switch(cmdreg & 0xf8) { |
1128 | 1128 | // type-1 |
1129 | 1129 | case 0x00: case 0x08: |
@@ -1234,13 +1234,12 @@ void MB8877::cmd_seek() | ||
1234 | 1234 | // verify |
1235 | 1235 | if(trkreg != fdc[drvreg].track) { |
1236 | 1236 | status |= FDC_ST_SEEKERR; |
1237 | - trkreg = fdc[drvreg].track; | |
1237 | + trkreg = fdc[drvreg].track; // Reload track register when verify: Really OK? 20180224 K.O | |
1238 | 1238 | } |
1239 | 1239 | } |
1240 | 1240 | |
1241 | -// seektrk = (uint8_t)(fdc[drvreg].track + datareg - trkreg); | |
1242 | - seektrk = datareg; | |
1243 | - | |
1241 | + seektrk = (uint8_t)(fdc[drvreg].track + datareg - trkreg); // Seek target is differ when drive's track != trkreg.Thanks to Haserin and Ryu Takegami. | |
1242 | + //seektrk = (int)((int8_t)datareg); | |
1244 | 1243 | //#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX) |
1245 | 1244 | if(type_fm77av_2dd) { |
1246 | 1245 | if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) { |
@@ -1253,13 +1252,9 @@ void MB8877::cmd_seek() | ||
1253 | 1252 | } else { |
1254 | 1253 | seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk; |
1255 | 1254 | } |
1255 | + | |
1256 | 1256 | seekvct = !(seektrk > fdc[drvreg].track); |
1257 | - // Fix wrong seek (to overtrack and overflow) | |
1258 | - // Followup from XM7. | |
1259 | - // Thanks to Haserin and Ryu Takegami. | |
1260 | - if((seekvct) && ((trkreg - datareg) > (uint8_t)(fdc[drvreg].track))) { | |
1261 | - seektrk = 0; | |
1262 | - } | |
1257 | + // Update track register by data register.Thanks to Ryu Takegami. 20180224 K.O | |
1263 | 1258 | trkreg = datareg; |
1264 | 1259 | set_irq(false); |
1265 | 1260 | set_drq(false); |
@@ -1521,7 +1516,8 @@ void MB8877::cmd_forceint() | ||
1521 | 1516 | } else if(seektrk < fdc[drvreg].track) { |
1522 | 1517 | if((fdc[drvreg].track <= 0xff) && (fdc[drvreg].track > 0)) fdc[drvreg].track--; |
1523 | 1518 | } |
1524 | - if((cmdreg_tmp & 0x10) || ((cmdreg_tmp & 0xf0) == 0)) { | |
1519 | + // Not update track register if "SEEK" command.Thanks to Haserin. 20180224 K.O. | |
1520 | + if((((cmdreg_tmp & 0x10) != 0) && (cmdreg_tmp >= 0x20)) || ((cmdreg_tmp & 0xf0) == 0)) { | |
1525 | 1521 | trkreg = fdc[drvreg].track; |
1526 | 1522 | } |
1527 | 1523 | } |