diff --git a/Components/9918/9918.cpp b/Components/9918/9918.cpp index fccdf628c..112046ceb 100644 --- a/Components/9918/9918.cpp +++ b/Components/9918/9918.cpp @@ -47,6 +47,12 @@ const uint32_t palette[16] = { palette_pack(255, 255, 255) }; +const uint8_t StatusInterrupt = 0x80; +const uint8_t StatusFifthSprite = 0x40; + +const int StatusSpriteCollisionShift = 5; +const uint8_t StatusSpriteCollision = 0x20; + } TMS9918::TMS9918(Personality p) : @@ -67,7 +73,7 @@ std::shared_ptr TMS9918::get_crt() { } void TMS9918::test_sprite(int sprite_number) { - if(!(status_ & 0x40)) { + if(!(status_ & StatusFifthSprite)) { status_ = static_cast((status_ & ~31) | sprite_number); } if(sprites_stopped_) @@ -85,7 +91,7 @@ void TMS9918::test_sprite(int sprite_number) { const int active_sprite_slot = sprite_sets_[active_sprite_set_].active_sprite_slot; if(active_sprite_slot == 4) { - status_ |= 0x40; + status_ |= StatusFifthSprite; return; } @@ -416,7 +422,7 @@ void TMS9918::run_for(const HalfCycles cycles) { } else if(sprite.shift_position < 32) { int mask = sprite.image[sprite.shift_position >> 4] << ((sprite.shift_position&15) >> 1); mask = (mask >> 7) & 1; - status_ |= (mask & sprite_mask) << 5; + status_ |= (mask & sprite_mask) << StatusSpriteCollisionShift; sprite_mask |= mask; sprite.shift_position += shift_advance; @@ -481,7 +487,7 @@ void TMS9918::run_for(const HalfCycles cycles) { if(column_ == 342) { access_pointer_ = column_ = output_column_ = 0; row_ = (row_ + 1) % frame_lines_; - if(row_ == 192) status_ |= 0x80; + if(row_ == 192) status_ |= StatusInterrupt; screen_mode_ = next_screen_mode_; blank_screen_ = next_blank_screen_; @@ -599,7 +605,7 @@ uint8_t TMS9918::get_register(int address) { // Reads from address 1 get the status register. uint8_t result = status_; - status_ &= ~(0x80 | 0x40 | 0x20); + status_ &= ~(StatusInterrupt | StatusFifthSprite | StatusSpriteCollision); return result; } @@ -613,5 +619,5 @@ uint8_t TMS9918::get_register(int address) { } bool TMS9918::get_interrupt_line() { - return (status_ & 0x80) && generate_interrupts_; + return (status_ & StatusInterrupt) && generate_interrupts_; } diff --git a/Components/9918/9918.hpp b/Components/9918/9918.hpp index 44d908f16..d9e1e43b6 100644 --- a/Components/9918/9918.hpp +++ b/Components/9918/9918.hpp @@ -44,7 +44,18 @@ class TMS9918 { void set_register(int address, uint8_t value); uint8_t get_register(int address); + /*! + Returns the amount of time until get_interrupt_line would next return true if + there are no interceding calls to set_register or get_register. + + If get_interrupt_line is true now, returns zero. If get_interrupt_line would + never return true, returns -1. + */ HalfCycles get_time_until_interrupt(); + + /*! + @returns @c true if the interrupt line is currently active; @c false otherwise. + */ bool get_interrupt_line(); private: