mirror of
https://github.com/TomHarte/CLK.git
synced 2025-01-13 07:30:21 +00:00
Established a general pattern for machines that can type things. Started working on the Vic typing itself.
This commit is contained in:
parent
960cae15b1
commit
e7aeed2f03
47
Machines/Typer.cpp
Normal file
47
Machines/Typer.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
//
|
||||
// Typer.cpp
|
||||
// Clock Signal
|
||||
//
|
||||
// Created by Thomas Harte on 19/06/2016.
|
||||
// Copyright © 2016 Thomas Harte. All rights reserved.
|
||||
//
|
||||
|
||||
#include "Typer.hpp"
|
||||
#include <stdlib.h>
|
||||
|
||||
using namespace Utility;
|
||||
|
||||
Typer::Typer(const char *string, int delay, int frequency, Delegate *delegate) :
|
||||
_counter(-delay), _frequency(frequency), _string(strdup(string)), _string_pointer(0), _delegate(delegate) {}
|
||||
|
||||
void Typer::update(int duration)
|
||||
{
|
||||
if(_string)
|
||||
{
|
||||
if(_counter < 0 && _counter + duration >= 0)
|
||||
{
|
||||
_delegate->typer_set_next_character(this, _string[_string_pointer]);
|
||||
_string_pointer++;
|
||||
}
|
||||
|
||||
_counter += duration;
|
||||
while(_counter > _frequency)
|
||||
{
|
||||
_counter -= _frequency;
|
||||
_delegate->typer_set_next_character(this, _string[_string_pointer]);
|
||||
_string_pointer++;
|
||||
|
||||
if(!_string[_string_pointer])
|
||||
{
|
||||
free(_string);
|
||||
_string = nullptr;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Typer::~Typer()
|
||||
{
|
||||
free(_string);
|
||||
}
|
50
Machines/Typer.hpp
Normal file
50
Machines/Typer.hpp
Normal file
@ -0,0 +1,50 @@
|
||||
//
|
||||
// Typer.hpp
|
||||
// Clock Signal
|
||||
//
|
||||
// Created by Thomas Harte on 19/06/2016.
|
||||
// Copyright © 2016 Thomas Harte. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef Typer_hpp
|
||||
#define Typer_hpp
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Utility {
|
||||
|
||||
class Typer {
|
||||
public:
|
||||
class Delegate {
|
||||
public:
|
||||
virtual void typer_set_next_character(Typer *typer, char character) = 0;
|
||||
};
|
||||
|
||||
Typer(const char *string, int delay, int frequency, Delegate *delegate);
|
||||
~Typer();
|
||||
void update(int duration);
|
||||
|
||||
private:
|
||||
char *_string;
|
||||
int _frequency;
|
||||
int _counter;
|
||||
Delegate *_delegate;
|
||||
size_t _string_pointer;
|
||||
};
|
||||
|
||||
class TypeRecipient: public Typer::Delegate {
|
||||
public:
|
||||
void set_typer_for_string(const char *string)
|
||||
{
|
||||
_typer = std::unique_ptr<Typer>(new Typer(string, get_typer_delay(), get_typer_frequency(), this));
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual int get_typer_delay() = 0;
|
||||
virtual int get_typer_frequency() = 0;
|
||||
std::unique_ptr<Typer> _typer;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* Typer_hpp */
|
@ -81,6 +81,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
||||
|
||||
_userPortVIA.run_for_half_cycles(2);
|
||||
_keyboardVIA.run_for_half_cycles(2);
|
||||
if(_typer) _typer->update(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -125,7 +126,8 @@ void Machine::add_prg(size_t length, const uint8_t *data)
|
||||
_rom_length = (uint16_t)(length - 2);
|
||||
if(_rom_address >= 0x1000 && _rom_address+_rom_length < 0x2000)
|
||||
{
|
||||
memcpy(&_screenMemory[_rom_address - 0x1000], &data[2], length - 2);
|
||||
set_typer_for_string("run\n");
|
||||
// memcpy(&_screenMemory[_rom_address - 0x1000], &data[2], length - 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -134,3 +136,28 @@ void Machine::add_prg(size_t length, const uint8_t *data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Typer
|
||||
|
||||
int Machine::get_typer_delay()
|
||||
{
|
||||
return 263*60*65 / 2; // wait half a second
|
||||
}
|
||||
|
||||
int Machine::get_typer_frequency()
|
||||
{
|
||||
return 2*263*65; // accept a new character every two fields
|
||||
}
|
||||
|
||||
void Machine::typer_set_next_character(::Utility::Typer *typer, char character)
|
||||
{
|
||||
clear_all_keys();
|
||||
switch(character)
|
||||
{
|
||||
case 'r': set_key_state(Key::KeyR, true); break;
|
||||
case 'u': set_key_state(Key::KeyU, true); break;
|
||||
case 'n': set_key_state(Key::KeyN, true); break;
|
||||
case '\n': set_key_state(Key::KeyReturn, true); break;
|
||||
}
|
||||
printf(".");
|
||||
}
|
||||
|
@ -12,7 +12,9 @@
|
||||
#include "../../Processors/6502/CPU6502.hpp"
|
||||
#include "../../Components/6560/6560.hpp"
|
||||
#include "../../Components/6522/6522.hpp"
|
||||
|
||||
#include "../CRTMachine.hpp"
|
||||
#include "../Typer.hpp"
|
||||
|
||||
namespace Vic20 {
|
||||
|
||||
@ -88,7 +90,12 @@ class KeyboardVIA: public MOS::MOS6522<KeyboardVIA>, public MOS::MOS6522IRQDeleg
|
||||
uint8_t _activation_mask;
|
||||
};
|
||||
|
||||
class Machine: public CPU6502::Processor<Machine>, public CRTMachine::Machine, public MOS::MOS6522IRQDelegate::Delegate {
|
||||
class Machine:
|
||||
public CPU6502::Processor<Machine>,
|
||||
public CRTMachine::Machine,
|
||||
public MOS::MOS6522IRQDelegate::Delegate,
|
||||
public Utility::TypeRecipient {
|
||||
|
||||
public:
|
||||
Machine();
|
||||
~Machine();
|
||||
@ -114,6 +121,11 @@ class Machine: public CPU6502::Processor<Machine>, public CRTMachine::Machine, p
|
||||
// to satisfy MOS::MOS6522::Delegate
|
||||
virtual void mos6522_did_change_interrupt_status(void *mos6522);
|
||||
|
||||
// for Utility::TypeRecipient
|
||||
virtual int get_typer_delay();
|
||||
virtual int get_typer_frequency();
|
||||
virtual void typer_set_next_character(Utility::Typer *typer, char character);
|
||||
|
||||
private:
|
||||
uint8_t _characterROM[0x1000];
|
||||
uint8_t _basicROM[0x2000];
|
||||
|
@ -13,6 +13,7 @@
|
||||
4B14145E1B5887AA00E04248 /* CPU6502AllRAM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414591B58879D00E04248 /* CPU6502AllRAM.cpp */; };
|
||||
4B1414601B58885000E04248 /* WolfgangLorenzTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */; };
|
||||
4B1414621B58888700E04248 /* KlausDormannTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414611B58888700E04248 /* KlausDormannTests.swift */; };
|
||||
4B1E85751D170228001EF87D /* Typer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1E85731D170228001EF87D /* Typer.cpp */; };
|
||||
4B2409551C45AB05004DA684 /* Speaker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2409531C45AB05004DA684 /* Speaker.cpp */; };
|
||||
4B2A539F1D117D36003C6002 /* CSAudioQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B2A53911D117D36003C6002 /* CSAudioQueue.m */; };
|
||||
4B2A53A01D117D36003C6002 /* CSMachine.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B2A53961D117D36003C6002 /* CSMachine.mm */; };
|
||||
@ -352,6 +353,8 @@
|
||||
4B14145A1B58879D00E04248 /* CPU6502AllRAM.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CPU6502AllRAM.hpp; sourceTree = "<group>"; };
|
||||
4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WolfgangLorenzTests.swift; sourceTree = "<group>"; };
|
||||
4B1414611B58888700E04248 /* KlausDormannTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlausDormannTests.swift; sourceTree = "<group>"; };
|
||||
4B1E85731D170228001EF87D /* Typer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Typer.cpp; sourceTree = "<group>"; };
|
||||
4B1E85741D170228001EF87D /* Typer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Typer.hpp; sourceTree = "<group>"; };
|
||||
4B2409531C45AB05004DA684 /* Speaker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Speaker.cpp; path = ../../Outputs/Speaker.cpp; sourceTree = "<group>"; };
|
||||
4B2409541C45AB05004DA684 /* Speaker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Speaker.hpp; path = ../../Outputs/Speaker.hpp; sourceTree = "<group>"; };
|
||||
4B24095A1C45DF85004DA684 /* Stepper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Stepper.hpp; sourceTree = "<group>"; };
|
||||
@ -1251,6 +1254,8 @@
|
||||
4B2E2D961C3A06EC00138695 /* Atari2600 */,
|
||||
4B2E2D9E1C3A070900138695 /* Electron */,
|
||||
4B886FF61D03B632004291C3 /* Vic-20 */,
|
||||
4B1E85731D170228001EF87D /* Typer.cpp */,
|
||||
4B1E85741D170228001EF87D /* Typer.hpp */,
|
||||
);
|
||||
name = Machines;
|
||||
path = ../../Machines;
|
||||
@ -1764,6 +1769,7 @@
|
||||
4B69FB441C4D941400B5F0AA /* TapeUEF.cpp in Sources */,
|
||||
4BBF99141C8FBA6F0075DAFB /* CRTInputBufferBuilder.cpp in Sources */,
|
||||
4B2409551C45AB05004DA684 /* Speaker.cpp in Sources */,
|
||||
4B1E85751D170228001EF87D /* Typer.cpp in Sources */,
|
||||
4B2E2D9D1C3A070400138695 /* Electron.cpp in Sources */,
|
||||
4B69FB3D1C4D908A00B5F0AA /* Tape.cpp in Sources */,
|
||||
4B55CE5D1C3B7D6F0093A61B /* CSOpenGLView.m in Sources */,
|
||||
|
Loading…
x
Reference in New Issue
Block a user