// // This file is part of VirtualC64 - A cycle accurate Commodore 64 emulator // // Copyright (C) Dirk W. Hoffmann. www.dirkwhoffmann.de // Licensed under the GNU General Public License v3 // // See https://www.gnu.org for license information // #import "C64Proxy+Private.h" #import "C64.h" struct C64Wrapper { C64 *c64; }; struct CpuWrapper { CPU *cpu; }; struct MemoryWrapper { C64Memory *mem; }; struct VicWrapper { VIC *vic; }; struct CiaWrapper { CIA *cia; }; struct KeyboardWrapper { Keyboard *keyboard; }; struct ControlPortWrapper { ControlPort *port; }; struct SidBridgeWrapper { SIDBridge *sid; }; struct IecWrapper { IEC *iec; }; struct ExpansionPortWrapper { ExpansionPort *expansionPort; }; struct ViaWrapper { VIA6522 *via; }; struct DiskWrapper { Disk *disk; }; struct DriveWrapper { VC1541 *drive; }; struct DatasetteWrapper { Datasette *datasette; }; struct MouseWrapper { Mouse *mouse; }; struct AnyC64FileWrapper { AnyC64File *file; }; // // CPU proxy // @implementation CPUProxy // Constructing - (instancetype) initWithCPU:(CPU *)cpu { if (self = [super init]) { wrapper = new CpuWrapper(); wrapper->cpu = cpu; } return self; } // Proxy methods - (CPUInfo) getInfo { return wrapper->cpu->getInfo(); } - (void) dump { wrapper->cpu->dump(); } - (BOOL) tracing { return wrapper->cpu->tracingEnabled(); } - (void) setTracing:(BOOL)b { b ? wrapper->cpu->startTracing() : wrapper->cpu->stopTracing(); } - (UInt64) cycle { return wrapper->cpu->cycle; } - (uint16_t) pc { return wrapper->cpu->getPC(); } - (void) setPC:(uint16_t)addr { wrapper->cpu->jumpToAddress(addr); } - (void) setSP:(uint8_t)sp { wrapper->cpu->regSP = sp; } - (void) setA:(uint8_t)a { wrapper->cpu->regA = a; } - (void) setX:(uint8_t)x { wrapper->cpu->regX = x; } - (void) setY:(uint8_t)y { wrapper->cpu->regY = y; } - (void) setNflag:(BOOL)b { wrapper->cpu->setN(b); } - (void) setZflag:(BOOL)b { wrapper->cpu->setZ(b); } - (void) setCflag:(BOOL)b { wrapper->cpu->setC(b); } - (void) setIflag:(BOOL)b { wrapper->cpu->setI(b); } - (void) setBflag:(BOOL)b { wrapper->cpu->setB(b); } - (void) setDflag:(BOOL)b { wrapper->cpu->setD(b); } - (void) setVflag:(BOOL)b { wrapper->cpu->setV(b); } - (BOOL) breakpoint:(uint16_t)addr { return wrapper->cpu->hardBreakpoint(addr); } - (void) setBreakpoint:(uint16_t)addr { wrapper->cpu->setHardBreakpoint(addr); } - (void) deleteBreakpoint:(uint16_t)addr { wrapper->cpu->deleteHardBreakpoint(addr); } - (void) toggleBreakpoint:(uint16_t)addr { wrapper->cpu->toggleHardBreakpoint(addr); } - (NSInteger) recordedInstructions { return wrapper->cpu->recordedInstructions(); } - (RecordedInstruction) readRecordedInstruction { return wrapper->cpu->readRecordedInstruction(); } - (RecordedInstruction) readRecordedInstruction:(NSInteger)previous { return wrapper->cpu->readRecordedInstruction((unsigned)previous); } - (DisassembledInstruction) disassemble:(uint16_t)addr hex:(BOOL)h; { return wrapper->cpu->disassemble(addr, h); } - (DisassembledInstruction) disassembleRecordedInstr:(RecordedInstruction)instr hex:(BOOL)h; { return wrapper->cpu->disassemble(instr, h); } @end // // Memory proxy // @implementation MemoryProxy // Constructing - (instancetype) initWithMemory:(C64Memory *)mem { if (self = [super init]) { wrapper = new MemoryWrapper(); wrapper->mem = mem; } return self; } // Proxy methods - (void) dump { wrapper->mem->dump(); } - (NSInteger) ramInitPattern { return wrapper->mem->getRamInitPattern(); } - (void) setRamInitPattern:(NSInteger)pattern { wrapper->mem->setRamInitPattern((RamInitPattern)pattern); } - (void) eraseWithPattern:(NSInteger)pattern { wrapper->mem->eraseWithPattern((RamInitPattern)pattern); } - (void) deleteBasicRom { wrapper->mem->deleteBasicRom(); } - (void) deleteCharacterRom { wrapper->mem->deleteCharacterRom(); } - (void) deleteKernalRom { wrapper->mem->deleteKernalRom(); } - (MemoryType) peekSource:(uint16_t)addr { return wrapper->mem->getPeekSource(addr); } - (MemoryType) pokeTarget:(uint16_t)addr { return wrapper->mem->getPokeTarget(addr); } - (uint8_t) spypeek:(uint16_t)addr source:(MemoryType)source { return wrapper->mem->spypeek(addr, source); } - (uint8_t) spypeek:(uint16_t)addr { return wrapper->mem->spypeek(addr); } - (uint8_t) spypeekIO:(uint16_t)addr { return wrapper->mem->spypeekIO(addr); } - (void) poke:(uint16_t)addr value:(uint8_t)value target:(MemoryType)target { wrapper->mem->suspend(); wrapper->mem->poke(addr, value, target); wrapper->mem->resume(); } - (void) poke:(uint16_t)addr value:(uint8_t)value { wrapper->mem->suspend(); wrapper->mem->poke(addr, value); wrapper->mem->resume(); } - (void) pokeIO:(uint16_t)addr value:(uint8_t)value { wrapper->mem->suspend(); wrapper->mem->pokeIO(addr, value); wrapper->mem->resume(); } @end // // CIA proxy // @implementation CIAProxy // Constructing - (instancetype) initWithCIA:(CIA *)cia { if (self = [super init]) { wrapper = new CiaWrapper(); wrapper->cia = cia; } return self; } // Proxy functions - (CIAInfo) getInfo { return wrapper->cia->getInfo(); } - (void) dump { wrapper->cia->dump(); } - (BOOL) tracing { return wrapper->cia->tracingEnabled(); } - (void) setTracing:(BOOL)b { b ? wrapper->cia->startTracing() : wrapper->cia->stopTracing(); } - (NSInteger) model { return (NSInteger)wrapper->cia->getModel(); } - (void) setModel:(NSInteger)value { wrapper->cia->setModel((CIAModel)value); } - (BOOL) emulateTimerBBug { return wrapper->cia->getEmulateTimerBBug(); } - (void) setEmulateTimerBBug:(BOOL)value { wrapper->cia->setEmulateTimerBBug(value); } - (void) poke:(uint16_t)addr value:(uint8_t)value { wrapper->cia->suspend(); wrapper->cia->poke(addr, value); wrapper->cia->resume(); } @end // // VIC proxy // // Constructing @implementation VICProxy - (instancetype) initWithVIC:(VIC *)vic { if (self = [super init]) { wrapper = new VicWrapper(); wrapper->vic = vic; } return self; } - (NSInteger) model { return (NSInteger)wrapper->vic->getModel(); } - (void) setModel:(NSInteger)value { wrapper->vic->setModel((VICModel)value); } - (NSInteger) videoPalette { return (NSInteger)wrapper->vic->videoPalette(); } - (void) setVideoPalette:(NSInteger)value { wrapper->vic->setVideoPalette((VICPalette)value); } - (NSInteger) glueLogic { return (NSInteger)wrapper->vic->getGlueLogic(); } - (void) setGlueLogic:(NSInteger)value { wrapper->vic->setGlueLogic((GlueLogic)value); } - (BOOL) hasGrayDotBug { return wrapper->vic->hasGrayDotBug(); } - (BOOL) emulateGrayDotBug { return wrapper->vic->emulateGrayDotBug; } - (void) setEmulateGrayDotBug:(BOOL)value { wrapper->vic->emulateGrayDotBug = value; } - (BOOL) isPAL { return wrapper->vic->isPAL(); } - (VICInfo) getInfo { return wrapper->vic->getInfo(); } - (void) dump { wrapper->vic->dump(); } - (SpriteInfo) getSpriteInfo:(NSInteger)sprite { return wrapper->vic->getSpriteInfo((unsigned)sprite); } - (void *) screenBuffer { return wrapper->vic->screenBuffer(); } - (NSColor *) color:(NSInteger)nr { assert (0 <= nr && nr < 16); uint32_t color = wrapper->vic->getColor((unsigned)nr); uint8_t r = color & 0xFF; uint8_t g = (color >> 8) & 0xFF; uint8_t b = (color >> 16) & 0xFF; return [NSColor colorWithCalibratedRed:(float)r/255.0 green:(float)g/255.0 blue:(float)b/255.0 alpha:1.0]; } - (UInt32) rgbaColor:(NSInteger)nr palette:(VICPalette)palette { assert (0 <= nr && nr < 16); return wrapper->vic->getColor((unsigned)nr, palette); } - (double)brightness { return wrapper->vic->getBrightness(); } - (void)setBrightness:(double)value { wrapper->vic->setBrightness(value); } - (double)contrast { return wrapper->vic->getContrast(); } - (void)setContrast:(double)value { wrapper->vic->setContrast(value); } - (double)saturation { return wrapper->vic->getSaturation(); } - (void)setSaturation:(double)value { wrapper->vic->setSaturation(value); } - (void) setMemoryBankAddr:(uint16_t)addr { wrapper->vic->setMemoryBankAddr(addr); } - (void) setScreenMemoryAddr:(uint16_t)addr { wrapper->vic->setScreenMemoryAddr(addr); } - (void) setCharacterMemoryAddr:(uint16_t)addr { wrapper->vic->setCharacterMemoryAddr(addr); } - (void) setDisplayMode:(DisplayMode)mode { wrapper->vic->setDisplayMode(mode); } - (void) setScreenGeometry:(ScreenGeometry)mode { wrapper->vic->setScreenGeometry(mode); } - (void) setHorizontalRasterScroll:(uint8_t)offset { wrapper->vic->setHorizontalRasterScroll(offset & 0x07); } - (void) setVerticalRasterScroll:(uint8_t)offset { wrapper->vic->setVerticalRasterScroll(offset & 0x07); } - (void) setSpriteEnabled:(NSInteger)nr value:(BOOL)flag { wrapper->vic->setSpriteEnabled(nr, flag); } - (void) toggleSpriteEnabled:(NSInteger)nr { wrapper->vic->toggleSpriteEnabled(nr); } - (void) setSpriteX:(NSInteger)nr value:(NSInteger)x { wrapper->vic->setSpriteX((unsigned)nr, (uint16_t)x); } - (void) setSpriteY:(NSInteger)nr value:(NSInteger)y { wrapper->vic->setSpriteY((unsigned)nr, (uint8_t)y); } - (void) setSpritePtr:(NSInteger)nr value:(NSInteger)ptr { wrapper->vic->setSpritePtr((unsigned)nr, (uint8_t)ptr); } - (void) setSpriteStretchX:(NSInteger)nr value:(BOOL)flag { wrapper->vic->setSpriteStretchX((unsigned)nr, flag); } - (void) toggleSpriteStretchX:(NSInteger)nr { wrapper->vic->spriteToggleStretchXFlag((unsigned)nr); } - (void) setSpriteStretchY:(NSInteger)nr value:(BOOL)flag { return wrapper->vic->setSpriteStretchY((unsigned)nr, flag); } - (void) toggleSpriteStretchY:(NSInteger)nr { wrapper->vic->spriteToggleStretchYFlag((unsigned)nr); } - (void) setSpriteColor:(NSInteger)nr value:(int)c { wrapper->vic->setSpriteColor((unsigned)nr, c); } - (void) setSpritePriority:(NSInteger)nr value:(BOOL)flag { wrapper->vic->setSpritePriority((unsigned)nr, flag); } - (void) toggleSpritePriority:(NSInteger)nr { wrapper->vic->toggleSpritePriority((unsigned)nr); } - (void) setSpriteMulticolor:(NSInteger)nr value:(BOOL)flag { wrapper->vic->setSpriteMulticolor((unsigned)nr, flag); } - (void) toggleSpriteMulticolor:(NSInteger)nr { wrapper->vic->toggleMulticolorFlag((unsigned)nr); } - (void) setIrqOnSpriteSpriteCollision:(BOOL)value { wrapper->vic->setIrqOnSpriteSpriteCollision(value); } - (void) toggleIrqOnSpriteSpriteCollision { wrapper->vic-> toggleIrqOnSpriteSpriteCollision(); } - (void) setIrqOnSpriteBackgroundCollision:(BOOL)value { wrapper->vic->setIrqOnSpriteBackgroundCollision(value); } - (void) toggleIrqOnSpriteBackgroundCollision { wrapper->vic->toggleIrqOnSpriteBackgroundCollision(); } - (void) setRasterInterruptLine:(uint16_t)line { wrapper->vic->setRasterInterruptLine(line); } - (void) setRasterInterruptEnabled:(BOOL)b { wrapper->vic->setRasterInterruptEnable(b); } - (void) toggleRasterInterruptFlag { wrapper->vic->toggleRasterInterruptFlag(); } - (BOOL) hideSprites { return wrapper->vic->hideSprites; } - (void) setHideSprites:(BOOL)b { wrapper->vic->setHideSprites(b); } - (BOOL) showIrqLines { return wrapper->vic->markIRQLines; } - (void) setShowIrqLines:(BOOL)b { wrapper->vic->setShowIrqLines(b); } - (BOOL) showDmaLines { return wrapper->vic->markDMALines; } - (void) setShowDmaLines:(BOOL)b { wrapper->vic->setShowDmaLines(b); } @end // // SID proxy // @implementation SIDProxy - (instancetype) initWithSID:(SIDBridge *)sid { if (self = [super init]) { wrapper = new SidBridgeWrapper(); wrapper->sid = sid; } return self; } - (void) dump { wrapper->sid->dump(); } - (SIDInfo) getInfo { return wrapper->sid->getInfo(); } - (VoiceInfo) getVoiceInfo:(NSInteger)voice { return wrapper->sid->getVoiceInfo((unsigned)voice); } - (BOOL) reSID { return wrapper->sid->getReSID(); } - (void) setReSID:(BOOL)b { wrapper->sid->setReSID(b); } - (BOOL) audioFilter { return wrapper->sid->getAudioFilter(); } - (void) setAudioFilter:(BOOL)b { wrapper->sid->setAudioFilter(b); } - (NSInteger) samplingMethod { return (NSInteger)(wrapper->sid->getSamplingMethod()); } - (void) setSamplingMethod:(NSInteger)value { wrapper->sid->setSamplingMethod((SamplingMethod)value); } - (NSInteger) model { return (int)(wrapper->sid->getModel()); } - (void) setModel:(NSInteger)value { wrapper->sid->setModel((SIDModel)value); } - (uint32_t) sampleRate { return wrapper->sid->getSampleRate(); } - (void) setSampleRate:(uint32_t)rate { wrapper->sid->setSampleRate(rate); } - (NSInteger) ringbufferSize { return wrapper->sid->ringbufferSize(); } - (float) ringbufferData:(NSInteger)offset { return wrapper->sid->ringbufferData(offset); } - (double) fillLevel { return wrapper->sid->fillLevel(); } - (NSInteger) bufferUnderflows { return wrapper->sid->bufferUnderflows; } - (NSInteger) bufferOverflows { return wrapper->sid->bufferOverflows; } - (void) readMonoSamples:(float *)target size:(NSInteger)n { wrapper->sid->readMonoSamples(target, n); } - (void) readStereoSamples:(float *)target1 buffer2:(float *)target2 size:(NSInteger)n { wrapper->sid->readStereoSamples(target1, target2, n); } - (void) readStereoSamplesInterleaved:(float *)target size:(NSInteger)n { wrapper->sid->readStereoSamplesInterleaved(target, n); } - (void) rampUp { wrapper->sid->rampUp(); } - (void) rampUpFromZero { wrapper->sid->rampUpFromZero(); } - (void) rampDown { wrapper->sid->rampDown(); } @end // // IEC bus proxy // @implementation IECProxy - (instancetype) initWithIEC:(IEC *)iec { if (self = [super init]) { wrapper = new IecWrapper(); wrapper->iec = iec; } return self; } - (void) dump { wrapper->iec->dump(); } - (BOOL) tracing { return wrapper->iec->tracingEnabled(); } - (void) setTracing:(BOOL)b { b ? wrapper->iec->startTracing() : wrapper->iec->stopTracing(); } @end // // Keyboard // @implementation KeyboardProxy - (instancetype) initWithKeyboard:(Keyboard *)keyboard { if (self = [super init]) { wrapper = new KeyboardWrapper(); wrapper->keyboard = keyboard; } return self; } - (void) dump { wrapper->keyboard->dump(); } - (void) pressKeyAtRow:(NSInteger)row col:(NSInteger)col { wrapper->keyboard->pressKey(row, col); } - (void) pressRestoreKey { wrapper->keyboard->pressRestoreKey(); } - (void) releaseKeyAtRow:(NSInteger)row col:(NSInteger)col { wrapper->keyboard->releaseKey(row, col); } - (void) releaseRestoreKey { wrapper->keyboard->releaseRestoreKey(); } - (void) releaseAll { wrapper->keyboard->releaseAll(); } - (BOOL) leftShiftIsPressed { return wrapper->keyboard->leftShiftIsPressed(); } - (BOOL) rightShiftIsPressed { return wrapper->keyboard->rightShiftIsPressed(); } - (BOOL) controlIsPressed { return wrapper->keyboard->ctrlIsPressed(); } - (BOOL) commodoreIsPressed { return wrapper->keyboard->commodoreIsPressed(); } - (BOOL) shiftLockIsHoldDown { return wrapper->keyboard->shiftLockIsHoldDown(); } - (void) lockShift { wrapper->keyboard->pressShiftLockKey(); } - (void) unlockShift { wrapper->keyboard->releaseShiftLockKey(); } - (BOOL) inUpperCaseMode { return wrapper->keyboard->inUpperCaseMode(); } @end // // Control port // @implementation ControlPortProxy - (instancetype) initWithJoystick:(ControlPort *)port { if (self = [super init]) { wrapper = new ControlPortWrapper(); wrapper->port = port; } return self; } - (void) dump { wrapper->port->dump(); } - (BOOL) autofire { return wrapper->port->getAutofire(); } - (void) setAutofire:(BOOL)value { return wrapper->port->setAutofire(value); } - (NSInteger) autofireBullets { return (NSInteger)wrapper->port->getAutofireBullets(); } - (void) setAutofireBullets:(NSInteger)value { wrapper->port->setAutofireBullets((int)value); } - (float) autofireFrequency { return wrapper->port->getAutofireFrequency(); } - (void) setAutofireFrequency:(float)value { wrapper->port->setAutofireFrequency(value); } - (void) trigger:(JoystickEvent)event { wrapper->port->trigger(event); } @end // // Expansion port proxy // @implementation ExpansionPortProxy - (instancetype) initWithExpansionPort:(ExpansionPort *)expansionPort { if (self = [super init]) { wrapper = new ExpansionPortWrapper(); wrapper->expansionPort = expansionPort; } return self; } - (void) dump { wrapper->expansionPort->dump(); } - (CartridgeType) cartridgeType { return wrapper->expansionPort->getCartridgeType(); } - (BOOL) cartridgeAttached { return wrapper->expansionPort->getCartridgeAttached(); } - (void) attachCartridgeAndReset:(CRTFileProxy *)c { CRTFile *file = (CRTFile *)([c wrapper]->file); wrapper->expansionPort->attachCartridgeAndReset(file); } - (BOOL) attachGeoRamCartridge:(NSInteger)capacity { return wrapper->expansionPort->attachGeoRamCartridge((uint32_t)capacity); } - (void) attachIsepicCartridge { wrapper->expansionPort->attachIsepicCartridge(); } - (void) detachCartridgeAndReset { wrapper->expansionPort->detachCartridgeAndReset(); } - (NSInteger) numButtons { return wrapper->expansionPort->numButtons(); } - (NSString *) getButtonTitle:(NSInteger)nr { const char *str = wrapper->expansionPort->getButtonTitle((unsigned)nr); return str ? [NSString stringWithUTF8String:str] : NULL; } - (void) pressButton:(NSInteger)nr { wrapper->expansionPort->pressButton((unsigned)nr); } - (void) releaseButton:(NSInteger)nr { wrapper->expansionPort->releaseButton((unsigned)nr); } - (BOOL) hasSwitch { return wrapper->expansionPort->hasSwitch(); } - (NSInteger) switchPosition { return wrapper->expansionPort->getSwitch(); } - (NSString *) switchDescription:(NSInteger)pos { const char *str = wrapper->expansionPort->getSwitchDescription(pos); return str ? [NSString stringWithUTF8String:str] : NULL; } - (BOOL) validSwitchPosition:(NSInteger)pos { return wrapper->expansionPort->validSwitchPosition(pos); } - (BOOL) switchIsNeutral { return wrapper->expansionPort->switchIsNeutral(); } - (BOOL) switchIsLeft { return wrapper->expansionPort->switchIsLeft(); } - (BOOL) switchIsRight { return wrapper->expansionPort->switchIsRight(); } - (void) setSwitchPosition:(NSInteger)pos { wrapper->expansionPort->setSwitch(pos); } - (BOOL) hasLed { return wrapper->expansionPort->hasLED(); } - (BOOL) led { return wrapper->expansionPort->getLED(); } - (void) setLed:(BOOL)value { wrapper->expansionPort->setLED(value); } - (BOOL) hasBattery { return wrapper->expansionPort->hasBattery(); } - (void) setBattery:(BOOL)value { wrapper->expansionPort->setBattery(value); } @end // // Disk proxy // @implementation DiskProxy @synthesize wrapper; - (instancetype) initWithDisk525:(Disk *)disk { if (self = [super init]) { wrapper = new DiskWrapper(); wrapper->disk = disk; } return self; } - (void) dump { wrapper->disk->dump(); } - (BOOL)writeProtected { return wrapper->disk->isWriteProtected(); } - (void)setWriteProtection:(BOOL)b { wrapper->disk->setWriteProtection(b); } - (void)toggleWriteProtection { wrapper->disk->toggleWriteProtection(); } - (NSInteger)nonemptyHalftracks { return (NSInteger)wrapper->disk->nonemptyHalftracks(); } - (void)analyzeTrack:(Track)t { wrapper->disk->analyzeTrack(t); } - (void)analyzeHalftrack:(Halftrack)ht { wrapper->disk->analyzeHalftrack(ht); } - (NSInteger)numErrors { return wrapper->disk->numErrors(); } - (NSString *)errorMessage:(NSInteger)nr { std::string s = wrapper->disk->errorMessage((unsigned)nr); return [NSString stringWithUTF8String:s.c_str()]; } - (NSInteger)firstErroneousBit:(NSInteger)nr { return wrapper->disk->firstErroneousBit((unsigned)nr); } - (NSInteger)lastErroneousBit:(NSInteger)nr { return wrapper->disk->lastErroneousBit((unsigned)nr); } - (SectorInfo)sectorInfo:(Sector)s { return wrapper->disk->sectorLayout(s); } - (const char *)trackDataAsString { return wrapper->disk->trackDataAsString(); } - (const char *)diskNameAsString { return wrapper->disk->diskNameAsString(); } - (const char *)sectorHeaderAsString:(Sector)nr { return wrapper->disk->sectorHeaderAsString(nr); } - (const char *)sectorDataAsString:(Sector)nr { return wrapper->disk->sectorDataAsString(nr); } @end // // VIA proxy // @implementation VIAProxy - (instancetype) initWithVIA:(VIA6522 *)via { if (self = [super init]) { wrapper = new ViaWrapper(); wrapper->via = via; } return self; } - (void) dump { wrapper->via->dump(); } - (BOOL) tracing { return wrapper->via->tracingEnabled(); } - (void) setTracing:(BOOL)b { b ? wrapper->via->startTracing() : wrapper->via->stopTracing(); } @end // // VC1541 proxy // @implementation DriveProxy @synthesize wrapper, cpu, via1, via2, disk; - (instancetype) initWithVC1541:(VC1541 *)drive { if (self = [super init]) { wrapper = new DriveWrapper(); wrapper->drive = drive; cpu = [[CPUProxy alloc] initWithCPU:&drive->cpu]; via1 = [[VIAProxy alloc] initWithVIA:&drive->via1]; via2 = [[VIAProxy alloc] initWithVIA:&drive->via2]; disk = [[DiskProxy alloc] initWithDisk525:&drive->disk]; } return self; } - (VIAProxy *) via:(NSInteger)num { switch (num) { case 1: return [self via1]; case 2: return [self via2]; default: assert(0); return NULL; } } - (void) dump { wrapper->drive->dump(); } - (BOOL) tracing { return wrapper->drive->tracingEnabled(); } - (void) setTracing:(BOOL)b { b ? wrapper->drive->startTracing() : wrapper->drive->stopTracing(); } - (BOOL) isPoweredOn { return wrapper->drive->isPoweredOn(); } - (void) powerOn { wrapper->drive->powerOn(); } - (void) powerOff { wrapper->drive->powerOff(); } - (void) togglePowerSwitch { wrapper->drive->togglePowerSwitch(); } - (void) deleteRom { wrapper->drive->mem.deleteRom(); } - (BOOL) redLED { return wrapper->drive->getRedLED(); } - (BOOL) hasDisk { return wrapper->drive->hasDisk(); } - (BOOL) hasModifiedDisk { return wrapper->drive->hasModifiedDisk(); } - (void) setModifiedDisk:(BOOL)b { wrapper->drive->setModifiedDisk(b); } - (void) prepareToInsert { wrapper->drive->prepareToInsert(); } - (void) insertDisk:(AnyArchiveProxy *)disk { AnyArchive *archive = (AnyArchive *)([disk wrapper]->file); wrapper->drive->insertDisk(archive); } - (void) prepareToEject { wrapper->drive->prepareToEject(); } - (void) ejectDisk { wrapper->drive->ejectDisk(); } - (BOOL) writeProtected { return wrapper->drive->disk.isWriteProtected(); } - (void) setWriteProtection:(BOOL)b { wrapper->drive->disk.setWriteProtection(b); } - (BOOL) hasWriteProtectedDisk { return wrapper->drive->hasWriteProtectedDisk(); } - (BOOL) sendSoundMessages { return wrapper->drive->soundMessagesEnabled(); } - (void) setSendSoundMessages:(BOOL)b { wrapper->drive->setSendSoundMessages(b); } - (Halftrack) halftrack { return wrapper->drive->getHalftrack(); } - (void) setTrack:(Track)t { wrapper->drive->setTrack(t); } - (void) setHalftrack:(Halftrack)ht { wrapper->drive->setHalftrack(ht); } - (uint16_t) sizeOfCurrentHalftrack { return wrapper->drive->sizeOfCurrentHalftrack(); } - (uint16_t) offset { return wrapper->drive->getOffset(); } - (void) setOffset:(uint16_t)value { wrapper->drive->setOffset(value); } - (uint8_t) readBitFromHead { return wrapper->drive->readBitFromHead(); } - (void) writeBitToHead:(uint8_t)value { wrapper->drive->writeBitToHead(value); } - (void) moveHeadUp { wrapper->drive->moveHeadUp(); } - (void) moveHeadDown { wrapper->drive->moveHeadDown(); } - (BOOL) isRotating { return wrapper->drive->isRotating(); } - (void) rotateDisk { wrapper->drive->rotateDisk(); } - (void) rotateBack { wrapper->drive->rotateBack(); } @end // // Datasette // @implementation DatasetteProxy - (instancetype) initWithDatasette:(Datasette *)datasette { if (self = [super init]) { wrapper = new DatasetteWrapper(); wrapper->datasette = datasette; } return self; } - (void) dump { wrapper->datasette->dump(); } - (BOOL) hasTape { return wrapper->datasette->hasTape(); } - (void) pressPlay { wrapper->datasette->pressPlay(); } - (void) pressStop { wrapper->datasette->pressStop(); } - (void) rewind { wrapper->datasette->rewind(); } - (BOOL) insertTape:(TAPFileProxy *)tape { TAPFile *file = (TAPFile *)([tape wrapper]->file); return wrapper->datasette->insertTape(file); } - (void) ejectTape { wrapper->datasette->ejectTape(); } - (NSInteger) getType { return wrapper->datasette->getType(); } - (long) durationInCycles { return wrapper->datasette->getDurationInCycles(); } - (int) durationInSeconds { return wrapper->datasette->getDurationInSeconds(); } - (NSInteger) head { return wrapper->datasette->getHead(); } - (NSInteger) headInCycles { return wrapper->datasette->getHeadInCycles(); } - (int) headInSeconds { return wrapper->datasette->getHeadInSeconds(); } - (void) setHeadInCycles:(long)value { wrapper->datasette->setHeadInCycles(value); } - (BOOL) motor { return wrapper->datasette->getMotor(); } - (BOOL) playKey { return wrapper->datasette->getPlayKey(); } @end // // Mouse // @implementation MouseProxy - (instancetype) initWithMouse:(Mouse *)mouse { if (self = [super init]) { wrapper = new MouseWrapper(); wrapper->mouse = mouse; } return self; } - (NSInteger) model { return (NSInteger)wrapper->mouse->getModel(); } - (void) setModel:(NSInteger)model { wrapper->mouse->setModel((MouseModel)model); } - (NSInteger) port { return wrapper->mouse->getPort(); } - (void) connect:(NSInteger)toPort { wrapper->mouse->connectMouse((unsigned)toPort); } - (void) disconnect { wrapper->mouse->disconnectMouse(); } - (void) setXY:(NSPoint)pos { wrapper->mouse->setXY((int64_t)pos.x, (int64_t)pos.y); } - (void) setLeftButton:(BOOL)pressed { wrapper->mouse->setLeftButton(pressed); } - (void) setRightButton:(BOOL)pressed { wrapper->mouse->setRightButton(pressed); } @end // // C64 // @implementation C64Proxy @synthesize wrapper; @synthesize mem, cpu, vic, cia1, cia2, sid; @synthesize keyboard, port1, port2, iec; @synthesize expansionport, drive1, drive2, datasette, mouse; - (instancetype) initWithC64:(C64 *)c64 { NSLog(@"C64Proxy::init"); if (!(self = [super init])) return self; wrapper = new C64Wrapper(); wrapper->c64 = c64; // Create sub proxys mem = [[MemoryProxy alloc] initWithMemory:&c64->mem]; cpu = [[CPUProxy alloc] initWithCPU:&c64->cpu]; vic = [[VICProxy alloc] initWithVIC:&c64->vic]; cia1 = [[CIAProxy alloc] initWithCIA:&c64->cia1]; cia2 = [[CIAProxy alloc] initWithCIA:&c64->cia2]; sid = [[SIDProxy alloc] initWithSID:&c64->sid]; keyboard = [[KeyboardProxy alloc] initWithKeyboard:&c64->keyboard]; port1 = [[ControlPortProxy alloc] initWithJoystick:&c64->port1]; port2 = [[ControlPortProxy alloc] initWithJoystick:&c64->port2]; iec = [[IECProxy alloc] initWithIEC:&c64->iec]; expansionport = [[ExpansionPortProxy alloc] initWithExpansionPort:&c64->expansionport]; drive1 = [[DriveProxy alloc] initWithVC1541:&c64->drive1]; drive2 = [[DriveProxy alloc] initWithVC1541:&c64->drive2]; datasette = [[DatasetteProxy alloc] initWithDatasette:&c64->datasette]; mouse = [[MouseProxy alloc] initWithMouse:&c64->mouse]; return self; } - (void) dealloc { NSLog(@"dealloc"); } - (void) kill { assert(wrapper->c64 != NULL); NSLog(@"C64Proxy::kill"); // Kill the emulator delete wrapper->c64; wrapper->c64 = NULL; } - (DriveProxy *) drive:(NSInteger)num { switch (num) { case 1: return [self drive1]; case 2: return [self drive2]; default: assert(false); return NULL; } } - (void) ping { wrapper->c64->ping(); } - (void) dump { wrapper->c64->dump(); } - (BOOL) developmentMode { return wrapper->c64->developmentMode(); } // Configuring the emulator - (NSInteger) model { return wrapper->c64->getModel(); } - (void) setModel:(NSInteger)value { wrapper->c64->setModel((C64Model)value); } // Accessing the message queue - (Message)message { return wrapper->c64->getMessage(); } - (void) addListener:(const void *)sender function:(Callback *)func { wrapper->c64->addListener(sender, func); } - (void) removeListener:(const void *)sender { wrapper->c64->removeListener(sender); } // Running the emulator - (void) powerUp { wrapper->c64->powerUp(); } - (void) run { wrapper->c64->run(); } - (void) halt { wrapper->c64->halt(); } - (void) suspend { wrapper->c64->suspend(); } - (void) resume { wrapper->c64->resume(); } - (BOOL) isRunnable { return wrapper->c64->isRunnable(); } - (BOOL) isRunning { return wrapper->c64->isRunning(); } - (BOOL) isHalted { return wrapper->c64->isHalted(); } - (void) step { wrapper->c64->step(); } - (void) stepOver { wrapper->c64->stepOver(); } // Managing the execution thread - (BOOL) warp { return wrapper->c64->getWarp(); } - (BOOL) alwaysWarp { return wrapper->c64->getAlwaysWarp(); } - (void) setAlwaysWarp:(BOOL)b { wrapper->c64->setAlwaysWarp(b); } - (BOOL) warpLoad { return wrapper->c64->getWarpLoad(); } - (void) setWarpLoad:(BOOL)b { wrapper->c64->setWarpLoad(b); } // Handling snapshots - (BOOL) takeAutoSnapshots { return wrapper->c64->getTakeAutoSnapshots(); } - (void) setTakeAutoSnapshots:(BOOL)b { wrapper->c64->setTakeAutoSnapshots(b); } /* - (void) disableAutoSnapshots { wrapper->c64->disableAutoSnapshots(); } - (void) enableAutoSnapshots { wrapper->c64->enableAutoSnapshots(); } */ - (void) suspendAutoSnapshots { wrapper->c64->suspendAutoSnapshots(); } - (void) resumeAutoSnapshots { wrapper->c64->resumeAutoSnapshots(); } - (NSInteger) snapshotInterval { return wrapper->c64->getSnapshotInterval(); } - (void) setSnapshotInterval:(NSInteger)value { wrapper->c64->setSnapshotInterval(value); } - (BOOL)restoreAutoSnapshot:(NSInteger)nr { return wrapper->c64->restoreAutoSnapshot((unsigned)nr); } - (BOOL)restoreUserSnapshot:(NSInteger)nr { return wrapper->c64->restoreUserSnapshot((unsigned)nr); } - (BOOL)restoreLatestUserSnapshot { return wrapper->c64->restoreLatestUserSnapshot(); } - (BOOL)restoreLatestAutoSnapshot { return wrapper->c64->restoreLatestAutoSnapshot(); } - (NSInteger) numAutoSnapshots { return wrapper->c64->numAutoSnapshots(); } - (NSInteger) numUserSnapshots { return wrapper->c64->numUserSnapshots(); } - (NSData *)autoSnapshotData:(NSInteger)nr { Snapshot *snapshot = wrapper->c64->autoSnapshot((unsigned)nr); return [NSData dataWithBytes: (void *)snapshot->getHeader() length: snapshot->sizeOnDisk()]; } - (NSData *)userSnapshotData:(NSInteger)nr { Snapshot *snapshot = wrapper->c64->userSnapshot((unsigned)nr); return [NSData dataWithBytes: (void *)snapshot->getHeader() length: snapshot->sizeOnDisk()]; } - (unsigned char *)autoSnapshotImageData:(NSInteger)nr { Snapshot *s = wrapper->c64->autoSnapshot((int)nr); return s ? s->getImageData() : NULL; } - (unsigned char *)userSnapshotImageData:(NSInteger)nr { Snapshot *s = wrapper->c64->userSnapshot((int)nr); return s ? s->getImageData() : NULL; } - (NSSize) autoSnapshotImageSize:(NSInteger)nr { Snapshot *s = wrapper->c64->autoSnapshot((int)nr); return s ? NSMakeSize(s->getImageWidth(), s->getImageHeight()) : NSMakeSize(0,0); } - (NSSize) userSnapshotImageSize:(NSInteger)nr { Snapshot *s = wrapper->c64->userSnapshot((int)nr); return s ? NSMakeSize(s->getImageWidth(), s->getImageHeight()) : NSMakeSize(0,0); } - (time_t)autoSnapshotTimestamp:(NSInteger)nr { Snapshot *s = wrapper->c64->autoSnapshot((int)nr); return s ? s->getTimestamp() : 0; } - (time_t)userSnapshotTimestamp:(NSInteger)nr { Snapshot *s = wrapper->c64->userSnapshot((int)nr); return s ? s->getTimestamp() : 0; } - (void)takeUserSnapshot { wrapper->c64->takeUserSnapshotSafe(); } - (void)deleteAutoSnapshot:(NSInteger)nr { wrapper->c64->deleteAutoSnapshot((unsigned)nr); } - (void)deleteUserSnapshot:(NSInteger)nr { wrapper->c64->deleteUserSnapshot((unsigned)nr); } // Handling ROMs - (BOOL) isBasicRom:(NSURL *)url { return ROMFile::isBasicRomFile([[url path] UTF8String]); } - (BOOL) loadBasicRom:(NSURL *)url { return [self isBasicRom:url] && wrapper->c64->loadRom([[url path] UTF8String]); } - (BOOL) isBasicRomLoaded { return wrapper->c64->mem.basicRomIsLoaded(); } - (uint64_t) basicRomFingerprint { return wrapper->c64->mem.basicRomFingerprint(); } - (BOOL) isCharRom:(NSURL *)url { return ROMFile::isCharRomFile([[url path] UTF8String]); } - (BOOL) loadCharRom:(NSURL *)url { return [self isCharRom:url] && wrapper->c64->loadRom([[url path] UTF8String]); } - (BOOL) isCharRomLoaded { return wrapper->c64->mem.characterRomIsLoaded(); } - (uint64_t) charRomFingerprint { return wrapper->c64->mem.characterRomFingerprint(); } - (BOOL) isKernalRom:(NSURL *)url { return ROMFile::isKernalRomFile([[url path] UTF8String]); } - (BOOL) loadKernalRom:(NSURL *)url { return [self isKernalRom:url] && wrapper->c64->loadRom([[url path] UTF8String]); } - (BOOL) isKernalRomLoaded { return wrapper->c64->mem.kernalRomIsLoaded(); } - (uint64_t) kernalRomFingerprint { return wrapper->c64->mem.kernalRomFingerprint(); } - (BOOL) isVC1541Rom:(NSURL *)url { return ROMFile::isVC1541RomFile([[url path] UTF8String]); } - (BOOL) loadVC1541Rom:(NSURL *)url { return [self isVC1541Rom:url] && wrapper->c64->loadRom([[url path] UTF8String]); } - (BOOL) isVC1541RomLoaded { return wrapper->c64->drive1.mem.romIsLoaded() && wrapper->c64->drive2.mem.romIsLoaded(); } - (uint64_t) vc1541RomFingerprint { return wrapper->c64->drive1.mem.romFingerprint(); } - (BOOL) isRom:(NSURL *)url { return [self isBasicRom:url] || [self isCharRom:url] || [self isKernalRom:url] || [self isVC1541Rom:url]; } - (BOOL) loadRom:(NSURL *)url { return [self loadBasicRom:url] || [self loadCharRom:url] || [self loadKernalRom:url] || [self loadVC1541Rom:url]; } // Flashing files - (BOOL)flash:(AnyC64FileProxy *)file { return wrapper->c64->flash([file wrapper]->file); } - (BOOL)flash:(AnyArchiveProxy *)archive item:(NSInteger)nr; { AnyArchive *a = (AnyArchive *)([archive wrapper]->file); return wrapper->c64->flash(a, (unsigned)nr); } @end // // AnyC64File proxy // @implementation AnyC64FileProxy - (instancetype) initWithFile:(AnyC64File *)file { if (file == nil) { return nil; } if (self = [super init]) { wrapper = new AnyC64FileWrapper(); wrapper->file = file; } return self; } + (AnyC64FileProxy *) makeWithFile:(AnyC64File *)file { if (file == nil) { return nil; } return [[self alloc] initWithFile:file]; } - (void)setPath:(NSString *)path { AnyC64File *file = (AnyC64File *)([self wrapper]->file); file->setPath([path UTF8String]); } - (AnyC64FileWrapper *)wrapper { return wrapper; } - (C64FileType)type { return wrapper->file->type(); } - (NSString *)name { return [NSString stringWithUTF8String:wrapper->file->getName()]; } - (NSInteger) sizeOnDisk { return wrapper->file->sizeOnDisk(); } - (void) readFromBuffer:(const void *)buffer length:(NSInteger)length { wrapper->file->readFromBuffer((const uint8_t *)buffer, length); } - (NSInteger) writeToBuffer:(void *)buffer { return wrapper->file->writeToBuffer((uint8_t *)buffer); } - (void) dealloc { // NSLog(@"AnyC64FileProxy::dealloc"); if (wrapper) { if (wrapper->file) delete wrapper->file; delete wrapper; } } @end // // Snapshot proxy // @implementation SnapshotProxy + (BOOL) isSupportedSnapshot:(const void *)buffer length:(NSInteger)length { return Snapshot::isSupportedSnapshot((uint8_t *)buffer, length); } + (BOOL) isUnsupportedSnapshot:(const void *)buffer length:(NSInteger)length { return Snapshot::isUnsupportedSnapshot((uint8_t *)buffer, length); } + (BOOL) isSupportedSnapshotFile:(NSString *)path { return Snapshot::isSupportedSnapshotFile([path UTF8String]); } + (BOOL) isUnsupportedSnapshotFile:(NSString *)path { return Snapshot::isUnsupportedSnapshotFile([path UTF8String]); } + (instancetype) make:(Snapshot *)snapshot { if (snapshot == NULL) { return nil; } return [[self alloc] initWithFile:snapshot]; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { Snapshot *snapshot = Snapshot::makeWithBuffer((uint8_t *)buffer, length); return [self make:snapshot]; } + (instancetype) makeWithFile:(NSString *)path { Snapshot *snapshot = Snapshot::makeWithFile([path UTF8String]); return [self make:snapshot]; } + (instancetype) makeWithC64:(C64Proxy *)c64proxy { C64 *c64 = [c64proxy wrapper]->c64; c64->suspend(); Snapshot *snapshot = Snapshot::makeWithC64(c64); c64->resume(); return [self make:snapshot]; } @end // // CRT proxy // @implementation CRTFileProxy + (CartridgeType) typeOfCRTBuffer:(const void *)buffer length:(NSInteger)length { return CRTFile::typeOfCRTBuffer((uint8_t *)buffer, length); } + (NSString *) typeNameOfCRTBuffer:(const void *)buffer length:(NSInteger)length { const char *str = CRTFile::typeNameOfCRTBuffer((uint8_t *)buffer, length); return [NSString stringWithUTF8String: str]; } + (BOOL) isSupportedCRTBuffer:(const void *)buffer length:(NSInteger)length { return CRTFile::isSupportedCRTBuffer((uint8_t *)buffer, length); } + (BOOL) isUnsupportedCRTBuffer:(const void *)buffer length:(NSInteger)length { return CRTFile::isUnsupportedCRTBuffer((uint8_t *)buffer, length); } + (BOOL) isCRTFile:(NSString *)path { return CRTFile::isCRTFile([path UTF8String]); } + (instancetype) make:(CRTFile *)container { return container ? [[self alloc] initWithFile:container] : nil; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { CRTFile *container = CRTFile::makeWithBuffer((const uint8_t *)buffer, length); return [self make: container]; } + (instancetype) makeWithFile:(NSString *)path { CRTFile *container = CRTFile::makeWithFile([path UTF8String]); return [self make: container]; } - (CRTFile *)unwrap { return (CRTFile *)wrapper->file; } - (CartridgeType)cartridgeType { return [self unwrap]->cartridgeType(); } - (NSString *)cartridgeTypeName { return [NSString stringWithUTF8String:[self unwrap]->cartridgeTypeName()]; } - (NSInteger)initialExromLine { return [self unwrap]->initialExromLine(); } - (NSInteger)initialGameLine { return [self unwrap]->initialGameLine(); } - (NSInteger)chipCount { return [self unwrap]->chipCount(); } - (NSInteger)chipType:(NSInteger)nr; { return [self unwrap]->chipType((unsigned)nr); } - (NSInteger)chipAddr:(NSInteger)nr; { return [self unwrap]->chipAddr((unsigned)nr); } - (NSInteger)chipSize:(NSInteger)nr; { return [self unwrap]->chipSize((unsigned)nr); } @end // // TAP proxy // @implementation TAPFileProxy + (BOOL) isTAPFile:(NSString *)path { return TAPFile::isTAPFile([path UTF8String]); } + (instancetype) make:(TAPFile *)container { return container ? [[self alloc] initWithFile:container] : nil; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { TAPFile *container = TAPFile::makeWithBuffer((const uint8_t *)buffer, length); return [self make: container]; } + (instancetype) makeWithFile:(NSString *)path { TAPFile *container = TAPFile::makeWithFile([path UTF8String]); return [self make: container]; } - (TAPFile *)unwrap { return (TAPFile *)wrapper->file; } - (NSInteger)TAPversion { return [self unwrap]->TAPversion(); } @end // // AnyArchive proxy // @implementation AnyArchiveProxy + (instancetype) make:(AnyArchive *)archive { if (archive == NULL) return nil; return [[self alloc] initWithFile:archive]; } + (instancetype) make { AnyArchive *archive = new AnyArchive(); return [self make: archive]; } + (instancetype) makeWithFile:(NSString *)path { AnyArchive *archive = AnyArchive::makeWithFile([path UTF8String]); return [self make: archive]; } - (AnyArchive *)unwrap { return (AnyArchive *)([self wrapper]->file); } - (void)selectItem:(NSInteger)item { return [self unwrap]->selectItem((unsigned)item); } - (NSInteger)numberOfItems { return [self unwrap]->numberOfItems(); } - (NSString *)nameOfItem { const char *chars = [self unwrap]->getNameOfItem(); return [NSString stringWithUTF8String:chars]; } - (NSString *)unicodeNameOfItem { const unsigned short *unichars = [self unwrap]->getUnicodeNameOfItem(); return [NSString stringWithCharacters:unichars length:strlen16(unichars)]; } - (NSInteger)sizeOfItem { return [self unwrap]->getSizeOfItem(); } - (NSInteger)sizeOfItemInBlocks { return [self unwrap]->getSizeOfItemInBlocks(); } - (void)seekItem:(NSInteger)offset { [self unwrap]->seekItem(offset); } - (NSString *)typeOfItem { const char *chars = [self unwrap]->getTypeOfItemAsString(); return [NSString stringWithUTF8String:chars]; } - (NSInteger)destinationAddrOfItem { return [self unwrap]->getDestinationAddrOfItem(); } - (NSString *)readItemHex:(NSInteger)num { const char *chars = [self unwrap]->readItemHex(num); return [NSString stringWithUTF8String:chars]; } @end // // T64 proxy // @implementation T64FileProxy + (BOOL)isT64File:(NSString *)filename { return T64File::isT64File([filename UTF8String]); } + (instancetype) make:(T64File *)archive { if (archive == NULL) return nil; return [[self alloc] initWithFile:archive]; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { T64File *archive = T64File::makeWithBuffer((const uint8_t *)buffer, length); return [self make: archive]; } + (instancetype) makeWithFile:(NSString *)path { T64File *archive = T64File::makeWithFile([path UTF8String]); return [self make: archive]; } + (instancetype) makeWithAnyArchive:(AnyArchiveProxy *)otherArchive { AnyArchive *other = (AnyArchive *)([otherArchive wrapper]->file); T64File *archive = T64File::makeT64ArchiveWithAnyArchive(other); return [self make: archive]; } @end // // PRG proxy // @implementation PRGFileProxy + (BOOL)isPRGFile:(NSString *)filename { return PRGFile::isPRGFile([filename UTF8String]); } + (instancetype) make:(PRGFile *)archive { if (archive == NULL) return nil; return [[self alloc] initWithFile:archive]; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { PRGFile *archive = PRGFile::makeWithBuffer((const uint8_t *)buffer, length); return [self make: archive]; } + (instancetype) makeWithFile:(NSString *)path { PRGFile *archive = PRGFile::makeWithFile([path UTF8String]); return [self make: archive]; } + (instancetype) makeWithAnyArchive:(AnyArchiveProxy *)otherArchive { AnyArchive *other = (AnyArchive *)([otherArchive wrapper]->file); PRGFile *archive = PRGFile::makeWithAnyArchive(other); return [self make: archive]; } @end // // P00 proxy // @implementation P00FileProxy + (BOOL)isP00File:(NSString *)filename { return P00File::isP00File([filename UTF8String]); } + (instancetype) make:(P00File *)archive { if (archive == NULL) return nil; return [[self alloc] initWithFile:archive]; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { P00File *archive = P00File::makeWithBuffer((const uint8_t *)buffer, length); return [self make: archive]; } + (instancetype) makeWithFile:(NSString *)path { P00File *archive = P00File::makeWithFile([path UTF8String]); return [self make: archive]; } + (instancetype) makeWithAnyArchive:(AnyArchiveProxy *)otherArchive { AnyArchive *other = (AnyArchive *)([otherArchive wrapper]->file); P00File *archive = P00File::makeWithAnyArchive(other); return [self make: archive]; } @end // // AnyDisk proxy // @implementation AnyDiskProxy + (instancetype) make:(AnyDisk *)disk { if (disk == NULL) return nil; return [[self alloc] initWithFile:disk]; } + (instancetype) make { AnyDisk *disk = new AnyDisk(); return [self make: disk]; } + (instancetype) makeWithFile:(NSString *)path { AnyDisk *disk = AnyDisk::makeWithFile([path UTF8String]); return [self make: disk]; } - (NSInteger) numberOfHalftracks { AnyDisk *disk = (AnyDisk *)([self wrapper]->file); return disk->numberOfHalftracks(); } - (void) selectHalftrack:(NSInteger)ht { AnyDisk *disk = (AnyDisk *)([self wrapper]->file); disk->selectHalftrack((unsigned)ht); } - (NSInteger) sizeOfHalftrack { AnyDisk *disk = (AnyDisk *)([self wrapper]->file); return disk->getSizeOfHalftrack(); } - (void)seekHalftrack:(NSInteger)offset { AnyDisk *disk = (AnyDisk *)([self wrapper]->file); return disk->seekHalftrack(offset); } - (NSString *)readHalftrackHex:(NSInteger)num { AnyDisk *disk = (AnyDisk *)([self wrapper]->file); return [NSString stringWithUTF8String:disk->readHalftrackHex(num)]; } @end // // D64 proxy // @implementation D64FileProxy + (BOOL)isD64File:(NSString *)filename { return D64File::isD64File([filename UTF8String]); } + (instancetype) make:(D64File *)archive { if (archive == NULL) return nil; return [[self alloc] initWithFile:archive]; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { D64File *archive = D64File::makeWithBuffer((const uint8_t *)buffer, length); return [self make: archive]; } + (instancetype) makeWithFile:(NSString *)path { D64File *archive = D64File::makeWithFile([path UTF8String]); return [self make: archive]; } + (instancetype) makeWithAnyArchive:(AnyArchiveProxy *)otherArchive { AnyArchive *other = (AnyArchive *)([otherArchive wrapper]->file); D64File *archive = D64File::makeWithAnyArchive(other); return [self make: archive]; } + (instancetype) makeWithDisk:(DiskProxy *)disk { Disk *d = (Disk *)([disk wrapper]->disk); D64File *archive = D64File::makeWithDisk(d); return archive ? [self make: archive] : NULL; } @end // // G64 proxy // @implementation G64FileProxy + (BOOL)isG64File:(NSString *)filename { return G64File::isG64File([filename UTF8String]); } + (instancetype) make:(G64File *)archive { if (archive == NULL) return nil; return [[self alloc] initWithFile:archive]; } + (instancetype) makeWithBuffer:(const void *)buffer length:(NSInteger)length { G64File *archive = G64File::makeWithBuffer((const uint8_t *)buffer, length); return [self make: archive]; } + (instancetype) makeWithFile:(NSString *)path { G64File *archive = G64File::makeWithFile([path UTF8String]); return [self make: archive]; } + (instancetype) makeWithDisk:(DiskProxy *)diskProxy { Disk *disk = [diskProxy wrapper]->disk; G64File *archive = G64File::makeWithDisk(disk); return [self make: archive]; } @end