From 57a064cd1b0f01b7cd4f040a7a44194dc33a2a53 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Fri, 25 Sep 2020 22:31:10 +0900 Subject: [PATCH] [VM][FMTOWNS][KEYBOARD] TRY: Boot with 'CD' 'H0' etc.Still works only with 'DEBUG'. --- source/src/vm/fmtowns/fmtowns.cpp | 4 + source/src/vm/fmtowns/keyboard.cpp | 245 +++++++++++++++++++++++-------------- 2 files changed, 155 insertions(+), 94 deletions(-) diff --git a/source/src/vm/fmtowns/fmtowns.cpp b/source/src/vm/fmtowns/fmtowns.cpp index b91adb438..5b814178d 100644 --- a/source/src/vm/fmtowns/fmtowns.cpp +++ b/source/src/vm/fmtowns/fmtowns.cpp @@ -324,6 +324,8 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) rtc->set_context_busy(timer, SIG_TIMER_RTC_BUSY, 0x80); scsi_host->set_context_irq(scsi, SIG_SCSI_IRQ, 1); scsi_host->set_context_drq(scsi, SIG_SCSI_DRQ, 1); + scsi_host->set_context_drq(keyboard, SIG_KEYBOARD_BOOTSEQ_END, 1); + dma->set_context_memory(memory); dma->set_context_ch0(fdc); dma->set_context_ch1(scsi_host); @@ -445,7 +447,9 @@ VM::VM(EMU_TEMPLATE* parent_emu) : VM_TEMPLATE(parent_emu) // EXTRA DMA2 : Reserved // EXTRA DMA3 : Reserved fdc->set_context_drq(dma, SIG_UPD71071_CH0, 1); + fdc->set_context_drq(keyboard, SIG_KEYBOARD_BOOTSEQ_END, 1); cdrom->set_context_drq_line(dma, SIG_UPD71071_CH3, 0xff); + cdrom->set_context_drq_line(keyboard, SIG_KEYBOARD_BOOTSEQ_END, 1); // NMI0 : KEYBOARD (RAS) // NMI1 : Extra SLOT (Maybe not implement) diff --git a/source/src/vm/fmtowns/keyboard.cpp b/source/src/vm/fmtowns/keyboard.cpp index 501edd8f9..f6bb87bf0 100644 --- a/source/src/vm/fmtowns/keyboard.cpp +++ b/source/src/vm/fmtowns/keyboard.cpp @@ -14,6 +14,7 @@ #define EVENT_KEY_CODE 1 #define EVENT_DELAY_PUSH 2 +#define EVENT_BOOT_TIMEOUT 3 namespace FMTOWNS { void KEYBOARD::initialize() @@ -38,6 +39,7 @@ void KEYBOARD::release() { cmd_buf->release(); key_buf->release(); + delete key_buf; delete cmd_buf; } @@ -51,7 +53,6 @@ void KEYBOARD::reset() void KEYBOARD::reset_device() { out_debug_log("RESET\n"); - special_boot_num = -1; last_cmd = 0x00; memset(table, 0, sizeof(table)); @@ -73,6 +74,9 @@ void KEYBOARD::reset_device() event_key_reset = -1; write_signals(&output_intr_line, 0); write_signals(&output_nmi_line, 0); + memset(boot_code, 0x00, sizeof(boot_code)); + boot_seq = false; + boot_code_ptr = 0; } void KEYBOARD::enqueue_key(uint8_t code) @@ -90,35 +94,72 @@ void KEYBOARD::enqueue_key2(uint8_t code) void KEYBOARD::special_reset(int num) { out_debug_log("SPECIAL RESET %d\n", num); - memset(boot_code, 0x00, sizeof(boot_code)); if(num < 0) return; if(num >= 12) return; + reset_device(); special_boot_num = num; - boot_ptr = 0; boot_seq = true; - boot_code_ptr = 0; kbstat |= 1; - key_buf->clear(); - enqueue_key(0x7f); - + + static const uint8_t bootcode_debug[] = {0x20, 0x13, 0x2E, 0x17, 0x22}; + static const uint8_t bootcode_cd[] = {0x2C, 0x20}; + static const uint8_t bootcode_icm[] = {0x18, 0x2C, 0x30}; + static const uint8_t dnum[] = {0x0B, 0x02, 0x03, 0x04, 0x05}; switch(num) { - case 11: // DEBUG - enqueue_key(0x20); - enqueue_key(0x13); - enqueue_key(0x2E); - enqueue_key(0x17); - enqueue_key(0x22); + case 0: // CD + enqueue_key(0x7f); +// memcpy(boot_code, bootcode_cd, sizeof(bootcode_cd)); + key_down('C'); + key_down('D'); + key_down('C'); + key_down('D'); + key_down('C'); + key_down('D'); break; - default: -// register_event(this, EVENT_DELAY_PUSH, 1.0, false, NULL); - event_callback(EVENT_DELAY_PUSH, 0); -// boot_seq = false; -// kbstat &= ~1; -// return; + case 1: + case 2: + case 3: + case 4: + enqueue_key(0x7f); +// boot_code[0] = 0x21; +// boot_code[1] = dnum[num - 1]; + key_down('F'); + key_down('0' + special_boot_num - 1); + break; + case 5: + case 6: + case 7: + case 8: + case 9: + enqueue_key(0x7f); + key_down('H'); + key_down('0' + special_boot_num - 5); break; +// boot_code[0] = 0x23; +// boot_code[1] = dnum[num - 5]; +// break; + case 10: // ICM + enqueue_key(0x7f); + key_down('I'); + key_down('C'); + key_down('M'); + // +// memcpy(boot_code, bootcode_icm, sizeof(bootcode_icm)); + break;; + case 11: // DEBUG + enqueue_key(0x7f); + key_down('D'); + key_down('E'); + key_down('B'); + key_down('U'); + key_down('G'); + +// memcpy(boot_code, bootcode_debug, sizeof(bootcode_debug)); + break;; } - register_key_interrupt(true); // NEXT BYTE + register_key_interrupt(false); // NEXT BYTE +// register_event(this, EVENT_BOOT_TIMEOUT, 30.0e6, false, &event_key_reset); } void KEYBOARD::register_key_interrupt(bool first) @@ -139,21 +180,19 @@ void KEYBOARD::do_common_command(uint8_t cmd) switch(cmd) { case 0xa0: this->reset_device(); // RESET + special_boot_num = -1; // From Tsugaru -// key_buf->write(0xa0); -// key_buf->write(0x7f); -// memset(boot_code, 0x00, sizeof(boot_code)); -// boot_ptr = 0; -// boot_seq = false; -// boot_code_ptr = false; + boot_seq = false; + boot_code_ptr = 0; break; case 0xa1: if(last_cmd != 0xa0) { this->reset_device(); // RESET + special_boot_num = -1; memset(boot_code, 0x00, sizeof(boot_code)); boot_ptr = 0; boot_seq = false; - boot_code_ptr = false; + boot_code_ptr = 0; } break; case 0xa4: @@ -244,7 +283,7 @@ uint32_t KEYBOARD::read_io8(uint32_t addr) case 0x600: kbint &= ~1; write_signals(&output_intr_line, 0); - if(key_buf->empty()) { + if((key_buf->empty()) /*&& !(boot_seq)*/) { kbstat &= ~1; } else { register_key_interrupt(false); // NEXT BYTE @@ -266,7 +305,45 @@ void KEYBOARD::event_callback(int event_id, int err) { switch(event_id) { case EVENT_KEY_CODE: - kbdata = key_buf->read(); +/* if(boot_seq) { + if((boot_code_ptr & 1) == 0) { + kbdata = (boot_code_ptr < 12) ? 0xA0 : 0xF0; + if(boot_code_ptr >= 12) { + //boot_seq = false; + } + } else { + if((boot_code_ptr >> 1) == 0) { + kbdata = 0x7F; + } else { + switch(special_boot_num) { + case 0: // CD + case 1: // F0 + case 2: // F1 + case 3: // F2 + case 4: // F3 + case 5: // H0 + case 6: // H1 + case 7: // H2 + case 8: // H3 + case 9: // H4 + kbdata = boot_code[(boot_code_ptr >> 1) % 2]; + break; + case 10: // ICM + kbdata = boot_code[(boot_code_ptr >> 1) % 3]; + break; + case 11: // DEBUG + kbdata = boot_code[(boot_code_ptr >> 1) % 5]; + break; + default: + kbdata = key_buf->read(); + break; + } + } + } + boot_code_ptr++; + } else {*/ + kbdata = key_buf->read(); +// } kbstat |= 1; if(kbmsk & 1) { kbint |= 1; @@ -274,70 +351,9 @@ void KEYBOARD::event_callback(int event_id, int err) } event_keycode = -1; break; - case EVENT_DELAY_PUSH: - if(boot_seq) { - int num = special_boot_num; - switch(special_boot_num) { - case 0: // CD - enqueue_key(0x2c); - enqueue_key(0x20); - enqueue_key(0x2c); - enqueue_key(0x20); - enqueue_key(0x2c); - enqueue_key2(0x20); - break; - case 1: // F0 - enqueue_key(0x21); - enqueue_key(0x0b); - enqueue_key(0x21); - enqueue_key(0x0b); - enqueue_key(0x21); - enqueue_key2(0x0b); - break; - case 2: // F1 - case 3: // F2 - case 4: // F3 - enqueue_key(0x21); - enqueue_key(0x01 + (num - 1)); - enqueue_key(0x21); - enqueue_key(0x01 + (num - 1)); - enqueue_key(0x21); - enqueue_key2(0x01 + (num - 1)); - break; - case 5: // H0 - enqueue_key(0x23); - enqueue_key(0x0B); - enqueue_key(0x23); - enqueue_key(0x0B); - enqueue_key(0x23); - enqueue_key2(0x0B); - break; - case 6: // H1 - H4 - case 7: // H1 - H4 - case 8: // H1 - H4 - case 9: // H1 - H4 - enqueue_key(0x23); - enqueue_key(0x01 + (num - 5)); - enqueue_key(0x23); - enqueue_key(0x01 + (num - 5)); - enqueue_key(0x23); - enqueue_key2(0x01 + (num - 5)); - break; - case 10: // ICM - enqueue_key(0x18); - enqueue_key(0x2C); - enqueue_key(0x30); - enqueue_key(0x18); - enqueue_key(0x2C); - enqueue_key2(0x30); - break; - } - } + case EVENT_BOOT_TIMEOUT: + event_key_reset = -1; boot_seq = false; - boot_ptr = 0; - boot_code_ptr = 0; - special_boot_num = -1; - memset(boot_code, 0x00, sizeof(boot_code)); break; } } @@ -369,7 +385,11 @@ void KEYBOARD::key_down(int code) code = 0x6c; } } - key_buf->write(0xc0 | (table[0x11] ? 8 : 0) | (table[0x10] ? 4 : 0)); + if(boot_seq) { + key_buf->write(0xa0); + } else { + key_buf->write(0xc0 | (table[0x11] ? 8 : 0) | (table[0x10] ? 4 : 0)); + } key_buf->write(code & 0x7f); register_key_interrupt(true); } @@ -412,7 +432,44 @@ void KEYBOARD::write_signal(int id, uint32_t data, uint32_t mask) { switch(id) { case SIG_KEYBOARD_BOOTSEQ_END: -// out_debug_log(_T("SIG_KEYBOARD_BOOTSEQ_END")); + if(((data & mask) != 0) && (boot_seq)) { + out_debug_log(_T("SIG_KEYBOARD_BOOTSEQ_END")); + switch(special_boot_num) { + case 0: // CD +// memcpy(boot_code, bootcode_cd, sizeof(bootcode_cd)); + key_up('C'); + key_up('D'); + break; + case 1: + case 2: + case 3: + case 4: + key_up('F'); + key_up('0' + special_boot_num - 1); + break; + case 5: + case 6: + case 7: + case 8: + case 9: + key_up('F'); + key_up('0' + special_boot_num - 5); + break; + case 10: + key_up('I'); + key_up('C'); + key_up('M'); + break; + case 11: + key_up('D'); + key_up('E'); + key_up('B'); + key_up('U'); + key_up('G'); + break; + } + boot_seq = false; + } break; } } -- 2.11.0