From 7dbaf4e12d8c1366492dad150a4e74e82a83bdb4 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Fri, 2 Feb 2024 21:06:07 -0500 Subject: [PATCH] Add back floppy bitmask since floppy order depends on slot order. --- Ample/Media.h | 4 ++- Ample/Media.m | 33 +++++++++++++++------- Ample/MediaViewController.m | 56 ++++++++++++++----------------------- 3 files changed, 47 insertions(+), 46 deletions(-) diff --git a/Ample/Media.h b/Ample/Media.h index 4a73fba..5e3cc91 100644 --- a/Ample/Media.h +++ b/Ample/Media.h @@ -23,7 +23,9 @@ typedef struct Media { unsigned midiout; unsigned picture; unsigned rom; - //uint64_t floppy_mask; + uint64_t floppy_mask_8; + uint64_t floppy_mask_5_25; + uint64_t floppy_mask_3_5; } Media; diff --git a/Ample/Media.m b/Ample/Media.m index f6ce4d9..4a6e37c 100644 --- a/Ample/Media.m +++ b/Ample/Media.m @@ -40,7 +40,8 @@ void MediaAdd(Media *dest, const Media *src) { // could merge from src media but not currently set there. //unsigned count; - //unsigned flops = dest->floppy_8 + dest->floppy_5_25 + dest->floppy_3_5; + unsigned dest_flops = dest->floppy_8 + dest->floppy_5_25 + dest->floppy_3_5; + unsigned src_flops = src->floppy_8 || src->floppy_5_25 || src->floppy_8; #define _(name) dest->name += src->name; @@ -58,15 +59,25 @@ void MediaAdd(Media *dest, const Media *src) { _(rom); #undef _ -#if 0 - // TODO - FLOPPY_8 - if ((count = src->floppy_5_25)) { - uint64_t bits = (1 << count) - 1; - //dest->floppy_mask <<= count; - bits <<= flops; - dest->floppy_mask |= bits; + + // this assumes any device that supports more than 1 floppy size + // the order is 8" < 5.25" < 3.5" + + if (src_flops) { + uint64_t bits = 1 << dest_flops; + for (unsigned i = 0; i < src->floppy_8; ++i) { + dest->floppy_mask_8 |= bits; + bits <<= 1; + } + for (unsigned i = 0; i < src->floppy_5_25; ++i) { + dest->floppy_mask_5_25 |= bits; + bits <<= 1; + } + for (unsigned i = 0; i < src->floppy_3_5; ++i) { + dest->floppy_mask_3_5 |= bits; + bits <<= 1; + } } -#endif } @@ -89,7 +100,9 @@ BOOL MediaEqual(const Media *lhs, const Media *rhs) { _(picture); _(rom); - //_(floppy_mask); + _(floppy_mask_8); + _(floppy_mask_5_25); + _(floppy_mask_3_5); return YES; #undef _ diff --git a/Ample/MediaViewController.m b/Ample/MediaViewController.m index 0522490..aca65e0 100644 --- a/Ample/MediaViewController.m +++ b/Ample/MediaViewController.m @@ -355,6 +355,10 @@ //unsigned counts[CATEGORY_COUNT] = { 0 }; + uint64_t floppy_mask_8 = _media.floppy_mask_8; + uint64_t floppy_mask_5_25 = _media.floppy_mask_5_25; + uint64_t floppy_mask_3_5 = _media.floppy_mask_3_5; + for (unsigned j = 0; j < CATEGORY_COUNT; ++j) { //uint64_t floppy_mask = _media.floppy_mask; @@ -362,49 +366,31 @@ MediaCategory *cat = _data[j]; NSInteger valid = [cat validCount]; - - // assumes floppy order is 8", 5.25", 3.5". - switch(j) { - case kIndexFloppy8: - index = 0; - break; - case kIndexFloppy525: - index = _media.floppy_8; - break; - case kIndexFloppy35: - index = _media.floppy_8 + _media.floppy_5_25; - break; - } - + for (NSInteger i = 0; i < valid; ++i) { MediaItem *item = [cat objectAtIndex: i]; NSString *arg = [item argument]; - ++index; - if (!arg) continue; -#if 0 - // TODO -- FLOPPY_8 support. - - if (j == kIndexFloppy525) { - // assumes < 64 floppies.... - // infinite loop if no floppy device... - if (floppy_mask == 0) break; - while ((floppy_mask & 0x01) == 0) { - floppy_mask >>= 1; + switch(j) { + case kIndexFloppy8: + index = ffsll(floppy_mask_8); + floppy_mask_8 &= ~(1 << (index-1)); + break; + case kIndexFloppy525: + index = ffsll(floppy_mask_5_25); + floppy_mask_5_25 &= ~(1 << (index-1)); + break; + case kIndexFloppy35: + index = ffsll(floppy_mask_3_5); + floppy_mask_3_5 &= ~(1 << (index-1)); + break; + default: ++index; - } - } else if (j == kIndexFloppy35) { - while ((floppy_mask & 0x01)) { - floppy_mask >>= 1; - ++index; - } } - - ++index; - floppy_mask >>= 1; if (!arg) continue; -#endif + if (!index) continue; + [args addObject: [NSString stringWithFormat: @"-%s%u", prefix[j], index]]; [args addObject: arg]; }