1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-22 12:33:29 +00:00

Catch SSM events.

This commit is contained in:
Thomas Harte 2024-06-30 21:26:16 -04:00
parent 0e30e2d865
commit dbc0ecde31
2 changed files with 32 additions and 12 deletions

View File

@ -946,14 +946,29 @@ class ConcreteMachine:
if constexpr (catches_ssm) { if constexpr (catches_ssm) {
ssm_code_ = (ssm_code_ << 8) | read_pointers_[address >> 14][address & 16383]; ssm_code_ = (ssm_code_ << 8) | read_pointers_[address >> 14][address & 16383];
if((ssm_code_ & 0xff00ff00) == 0xed00ed00) { if(ssm_delegate_) {
if(ssm_delegate_) { if((ssm_code_ & 0xff00ff00) == 0xed00ed00) {
ssm_delegate_->perform( const auto code = uint16_t(
uint16_t( (ssm_code_ & 0xff) | ((ssm_code_ >> 8) & 0xff00)
(ssm_code_ & 0xff) | ((ssm_code_ >> 8) & 0xff00) );
)); ssm_code_ = 0;
if(
(code <= 0x3f3f) ||
(code >= 0x7f7f && code <= 0x9f9f) ||
(code >= 0xa4a4 && code <= 0xa7a7) ||
(code >= 0xacac && code <= 0xafaf) ||
(code >= 0xb4b4 && code <= 0xb7b7) ||
(code >= 0xbcbc && code <= 0xbfbf) ||
(code >= 0xc0c0 && code <= 0xfdfd)
) {
ssm_delegate_->perform(code);
}
} }
ssm_code_ = 0; } else if((ssm_code_ & 0xffff) == 0xedfe) {
ssm_delegate_->perform(0xfffe);
} else if((ssm_code_ & 0xffff) == 0xedff) {
ssm_delegate_->perform(0xffff);
} }
} }
[[fallthrough]]; [[fallthrough]];

View File

@ -21,8 +21,10 @@
#include "KeyboardMachine.hpp" #include "KeyboardMachine.hpp"
#include "MachineForTarget.hpp" #include "MachineForTarget.hpp"
struct CSLPerformer { struct SSMDelegate: public AmstradCPC::Machine::SSMDelegate {
void perform(uint16_t code) {
NSLog(@"SSM %04x", code);
}
}; };
// //
@ -31,23 +33,27 @@ struct CSLPerformer {
@interface CPCShakerTests : XCTestCase @interface CPCShakerTests : XCTestCase
@end @end
@implementation CPCShakerTests { @implementation CPCShakerTests {}
}
- (void)testCSLPath:(NSString *)path name:(NSString *)name { - (void)testCSLPath:(NSString *)path name:(NSString *)name {
using namespace Storage::Automation; using namespace Storage::Automation;
const auto steps = CSL::parse([[path stringByAppendingPathComponent:name] UTF8String]); const auto steps = CSL::parse([[path stringByAppendingPathComponent:name] UTF8String]);
SSMDelegate ssm_delegate;
std::unique_ptr<Machine::DynamicMachine> lazy_machine; std::unique_ptr<Machine::DynamicMachine> lazy_machine;
CSL::KeyDelay key_delay; CSL::KeyDelay key_delay;
using Target = Analyser::Static::AmstradCPC::Target; using Target = Analyser::Static::AmstradCPC::Target;
Target target; Target target;
target.catch_ssm_codes = true; target.catch_ssm_codes = true;
target.model = Target::Model::CPC6128;
const auto machine = [&]() -> Machine::DynamicMachine& { const auto machine = [&]() -> Machine::DynamicMachine& {
if(!lazy_machine) { if(!lazy_machine) {
Machine::Error error; Machine::Error error;
lazy_machine = Machine::MachineForTarget(&target, CSROMFetcher(), error); lazy_machine = Machine::MachineForTarget(&target, CSROMFetcher(), error);
reinterpret_cast<AmstradCPC::Machine *>(lazy_machine->raw_pointer())
->set_ssm_delegate(&ssm_delegate);
} }
return *lazy_machine; return *lazy_machine;
}; };
@ -56,7 +62,6 @@ struct CSLPerformer {
}; };
using Type = CSL::Instruction::Type; using Type = CSL::Instruction::Type;
int c = 0;
for(const auto &step: steps) { for(const auto &step: steps) {
switch(step.type) { switch(step.type) {
case Type::Version: case Type::Version: