mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-13 00:25:26 +00:00
Fix top line of cursor, add pretend cursor, page video separately.
This commit is contained in:
@@ -114,7 +114,7 @@ public:
|
|||||||
m6502_(*this),
|
m6502_(*this),
|
||||||
interrupts_(*this),
|
interrupts_(*this),
|
||||||
timers_(interrupts_),
|
timers_(interrupts_),
|
||||||
video_(map_, interrupts_)
|
video_(video_map_, interrupts_)
|
||||||
{
|
{
|
||||||
set_clock_rate(PALclock);
|
set_clock_rate(PALclock);
|
||||||
|
|
||||||
@@ -132,7 +132,9 @@ public:
|
|||||||
|
|
||||||
Memory::Fuzz(ram_);
|
Memory::Fuzz(ram_);
|
||||||
map_.page<PagerSide::ReadWrite, 0, 65536>(ram_.data());
|
map_.page<PagerSide::ReadWrite, 0, 65536>(ram_.data());
|
||||||
page_rom();
|
page_cpu_rom();
|
||||||
|
|
||||||
|
video_map_.page<PagerSide::ReadWrite, 0, 65536>(ram_.data());
|
||||||
|
|
||||||
insert_media(target.media);
|
insert_media(target.media);
|
||||||
}
|
}
|
||||||
@@ -255,6 +257,12 @@ public:
|
|||||||
case 0xff12:
|
case 0xff12:
|
||||||
ff12_ = *value & 0x3f;
|
ff12_ = *value & 0x3f;
|
||||||
video_.write<0xff12>(*value);
|
video_.write<0xff12>(*value);
|
||||||
|
|
||||||
|
if((*value & 4)) {
|
||||||
|
page_video_rom();
|
||||||
|
} else {
|
||||||
|
page_video_ram();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0xff13:
|
case 0xff13:
|
||||||
ff13_ = *value & 0xfe;
|
ff13_ = *value & 0xfe;
|
||||||
@@ -270,8 +278,8 @@ public:
|
|||||||
case 0xff18: video_.write<0xff18>(*value); break;
|
case 0xff18: video_.write<0xff18>(*value); break;
|
||||||
case 0xff19: video_.write<0xff19>(*value); break;
|
case 0xff19: video_.write<0xff19>(*value); break;
|
||||||
|
|
||||||
case 0xff3e: page_rom(); break;
|
case 0xff3e: page_cpu_rom(); break;
|
||||||
case 0xff3f: page_ram(); break;
|
case 0xff3f: page_cpu_ram(); break;
|
||||||
|
|
||||||
// TODO: audio is 0xff10, 0xff11, 0xff0e, 0xff0f and shares 0xff18.
|
// TODO: audio is 0xff10, 0xff11, 0xff0e, 0xff0f and shares 0xff18.
|
||||||
|
|
||||||
@@ -294,13 +302,21 @@ private:
|
|||||||
m6502_.set_ready_line(active);
|
m6502_.set_ready_line(active);
|
||||||
}
|
}
|
||||||
|
|
||||||
void page_rom() {
|
void page_video_rom() {
|
||||||
|
video_map_.page<PagerSide::Read, 0x8000, 16384>(basic_.data());
|
||||||
|
video_map_.page<PagerSide::Read, 0xc000, 16384>(kernel_.data());
|
||||||
|
}
|
||||||
|
void page_video_ram() {
|
||||||
|
video_map_.page<PagerSide::Read, 0x8000, 32768>(&ram_[0x8000]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void page_cpu_rom() {
|
||||||
// TODO: allow other ROM selection. And no ROM?
|
// TODO: allow other ROM selection. And no ROM?
|
||||||
map_.page<PagerSide::Read, 0x8000, 16384>(basic_.data());
|
map_.page<PagerSide::Read, 0x8000, 16384>(basic_.data());
|
||||||
map_.page<PagerSide::Read, 0xc000, 16384>(kernel_.data());
|
map_.page<PagerSide::Read, 0xc000, 16384>(kernel_.data());
|
||||||
rom_is_paged_ = true;
|
rom_is_paged_ = true;
|
||||||
}
|
}
|
||||||
void page_ram() {
|
void page_cpu_ram() {
|
||||||
map_.page<PagerSide::Read, 0x8000, 32768>(&ram_[0x8000]);
|
map_.page<PagerSide::Read, 0x8000, 32768>(&ram_[0x8000]);
|
||||||
rom_is_paged_ = false;
|
rom_is_paged_ = false;
|
||||||
}
|
}
|
||||||
@@ -323,6 +339,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Commodore::Plus4::Pager map_;
|
Commodore::Plus4::Pager map_;
|
||||||
|
Commodore::Plus4::Pager video_map_;
|
||||||
std::array<uint8_t, 65536> ram_;
|
std::array<uint8_t, 65536> ram_;
|
||||||
std::vector<uint8_t> kernel_;
|
std::vector<uint8_t> kernel_;
|
||||||
std::vector<uint8_t> basic_;
|
std::vector<uint8_t> basic_;
|
||||||
|
@@ -25,8 +25,6 @@ public:
|
|||||||
pager_(pager),
|
pager_(pager),
|
||||||
interrupts_(interrupts)
|
interrupts_(interrupts)
|
||||||
{
|
{
|
||||||
// TODO: perfect crop.
|
|
||||||
// crt_.set_visible_area(Outputs::Display::Rect(0.075f - 0.00877193f, 0.065f, 0.85f, 0.85f));
|
|
||||||
crt_.set_visible_area(crt_.get_rect_for_area(
|
crt_.set_visible_area(crt_.get_rect_for_area(
|
||||||
311 - 257 - 4,
|
311 - 257 - 4,
|
||||||
208 + 8,
|
208 + 8,
|
||||||
@@ -87,7 +85,7 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xff12:
|
case 0xff12:
|
||||||
// bitmap_base_ = uint16_t((value & 0x3c) << 10);
|
bitmap_base_ = uint16_t((value & 0x3c) << 10);
|
||||||
break;
|
break;
|
||||||
case 0xff13:
|
case 0xff13:
|
||||||
character_generator_address_ = uint16_t((value & 0xfc) << 8);
|
character_generator_address_ = uint16_t((value & 0xfc) << 8);
|
||||||
@@ -175,6 +173,7 @@ public:
|
|||||||
//
|
//
|
||||||
const auto attribute_fetch_start = [&] {
|
const auto attribute_fetch_start = [&] {
|
||||||
character_address_ = 0;
|
character_address_ = 0;
|
||||||
|
fetch_phase_ = FetchPhase::Waiting;
|
||||||
};
|
};
|
||||||
switch(vertical_counter_) {
|
switch(vertical_counter_) {
|
||||||
case 261: // End of screen NTSC. [and hence 0: Attribute fetch start].
|
case 261: // End of screen NTSC. [and hence 0: Attribute fetch start].
|
||||||
@@ -239,19 +238,39 @@ public:
|
|||||||
fetch_count_ += period;
|
fetch_count_ += period;
|
||||||
|
|
||||||
auto &line = lines_[line_pointer_];
|
auto &line = lines_[line_pointer_];
|
||||||
// uint8_t attributes[40];
|
|
||||||
// uint8_t characters[40];
|
|
||||||
// } lines_[2];
|
|
||||||
// int line_pointer_ = 0;
|
|
||||||
|
|
||||||
for(int x = start; x < end; x++) {
|
for(int x = start; x < end; x++) {
|
||||||
// line.attributes[x] = pager_.read(character_generator_address_ + x * 8 + (row & 7));
|
const auto offset = (line.characters[x] << 3) + (character_line_ & 7);
|
||||||
// line.characters[x] = pager_.read(uint16_t(line_character_address_ + x + screen_memory_address_ + 0x400));
|
bitmap_[x] = pager_.read(uint16_t(
|
||||||
|
character_generator_address_ +
|
||||||
|
offset
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// switch(fetch_phase_) {
|
switch(fetch_phase_) {
|
||||||
// case FetchPh
|
default: break;
|
||||||
// }
|
case FetchPhase::FetchingCharacters: {
|
||||||
|
auto &character_line = lines_[line_pointer_ ^ 1];
|
||||||
|
for(int x = start; x < end; x++) {
|
||||||
|
character_line.characters[x] = pager_.read(
|
||||||
|
screen_memory_address_ + 0x400 +
|
||||||
|
uint16_t(character_address_ + x)
|
||||||
|
);
|
||||||
|
|
||||||
|
// TEST of cursor position.
|
||||||
|
if(character_address_ + x == cursor_address_) {
|
||||||
|
character_line.characters[x] = ']';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
case FetchPhase::FetchingAttributes:
|
||||||
|
for(int x = start; x < end; x++) {
|
||||||
|
line.attributes[x] = pager_.read(
|
||||||
|
screen_memory_address_ +
|
||||||
|
uint16_t(character_address_ + x)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -284,16 +303,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Output pixels.
|
// Output pixels.
|
||||||
// TODO: properly. THIS HACKS IN TEXT OUTPUT. IT IS NOT CORRECT. NOT AS TO TIMING, NOT AS TO CONTENT.
|
// TODO: properly. Accounting for mode, attributes, etc.
|
||||||
if(pixels_) {
|
if(pixels_) {
|
||||||
for(int c = 0; c < period; c++) {
|
for(int c = 0; c < period; c++) {
|
||||||
const auto pixel = time_in_state_ + c;
|
const auto pixel = time_in_state_ + c;
|
||||||
const auto row = vertical_counter_ - 4;
|
const uint8_t glyph = bitmap_[pixel >> 3];
|
||||||
|
|
||||||
const auto index = (row >> 3) * 40 + (pixel >> 3);
|
|
||||||
const uint8_t character = pager_.read(uint16_t(index + screen_memory_address_ + 0x400));
|
|
||||||
const uint8_t glyph = pager_.read(character_generator_address_ + character * 8 + (row & 7));
|
|
||||||
|
|
||||||
pixels_[c] = glyph & (0x80 >> (pixel & 7)) ? 0xff00 : 0xffff;
|
pixels_[c] = glyph & (0x80 >> (pixel & 7)) ? 0xff00 : 0xffff;
|
||||||
}
|
}
|
||||||
pixels_ += period;
|
pixels_ += period;
|
||||||
@@ -314,21 +328,24 @@ public:
|
|||||||
|
|
||||||
case BeginExternalFetchWindow:
|
case BeginExternalFetchWindow:
|
||||||
external_fetch_ = true;
|
external_fetch_ = true;
|
||||||
|
++character_line_;
|
||||||
|
|
||||||
|
// At this point fetch_phase_ is whichever phase is **ending**.
|
||||||
switch(fetch_phase_) {
|
switch(fetch_phase_) {
|
||||||
case FetchPhase::Waiting:
|
case FetchPhase::Waiting:
|
||||||
++character_line_;
|
|
||||||
|
|
||||||
// TODO: the < 200 is obviously phoney baloney. Figure out what the actual condition is here.
|
// TODO: the < 200 is obviously phoney baloney. Figure out what the actual condition is here.
|
||||||
if(vertical_counter_ < 200 && (vertical_counter_&7) == y_scroll_ && vertical_window_) {
|
if(vertical_counter_ < 200 && (vertical_counter_&7) == y_scroll_) {
|
||||||
fetch_phase_ = FetchPhase::FetchingCharacters;
|
fetch_phase_ = FetchPhase::FetchingCharacters;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FetchPhase::FetchingCharacters:
|
case FetchPhase::FetchingCharacters:
|
||||||
fetch_phase_ = FetchPhase::FetchingAttributes;
|
fetch_phase_ = FetchPhase::FetchingAttributes;
|
||||||
character_line_ = 0;
|
character_line_ = 0;
|
||||||
|
line_pointer_ ^= 1;
|
||||||
break;
|
break;
|
||||||
case FetchPhase::FetchingAttributes:
|
case FetchPhase::FetchingAttributes:
|
||||||
fetch_phase_ = FetchPhase::Waiting;
|
fetch_phase_ = FetchPhase::Waiting;
|
||||||
|
character_address_ += 40;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
interrupts_.bus().set_ready_line(fetch_phase_ != FetchPhase::Waiting);
|
interrupts_.bus().set_ready_line(fetch_phase_ != FetchPhase::Waiting);
|
||||||
@@ -337,7 +354,6 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case LatchCharacterPosition:
|
case LatchCharacterPosition:
|
||||||
line_character_address_ = character_address_;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EndCharacterFetchWindow:
|
case EndCharacterFetchWindow:
|
||||||
@@ -426,6 +442,7 @@ private:
|
|||||||
uint16_t character_row_address_ = 0;
|
uint16_t character_row_address_ = 0;
|
||||||
uint16_t character_generator_address_ = 0;
|
uint16_t character_generator_address_ = 0;
|
||||||
uint16_t screen_memory_address_ = 0;
|
uint16_t screen_memory_address_ = 0;
|
||||||
|
uint16_t bitmap_base_ = 0;
|
||||||
|
|
||||||
int raster_interrupt_ = 0x1ff;
|
int raster_interrupt_ = 0x1ff;
|
||||||
|
|
||||||
@@ -443,7 +460,6 @@ private:
|
|||||||
uint8_t ff06_;
|
uint8_t ff06_;
|
||||||
|
|
||||||
uint16_t character_address_ = 0;
|
uint16_t character_address_ = 0;
|
||||||
uint16_t line_character_address_ = 0;
|
|
||||||
bool fetch_characters_ = false;
|
bool fetch_characters_ = false;
|
||||||
bool external_fetch_ = false;
|
bool external_fetch_ = false;
|
||||||
bool output_pixels_ = false;
|
bool output_pixels_ = false;
|
||||||
|
Reference in New Issue
Block a user