From cd5ebcec8bfd734e78e232c7dba0a43a13278d00 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Thu, 25 Jan 2018 19:04:16 +0900 Subject: [PATCH] [VM][FM7][KEYBOARD] Keep BREAK key when special reset (hot start). [VM][FM77][FM77AV40][FM77AV40EX] Fix FTBFSs. --- source/src/vm/fm7/fm7.cpp | 8 +++++--- source/src/vm/fm7/fm7_common.h | 3 +++ source/src/vm/fm7/fm7_keyboard.h | 2 ++ source/src/vm/fm7/fm7_mainio.cpp | 3 ++- source/src/vm/fm7/fm7_mainio.h | 3 +-- source/src/vm/fm7/keyboard.cpp | 19 +++++++++++++++---- 6 files changed, 28 insertions(+), 10 deletions(-) diff --git a/source/src/vm/fm7/fm7.cpp b/source/src/vm/fm7/fm7.cpp index 6fabebde4..b5da9b51e 100644 --- a/source/src/vm/fm7/fm7.cpp +++ b/source/src/vm/fm7/fm7.cpp @@ -700,18 +700,20 @@ void VM::reset() void VM::special_reset() { // BREAK + RESET - mainio->write_signal(FM7_MAINIO_PUSH_BREAK, 1, 1); mainio->reset(); mainmem->reset(); + //mainio->write_signal(FM7_MAINIO_PUSH_BREAK, 1, 1); + //keyboard->write_signal(SIG_FM7KEY_OVERRIDE_PRESS_BREAK, 0xffffffff, 0xffffffff); #if defined(FM77AV_VARIANTS) mainio->write_signal(FM7_MAINIO_HOT_RESET, 1, 1); #endif display->reset(); subcpu->reset(); - mainio->write_signal(FM7_MAINIO_PUSH_BREAK, 1, 1); maincpu->reset(); - event->register_event(mainio, EVENT_UP_BREAK, 10000.0 * 1000.0, false, NULL); + mainio->write_signal(FM7_MAINIO_PUSH_BREAK, 1, 1); + keyboard->write_signal(SIG_FM7KEY_OVERRIDE_PRESS_BREAK, 0xffffffff, 0xffffffff); + event->register_event(mainio, EVENT_UP_BREAK, 1000.0 * 1000.0, false, NULL); } void VM::run() diff --git a/source/src/vm/fm7/fm7_common.h b/source/src/vm/fm7/fm7_common.h index 28ad7078c..af6dd7804 100644 --- a/source/src/vm/fm7/fm7_common.h +++ b/source/src/vm/fm7/fm7_common.h @@ -100,6 +100,8 @@ enum { EVENT_TIMERIRQ_OFF, EVENT_FD_MOTOR_ON, EVENT_FD_MOTOR_OFF, + EVENT_FD_MOTOR_ON_2HD, + EVENT_FD_MOTOR_OFF_2HD, EVENT_FM7MAINIO_ATTENTION, EVENT_FM7MAINIO_SUBBUSY_SET, EVENT_FM7MAINIO_SUBBUSY_RESET, @@ -307,6 +309,7 @@ enum { SIG_FM7KEY_BREAK_KEY, SIG_FM7KEY_PUSH_TO_ENCODER, SIG_FM7KEY_LED_STATUS, + SIG_FM7KEY_OVERRIDE_PRESS_BREAK, }; enum { diff --git a/source/src/vm/fm7/fm7_keyboard.h b/source/src/vm/fm7/fm7_keyboard.h index 6b52766ee..df11bd4ba 100644 --- a/source/src/vm/fm7/fm7_keyboard.h +++ b/source/src/vm/fm7/fm7_keyboard.h @@ -64,6 +64,8 @@ private: uint8_t datareg; uint32_t older_vk; + bool override_break_key; + #if defined(_FM77AV_VARIANTS) dll_cur_time_t cur_time; uint8_t rtc_yy; diff --git a/source/src/vm/fm7/fm7_mainio.cpp b/source/src/vm/fm7/fm7_mainio.cpp index 3edbab9c4..607ef4708 100644 --- a/source/src/vm/fm7/fm7_mainio.cpp +++ b/source/src/vm/fm7/fm7_mainio.cpp @@ -1813,6 +1813,7 @@ void FM7_MAINIO::event_callback(int event_id, int err) event_beep_cycle(); break; case EVENT_UP_BREAK: + keyboard->write_signal(SIG_FM7KEY_OVERRIDE_PRESS_BREAK, 0, 0xffffffff); set_break_key(false); break; //#if !defined(_FM8) @@ -1974,7 +1975,7 @@ void FM7_MAINIO::save_state_main(FILEIO *state_fio) state_fio->FputInt32_BE(event_fdc_motor); #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \ defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX) - for(ch = 0; ch < 4; ch++) state_fio->FputUint8(fdc_drive_table[ch]); + for(int ch = 0; ch < 4; ch++) state_fio->FputUint8(fdc_drive_table[ch]); state_fio->FputUint8(fdc_reg_fd1e); #endif #if defined(HAS_DMA) diff --git a/source/src/vm/fm7/fm7_mainio.h b/source/src/vm/fm7/fm7_mainio.h index dbbef4576..5b35ead53 100644 --- a/source/src/vm/fm7/fm7_mainio.h +++ b/source/src/vm/fm7/fm7_mainio.h @@ -40,7 +40,7 @@ class FM7_MAINIO : public DEVICE { int event_beep_oneshot; int event_timerirq; int event_fdc_motor; - int event_fdc_2HD_motor; + int event_fdc_motor_2HD; outputs_t clock_status; outputs_t printer_reset_bus; outputs_t printer_strobe_bus; @@ -105,7 +105,6 @@ class FM7_MAINIO : public DEVICE { bool stat_kanjirom; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only. bool stat_400linemode; // R/W : bit3, '0' = 400line, '1' = 200line. #elif defined(_FM77_VARIANTS) - bool stat_fdmode_2hd; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only. bool stat_kanjirom; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only. bool stat_400linecard;// R/W : bit4, '0' = connected. FM-77 Only. //bool stat_400linemode; // R/W : bit3, '0' = 400line, '1' = 200line. diff --git a/source/src/vm/fm7/keyboard.cpp b/source/src/vm/fm7/keyboard.cpp index f20dfa75d..468633993 100644 --- a/source/src/vm/fm7/keyboard.cpp +++ b/source/src/vm/fm7/keyboard.cpp @@ -124,7 +124,9 @@ void KEYBOARD::set_modifiers(uint8_t sc, bool flag) if(keymode == KEYMODE_STANDARD) kana_led_status = kana_pressed; } } else if(sc == 0x5c) { // Break - break_pressed = flag; + if(!override_break_key) { + break_pressed = flag; + } } } @@ -614,6 +616,7 @@ void KEYBOARD::reset_unchange_mode(void) repeat_keycode = 0x00; autokey_backup = 0x00; + if(override_break_key) write_signals(&break_line, (break_pressed) ? 0xff : 0); #if defined(_FM77AV_VARIANTS) cmd_fifo->clear(); data_fifo->clear(); @@ -655,7 +658,9 @@ void KEYBOARD::reset(void) did_hidden_message_av_1 = false; beep_phase = 0; #endif - + + if(override_break_key) write_signals(&break_line, (break_pressed) ? 0xff : 0); + if(event_int >= 0) cancel_event(this, event_int); register_event(this, ID_KEYBOARD_INT, @@ -974,6 +979,8 @@ void KEYBOARD::write_signal(int id, uint32_t data, uint32_t mask) { if(id == SIG_FM7KEY_SET_INSLED) { ins_led_status = ((data & mask) != 0); + } else if(id == SIG_FM7KEY_OVERRIDE_PRESS_BREAK) { + override_break_key = ((data & mask) != 0); } #if defined(_FM77AV_VARIANTS) else if(id == SIG_FM7KEY_PUSH_TO_ENCODER) { @@ -1164,6 +1171,7 @@ KEYBOARD::KEYBOARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_em autokey_backup = 0x00; keymode = KEYMODE_STANDARD; + override_break_key = false; #if defined(_FM77AV_VARIANTS) cmd_fifo = new FIFO(16); data_fifo = new FIFO(16); @@ -1217,7 +1225,7 @@ KEYBOARD::~KEYBOARD() { } -#define STATE_VERSION 5 +#define STATE_VERSION 6 #if defined(Q_OS_WIN) DLL_PREFIX_I struct cur_time_s cur_time; #endif @@ -1300,6 +1308,8 @@ void KEYBOARD::save_state(FILEIO *state_fio) state_fio->FputBool(ins_led_status); state_fio->FputBool(kana_led_status); state_fio->FputBool(caps_led_status); + // Version 6 + state_fio->FputBool(override_break_key); } bool KEYBOARD::load_state(FILEIO *state_fio) @@ -1382,7 +1392,8 @@ bool KEYBOARD::load_state(FILEIO *state_fio) ins_led_status = state_fio->FgetBool(); kana_led_status = state_fio->FgetBool(); caps_led_status = state_fio->FgetBool(); - + // Version 6 + override_break_key = state_fio->FgetBool(); if(version == STATE_VERSION) { return true; -- 2.11.0