diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 0e6ce8b88..0dd95b24e 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -46,6 +46,16 @@ Machine::Machine() : _current_pixel_line(-1), _use_fast_tape_hack(false), _crt(std::unique_ptr(new Outputs::CRT::CRT(crt_cycles_per_line, 8, Outputs::CRT::DisplayType::PAL50, 1))) +{ + memset(_key_states, 0, sizeof(_key_states)); + memset(_palette, 0xf, sizeof(_palette)); + for(int c = 0; c < 16; c++) + memset(_roms[c], 0xff, 16384); + + _tape.set_delegate(this); +} + +void Machine::setup_output() { _crt->set_rgb_sampling_function( "vec4 rgb_sample(vec2 coordinate)" @@ -56,13 +66,7 @@ Machine::Machine() : _crt->set_output_device(Outputs::CRT::Monitor); // _crt->set_visible_area(Outputs::Rect(0.23108f, 0.0f, 0.8125f, 0.98f)); //1875 - memset(_key_states, 0, sizeof(_key_states)); - memset(_palette, 0xf, sizeof(_palette)); - for(int c = 0; c < 16; c++) - memset(_roms[c], 0xff, 16384); - _speaker.set_input_rate(125000); - _tape.set_delegate(this); } unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value) diff --git a/Machines/Electron/Electron.hpp b/Machines/Electron/Electron.hpp index bcfe7f916..304e7fc81 100644 --- a/Machines/Electron/Electron.hpp +++ b/Machines/Electron/Electron.hpp @@ -152,6 +152,7 @@ class Machine: public CPU6502::Processor, Tape::Delegate { void set_key_state(Key key, bool isPressed); + void setup_output(); Outputs::CRT::CRT *get_crt() { return _crt.get(); } Outputs::Speaker *get_speaker() { return &_speaker; } diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h index e3ab2f8c5..9cb9b48e6 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h @@ -11,6 +11,8 @@ @interface CSElectron : CSMachine +- (void)setupOutput; + - (void)setOSROM:(nonnull NSData *)rom; - (void)setBASICROM:(nonnull NSData *)rom; - (void)setROM:(nonnull NSData *)rom slot:(int)slot; diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm index 608aa4e73..957318d1d 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm @@ -42,9 +42,7 @@ } - (void)drawViewForPixelSize:(CGSize)pixelSize onlyIfDirty:(BOOL)onlyIfDirty { - @synchronized(self) { - _electron.get_crt()->draw_frame((unsigned int)pixelSize.width, (unsigned int)pixelSize.height, onlyIfDirty ? true : false); - } + _electron.get_crt()->draw_frame((unsigned int)pixelSize.width, (unsigned int)pixelSize.height, onlyIfDirty ? true : false); } - (BOOL)openUEFAtURL:(NSURL *)URL { @@ -154,4 +152,10 @@ } } +- (void)setupOutput { + @synchronized(self) { + _electron.setup_output(); + } +} + @end diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSMachine+Subclassing.h b/OSBindings/Mac/Clock Signal/Wrappers/CSMachine+Subclassing.h index 788d1423b..2c16901f3 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSMachine+Subclassing.h +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSMachine+Subclassing.h @@ -16,5 +16,6 @@ - (void)speaker:(Outputs::Speaker *)speaker didCompleteSamples:(const int16_t *)samples length:(int)length; - (void)performAsync:(dispatch_block_t)action; - (void)performSync:(dispatch_block_t)action; +- (void)setupOutput; @end diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm b/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm index 8f15b603b..8530a595f 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm @@ -51,4 +51,13 @@ struct SpeakerDelegate: public Outputs::Speaker::Delegate { dispatch_async(_serialDispatchQueue, action); } +- (void)setupOutput {} + +- (void)setView:(CSOpenGLView *)view { + _view = view; + [view performWithGLContext:^{ + [self setupOutput]; + }]; +} + @end