mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Tidies up some of the TMS' magic constants.
This commit is contained in:
parent
042edc72f7
commit
b3fbd0f352
@ -47,6 +47,12 @@ const uint32_t palette[16] = {
|
|||||||
palette_pack(255, 255, 255)
|
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) :
|
TMS9918::TMS9918(Personality p) :
|
||||||
@ -67,7 +73,7 @@ std::shared_ptr<Outputs::CRT::CRT> TMS9918::get_crt() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TMS9918::test_sprite(int sprite_number) {
|
void TMS9918::test_sprite(int sprite_number) {
|
||||||
if(!(status_ & 0x40)) {
|
if(!(status_ & StatusFifthSprite)) {
|
||||||
status_ = static_cast<uint8_t>((status_ & ~31) | sprite_number);
|
status_ = static_cast<uint8_t>((status_ & ~31) | sprite_number);
|
||||||
}
|
}
|
||||||
if(sprites_stopped_)
|
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;
|
const int active_sprite_slot = sprite_sets_[active_sprite_set_].active_sprite_slot;
|
||||||
if(active_sprite_slot == 4) {
|
if(active_sprite_slot == 4) {
|
||||||
status_ |= 0x40;
|
status_ |= StatusFifthSprite;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,7 +422,7 @@ void TMS9918::run_for(const HalfCycles cycles) {
|
|||||||
} else if(sprite.shift_position < 32) {
|
} else if(sprite.shift_position < 32) {
|
||||||
int mask = sprite.image[sprite.shift_position >> 4] << ((sprite.shift_position&15) >> 1);
|
int mask = sprite.image[sprite.shift_position >> 4] << ((sprite.shift_position&15) >> 1);
|
||||||
mask = (mask >> 7) & 1;
|
mask = (mask >> 7) & 1;
|
||||||
status_ |= (mask & sprite_mask) << 5;
|
status_ |= (mask & sprite_mask) << StatusSpriteCollisionShift;
|
||||||
sprite_mask |= mask;
|
sprite_mask |= mask;
|
||||||
sprite.shift_position += shift_advance;
|
sprite.shift_position += shift_advance;
|
||||||
|
|
||||||
@ -481,7 +487,7 @@ void TMS9918::run_for(const HalfCycles cycles) {
|
|||||||
if(column_ == 342) {
|
if(column_ == 342) {
|
||||||
access_pointer_ = column_ = output_column_ = 0;
|
access_pointer_ = column_ = output_column_ = 0;
|
||||||
row_ = (row_ + 1) % frame_lines_;
|
row_ = (row_ + 1) % frame_lines_;
|
||||||
if(row_ == 192) status_ |= 0x80;
|
if(row_ == 192) status_ |= StatusInterrupt;
|
||||||
|
|
||||||
screen_mode_ = next_screen_mode_;
|
screen_mode_ = next_screen_mode_;
|
||||||
blank_screen_ = next_blank_screen_;
|
blank_screen_ = next_blank_screen_;
|
||||||
@ -599,7 +605,7 @@ uint8_t TMS9918::get_register(int address) {
|
|||||||
|
|
||||||
// Reads from address 1 get the status register.
|
// Reads from address 1 get the status register.
|
||||||
uint8_t result = status_;
|
uint8_t result = status_;
|
||||||
status_ &= ~(0x80 | 0x40 | 0x20);
|
status_ &= ~(StatusInterrupt | StatusFifthSprite | StatusSpriteCollision);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -613,5 +619,5 @@ uint8_t TMS9918::get_register(int address) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool TMS9918::get_interrupt_line() {
|
bool TMS9918::get_interrupt_line() {
|
||||||
return (status_ & 0x80) && generate_interrupts_;
|
return (status_ & StatusInterrupt) && generate_interrupts_;
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,18 @@ class TMS9918 {
|
|||||||
void set_register(int address, uint8_t value);
|
void set_register(int address, uint8_t value);
|
||||||
uint8_t get_register(int address);
|
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();
|
HalfCycles get_time_until_interrupt();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@returns @c true if the interrupt line is currently active; @c false otherwise.
|
||||||
|
*/
|
||||||
bool get_interrupt_line();
|
bool get_interrupt_line();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user