diff --git a/src/E2wxApp.cpp b/src/E2wxApp.cpp index eeedc66..b3a373c 100644 --- a/src/E2wxApp.cpp +++ b/src/E2wxApp.cpp @@ -28,7 +28,7 @@ #include "e2const.h" #include -#include +#include #include #include #include @@ -213,7 +213,7 @@ void E2wxApp::OnFnKeyPressed(const SDL_Keycode k) { } else if (k == SDLK_F4) { // } else if (k == SDLK_F5) { - // + this->EmulatorCommand(); } else if (k == SDLK_F6) { this->Reset(); } else if (k == SDLK_F7) { @@ -446,3 +446,14 @@ void E2wxApp::ToggleFullScreen() { this->emu->toggleFullScreen(); } } + +static const wxString message = "Enter a command for the emulator. See https://cmosher01.github.io/Epple-II/usermanual.html"; +static const wxString title = "Emulator command"; +void E2wxApp::EmulatorCommand() { + if (this->emu) { + wxTextEntryDialog dlg(this->frame, message, title); + if (dlg.ShowModal() == wxID_OK) { + this->emu->cmd(dlg.GetValue()); + } + } +} diff --git a/src/E2wxApp.h b/src/E2wxApp.h index c73405d..2e5d63e 100644 --- a/src/E2wxApp.h +++ b/src/E2wxApp.h @@ -95,6 +95,7 @@ public: void TogglePower(); void ToggleBuffered(); void ToggleFullScreen(); + void EmulatorCommand(); virtual bool OnInit() override; virtual int OnExit() override; diff --git a/src/E2wxFrame.cpp b/src/E2wxFrame.cpp index 1384773..9f40779 100644 --- a/src/E2wxFrame.cpp +++ b/src/E2wxFrame.cpp @@ -33,6 +33,7 @@ enum E2MenuID { ID_MENUITEM_POWER = wxID_HIGHEST+1, ID_MENUITEM_CYCLE_MONITOR, ID_MENUITEM_TOGGLE_FULL_SCREEN, + ID_MENUITEM_EMULATOR_COMMAND, ID_MENUITEM_RESET, ID_MENUITEM_SCREEN_SHOT, ID_MENUITEM_TOGGLE_BUFFERED, @@ -46,6 +47,7 @@ wxBEGIN_EVENT_TABLE(E2wxFrame, wxFrame) EVT_MENU(ID_MENUITEM_POWER, E2wxFrame::OnTogglePower) EVT_MENU(ID_MENUITEM_CYCLE_MONITOR, E2wxFrame::OnCycleMonitor) EVT_MENU(ID_MENUITEM_TOGGLE_FULL_SCREEN, E2wxFrame::OnToggleFullScreen) + EVT_MENU(ID_MENUITEM_EMULATOR_COMMAND, E2wxFrame::OnEmulatorCommand) EVT_MENU(ID_MENUITEM_RESET, E2wxFrame::OnReset) EVT_MENU(wxID_PASTE, E2wxFrame::OnPaste) EVT_MENU(ID_MENUITEM_SCREEN_SHOT, E2wxFrame::OnScreenShot) @@ -97,6 +99,9 @@ void E2wxFrame::InitMenuBar() { wxMenuItem *miReset = menuMachine->Append(ID_MENUITEM_RESET, "Reset"); miReset->SetAccel(new wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F6)); menuMachine->AppendSeparator(); + wxMenuItem *miCmd = menuMachine->Append(ID_MENUITEM_EMULATOR_COMMAND, "Command..."); + miCmd->SetAccel(new wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F5)); + menuMachine->AppendSeparator(); wxMenuItem *miBuffered = menuMachine->Append(ID_MENUITEM_TOGGLE_BUFFERED, "Toggle Keyboard Buffer"); miBuffered->SetAccel(new wxAcceleratorEntry(wxACCEL_NORMAL, WXK_F12)); @@ -170,6 +175,10 @@ void E2wxFrame::OnToggleFullScreen(wxCommandEvent& event) { wxGetApp().ToggleFullScreen(); } +void E2wxFrame::OnEmulatorCommand(wxCommandEvent& event) { + wxGetApp().EmulatorCommand(); +} + void E2wxFrame::OnReset(wxCommandEvent& event) { wxGetApp().Reset(); } @@ -185,5 +194,3 @@ void E2wxFrame::OnScreenShot(wxCommandEvent& event) { void E2wxFrame::OnToggleBuffered(wxCommandEvent& event) { wxGetApp().ToggleBuffered(); } - - diff --git a/src/E2wxFrame.h b/src/E2wxFrame.h index 57fd78a..62a1624 100644 --- a/src/E2wxFrame.h +++ b/src/E2wxFrame.h @@ -45,6 +45,7 @@ private: void OnTogglePower(wxCommandEvent& event); void OnCycleMonitor(wxCommandEvent& event); void OnToggleFullScreen(wxCommandEvent& event); + void OnEmulatorCommand(wxCommandEvent& event); void OnReset(wxCommandEvent& event); void OnPaste(wxCommandEvent& event); void OnScreenShot(wxCommandEvent& event); diff --git a/src/emulator.cpp b/src/emulator.cpp index a760407..b09b1e9 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -51,9 +51,7 @@ Emulator::Emulator() : timable(nullptr), // No ticked object (NULL pointer) repeat(false), keysDown(0), - prev_ms(SDL_GetTicks()), - command(false), - pendingCommandExit(false) { + prev_ms(SDL_GetTicks()) { } Emulator::~Emulator() { @@ -106,29 +104,13 @@ void Emulator::handleAnyPendingEvents() { wxGetApp().CloseMainFrame(); break; case SDL_KEYDOWN: - // If we're collecting a command line for changing any - // of the configurables of the emulator... - if (this->command) - cmdKey(event.key); - else - // ...else we're collecting keypresses for the keyboard - // emulation (and thus the Apple ][ emulation itself) - dispatchKeyDown(event.key); - // People who have too many press-releases should be referred to as "keyboards" + // we're collecting keypresses for the keyboard + // emulation (and thus the Apple ][ emulation itself) + dispatchKeyDown(event.key); + // People who have too many press-releases should be referred to as "keyboards" break; case SDL_KEYUP: - // If we're collecting a command line for changing any - // of the configurables of the emulator... - if (this->command) { - if (this->pendingCommandExit) { - this->command = false; - this->pendingCommandExit = false; - } - } else { - // ...else we're collecting keypresses for the keyboard - // emulation (and thus the Apple ][ emulation itself) - dispatchKeyUp(event.key); - } + dispatchKeyUp(event.key); break; } } @@ -234,7 +216,6 @@ static bool translateKeysToAppleModernized(SDL_Keycode keycode, SDL_Keymod modif return false; } - return true; } @@ -258,10 +239,6 @@ void Emulator::dispatchKeyDown(const SDL_KeyboardEvent& keyEvent) { this->repeat = true; this->rept = CYCLES_PER_REPT; return; - } else if (sym == SDLK_F5) { // TODO re-do user-entered command line - this->command = true; - this->screenImage.enterCommandMode(); - return; } else if (SDLK_F1 <= sym && sym <= SDLK_F12) { wxGetApp().OnFnKeyPressed(sym); return; @@ -295,63 +272,19 @@ void Emulator::dispatchKeyUp(const SDL_KeyboardEvent& keyEvent) { - -// TODO redo command line handling -// Collect and edit a command line typed at the bottom of the emulator window -void Emulator::cmdKey(const SDL_KeyboardEvent& keyEvent) { - SDL_Keycode sym = keyEvent.keysym.sym; - unsigned char key = (unsigned char) (sym & 0x7F); - - if (sym == SDLK_RETURN) { - processCommand(); - } else if (sym == SDLK_ESCAPE) { - cmdline.erase(cmdline.begin(), cmdline.end()); - processCommand(); - } else if (sym == SDLK_BACKSPACE) { - if (cmdline.length()) { - cmdline.erase(cmdline.end() - 1); - this->screenImage.backspaceCommand(); - } - } else if (sym == SDLK_INSERT) { - std::string s = this->clip.getText(); - for (unsigned int i = 0; i < s.length(); ++i) { - key = s[i]; - if (key == '\n' || key == '\r') { - processCommand(); - break; - } else { - cmdline += key; - this->screenImage.addkeyCommand(key); - } - } - } else if (key) { - cmdline += key; - this->screenImage.addkeyCommand(key); - } -} - -// Process a command line typed at the bottom of the emulator window -void Emulator::processCommand() { - this->screenImage.exitCommandMode(); - this->screenImage.drawPower(this->timable == &this->apple2); - this->pendingCommandExit = true; - - if (cmdline.empty()) { +void Emulator::cmd(const wxString& c) { + if (c.empty()) { return; } - - E2Command{}.parseLine(cmdline, this->apple2.ram, this->apple2.rom, this->apple2.slts, this->apple2.revision, this->screenImage, this->apple2.cassetteIn, this->apple2.cassetteOut, NULL); - cmdline.erase(cmdline.begin(), cmdline.end()); + E2Command{}.parseLine( + c.c_str().AsChar(), + this->apple2.ram, this->apple2.rom, this->apple2.slts, this->apple2.revision, this->screenImage, this->apple2.cassetteIn, this->apple2.cassetteOut, nullptr); } - - - - static int askSave() { wxMessageDialog *dlg = new wxMessageDialog{ nullptr, diff --git a/src/emulator.h b/src/emulator.h index 5ce0fbf..e93da97 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -28,6 +28,7 @@ #include "hypermode.h" #include "clipboardhandler.h" #include +#include class Timable; class E2Config; @@ -51,14 +52,9 @@ class Emulator { int rept; unsigned char lastKeyDown; Uint32 prev_ms; - bool command; - bool pendingCommandExit; - std::string cmdline; void dispatchKeyDown(const SDL_KeyboardEvent& keyEvent); void dispatchKeyUp(const SDL_KeyboardEvent& keyEvent); - void cmdKey(const SDL_KeyboardEvent& keyEvent); - void processCommand(); void powerOnComputer(); void powerOffComputer(); @@ -71,6 +67,7 @@ public: void config(E2Config& cfg); void tick50ms(); + void cmd(const wxString& c); bool isSafeToQuit(); void toggleComputerPower();