diff --git a/src/core/fds.c b/src/core/fds.c index f22ffd111..89c7233b2 100644 --- a/src/core/fds.c +++ b/src/core/fds.c @@ -417,7 +417,6 @@ void fds_diff_op(BYTE side, BYTE mode, uint32_t position, WORD value) { fds.info.writings_occurred = TRUE; if (mode == FDS_OP_WRITE) { - _fds_info_side *is = &fds.info.sides[side]; _fds_diff_ele in = { 0 }, out = { 0 }; uint32_t version = DIFFVERSION; @@ -444,10 +443,6 @@ void fds_diff_op(BYTE side, BYTE mode, uint32_t position, WORD value) { } // senza questo in windows non funziona correttamente fflush(fds.info.diff); - - if (position >= is->last_position) { - is->last_position = position + 1; - } } else if (mode == FDS_OP_READ) { WORD *dst = &fds.info.image[side * fds_image_side_size()]; _fds_diff_ele ele = { 0 }; diff --git a/src/core/mappers/mapper_FDS.c b/src/core/mappers/mapper_FDS.c index 574865d2e..53a4d52fb 100644 --- a/src/core/mappers/mapper_FDS.c +++ b/src/core/mappers/mapper_FDS.c @@ -290,12 +290,15 @@ void extcl_cpu_every_cycle_FDS(BYTE nidx) { uint32_t position = (fds.drive.disk_position - 2); WORD *dst = &fds.side.info->data[position]; + // quando inizia la scrittura il bios scrive sempre + // prima un GAP, seguito da un MARK seguito dal blocco che verrĂ  chiuso dai CRC. + // il last_position devo aggiornarlo solo con i CRC e i GAP che seguono. if (((*dst) == 0x0100) && (fds.drive.data_to_write == 0x00)) { (*dst) = 0x0100; } else if ((fds.drive.data_to_write == 0x80) && (((*dst) == 0x0180) || (position == fds.side.info->last_position))) { (*dst) = 0x0180; - if (position >= fds.side.info->last_position) { + if (position == fds.side.info->last_position) { fds_diff_op(fds.side.info->side, FDS_OP_WRITE, position, (*dst)); } } else if (fds.drive.crc_char) { @@ -306,6 +309,7 @@ void extcl_cpu_every_cycle_FDS(BYTE nidx) { } if (position >= fds.side.info->last_position) { fds_diff_op(fds.side.info->side, FDS_OP_WRITE, position, (*dst)); + fds.info.sides[fds.side.info->side].last_position = position + 1; if ((*dst) == FDS_DISK_CRC_CHAR2) { for (uint32_t i = 0; i < FDS_GAP_BLOCK; i++) { uint32_t p = position + 1 + i; @@ -313,6 +317,7 @@ void extcl_cpu_every_cycle_FDS(BYTE nidx) { if (p < fds_disk_side_size()) { fds.side.info->data[p] = FDS_DISK_GAP; fds_diff_op(fds.side.info->side, FDS_OP_WRITE, p, FDS_DISK_GAP); + fds.info.sides[fds.side.info->side].last_position = p + 1; } } }