Skip to content

Commit

Permalink
Рефакторинг
Browse files Browse the repository at this point in the history
  • Loading branch information
chicherov committed Mar 14, 2018
1 parent d76ab9b commit 87f2631
Show file tree
Hide file tree
Showing 117 changed files with 7,261 additions and 7,230 deletions.
32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Ретро КР580
Проект «**Ретро КР580**» — эмулятор некоторых, интересных мне, отечественных бытовых компьютеров 80-ых годов прошлого века.
Эмулятор полностью написан на **Objective-C**, является обычным приложением **macOS** и требует для своей работы *как минимум OS X Lion (10.7)*.
Последнюю версию можно скачать [здесь](https://github.com/chicherov/Retro80/releases).

## Поддерживаемые компьютеры
* Радио-86РК
* Микроша
* Партнер 01.01
* Апогей БК-01
* Микро-80
* ЮТ-88
* Специалист
* Специалист-MX
* Специалист-MX2
* Орион-128

## Встроенный отладчик
Эмуляцию можно в любой момент приостановить для отладки с помощью сочетания клавиш ⌘D.
Появится консоль отладчика, в которую будут выведены текущее содержимое регистров процессора, инструкция, находящиеся по адресу PC и приглашение к вводу команды.

## Клавиатура
Два режима работы клавиатуры.
В режиме «QWERTY» алфавитно-цифровые клавиши в целом соответствуют надписям над ними.
Набирать текст можно точно так же, как и в других приложениях macOS, в том числе вставлять текст из буфера обмена.
В зависимости от набранного символа эмулируется нажатие соответствующей клавиши в нужном регистре.
* [ВК] это **[Return ⏎]**, [ПС]**[Enter ⌤]** или **[fn] + [Return ⏎]**.
* [СТР]**[Delete ⌦]** или **[fn] + [Backspace ⌫]**
* []**[fn] + []**
* [СС]**[Shift ⇧]**, в режиме «QWERTY» может игнорироваться.
* [УС]**[Control]**
* [РУС/ЛАТ]**[Option ⌥]** или **[Capslock ⇪]** для Микро-80/ЮТ-88
184 changes: 139 additions & 45 deletions Retro80.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

8 changes: 2 additions & 6 deletions Retro80/Apogeo.h
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
/*****
Проект «Ретро КР580» (http://uart.myqnapcloud.com/retro80.html)
Copyright © 2014-2016 Andrey Chicherov <chicherov@mac.com>
Проект «Ретро КР580» (https://github.com/chicherov/Retro80)
Copyright © 2014-2018 Andrey Chicherov <chicherov@mac.com>
ПЭВМ «Апогей БК-01»
*****/

#import "RK86Base.h"
#import "ROMDisk.h"

@interface Apogeo : RK86Base

@property ROMDisk *ext;

@end
103 changes: 24 additions & 79 deletions Retro80/Apogeo.m
Original file line number Diff line number Diff line change
@@ -1,111 +1,61 @@
/*****
Проект «Ретро КР580» (http://uart.myqnapcloud.com/retro80.html)
Copyright © 2014-2016 Andrey Chicherov <chicherov@mac.com>
Проект «Ретро КР580» (https://github.com/chicherov/Retro80)
Copyright © 2014-2018 Andrey Chicherov <chicherov@mac.com>
ПЭВМ «Апогей БК-01»
*****/

#import "Apogeo.h"
#import "RKSDCard.h"

@implementation Apogeo

+ (NSString *) title
+ (NSString *)title
{
return @"Апогей БК-01";
}

+ (NSArray *) extensions
{
return @[@"rka"];
}

// -----------------------------------------------------------------------------
// validateMenuItem
// -----------------------------------------------------------------------------

- (BOOL) validateMenuItem:(NSMenuItem *)menuItem
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
if (menuItem.action == @selector(colorModule:))
{
menuItem.state = self.isColor;
return YES;
}

if (menuItem.action == @selector(ROMDisk:) && menuItem.tag == 0)
{
NSURL *url = [self.ext URL]; if ((menuItem.state = url != nil))
menuItem.title = [((NSString *)[menuItem.title componentsSeparatedByString:@":"].firstObject) stringByAppendingFormat:@": %@", url.lastPathComponent];
else
menuItem.title = [menuItem.title componentsSeparatedByString:@":"].firstObject;

menuItem.submenu = nil;
return YES;
menuItem.hidden = menuItem.tag != 0;
menuItem.state = self.colorScheme != 0;
return menuItem.tag == 0;
}

return [super validateMenuItem:menuItem];
}

// -----------------------------------------------------------------------------
// Модуль цветности
// -----------------------------------------------------------------------------

static uint32_t colors[] =
{
0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFFFF, 0xFFFFFF00,
0xFF00FFFF, 0xFF00FF00, 0xFF00FFFF, 0xFF00FF00,
0xFFFF00FF, 0xFFFF0000, 0xFFFF00FF, 0xFFFF0000,
0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000
static uint32_t colors[] = {
0xFFFFFFFF, 0xFFFFFF00, 0xFFFFFFFF, 0xFFFFFF00, 0xFF00FFFF, 0xFF00FF00, 0xFF00FFFF, 0xFF00FF00,
0xFFFF00FF, 0xFFFF0000, 0xFFFF00FF, 0xFFFF0000, 0xFF0000FF, 0xFF000000, 0xFF0000FF, 0xFF000000
};

- (IBAction) colorModule:(NSMenuItem *)menuItem
- (IBAction)colorModule:(NSMenuItem *)menuItem
{
[self.document registerUndoWithMenuItem:menuItem];

if ((self.isColor = !self.isColor))
[self.crt setColors:colors attributesMask:0x3F shiftMask:0x3F];
else
[self.crt setColors:NULL attributesMask:0x33 shiftMask:0x22];
}

// -----------------------------------------------------------------------------
// Внешний ROM-диск
// -----------------------------------------------------------------------------

- (IBAction) ROMDisk:(NSMenuItem *)menuItem;
{
NSOpenPanel *panel = [NSOpenPanel openPanel];
panel.allowedFileTypes = @[@"rom", @"bin"];
panel.canChooseDirectories = TRUE;
panel.title = menuItem.title;
panel.delegate = self.ext;

if ([panel runModal] == NSFileHandlingPanelOKButton && panel.URLs.count == 1)
@synchronized(self)
{
[self.document registerUndoWithMenuItem:menuItem];
self.ext.URL = panel.URLs.firstObject;
}
else if (self.ext.URL != nil)
{
[self.document registerUndoWithMenuItem:menuItem];
self.ext.URL = nil;
[self registerUndoWithMenuItem:menuItem];

if ((self.colorScheme = !self.colorScheme))
[self.crt setColors:colors attributesMask:0x3F shiftMask:0x3F];
else
[self.crt setColors:NULL attributesMask:0x33 shiftMask:0x22];
}
}

// -----------------------------------------------------------------------------
// createObjects
// -----------------------------------------------------------------------------

- (BOOL) createObjects
- (BOOL)createObjects
{
if ((self.rom = [[ROM alloc] initWithContentsOfResource:@"Apogeo" mask:0x0FFF]) == nil)
return FALSE;

if ((self.ram = [[RAM alloc] initWithLength:0xEC00 mask:0xFFFF]) == nil)
return FALSE;

if ((self.ext = [[ROMDisk alloc] init]) == nil)
if ((self.ext = [[RKSDCard alloc] init]) == nil)
return FALSE;

if (![super createObjects])
Expand All @@ -117,18 +67,13 @@ - (BOOL) createObjects
self.snd.channel1 = TRUE;
self.snd.channel2 = TRUE;

self.isColor = TRUE;

self.colorScheme = TRUE;
return TRUE;
}

// -----------------------------------------------------------------------------
// mapObjects
// -----------------------------------------------------------------------------

- (BOOL) mapObjects
- (BOOL)mapObjects
{
if (self.isColor)
if (self.colorScheme)
[self.crt setColors:colors attributesMask:0x3F shiftMask:0x3F];
else
[self.crt setColors:NULL attributesMask:0x33 shiftMask:0x22];
Expand Down
10 changes: 10 additions & 0 deletions Retro80/ApplicationDelegate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/*****
Проект «Ретро КР580» (https://github.com/chicherov/Retro80)
Copyright © 2014-2018 Andrey Chicherov <chicherov@mac.com>
*****/

@interface ApplicationDelegate : NSObject <NSApplicationDelegate>

@end
41 changes: 41 additions & 0 deletions Retro80/ApplicationDelegate.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*****
Проект «Ретро КР580» (https://github.com/chicherov/Retro80)
Copyright © 2014-2018 Andrey Chicherov <chicherov@mac.com>
*****/

#import "ApplicationDelegate.h"

@implementation ApplicationDelegate

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
if (menuItem.action == @selector(inpHook:) || menuItem.action == @selector(outHook:) || menuItem.action == @selector(qwerty:))
{
menuItem.hidden = menuItem.tag != 0;
}
else
{
menuItem.hidden = TRUE;
}

menuItem.alternate = FALSE;
menuItem.state = FALSE;
return NO;
}

- (IBAction)inpHook:(id)sender {}
- (IBAction)outHook:(id)sender {}
- (IBAction)qwerty:(id)sender {}
- (IBAction)ramfos:(id)sender {}

- (IBAction)extraMemory:(id)sender {}
- (IBAction)ROMDisk:(id)sender {}
- (IBAction)floppy:(id)sender {}

- (IBAction)colorModule:(id)sender {}
- (IBAction)UT88:(id)sender {}
- (IBAction)VI53:(id)sender {}

@end
52 changes: 52 additions & 0 deletions Retro80/Computer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*****
Проект «Ретро КР580» (https://github.com/chicherov/Retro80)
Copyright © 2014-2018 Andrey Chicherov <chicherov@mac.com>
Базовый класс ретрокомпьютера
*****/

@class Document;

@class Display;
@class Sound;
@class Debug;

@protocol Enabled
@property(nonatomic,getter=isEnabled) BOOL enabled;
@end

@interface Computer : NSResponder<NSCoding>

@property(class, nonatomic, readonly) NSString *title;

@property(nonatomic, assign) Document *document;
@property(nonatomic, assign) Display *display;
@property(nonatomic, assign) Sound *sound;
@property(nonatomic, assign) Debug *debug;

@property(nonatomic, readonly) unsigned quartz;
@property(nonatomic, readonly) uint64_t clock;

@property(nonatomic, strong, readonly) NSObject<Enabled> *inpHook;
@property(nonatomic, strong, readonly) NSObject<Enabled> *outHook;

- (void)registerUndoWithMenuItem:(NSMenuItem *)menuItem;

- (BOOL)execute:(uint64_t)clki;

- (void)start;
- (void)stop;

- (instancetype)initWithQuartz:(unsigned)quartz NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;

- (BOOL)createObjects;
- (BOOL)mapObjects;

- (BOOL)decodeWithCoder:(NSCoder *)coder;
- (void)encodeWithCoder:(NSCoder *)coder;

@end
Loading

0 comments on commit 87f2631

Please sign in to comment.