From 01619cfe53467d9c0dc7df4ada9abc6f3501962a Mon Sep 17 00:00:00 2001 From: Michel Pollet Date: Tue, 13 Feb 2024 08:46:09 +0000 Subject: [PATCH] Fix for some crashing WOZ, uncommented code! I had left a block of code commented out, and that was crashing some disks with 'special' track mapping. Also now clear the CRC field on the woz, if any, when writing tracks. Signed-off-by: Michel Pollet --- README.md | 4 ++++ src/drivers/mii_disk2.c | 10 ++++++++-- src/format/mii_floppy.c | 22 ++++++++++++++++------ src/format/mii_floppy.h | 7 ++++--- ui_gl/mii_mui_1mb.c | 3 ++- ui_gl/mii_mui_settings.c | 8 +++++++- ui_gl/mii_mui_settings.h | 3 ++- 7 files changed, 43 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index a8bf318..724369c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +

+ MII Logo +

+ # MII Version Changelog ## 1.6 * Another big update, yanked the old DiskII driver, and replaced it with a diff --git a/src/drivers/mii_disk2.c b/src/drivers/mii_disk2.c index 5c35e6b..a34e552 100644 --- a/src/drivers/mii_disk2.c +++ b/src/drivers/mii_disk2.c @@ -36,7 +36,7 @@ typedef struct mii_card_disk2_t { uint8_t write_register; uint8_t head : 4; // bits are shifted in there - uint8_t clock : 3; // LSS clock cycles, read a bit when 0 + uint16_t clock; // LSS clock cycles, read a bit when 0 uint8_t lss_state : 4, // Sequence state lss_mode : 4; // WRITE/LOAD/SHIFT/QA/RP etc uint8_t lss_prev_state; // for write bit @@ -248,6 +248,8 @@ _mii_disk2_command( if (!file) return -1; } + // reinit all tracks, bits, maps etc + mii_floppy_init(&c->floppy[drive]); mii_dd_drive_load(&c->drive[drive], file); mii_floppy_load(&c->floppy[drive], file); break; @@ -347,7 +349,9 @@ _mii_disk2_lss_tick( c->lss_mode = (c->lss_mode & ~(1 << QA_BIT)) | (!!(c->data_register & 0x80) << QA_BIT); - if (c->clock++ == 0) { // clock is clipped to 3 bits + c->clock += 4; // 4 is 0.5us.. we run at 2MHz + if (c->clock >= f->bit_timing) { + c->clock -= f->bit_timing; uint8_t track_id = f->track_id[f->qtrack]; uint32_t byte_index = f->bit_position >> 3; @@ -360,6 +364,8 @@ _mii_disk2_lss_tick( if ((c->head & 0xf) == 0) { bit = f->tracks[MII_FLOPPY_RANDOM_TRACK_ID].data[byte_index]; bit = (bit >> bit_index) & 1; +// printf("RANDOM TRACK %2d %2d %2d : %d\n", +// track_id, byte_index, bit_index, bit); } else { bit = (c->head >> 1) & 1; } diff --git a/src/format/mii_floppy.c b/src/format/mii_floppy.c index 8e79fa3..d48c1b6 100644 --- a/src/format/mii_floppy.c +++ b/src/format/mii_floppy.c @@ -20,8 +20,12 @@ mii_floppy_init( { f->motor = 0; f->stepper = 0; + // see spec for this.. 32 is the default for 4us. + + f->bit_timing = 32; f->qtrack = 15; // just to see something at seek time f->bit_position = 0; + f->tracks_dirty = 0; f->write_protected &= ~MII_FLOPPY_WP_MANUAL;// keep the manual WP bit /* this will look like this; ie half tracks are 'random' 0: 0 1: 0 2:35 3: 1 @@ -164,6 +168,13 @@ mii_floppy_write_track_woz( } version += !strncmp((char*)header, "WOZ2", 4); + /* I don't really want to recalculate the CRC. Seems pointless in a file + like this, and i'd have to walk 250KB+ of data each time I update + anything. + Mark is as cleared, perhapps I need a tool to 'fix' it later, or JUST + at closing time ?*/ + header->crc_le = 0; + mii_woz_tmap_t *tmap = NULL; if (version == 1) { mii_woz1_info_t *info = (mii_woz1_info_t *)(header + 1); @@ -230,7 +241,6 @@ mii_floppy_load_woz( uint8_t *track = trks->track[i].bits; memcpy(f->tracks[i].data, track, le16toh(trks->track[i].byte_count_le)); f->tracks[i].bit_count = le32toh(trks->track[i].bit_count_le); - f->tracks[i].dirty = 0; } } else { mii_woz2_info_t *info = (mii_woz2_info_t *)(header + 1); @@ -239,9 +249,10 @@ mii_floppy_load_woz( mii_woz2_trks_t *trks = (mii_woz2_trks_t *)((uint8_t *)tmap + le32toh(tmap->chunk.size_le) + sizeof(mii_woz_chunk_t)); #if 1 - printf("WOZ: version %d, type %d, sides %d, largest track %d\n", + printf("WOZ: version %d, type %d, sides %d, largest track %d, optimal bit timing: %d\n", info->version, info->disk_type, info->sides, - le16toh(info->largest_track_le) * 512); + le16toh(info->largest_track_le) * 512, + info->optimal_bit_timing); printf("WOZ: creator '%s'\n", info->creator); printf("WOZ: track map %4.4s size %d\n", (char*)&tmap->chunk.id_le, @@ -249,16 +260,16 @@ mii_floppy_load_woz( printf("WOZ: Track chunk %4.4s size %d\n", (char*)&trks->chunk.id_le, le32toh(trks->chunk.size_le)); #endif + /* TODO: this doesn't work yet... */ + // f->bit_timing = info->optimal_bit_timing; for (int i = 0; i < 35; i++) { uint8_t *track = file->map + (le16toh(trks->track[i].start_block_le) << 9); uint32_t byte_count = (le32toh(trks->track[i].bit_count_le) + 7) >> 3; memcpy(f->tracks[i].data, track, byte_count); f->tracks[i].bit_count = le32toh(trks->track[i].bit_count_le); - f->tracks[i].dirty = 0; } } - #if 0 // copy the track map from the file to the floppy for (int ti = 0; ti < (int)sizeof(f->track_id); ti++) { f->track_id[ti] = tmap->track_id[ti] == 0xff ? @@ -268,7 +279,6 @@ mii_floppy_load_woz( __func__, ti, f->track_id[ti]); } } - #endif return version; } diff --git a/src/format/mii_floppy.h b/src/format/mii_floppy.h index dbc99b2..b060804 100644 --- a/src/format/mii_floppy.h +++ b/src/format/mii_floppy.h @@ -23,13 +23,14 @@ enum { }; typedef struct mii_floppy_track_t { - uint8_t dirty : 1; // track has been written to - uint32_t bit_count; - uint8_t data[6680]; // max suggested by WOZ spec + uint8_t dirty : 1; // track has been written to + uint32_t bit_count; + uint8_t data[6680]; // max suggested by WOZ spec } mii_floppy_track_t; typedef struct mii_floppy_t { uint8_t write_protected : 3, id : 2; + uint8_t bit_timing; // 0=32 (default) uint8_t motor; // motor is on uint8_t stepper; // last step we did... uint8_t qtrack; // quarter track we are on diff --git a/ui_gl/mii_mui_1mb.c b/ui_gl/mii_mui_1mb.c index 15de653..4ba56a2 100644 --- a/ui_gl/mii_mui_1mb.c +++ b/ui_gl/mii_mui_1mb.c @@ -38,7 +38,8 @@ typedef struct mii_mui_1mb_t { mii_1mb_conf_t config; } mii_mui_1mb_t; -static void +// TODO: Dedup that with mii_mui_2dsk.c +void _size_string( size_t s, char *out, diff --git a/ui_gl/mii_mui_settings.c b/ui_gl/mii_mui_settings.c index 72a558a..b74ed8b 100644 --- a/ui_gl/mii_mui_settings.c +++ b/ui_gl/mii_mui_settings.c @@ -355,12 +355,18 @@ mii_emu_load( cl = mii_config_get(cf, section, "flags0"); if (cl) config->slot[i].conf.disk2.drive[0].flags = strtoul(cl->value, NULL, 0); + cl = mii_config_get(cf, section, "wp0"); + if (cl) + config->slot[i].conf.disk2.drive[0].wp = !!strtoul(cl->value, NULL, 0); cl = mii_config_get(cf, section, "image1"); if (cl) strcpy(config->slot[i].conf.disk2.drive[1].disk, cl->value); cl = mii_config_get(cf, section, "flags1"); if (cl) config->slot[i].conf.disk2.drive[1].flags = strtoul(cl->value, NULL, 0); + cl = mii_config_get(cf, section, "wp1"); + if (cl) + config->slot[i].conf.disk2.drive[1].wp = !!strtoul(cl->value, NULL, 0); break; case MII_SLOT_DRIVER_SUPERSERIAL: cl = mii_config_get(cf, section, "device"); @@ -378,4 +384,4 @@ mii_emu_load( } } return 0; -} \ No newline at end of file +} diff --git a/ui_gl/mii_mui_settings.h b/ui_gl/mii_mui_settings.h index 14a5db0..62ecc5f 100644 --- a/ui_gl/mii_mui_settings.h +++ b/ui_gl/mii_mui_settings.h @@ -38,7 +38,8 @@ typedef struct mii_config_file_t { } mii_config_file_t; typedef struct mii_drive_conf_t { - unsigned long flags; + unsigned long wp : 1, ro_file : 1, ro_format : 1, + flags; char disk[MII_PATH_SIZE_MAX]; } mii_drive_conf_t;