1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-30 22:29:56 +00:00

Implemented full paste ability for any machine that is a typer.

This commit is contained in:
Thomas Harte 2016-06-19 16:35:04 -04:00
parent 3fc472d5cb
commit ef3ed1f436
5 changed files with 84 additions and 96 deletions

View File

@ -138,7 +138,7 @@ void Machine::add_prg(size_t length, const uint8_t *data)
int Machine::get_typer_delay() int Machine::get_typer_delay()
{ {
return 1*263*60*65; // wait two seconds return get_reset_line() ? 1*263*60*65 : 0; // wait two seconds if resetting
} }
int Machine::get_typer_frequency() int Machine::get_typer_frequency()
@ -173,102 +173,58 @@ bool Machine::typer_set_next_character(::Utility::Typer *typer, char character,
{KeySpace, TerminateSequence}, // space {KeySpace, TerminateSequence}, // space
{KeyLShift, Key1, TerminateSequence}, // ! {KeyLShift, Key1, TerminateSequence}, {KeyLShift, Key2, TerminateSequence}, // !, "
{KeyLShift, Key2, TerminateSequence}, // " {KeyLShift, Key3, TerminateSequence}, {KeyLShift, Key4, TerminateSequence}, // #, $
{KeyLShift, Key3, TerminateSequence}, // # {KeyLShift, Key5, TerminateSequence}, {KeyLShift, Key6, TerminateSequence}, // %, &
{KeyLShift, Key4, TerminateSequence}, // $ {KeyLShift, Key7, TerminateSequence}, {KeyLShift, Key8, TerminateSequence}, // ', (
{KeyLShift, Key5, TerminateSequence}, // % {KeyLShift, Key9, TerminateSequence}, {KeyAsterisk, TerminateSequence}, // ), *
{KeyLShift, Key6, TerminateSequence}, // & {KeyPlus, TerminateSequence}, {KeyComma, TerminateSequence}, // +, ,
{KeyLShift, Key7, TerminateSequence}, // ' {KeyDash, TerminateSequence}, {KeyFullStop, TerminateSequence}, // -, .
{KeyLShift, Key8, TerminateSequence}, // ( {KeySlash, TerminateSequence}, // /
{KeyLShift, Key9, TerminateSequence}, // )
{KeyAsterisk, TerminateSequence}, // * {Key0, TerminateSequence}, {Key1, TerminateSequence}, // 0, 1
{KeyPlus, TerminateSequence}, // + {Key2, TerminateSequence}, {Key3, TerminateSequence}, // 2, 3
{KeyComma, TerminateSequence}, // , {Key4, TerminateSequence}, {Key5, TerminateSequence}, // 4, 5
{KeyDash, TerminateSequence}, // - {Key6, TerminateSequence}, {Key7, TerminateSequence}, // 6, 7
{KeyFullStop, TerminateSequence}, // . {Key8, TerminateSequence}, {Key9, TerminateSequence}, // 8, 9
{KeySlash, TerminateSequence}, // /
{Key0, TerminateSequence}, // 0 {KeyColon, TerminateSequence}, {KeySemicolon, TerminateSequence}, // :, ;
{Key1, TerminateSequence}, // 1 {KeyLShift, KeyComma, TerminateSequence}, {KeyEquals, TerminateSequence}, // <, =
{Key2, TerminateSequence}, // 2 {KeyLShift, KeyFullStop, TerminateSequence}, {KeyLShift, KeySlash, TerminateSequence}, // >, ?
{Key3, TerminateSequence}, // 3
{Key4, TerminateSequence}, // 4
{Key5, TerminateSequence}, // 5
{Key6, TerminateSequence}, // 6
{Key7, TerminateSequence}, // 7
{Key8, TerminateSequence}, // 8
{Key9, TerminateSequence}, // 9
{KeyColon, TerminateSequence}, // :
{KeySemicolon, TerminateSequence}, // ;
{KeyLShift, KeyComma, TerminateSequence}, // <
{KeyEquals, TerminateSequence}, // =
{KeyLShift, KeyFullStop, TerminateSequence}, // >
{KeyLShift, KeySlash, TerminateSequence}, // ?
{KeyAt, TerminateSequence}, // @ {KeyAt, TerminateSequence}, // @
{KeyA, TerminateSequence}, // A {KeyA, TerminateSequence}, {KeyB, TerminateSequence}, {KeyC, TerminateSequence}, {KeyD, TerminateSequence}, // A, B, C, D
{KeyB, TerminateSequence}, // B {KeyE, TerminateSequence}, {KeyF, TerminateSequence}, {KeyG, TerminateSequence}, {KeyH, TerminateSequence}, // E, F, G, H
{KeyC, TerminateSequence}, // C {KeyI, TerminateSequence}, {KeyJ, TerminateSequence}, {KeyK, TerminateSequence}, {KeyL, TerminateSequence}, // I, J, K L
{KeyD, TerminateSequence}, // D {KeyM, TerminateSequence}, {KeyN, TerminateSequence}, {KeyO, TerminateSequence}, {KeyP, TerminateSequence}, // M, N, O, P
{KeyE, TerminateSequence}, // E {KeyQ, TerminateSequence}, {KeyR, TerminateSequence}, {KeyS, TerminateSequence}, {KeyT, TerminateSequence}, // Q, R, S, T
{KeyF, TerminateSequence}, // F {KeyU, TerminateSequence}, {KeyV, TerminateSequence}, {KeyW, TerminateSequence}, {KeyX, TerminateSequence}, // U, V, W X
{KeyG, TerminateSequence}, // G {KeyY, TerminateSequence}, {KeyZ, TerminateSequence}, // Y, Z
{KeyH, TerminateSequence}, // H
{KeyI, TerminateSequence}, // I
{KeyJ, TerminateSequence}, // J
{KeyK, TerminateSequence}, // K
{KeyL, TerminateSequence}, // L
{KeyM, TerminateSequence}, // M
{KeyN, TerminateSequence}, // N
{KeyO, TerminateSequence}, // O
{KeyP, TerminateSequence}, // P
{KeyQ, TerminateSequence}, // Q
{KeyR, TerminateSequence}, // R
{KeyS, TerminateSequence}, // S
{KeyT, TerminateSequence}, // T
{KeyU, TerminateSequence}, // U
{KeyV, TerminateSequence}, // V
{KeyW, TerminateSequence}, // W
{KeyX, TerminateSequence}, // X
{KeyY, TerminateSequence}, // Y
{KeyZ, TerminateSequence}, // Z
{KeyLShift, KeyColon, TerminateSequence}, // [ {KeyLShift, KeyColon, TerminateSequence}, {NotMapped}, // [, '\'
{NotMapped}, // '\' {KeyLShift, KeyFullStop, TerminateSequence}, {NotMapped}, // ], ^
{KeyLShift, KeyFullStop, TerminateSequence}, // ] {NotMapped}, {NotMapped}, // _, `
{NotMapped}, // ^
{NotMapped}, // _
{NotMapped}, // `
{KeyLShift, KeyA, TerminateSequence}, // A {KeyA, TerminateSequence}, {KeyB, TerminateSequence}, {KeyC, TerminateSequence}, {KeyD, TerminateSequence}, // A, B, C, D
{KeyLShift, KeyB, TerminateSequence}, // B {KeyE, TerminateSequence}, {KeyF, TerminateSequence}, {KeyG, TerminateSequence}, {KeyH, TerminateSequence}, // E, F, G, H
{KeyLShift, KeyC, TerminateSequence}, // C {KeyI, TerminateSequence}, {KeyJ, TerminateSequence}, {KeyK, TerminateSequence}, {KeyL, TerminateSequence}, // I, J, K L
{KeyLShift, KeyD, TerminateSequence}, // D {KeyM, TerminateSequence}, {KeyN, TerminateSequence}, {KeyO, TerminateSequence}, {KeyP, TerminateSequence}, // M, N, O, P
{KeyLShift, KeyE, TerminateSequence}, // E {KeyQ, TerminateSequence}, {KeyR, TerminateSequence}, {KeyS, TerminateSequence}, {KeyT, TerminateSequence}, // Q, R, S, T
{KeyLShift, KeyF, TerminateSequence}, // F {KeyU, TerminateSequence}, {KeyV, TerminateSequence}, {KeyW, TerminateSequence}, {KeyX, TerminateSequence}, // U, V, W X
{KeyLShift, KeyG, TerminateSequence}, // G {KeyY, TerminateSequence}, {KeyZ, TerminateSequence}, // Y, Z
{KeyLShift, KeyH, TerminateSequence}, // H // {KeyLShift, KeyA, TerminateSequence}, {KeyLShift, KeyB, TerminateSequence}, // a, b
{KeyLShift, KeyI, TerminateSequence}, // I // {KeyLShift, KeyC, TerminateSequence}, {KeyLShift, KeyD, TerminateSequence}, // c, d
{KeyLShift, KeyJ, TerminateSequence}, // J // {KeyLShift, KeyE, TerminateSequence}, {KeyLShift, KeyF, TerminateSequence}, // e, f
{KeyLShift, KeyK, TerminateSequence}, // K // {KeyLShift, KeyG, TerminateSequence}, {KeyLShift, KeyH, TerminateSequence}, // g, h
{KeyLShift, KeyL, TerminateSequence}, // L // {KeyLShift, KeyI, TerminateSequence}, {KeyLShift, KeyJ, TerminateSequence}, // i, j
{KeyLShift, KeyM, TerminateSequence}, // M // {KeyLShift, KeyK, TerminateSequence}, {KeyLShift, KeyL, TerminateSequence}, // k, l
{KeyLShift, KeyN, TerminateSequence}, // N // {KeyLShift, KeyM, TerminateSequence}, {KeyLShift, KeyN, TerminateSequence}, // m, n
{KeyLShift, KeyO, TerminateSequence}, // O // {KeyLShift, KeyO, TerminateSequence}, {KeyLShift, KeyP, TerminateSequence}, // o, p
{KeyLShift, KeyP, TerminateSequence}, // P // {KeyLShift, KeyQ, TerminateSequence}, {KeyLShift, KeyR, TerminateSequence}, // q, r
{KeyLShift, KeyQ, TerminateSequence}, // Q // {KeyLShift, KeyS, TerminateSequence}, {KeyLShift, KeyT, TerminateSequence}, // s, t
{KeyLShift, KeyR, TerminateSequence}, // R // {KeyLShift, KeyU, TerminateSequence}, {KeyLShift, KeyV, TerminateSequence}, // u, v
{KeyLShift, KeyS, TerminateSequence}, // S // {KeyLShift, KeyW, TerminateSequence}, {KeyLShift, KeyX, TerminateSequence}, // w, x
{KeyLShift, KeyT, TerminateSequence}, // T // {KeyLShift, KeyY, TerminateSequence}, {KeyLShift, KeyZ, TerminateSequence}, // y, z
{KeyLShift, KeyU, TerminateSequence}, // U
{KeyLShift, KeyV, TerminateSequence}, // V
{KeyLShift, KeyW, TerminateSequence}, // W
{KeyLShift, KeyX, TerminateSequence}, // X
{KeyLShift, KeyY, TerminateSequence}, // Y
{KeyLShift, KeyZ, TerminateSequence}, // Z
}; };
Key *key_sequence = nullptr; Key *key_sequence = nullptr;
@ -277,12 +233,17 @@ bool Machine::typer_set_next_character(::Utility::Typer *typer, char character,
if(character < sizeof(key_sequences) / sizeof(*key_sequences)) if(character < sizeof(key_sequences) / sizeof(*key_sequences))
{ {
key_sequence = key_sequences[character]; key_sequence = key_sequences[character];
}
if(key_sequence && key_sequence[phase] != NotMapped) if(key_sequence[0] != NotMapped)
{ {
set_key_state(key_sequence[phase], true); if(phase > 0)
return key_sequence[phase+1] == TerminateSequence; {
set_key_state(key_sequence[phase-1], true);
return key_sequence[phase] == TerminateSequence;
}
else
return false;
}
} }
return true; return true;

View File

@ -80,6 +80,14 @@ class MachineDocument:
super.close() super.close()
} }
// MARK: the pasteboard
func paste(sender: AnyObject!) {
let pasteboard = NSPasteboard.generalPasteboard()
if let string = pasteboard.stringForType(NSPasteboardTypeString) {
self.machine().paste(string)
}
}
// MARK: CSBestEffortUpdaterDelegate // MARK: CSBestEffortUpdaterDelegate
final func bestEffortUpdater(bestEffortUpdater: CSBestEffortUpdater!, runForCycles cycles: UInt, didSkipPreviousUpdate: Bool) { final func bestEffortUpdater(bestEffortUpdater: CSBestEffortUpdater!, runForCycles cycles: UInt, didSkipPreviousUpdate: Bool) {
runForNumberOfCycles(Int32(cycles)) runForNumberOfCycles(Int32(cycles))

View File

@ -30,4 +30,6 @@
@property (nonatomic, weak) id<CSMachineDelegate> delegate; @property (nonatomic, weak) id<CSMachineDelegate> delegate;
@property (nonatomic, readonly) double clockRate; @property (nonatomic, readonly) double clockRate;
- (void)paste:(NSString *)string;
@end @end

View File

@ -8,6 +8,7 @@
#import "CSMachine.h" #import "CSMachine.h"
#import "CSMachine+Subclassing.h" #import "CSMachine+Subclassing.h"
#include "Typer.hpp"
@interface CSMachine() @interface CSMachine()
- (void)speaker:(Outputs::Speaker *)speaker didCompleteSamples:(const int16_t *)samples length:(int)length; - (void)speaker:(Outputs::Speaker *)speaker didCompleteSamples:(const int16_t *)samples length:(int)length;
@ -92,4 +93,10 @@ struct SpeakerDelegate: public Outputs::Speaker::Delegate {
return self.machine->get_clock_rate(); return self.machine->get_clock_rate();
} }
- (void)paste:(NSString *)paste {
Utility::TypeRecipient *typeRecipient = dynamic_cast<Utility::TypeRecipient *>(self.machine);
if(typeRecipient)
typeRecipient->set_typer_for_string([paste UTF8String]);
}
@end @end

View File

@ -1150,6 +1150,16 @@ template <class T> class Processor {
_reset_line_is_enabled = active; _reset_line_is_enabled = active;
} }
/*!
Gets the current level of the RST line.
@returns @c true if the line is logically active; @c false otherwise.
*/
inline bool get_reset_line()
{
return _reset_line_is_enabled;
}
/*! /*!
Sets the current level of the IRQ line. Sets the current level of the IRQ line.