2279 lines
47 KiB
Plaintext
2279 lines
47 KiB
Plaintext
//
|
|
// 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
|