2016-05-28 11:01:13 +00:00
|
|
|
//
|
|
|
|
// Emulator.m
|
|
|
|
// Mini vMac
|
|
|
|
//
|
|
|
|
// Created by Jesús A. Álvarez on 27/05/2016.
|
|
|
|
// Copyright © 2016 namedfork. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#import "Emulator.h"
|
|
|
|
#include "CNFGRAPI.h"
|
|
|
|
#include "SYSDEPNS.h"
|
|
|
|
#include "ENDIANAC.h"
|
|
|
|
#include "MYOSGLUE.h"
|
|
|
|
|
|
|
|
IMPORTPROC RunEmulator(void);
|
|
|
|
IMPORTFUNC blnr GetSpeedStopped(void);
|
|
|
|
IMPORTPROC SetSpeedStopped(blnr stopped);
|
|
|
|
IMPORTPROC SetMouseButton(blnr down);
|
|
|
|
IMPORTPROC SetMouseLoc(ui4r h, ui4r v);
|
|
|
|
IMPORTPROC SetMouseDelta(ui4r dh, ui4r dv);
|
|
|
|
IMPORTFUNC blnr Sony_Insert1(NSString *filePath, blnr silentfail);
|
|
|
|
IMPORTFUNC blnr Sony_IsInserted(NSString *filePath);
|
|
|
|
IMPORTPROC SetKeyState(int key, blnr down);
|
|
|
|
|
|
|
|
static Emulator *sharedEmulator = nil;
|
|
|
|
static dispatch_once_t onceToken;
|
|
|
|
|
|
|
|
@implementation Emulator
|
|
|
|
|
|
|
|
@synthesize dataPath;
|
|
|
|
|
|
|
|
+ (instancetype)sharedEmulator {
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
|
sharedEmulator = [self new];
|
|
|
|
});
|
|
|
|
return sharedEmulator;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)init {
|
|
|
|
if ((self = [super init])) {
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
|
sharedEmulator = self;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
- (void)run {
|
|
|
|
SpeedValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"speedValue"];
|
|
|
|
if (SpeedValue > 3) {
|
|
|
|
SpeedValue = 3;
|
|
|
|
}
|
|
|
|
RunEmulator();
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSInteger)initialSpeed {
|
|
|
|
return WantInitSpeedValue;
|
|
|
|
}
|
|
|
|
|
2016-05-28 20:20:55 +00:00
|
|
|
- (NSBundle *)bundle {
|
|
|
|
return [NSBundle bundleForClass:self.class];
|
|
|
|
}
|
|
|
|
|
2016-05-28 11:01:13 +00:00
|
|
|
- (NSInteger)speed {
|
|
|
|
return SpeedValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setSpeed:(NSInteger)speed {
|
|
|
|
SpeedValue = speed;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)isRunning {
|
|
|
|
return !GetSpeedStopped();
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setRunning:(BOOL)running {
|
|
|
|
SetSpeedStopped(running ? falseblnr : trueblnr);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)interrupt {
|
|
|
|
WantMacInterrupt = trueblnr;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)reset {
|
|
|
|
WantMacReset = trueblnr;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark - Screen
|
|
|
|
|
|
|
|
@synthesize screenLayer;
|
|
|
|
|
|
|
|
- (CGSize)screenSize {
|
|
|
|
return CGSizeMake(vMacScreenWidth, vMacScreenHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)updateScreen:(CGImageRef)screenImage {
|
|
|
|
screenLayer.contents = (__bridge id)screenImage;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark - Disk
|
|
|
|
|
|
|
|
@synthesize insertDiskNotification, ejectDiskNotification;
|
|
|
|
|
|
|
|
- (BOOL)anyDiskInserted {
|
|
|
|
return AnyDiskInserted();
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)isDiskInserted:(NSString *)path {
|
|
|
|
return Sony_IsInserted(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)insertDisk:(NSString *)path {
|
|
|
|
return Sony_Insert1(path, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *)insertDiskNotification {
|
|
|
|
return @"didInsertDisk";
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *)ejectDiskNotification {
|
|
|
|
return @"didEjectDisk";
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark - Keyboard
|
|
|
|
|
|
|
|
- (int)translateScanCode:(int)scancode {
|
|
|
|
switch (scancode) {
|
|
|
|
case 54: return 59; // left control
|
|
|
|
case 59: return 70; // arrow left
|
|
|
|
case 60: return 66; // arrow right
|
|
|
|
case 61: return 72; // arrow down
|
|
|
|
case 62: return 77; // arrow up
|
|
|
|
default: return scancode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)keyDown:(int)scancode {
|
|
|
|
SetKeyState([self translateScanCode:scancode], true);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)keyUp:(int)scancode {
|
|
|
|
SetKeyState([self translateScanCode:scancode], false);
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark - Mouse
|
|
|
|
|
|
|
|
- (void)setMouseX:(NSInteger)x Y:(NSInteger)y {
|
|
|
|
SetMouseLoc(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)moveMouseX:(NSInteger)x Y:(NSInteger)y {
|
|
|
|
SetMouseDelta(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setMouseButton:(BOOL)down {
|
|
|
|
SetMouseButton(down);
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|