Changed two memcpy's in floppy/fdd_td0.c back to memmov, fixes loading of compressed TD0 images.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Implementation of the Teledisk floppy image format.
|
* Implementation of the Teledisk floppy image format.
|
||||||
*
|
*
|
||||||
* Version: @(#)fdd_td0.c 1.0.7 2018/10/18
|
* Version: @(#)fdd_td0.c 1.0.8 2018/10/24
|
||||||
*
|
*
|
||||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -387,9 +387,11 @@ state_reconst(td0dsk_t *state)
|
|||||||
k++;
|
k++;
|
||||||
l = (j - k) * 2;
|
l = (j - k) * 2;
|
||||||
|
|
||||||
memcpy(&state->freq[k + 1], &state->freq[k], l);
|
/* These *HAVE* to be memmove's as destination and source
|
||||||
|
can overlap, which memcpy can't handle. */
|
||||||
|
memmove(&state->freq[k + 1], &state->freq[k], l);
|
||||||
state->freq[k] = f;
|
state->freq[k] = f;
|
||||||
memcpy(&state->son[k + 1], &state->son[k], l);
|
memmove(&state->son[k + 1], &state->son[k], l);
|
||||||
state->son[k] = i;
|
state->son[k] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -758,7 +760,7 @@ td0_initialize(int drive)
|
|||||||
offset += 3;
|
offset += 3;
|
||||||
switch (hs[8]) {
|
switch (hs[8]) {
|
||||||
default:
|
default:
|
||||||
td0_log("TD0: Image uses an unsupported sector data encoding\n");
|
td0_log("TD0: Image uses an unsupported sector data encoding: %i\n", hs[8]);
|
||||||
return(0);
|
return(0);
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
@@ -1136,6 +1138,23 @@ td0_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
td0_abort(int drive)
|
||||||
|
{
|
||||||
|
td0_t *dev = td0[drive];
|
||||||
|
|
||||||
|
if (dev->imagebuf)
|
||||||
|
free(dev->imagebuf);
|
||||||
|
if (dev->processed_buf)
|
||||||
|
free(dev->processed_buf);
|
||||||
|
if (dev->f)
|
||||||
|
fclose(dev->f);
|
||||||
|
memset(floppyfns[drive], 0, sizeof(floppyfns[drive]));
|
||||||
|
free(dev);
|
||||||
|
td0[drive] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
td0_load(int drive, wchar_t *fn)
|
td0_load(int drive, wchar_t *fn)
|
||||||
{
|
{
|
||||||
@@ -1160,9 +1179,7 @@ td0_load(int drive, wchar_t *fn)
|
|||||||
|
|
||||||
if (! dsk_identify(drive)) {
|
if (! dsk_identify(drive)) {
|
||||||
td0_log("TD0: Not a valid Teledisk image\n");
|
td0_log("TD0: Not a valid Teledisk image\n");
|
||||||
fclose(dev->f);
|
td0_abort(drive);
|
||||||
dev->f = NULL;
|
|
||||||
memset(floppyfns[drive], 0, sizeof(floppyfns[drive]));
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
td0_log("TD0: Valid Teledisk image\n");
|
td0_log("TD0: Valid Teledisk image\n");
|
||||||
@@ -1177,10 +1194,7 @@ td0_load(int drive, wchar_t *fn)
|
|||||||
|
|
||||||
if (! td0_initialize(drive)) {
|
if (! td0_initialize(drive)) {
|
||||||
td0_log("TD0: Failed to initialize\n");
|
td0_log("TD0: Failed to initialize\n");
|
||||||
fclose(dev->f);
|
td0_abort(drive);
|
||||||
free(dev->imagebuf);
|
|
||||||
free(dev->processed_buf);
|
|
||||||
memset(floppyfns[drive], 0, sizeof(floppyfns[drive]));
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
td0_log("TD0: Initialized successfully\n");
|
td0_log("TD0: Initialized successfully\n");
|
||||||
@@ -1218,8 +1232,10 @@ td0_close(int drive)
|
|||||||
|
|
||||||
d86f_unregister(drive);
|
d86f_unregister(drive);
|
||||||
|
|
||||||
free(dev->imagebuf);
|
if (dev->imagebuf)
|
||||||
free(dev->processed_buf);
|
free(dev->imagebuf);
|
||||||
|
if (dev->processed_buf)
|
||||||
|
free(dev->processed_buf);
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
for (j = 0; j < 2; j++) {
|
for (j = 0; j < 2; j++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user