From 2e57531e86c58e1f8ad90f8e44dff29609610649 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Tue, 27 Jun 2017 18:51:02 +0900 Subject: [PATCH] [EMU] Add EMU::get_extra_leds() to get led status. [VM][FM7] Stop using DUMMYDEVICE:: . Use VM::get_extra_leds() to get led status. [VM][FM7][KEYBOARD] Update state version. --- source/src/emu.cpp | 12 +++++------ source/src/emu.h | 6 +++--- source/src/vm/fm7/fm7.cpp | 31 +++++++-------------------- source/src/vm/fm7/fm7.h | 16 +++----------- source/src/vm/fm7/fm7_common.h | 1 + source/src/vm/fm7/fm7_keyboard.h | 16 ++++---------- source/src/vm/fm7/keyboard.cpp | 45 ++++++++++++++++++++++++++-------------- 7 files changed, 55 insertions(+), 72 deletions(-) diff --git a/source/src/emu.cpp b/source/src/emu.cpp index cf4adcec5..90c173413 100644 --- a/source/src/emu.cpp +++ b/source/src/emu.cpp @@ -426,6 +426,12 @@ bool EMU::get_kana_locked() return vm->get_kana_locked(); } #endif +#ifdef USE_EXTRA_LEDS +uint32_t EMU::get_extra_leds() +{ + return vm->get_extra_leds(); +} +#endif void EMU::key_lost_focus() { @@ -2606,12 +2612,6 @@ uint32_t EMU::is_hard_disk_accessed() } #endif -#ifdef USE_LED_DEVICE -uint32_t EMU::get_led_status() -{ - return vm->get_led_status(); -} -#endif #ifdef USE_SOUND_VOLUME void EMU::set_sound_device_volume(int ch, int decibel_l, int decibel_r) diff --git a/source/src/emu.h b/source/src/emu.h index c469b915a..3804758bc 100644 --- a/source/src/emu.h +++ b/source/src/emu.h @@ -235,6 +235,9 @@ public: bool get_caps_locked(); bool get_kana_locked(); #endif +#ifdef USE_EXTRA_LEDS + uint32_t get_extra_leds(); +#endif void key_lost_focus(); #ifdef ONE_BOARD_MICRO_COMPUTER void press_button(int num); @@ -484,9 +487,6 @@ public: #ifdef USE_HARD_DISK uint32_t is_hard_disk_accessed(); #endif -#ifdef USE_LED_DEVICE - uint32_t get_led_status(void); -#endif #ifdef USE_SOUND_VOLUME void set_sound_device_volume(int ch, int decibel_l, int decibel_r); #endif diff --git a/source/src/vm/fm7/fm7.cpp b/source/src/vm/fm7/fm7.cpp index 386a74f93..99ad6a6de 100644 --- a/source/src/vm/fm7/fm7.cpp +++ b/source/src/vm/fm7/fm7.cpp @@ -40,13 +40,6 @@ #include "./bubblecasette.h" #endif -#if defined(USE_LED_DEVICE) -#include "./dummydevice.h" -#else -#define SIG_DUMMYDEVICE_BIT0 0 -#define SIG_DUMMYDEVICE_BIT1 1 -#define SIG_DUMMYDEVICE_BIT2 2 -#endif #include "./fm7_mainio.h" #include "./fm7_mainmem.h" #include "./fm7_display.h" @@ -164,11 +157,6 @@ VM::VM(EMU* parent_emu): emu(parent_emu) #ifdef CAPABLE_KANJI_CLASS2 kanjiclass2 = new KANJIROM(this, emu, true); #endif -#if defined(USE_LED_DEVICE) - led_terminate = new DUMMYDEVICE(this, emu); -#else - led_terminate = new DEVICE(this, emu); -#endif #if defined(_USE_QT) event->set_device_name(_T("EVENT")); dummy->set_device_name(_T("1st Dummy")); @@ -179,7 +167,6 @@ VM::VM(EMU* parent_emu): emu(parent_emu) # ifdef WITH_Z80 z80cpu->set_device_name(_T("Z80 CPU")); # endif - led_terminate->set_device_name(_T("LEDs")); if(fdc != NULL) fdc->set_device_name(_T("MB8877 FDC(320KB)")); // basic devices @@ -347,9 +334,6 @@ void VM::connect_bus(void) #endif keyboard->set_context_rxrdy(display, SIG_FM7KEY_RXRDY, 0x01); keyboard->set_context_key_ack(display, SIG_FM7KEY_ACK, 0x01); - keyboard->set_context_ins_led( led_terminate, SIG_DUMMYDEVICE_BIT0, 0xffffffff); - keyboard->set_context_caps_led(led_terminate, SIG_DUMMYDEVICE_BIT1, 0xffffffff); - keyboard->set_context_kana_led(led_terminate, SIG_DUMMYDEVICE_BIT2, 0xffffffff); if(drec != NULL) { drec->set_context_ear(mainio, FM7_MAINIO_CMT_RECV, 0xffffffff); @@ -537,12 +521,6 @@ double VM::get_frame_rate() return event->get_frame_rate(); } -#if defined(USE_LED_DEVICE) -uint32_t VM::get_led_status() -{ - return led_terminate->read_signal(SIG_DUMMYDEVICE_READWRITE); -} -#endif // USE_LED_DEVICE // ---------------------------------------------------------------------------- @@ -685,6 +663,13 @@ bool VM::get_kana_locked() return keyboard->get_kana_locked(); } +// Get INS status.Important with FM-7 series (^_^; +uint32_t VM::get_extra_leds() +{ + return keyboard->read_signal(SIG_FM7KEY_LED_STATUS); +} + + // ---------------------------------------------------------------------------- // user interface // ---------------------------------------------------------------------------- @@ -899,7 +884,7 @@ void VM::is_bubble_casette_protected(int drv, bool flag) #endif -#define STATE_VERSION 5 +#define STATE_VERSION 6 void VM::save_state(FILEIO* state_fio) { state_fio->FputUint32_BE(STATE_VERSION); diff --git a/source/src/vm/fm7/fm7.h b/source/src/vm/fm7/fm7.h index b07dd0087..62e5b4ed4 100644 --- a/source/src/vm/fm7/fm7.h +++ b/source/src/vm/fm7/fm7.h @@ -17,7 +17,7 @@ #define USE_DIPSWITCH #define USE_CPU_TYPE 2 #define USE_SPECIAL_RESET -#define USE_LED_DEVICE 3 +#define USE_EXTRA_LEDS 3 #define USE_MINIMUM_RENDERING 1 #define USE_MOUSE #define USE_JOYSTICK @@ -26,6 +26,7 @@ #define USE_PRINTER_TYPE 4 #define USE_AY_3_8910_AS_PSG +#define INDEPENDENT_CAPS_KANA_LED #define NOTIFY_KEY_DOWN //#define NOTIFY_KEY_UP #define NOTIFY_KEY_DOWN_LR_SHIFT @@ -375,10 +376,6 @@ class AY_3_891X; #if defined(_FM8) class BUBBLECASETTE; #endif -#if defined(USE_LED_DEVICE) -class DUMMYDEVICE; -#endif - class DISPLAY; #if defined(_FM77AV_VARIANTS) class MB61VH010; @@ -406,11 +403,6 @@ protected: MC6809* maincpu; FM7_MAINMEM* mainmem; FM7_MAINIO* mainio; -#if defined(USE_LED_DEVICE) - DUMMYDEVICE* led_terminate; -#else - DEVICE* led_terminate; -#endif MB8877* fdc; #if defined(_FM8) // FM8 @@ -479,9 +471,6 @@ public: void special_reset(); void run(); double get_frame_rate(); -#if defined(USE_LED_DEVICE) - uint32_t get_led_status(); -#endif #ifdef USE_DEBUGGER // debugger @@ -507,6 +496,7 @@ public: void key_up(int code); bool get_caps_locked(); bool get_kana_locked(); + uint32_t get_extra_leds(); // user interface void open_floppy_disk(int drv, const _TCHAR* file_path, int bank); diff --git a/source/src/vm/fm7/fm7_common.h b/source/src/vm/fm7/fm7_common.h index 7ceb88065..f41c6e903 100644 --- a/source/src/vm/fm7/fm7_common.h +++ b/source/src/vm/fm7/fm7_common.h @@ -272,6 +272,7 @@ enum { SIG_FM7KEY_ACK, // D431 SIG_FM7KEY_BREAK_KEY, SIG_FM7KEY_PUSH_TO_ENCODER, + SIG_FM7KEY_LED_STATUS, }; enum { diff --git a/source/src/vm/fm7/fm7_keyboard.h b/source/src/vm/fm7/fm7_keyboard.h index ee6164c50..6b52766ee 100644 --- a/source/src/vm/fm7/fm7_keyboard.h +++ b/source/src/vm/fm7/fm7_keyboard.h @@ -29,9 +29,6 @@ class KEYBOARD : public DEVICE { void turn_on_ins_led(void); void turn_off_ins_led(void); - outputs_t caps_led; - outputs_t kana_led; - outputs_t ins_led; #if defined(_FM77AV_VARIANTS) outputs_t rxrdy; outputs_t key_ack; @@ -50,6 +47,10 @@ private: bool caps_pressed; bool kana_pressed; bool break_pressed; + + bool ins_led_status; + bool kana_led_status; + bool caps_led_status; uint8_t read_data_reg(void); uint8_t read_stat_reg(void); @@ -154,15 +155,6 @@ private: register_output_signal(&key_ack, p, id, mask); #endif } - void set_context_caps_led(DEVICE *p, int id, uint32_t mask) { - register_output_signal(&caps_led, p, id, mask); - } - void set_context_kana_led(DEVICE *p, int id, uint32_t mask) { - register_output_signal(&kana_led, p, id, mask); - } - void set_context_ins_led(DEVICE *p, int id, uint32_t mask) { - register_output_signal(&ins_led, p, id, mask); - } void set_context_break_line(DEVICE *p, int id, uint32_t mask) { register_output_signal(&break_line, p, id, mask); } diff --git a/source/src/vm/fm7/keyboard.cpp b/source/src/vm/fm7/keyboard.cpp index 241318636..f20dfa75d 100644 --- a/source/src/vm/fm7/keyboard.cpp +++ b/source/src/vm/fm7/keyboard.cpp @@ -58,13 +58,13 @@ uint8_t KEYBOARD::get_keycode_low(void) // 0xd40d : R void KEYBOARD::turn_on_ins_led(void) { - this->write_signals(&ins_led, 0xff); + ins_led_status = true; } // 0xd40d : W void KEYBOARD::turn_off_ins_led(void) { - this->write_signals(&ins_led, 0x00); + ins_led_status = false; } // UI Handler. @@ -111,7 +111,7 @@ void KEYBOARD::set_modifiers(uint8_t sc, bool flag) } else { caps_pressed = true; } - if(keymode == KEYMODE_STANDARD) this->write_signals(&caps_led, caps_pressed ? 0xff : 0x00); + if(keymode == KEYMODE_STANDARD) caps_led_status = caps_pressed; } } else if(sc == 0x5a) { // KANA // Toggle on press. @@ -121,7 +121,7 @@ void KEYBOARD::set_modifiers(uint8_t sc, bool flag) } else { kana_pressed = true; } - if(keymode == KEYMODE_STANDARD) this->write_signals(&kana_led, kana_pressed ? 0xff : 0x00); + if(keymode == KEYMODE_STANDARD) kana_led_status = kana_pressed; } } else if(sc == 0x5c) { // Break break_pressed = flag; @@ -607,7 +607,9 @@ void KEYBOARD::reset_unchange_mode(void) graph_pressed = false; kana_pressed = false; caps_pressed = false; - // ins_pressed = false; + ins_led_status = false; + kana_led_status = false; + caps_led_status = false; datareg = 0x00; repeat_keycode = 0x00; autokey_backup = 0x00; @@ -636,9 +638,6 @@ void KEYBOARD::reset_unchange_mode(void) this->write_signals(&rxrdy, 0x00); this->write_signals(&key_ack, 0xff); #endif - this->write_signals(&kana_led, 0x00); - this->write_signals(&caps_led, 0x00); - this->write_signals(&ins_led, 0x00); } @@ -743,11 +742,11 @@ void KEYBOARD::set_leds(void) if((ledvar & 0x02) != 0) { // Kana kana_pressed = ((ledvar & 0x01) == 0); - write_signals(&kana_led, kana_pressed); + kana_led_status = kana_pressed; } else { // Caps caps_pressed = ((ledvar & 0x01) == 0); - write_signals(&caps_led, caps_pressed); + caps_led_status = caps_pressed; } } cmd_fifo->clear(); @@ -960,6 +959,12 @@ uint32_t KEYBOARD::read_signal(int id) { if(id == SIG_FM7KEY_BREAK_KEY) { return break_pressed ? 0xfffffff : 0x00000000; + } else if(id == SIG_FM7KEY_LED_STATUS) { + uint32_t _l; + _l = (ins_led_status) ? 0x00000001 : 0; + _l |= (kana_led_status) ? 0x00000002 : 0; + _l |= (caps_led_status) ? 0x00000004 : 0; + return _l; } return 0; } @@ -968,7 +973,7 @@ uint32_t KEYBOARD::read_signal(int id) void KEYBOARD::write_signal(int id, uint32_t data, uint32_t mask) { if(id == SIG_FM7KEY_SET_INSLED) { - write_signals(&ins_led, data & mask); + ins_led_status = ((data & mask) != 0); } #if defined(_FM77AV_VARIANTS) else if(id == SIG_FM7KEY_PUSH_TO_ENCODER) { @@ -1188,9 +1193,9 @@ KEYBOARD::KEYBOARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_em initialize_output_signals(&break_line); initialize_output_signals(&int_line); - initialize_output_signals(&kana_led); - initialize_output_signals(&caps_led); - initialize_output_signals(&ins_led); + ins_led_status = false; + kana_led_status = false; + caps_led_status = false; set_device_name(_T("KEYBOARD SUBSYSTEM")); } @@ -1212,7 +1217,7 @@ KEYBOARD::~KEYBOARD() { } -#define STATE_VERSION 4 +#define STATE_VERSION 5 #if defined(Q_OS_WIN) DLL_PREFIX_I struct cur_time_s cur_time; #endif @@ -1291,6 +1296,10 @@ void KEYBOARD::save_state(FILEIO *state_fio) } // Version 4 state_fio->FputUint8(autokey_backup); + // Version 5 + state_fio->FputBool(ins_led_status); + state_fio->FputBool(kana_led_status); + state_fio->FputBool(caps_led_status); } bool KEYBOARD::load_state(FILEIO *state_fio) @@ -1369,6 +1378,12 @@ bool KEYBOARD::load_state(FILEIO *state_fio) } // Version 4 autokey_backup = state_fio->FgetUint8(); + // Version 5 + ins_led_status = state_fio->FgetBool(); + kana_led_status = state_fio->FgetBool(); + caps_led_status = state_fio->FgetBool(); + + if(version == STATE_VERSION) { return true; } -- 2.11.0