From 4f5a38b5c52e4146e5e122b802be5118fe834de4 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 5 May 2019 23:05:24 -0400 Subject: [PATCH] Adds support for the alternate video buffer. --- Machines/Apple/Macintosh/Macintosh.cpp | 20 ++++++++++++-------- Machines/Apple/Macintosh/Video.cpp | 11 +++++++---- Machines/Apple/Macintosh/Video.hpp | 2 ++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Machines/Apple/Macintosh/Macintosh.cpp b/Machines/Apple/Macintosh/Macintosh.cpp index e498fadef..09e0ee0dd 100644 --- a/Machines/Apple/Macintosh/Macintosh.cpp +++ b/Machines/Apple/Macintosh/Macintosh.cpp @@ -189,6 +189,10 @@ class ConcreteMachine: ROM_is_overlay_ = rom_is_overlay; } + void set_use_alternate_screen_buffer(bool use_alternate_screen_buffer) { + video_.set_use_alternate_screen_buffer(use_alternate_screen_buffer); + } + private: class VIAPortHandler: public MOS::MOS6522::PortHandler { public: @@ -213,8 +217,9 @@ class ConcreteMachine: b3: 0 = use alternate sound buffer, 1 = use ordinary sound buffer b2–b0: audio output volume */ - printf(" w A: %02x", value); + printf("6522 A: %02x\n", value); machine_.set_rom_is_overlay(!!(value & 0x10)); + machine_.set_use_alternate_screen_buffer(!(value & 0x40)); break; case Port::B: @@ -229,7 +234,7 @@ class ConcreteMachine: b1: clock's data-clock line b0: clock's serial data line */ - printf(" w B: %02x", value); + printf("6522 B: %02x\n", value); break; } } @@ -237,18 +242,17 @@ class ConcreteMachine: uint8_t get_port_input(Port port) { switch(port) { case Port::A: - printf(" r A"); - break; + printf("6522 r A\n"); + return 0xff; case Port::B: - printf(" r B"); - break; + printf("6522 r B\n"); + return 0x00; } - return 0xff; } void set_control_line_output(Port port, Line line, bool value) { - printf(" l %c%d: %c", port ? 'B' : 'A', int(line), value ? 't' : 'f'); + printf("6522 line %c%d: %c\n", port ? 'B' : 'A', int(line), value ? 't' : 'f'); } private: diff --git a/Machines/Apple/Macintosh/Video.cpp b/Machines/Apple/Macintosh/Video.cpp index ab72ad956..78ad4294f 100644 --- a/Machines/Apple/Macintosh/Video.cpp +++ b/Machines/Apple/Macintosh/Video.cpp @@ -137,11 +137,14 @@ void Video::run_for(HalfCycles duration) { frame_position_ = frame_position_ + cycles_left_in_line; if(frame_position_ == frame_length) { frame_position_ = HalfCycles(0); - video_address_ = 0x1a700 >> 1; + /* + Video: $1A700 and the alternate buffer starts at $12700; for a 512K Macintosh, add $60000 to these numbers. + */ + video_address_ = use_alternate_screen_buffer_ ? (0x12700 >> 1) : (0x1a700 >> 1); } } } -/* - Video: $1A700 and the alternate buffer starts at $12700; for a 512K Macintosh, add $60000 to these numbers. -*/ +void Video::set_use_alternate_screen_buffer(bool use_alternate_screen_buffer) { + use_alternate_screen_buffer_ = use_alternate_screen_buffer; +} diff --git a/Machines/Apple/Macintosh/Video.hpp b/Machines/Apple/Macintosh/Video.hpp index 27fb3e005..b37479101 100644 --- a/Machines/Apple/Macintosh/Video.hpp +++ b/Machines/Apple/Macintosh/Video.hpp @@ -20,6 +20,7 @@ class Video { Video(uint16_t *ram); void set_scan_target(Outputs::Display::ScanTarget *scan_target); void run_for(HalfCycles duration); + void set_use_alternate_screen_buffer(bool use_alternate_screen_buffer); // TODO: feedback on blanks and syncs. @@ -30,6 +31,7 @@ class Video { size_t video_address_; uint16_t *ram_; uint8_t *pixel_buffer_; + bool use_alternate_screen_buffer_ = false; }; }