mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 23:52:26 +00:00
Starts to reimplement Master System output.
This commit is contained in:
parent
252f47a425
commit
05248ab990
@ -256,7 +256,7 @@ void TMS9918::run_for(const HalfCycles cycles) {
|
|||||||
mode_timing_.next_border_column,
|
mode_timing_.next_border_column,
|
||||||
if(start == mode_timing_.first_pixel_output_column) {
|
if(start == mode_timing_.first_pixel_output_column) {
|
||||||
pixel_target_ = reinterpret_cast<uint32_t *>(
|
pixel_target_ = reinterpret_cast<uint32_t *>(
|
||||||
crt_->allocate_write_area(static_cast<unsigned int>(mode_timing_.next_border_column - mode_timing_.first_pixel_output_column))
|
crt_->allocate_write_area(static_cast<unsigned int>(mode_timing_.next_border_column - mode_timing_.first_pixel_output_column) + 8) // TODO: the +8 is really for the SMS only; make it optional.
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,12 +276,6 @@ void TMS9918::run_for(const HalfCycles cycles) {
|
|||||||
const unsigned int length = static_cast<unsigned int>(mode_timing_.next_border_column - mode_timing_.first_pixel_output_column);
|
const unsigned int length = static_cast<unsigned int>(mode_timing_.next_border_column - mode_timing_.first_pixel_output_column);
|
||||||
crt_->output_data(length * 4, length);
|
crt_->output_data(length * 4, length);
|
||||||
pixel_target_ = nullptr;
|
pixel_target_ = nullptr;
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
memset(pattern_names_, sizeof(pattern_names_), 0xff);
|
|
||||||
memset(pattern_buffer_, sizeof(pattern_buffer_), 0xff);
|
|
||||||
memset(colour_buffer_, sizeof(colour_buffer_), 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -293,48 +287,20 @@ void TMS9918::run_for(const HalfCycles cycles) {
|
|||||||
|
|
||||||
#undef intersect
|
#undef intersect
|
||||||
|
|
||||||
|
// -----------------
|
||||||
|
// End video stream.
|
||||||
|
// -----------------
|
||||||
|
|
||||||
|
|
||||||
column_ = end_column; // column_ is now the column that has been reached in this line.
|
column_ = end_column; // column_ is now the column that has been reached in this line.
|
||||||
int_cycles -= cycles_left; // Count down duration to run for.
|
int_cycles -= cycles_left; // Count down duration to run for.
|
||||||
|
|
||||||
|
/*
|
||||||
/* if(row_ < 192 && current_mode_ != ScreenMode::Blank) {
|
|
||||||
|
|
||||||
// --------------
|
// --------------
|
||||||
// Output pixels.
|
// Output pixels.
|
||||||
// --------------
|
// --------------
|
||||||
if(output_column_ >= first_pixel_column_) {
|
|
||||||
int pixels_end = std::min(first_right_border_column_, column_);
|
|
||||||
|
|
||||||
if(output_column_ < pixels_end) {
|
|
||||||
switch(line_mode_) {
|
|
||||||
default: break;
|
|
||||||
|
|
||||||
case LineMode::SMS: {
|
|
||||||
if(pixel_target_) {
|
|
||||||
const int pixels_left = pixels_end - output_column_;
|
|
||||||
const int pixel_location = output_column_ - first_pixel_column_;
|
|
||||||
const int reverses[2] = {0, 7};
|
|
||||||
for(int c = 0; c < pixels_left; ++c) {
|
|
||||||
const int column = (pixel_location + c) >> 3;
|
|
||||||
const int shift = 4 + (((pixel_location + c) & 7) ^ reverses[(master_system_.names[column].flags&2) >> 1]);
|
|
||||||
int value =
|
|
||||||
(
|
|
||||||
(
|
|
||||||
((master_system_.tile_graphics[column][3] << shift) & 0x800) |
|
|
||||||
((master_system_.tile_graphics[column][2] << (shift - 1)) & 0x400) |
|
|
||||||
((master_system_.tile_graphics[column][1] << (shift - 2)) & 0x200) |
|
|
||||||
((master_system_.tile_graphics[column][0] << (shift - 3)) & 0x100)
|
|
||||||
) >> 8
|
|
||||||
) | ((master_system_.names[column].flags&0x08) << 1);
|
|
||||||
|
|
||||||
pixel_target_[c] = master_system_.colour_ram[value];
|
|
||||||
}
|
|
||||||
pixel_target_ += pixels_left;
|
|
||||||
}
|
|
||||||
|
|
||||||
output_column_ = pixels_end;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LineMode::Character: {
|
case LineMode::Character: {
|
||||||
// If this is the start of the visible area, seed sprite shifter positions.
|
// If this is the start of the visible area, seed sprite shifter positions.
|
||||||
@ -451,18 +417,8 @@ void TMS9918::run_for(const HalfCycles cycles) {
|
|||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(output_column_ == first_right_border_column_) {
|
|
||||||
const unsigned int data_length = static_cast<unsigned int>(first_right_border_column_ - first_pixel_column_);
|
|
||||||
crt_->output_data(data_length * 4, data_length);
|
|
||||||
pixel_target_ = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}*/
|
}*/
|
||||||
// -----------------
|
|
||||||
// End video stream.
|
|
||||||
// -----------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -660,9 +616,11 @@ bool TMS9918::get_interrupt_line() {
|
|||||||
// MARK: -
|
// MARK: -
|
||||||
|
|
||||||
void Base::draw_tms_character(int start, int end) {
|
void Base::draw_tms_character(int start, int end) {
|
||||||
for(int c = start; c < end; ++c) {
|
// if(!start) printf("\n");
|
||||||
pixel_target_[c] = static_cast<uint32_t>(c * 0x01010101);
|
// printf("%d to %d | ", start, end);
|
||||||
}
|
// for(int c = start; c < end; ++c) {
|
||||||
|
// pixel_target_[c] = static_cast<uint32_t>(c * 0x01010101);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
void Base::draw_tms_text(int start, int end) {
|
void Base::draw_tms_text(int start, int end) {
|
||||||
@ -689,7 +647,75 @@ void Base::draw_tms_text(int start, int end) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Base::draw_sms(int start, int end) {
|
void Base::draw_sms(int start, int end) {
|
||||||
for(int c = start; c < end; ++c) {
|
if(!start) {
|
||||||
pixel_target_[c] = static_cast<uint32_t>(c * 0x01010101);
|
pixel_target_ += master_system_.horizontal_scroll & 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int shift = start & 7;
|
||||||
|
int byte_column = start >> 3;
|
||||||
|
int pixels_left = end - start;
|
||||||
|
int length = std::min(pixels_left, 8 - shift);
|
||||||
|
uint32_t pattern = *reinterpret_cast<uint32_t *>(master_system_.tile_graphics[byte_column]);
|
||||||
|
|
||||||
|
if(master_system_.names[byte_column].flags&2)
|
||||||
|
pattern >>= shift;
|
||||||
|
else
|
||||||
|
pattern <<= shift;
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
pixels_left -= length;
|
||||||
|
const uint32_t palette_offset = static_cast<uint32_t>((master_system_.names[byte_column].flags&0x08) << 1);
|
||||||
|
if(master_system_.names[byte_column].flags&2) {
|
||||||
|
for(int c = 0; c < length; ++c) {
|
||||||
|
const uint32_t value =
|
||||||
|
((pattern & 0x00000001) >> 0) |
|
||||||
|
((pattern & 0x00000100) >> 6) |
|
||||||
|
((pattern & 0x00010000) >> 15) |
|
||||||
|
((pattern & 0x01000000) >> 24) |
|
||||||
|
palette_offset;
|
||||||
|
pixel_target_[c] = master_system_.colour_ram[value];
|
||||||
|
pattern >>= 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(int c = 0; c < length; ++c) {
|
||||||
|
const uint32_t value =
|
||||||
|
((pattern & 0x00000080) >> 7) |
|
||||||
|
((pattern & 0x00008000) >> 14) |
|
||||||
|
((pattern & 0x00800000) >> 21) |
|
||||||
|
((pattern & 0x80000000) >> 28) |
|
||||||
|
palette_offset;
|
||||||
|
pixel_target_[c] = master_system_.colour_ram[value];
|
||||||
|
pattern <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pixel_target_ += length;
|
||||||
|
|
||||||
|
if(!pixels_left) break;
|
||||||
|
length = std::min(8, pixels_left);
|
||||||
|
byte_column++;
|
||||||
|
pattern = *reinterpret_cast<uint32_t *>(master_system_.tile_graphics[byte_column]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// const int pixels_left = pixels_end - output_column_;
|
||||||
|
// const int pixel_location = output_column_ - first_pixel_column_;
|
||||||
|
// const int reverses[2] = {0, 7};
|
||||||
|
// for(int c = 0; c < pixels_left; ++c) {
|
||||||
|
// const int column = (pixel_location + c) >> 3;
|
||||||
|
// const int shift = 4 + (((pixel_location + c) & 7) ^ reverses[(master_system_.names[column].flags&2) >> 1]);
|
||||||
|
// int value =
|
||||||
|
// (
|
||||||
|
// (
|
||||||
|
// ((master_system_.tile_graphics[column][3] << shift) & 0x800) |
|
||||||
|
// ((master_system_.tile_graphics[column][2] << (shift - 1)) & 0x400) |
|
||||||
|
// ((master_system_.tile_graphics[column][1] << (shift - 2)) & 0x200) |
|
||||||
|
// ((master_system_.tile_graphics[column][0] << (shift - 3)) & 0x100)
|
||||||
|
// ) >> 8
|
||||||
|
// ) | ((master_system_.names[column].flags&0x08) << 1);
|
||||||
|
//
|
||||||
|
// pixel_target_[c] = master_system_.colour_ram[value];
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for(int c = start; c < end; ++c) {
|
||||||
|
// pixel_target_[c] = static_cast<uint32_t>(c * 0x01010101);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ class Base {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mode_timing_.maximum_visible_sprites = 8;
|
mode_timing_.maximum_visible_sprites = 4;
|
||||||
if(!mode1_enable_ && !mode2_enable_ && !mode3_enable_) {
|
if(!mode1_enable_ && !mode2_enable_ && !mode3_enable_) {
|
||||||
screen_mode_ = ScreenMode::ColouredText;
|
screen_mode_ = ScreenMode::ColouredText;
|
||||||
return;
|
return;
|
||||||
@ -268,7 +268,6 @@ class Base {
|
|||||||
void external_slot() {
|
void external_slot() {
|
||||||
// TODO: write or read a value if one is queued and ready to read/write.
|
// TODO: write or read a value if one is queued and ready to read/write.
|
||||||
// (and, later: update the command engine, if this is an MSX2).
|
// (and, later: update the command engine, if this is an MSX2).
|
||||||
|
|
||||||
switch(queued_access_) {
|
switch(queued_access_) {
|
||||||
default: return;
|
default: return;
|
||||||
|
|
||||||
@ -473,11 +472,11 @@ class Base {
|
|||||||
#define sprite_y_read(location, sprite) \
|
#define sprite_y_read(location, sprite) \
|
||||||
slot(location):
|
slot(location):
|
||||||
|
|
||||||
#define fetch_tile_name(column) pattern_names_[column] = ram_[row_base + column];
|
#define fetch_tile_name(column) pattern_names_[column] = ram_[(row_base + column) & 0x3fff];
|
||||||
|
|
||||||
#define fetch_tile(column) {\
|
#define fetch_tile(column) {\
|
||||||
colour_buffer_[column] = ram_[colour_base + static_cast<size_t>((pattern_names_[column] << 3) >> colour_name_shift)]; \
|
colour_buffer_[column] = ram_[(colour_base + static_cast<size_t>((pattern_names_[column] << 3) >> colour_name_shift)) & 0x3fff]; \
|
||||||
pattern_buffer_[column] = ram_[pattern_base + static_cast<size_t>(pattern_names_[column] << 3)]; \
|
pattern_buffer_[column] = ram_[(pattern_base + static_cast<size_t>(pattern_names_[column] << 3)) & 0x3fff]; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define background_fetch_block(location, column) \
|
#define background_fetch_block(location, column) \
|
||||||
|
Loading…
Reference in New Issue
Block a user