1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 23:52:26 +00:00

Extend generator to handle sprite collection.

This commit is contained in:
Thomas Harte 2023-02-12 22:28:34 -05:00
parent 4ad84e5047
commit 815a75d9b6

View File

@ -251,22 +251,40 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
}; };
static constexpr auto refresh_events = events<RefreshGenerator>(); static constexpr auto refresh_events = events<RefreshGenerator>();
struct NoSpriteEventsGenerator { template <bool include_sprites> struct BitmapEventsGenerator {
static constexpr std::optional<typename Event::Type> event(int grauw_index) { static constexpr std::optional<typename Event::Type> event(int grauw_index) {
// Various standard zones of one-every-eight external slots. if(!include_sprites) {
if(grauw_index < 124) { // Various standard zones of one-every-eight external slots.
return StandardGenerators::external_every_eight(grauw_index + 2); if(grauw_index < 124) {
} return StandardGenerators::external_every_eight(grauw_index + 2);
if(grauw_index > 1266) { }
return StandardGenerators::external_every_eight(grauw_index - 1266); if(grauw_index > 1266) {
return StandardGenerators::external_every_eight(grauw_index - 1266);
}
} else {
// This records collection points for all data for selected sprites.
// There's only four of them (each site covering two sprites),
// so it's clearer just to be explicit.
//
// There's also a corresponding number of extra external slots to spell out.
switch(grauw_index) {
default: break;
case 1238: case 1302: case 2: case 66:
return Event::Type::SpriteLocation;
case 1270: case 1338: case 34: case 98:
return Event::Type::SpritePattern;
case 1264: case 1330: case 28: case 92:
return Event::Type::External;
}
} }
if(grauw_index >= 162 && grauw_index < 176) { if(grauw_index >= 162 && grauw_index < 176) {
return StandardGenerators::external_every_eight(grauw_index - 162); return StandardGenerators::external_every_eight(grauw_index - 162);
} }
// Everywhere else the pattern is: // Everywhere else the pattern is:
// //
// external, external, data block // external or sprite y, external, data block
// //
// Subject to caveats: // Subject to caveats:
// //
@ -281,7 +299,15 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
switch(sub_block) { switch(sub_block) {
default: return std::nullopt; default: return std::nullopt;
case 0: return Event::Type::External; case 0:
if(include_sprites) {
// Don't include the sprite post-amble (i.e. a spurious read with no side effects).
if(block < 32) {
return Event::Type::SpriteY;
}
} else {
return Event::Type::External;
}
case 6: case 6:
if((block & 3) != 3) { if((block & 3) != 3) {
return Event::Type::External; return Event::Type::External;
@ -298,7 +324,8 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
return std::nullopt; return std::nullopt;
} }
}; };
static constexpr auto no_sprites_events = events<NoSpriteEventsGenerator>(); static constexpr auto no_sprites_events = events<BitmapEventsGenerator<false>>();
static constexpr auto sprites_events = events<BitmapEventsGenerator<true>>();
}; };
// Master System-specific storage. // Master System-specific storage.