1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-30 22:29:56 +00:00

Add missing status storage; capture mode 2 sprite collision locations.

This commit is contained in:
Thomas Harte 2023-03-15 23:06:32 -04:00
parent aa4582956f
commit a5a36cb08e
4 changed files with 28 additions and 21 deletions

View File

@ -1112,15 +1112,15 @@ uint8_t Base<personality>::read_register() {
} break; } break;
case 3: LOG("TODO: Yamaha status 3"); break; case 3: return uint8_t(Storage<personality>::collision_location_[0]);
case 4: LOG("TODO: Yamaha status 4"); break; case 4: return uint8_t((Storage<personality>::collision_location_[0] >> 8) | 0xfe);
case 5: LOG("TODO: Yamaha status 5"); break; case 5: return uint8_t(Storage<personality>::collision_location_[1]);
case 6: LOG("TODO: Yamaha status 6"); break; case 6: return uint8_t((Storage<personality>::collision_location_[1] >> 8) | 0xfc);
case 7: return Storage<personality>::colour_status_; case 7: return Storage<personality>::colour_status_;
case 8: LOG("TODO: Yamaha status 8"); break; case 8: return uint8_t(Storage<personality>::colour_location_);
case 9: LOG("TODO: Yamaha status 9"); break; case 9: return uint8_t((Storage<personality>::colour_location_ >> 8) | 0xfe);
} }
} }

View File

@ -575,10 +575,10 @@ template <Personality personality> struct Base: public Storage<personality> {
template <bool apply_blink> void draw_tms_text(int start, int end); template <bool apply_blink> void draw_tms_text(int start, int end);
void draw_sms(int start, int end, uint32_t cram_dot); void draw_sms(int start, int end, uint32_t cram_dot);
template<ScreenMode mode> void draw_yamaha(LineBuffer &, int start, int end); template<ScreenMode mode> void draw_yamaha(LineBuffer &, int y, int start, int end);
void draw_yamaha(int start, int end); void draw_yamaha(int start, int end);
template <SpriteMode mode, bool double_width> void draw_sprites(LineBuffer &, int start, int end, const std::array<uint32_t, 16> &palette, int *colour_buffer = nullptr); template <SpriteMode mode, bool double_width> void draw_sprites(LineBuffer &, int y, int start, int end, const std::array<uint32_t, 16> &palette, int *colour_buffer = nullptr);
}; };
#include "Fetch.hpp" #include "Fetch.hpp"

View File

@ -13,7 +13,7 @@
template <Personality personality> template <Personality personality>
template <SpriteMode mode, bool double_width> template <SpriteMode mode, bool double_width>
void Base<personality>::draw_sprites(LineBuffer &buffer, int start, int end, const std::array<uint32_t, 16> &palette, int *colour_buffer) { void Base<personality>::draw_sprites(LineBuffer &buffer, [[maybe_unused]] int y, int start, int end, const std::array<uint32_t, 16> &palette, int *colour_buffer) {
if(!buffer.active_sprite_slot) { if(!buffer.active_sprite_slot) {
return; return;
} }
@ -177,15 +177,20 @@ void Base<personality>::draw_sprites(LineBuffer &buffer, int start, int end, con
pixel_origin_[sprite.x + x] = palette[colour & 0xf]; pixel_origin_[sprite.x + x] = palette[colour & 0xf];
} }
// Accumulate collisions. // TODO: is collision location recorded in mode 1?
// Check for a new collision.
if(!(status_ & StatusSpriteCollision)) {
sprite_collision |= sprite_buffer[sprite.x + x]; sprite_collision |= sprite_buffer[sprite.x + x];
sprite_buffer[sprite.x + x] |= colour; sprite_buffer[sprite.x + x] |= colour;
// TODO: capture (x, y) if a collision has been spotted.
}
// Update collision bit.
status_ |= sprite_collision & StatusSpriteCollision; status_ |= sprite_collision & StatusSpriteCollision;
if(status_ & StatusSpriteCollision) {
Storage<personality>::collision_location_[0] = uint16_t(x);
Storage<personality>::collision_location_[1] = uint16_t(y);
}
}
}
} }
return; return;
@ -284,7 +289,7 @@ void Base<personality>::draw_tms_character(int start, int end) {
} }
} }
draw_sprites<sprite_mode, false>(line_buffer, start, end, palette()); draw_sprites<sprite_mode, false>(line_buffer, output_pointer_.row, start, end, palette());
} }
template <Personality personality> template <Personality personality>
@ -411,7 +416,7 @@ void Base<personality>::draw_sms(int start, int end, uint32_t cram_dot) {
/* /*
Apply sprites (if any). Apply sprites (if any).
*/ */
draw_sprites<SpriteMode::MasterSystem, false>(line_buffer, start, end, palette(), colour_buffer); draw_sprites<SpriteMode::MasterSystem, false>(line_buffer, output_pointer_.row, start, end, palette(), colour_buffer);
// Map from the 32-colour buffer to real output pixels, applying the specific CRAM dot if any. // Map from the 32-colour buffer to real output pixels, applying the specific CRAM dot if any.
pixel_target_[start] = Storage<personality>::colour_ram_[colour_buffer[start] & 0x1f] | cram_dot; pixel_target_[start] = Storage<personality>::colour_ram_[colour_buffer[start] & 0x1f] | cram_dot;
@ -435,7 +440,7 @@ void Base<personality>::draw_sms(int start, int end, uint32_t cram_dot) {
template <Personality personality> template <Personality personality>
template <ScreenMode mode> template <ScreenMode mode>
void Base<personality>::draw_yamaha(LineBuffer &buffer, int start, int end) { void Base<personality>::draw_yamaha(LineBuffer &buffer, int y, int start, int end) {
const auto active_palette = palette(); const auto active_palette = palette();
const int sprite_start = start >> 2; const int sprite_start = start >> 2;
const int sprite_end = end >> 2; const int sprite_end = end >> 2;
@ -517,7 +522,7 @@ void Base<personality>::draw_yamaha(LineBuffer &buffer, int start, int end) {
draw_sprites< draw_sprites<
SpriteMode::Mode2, SpriteMode::Mode2,
mode == ScreenMode::YamahaGraphics5 || mode == ScreenMode::YamahaGraphics6 mode == ScreenMode::YamahaGraphics5 || mode == ScreenMode::YamahaGraphics6
>(buffer, sprite_start, sprite_end, mode == ScreenMode::YamahaGraphics7 ? graphics7_sprite_palette : palette()); >(buffer, y, sprite_start, sprite_end, mode == ScreenMode::YamahaGraphics7 ? graphics7_sprite_palette : palette());
} }
template <Personality personality> template <Personality personality>
@ -537,7 +542,7 @@ void Base<personality>::draw_yamaha(int start, int end) {
draw_tms_character<SpriteMode::Mode2>(start >> 2, end >> 2); draw_tms_character<SpriteMode::Mode2>(start >> 2, end >> 2);
break; break;
#define Dispatch(x) case ScreenMode::x: draw_yamaha<ScreenMode::x>(line_buffer, start, end); break; #define Dispatch(x) case ScreenMode::x: draw_yamaha<ScreenMode::x>(line_buffer, output_pointer_.row, start, end); break;
Dispatch(YamahaGraphics4); Dispatch(YamahaGraphics4);
Dispatch(YamahaGraphics5); Dispatch(YamahaGraphics5);
Dispatch(YamahaGraphics6); Dispatch(YamahaGraphics6);

View File

@ -102,6 +102,8 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
// Additional status. // Additional status.
uint8_t colour_status_ = 0; uint8_t colour_status_ = 0;
uint16_t colour_location_ = 0;
uint16_t collision_location_[2]{};
/// Resets line-ephemeral state for a new line. /// Resets line-ephemeral state for a new line.
void begin_line(ScreenMode mode, bool is_refresh) { void begin_line(ScreenMode mode, bool is_refresh) {