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:
parent
4ad84e5047
commit
815a75d9b6
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user