diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 8d43ec14b..0113939d2 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -27,6 +27,8 @@ Machine::Machine() : memset(_palette, 0xf, sizeof(_palette)); _crt = new Outputs::CRT(crt_cycles_per_line, 312, 1, 1); _interruptStatus = 0x02; + for(int c = 0; c < 16; c++) + memset(_roms[c], 0xff, 16384); setup6502(); } @@ -55,6 +57,13 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin // TODO: RAM timing for Modes 0–3 cycles += (_frameCycles&1)^1; + if(_screenMode < 4) + { + const int current_line = _frameCycles >> 7; + const int line_position = _frameCycles & 127; + if(current_line >= 28 && current_line < 28+256 && line_position >= 24 && line_position < 104) + cycles = (unsigned int)(104 - line_position); + } } else { @@ -191,10 +200,6 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin { switch(_activeRom) { - case ROMSlotBASIC: - case ROMSlotBASIC+1: - *value = _basic[address & 16383]; - break; case ROMSlotKeyboard: case ROMSlotKeyboard+1: *value = 0xf0; @@ -204,7 +209,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin } break; default: - *value = 0xff; + *value = _roms[_activeRom][address & 16383]; break; } } @@ -235,9 +240,8 @@ void Machine::set_rom(ROMSlot slot, size_t length, const uint8_t *data) uint8_t *target = nullptr; switch(slot) { - case ROMSlotBASIC: target = _basic; break; - case ROMSlotOS: target = _os; break; - default: return; + case ROMSlotOS: target = _os; break; + default: target = _roms[slot]; break; } memcpy(target, data, std::min((size_t)16384, length)); diff --git a/Machines/Electron/Electron.hpp b/Machines/Electron/Electron.hpp index 5c8269186..7c3db47ce 100644 --- a/Machines/Electron/Electron.hpp +++ b/Machines/Electron/Electron.hpp @@ -73,7 +73,8 @@ class Machine: public CPU6502::Processor { const char *get_signal_decoder(); private: - uint8_t _os[16384], _basic[16384], _ram[32768]; + uint8_t _roms[16][16384]; + uint8_t _os[16384], _ram[32768]; uint8_t _interruptStatus, _interruptControl; uint8_t _palette[16]; uint8_t _keyStates[14]; diff --git a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift index 92dbaf0b3..06e494000 100644 --- a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift @@ -34,6 +34,7 @@ class ElectronDocument: MachineDocument { } override func readFromData(data: NSData, ofType typeName: String) throws { + electron.setROM(data, slot: 15) } // MARK: CSOpenGLViewDelegate diff --git a/OSBindings/Mac/Clock Signal/Info.plist b/OSBindings/Mac/Clock Signal/Info.plist index 65aac910a..af40ec174 100644 --- a/OSBindings/Mac/Clock Signal/Info.plist +++ b/OSBindings/Mac/Clock Signal/Info.plist @@ -41,6 +41,20 @@ NSDocumentClass $(PRODUCT_MODULE_NAME).ElectronDocument + + CFBundleTypeExtensions + + rom + + CFBundleTypeName + Electron/BBC ROM Image + CFBundleTypeRole + Viewer + LSTypeIsPackage + 0 + NSDocumentClass + $(PRODUCT_MODULE_NAME).ElectronDocument + CFBundleExecutable $(EXECUTABLE_NAME) diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h index b8af2bec4..aefd4d4e0 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.h @@ -13,6 +13,7 @@ - (void)setOSROM:(nonnull NSData *)rom; - (void)setBASICROM:(nonnull NSData *)rom; +- (void)setROM:(nonnull NSData *)rom slot:(int)slot; - (void)setKey:(uint16_t)key isPressed:(BOOL)isPressed; diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm index 630666989..f8b260442 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSElectron.mm @@ -27,7 +27,11 @@ _electron.set_rom(Electron::ROMSlotBASIC, rom.length, (const uint8_t *)rom.bytes); } -- (void)setCRTDelegate:(Outputs::CRT::Delegate *)delegate{ +- (void)setROM:(nonnull NSData *)rom slot:(int)slot { + _electron.set_rom((Electron::ROMSlot)slot, rom.length, (const uint8_t *)rom.bytes); +} + +- (void)setCRTDelegate:(Outputs::CRT::Delegate *)delegate { _electron.get_crt()->set_delegate(delegate); }