OSDN Git Service

[VM][FMTOWNS][KEYBOARD] TRY: Boot with 'CD' 'H0' etc.Still works only with 'DEBUG'.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 25 Sep 2020 13:31:10 +0000 (22:31 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 25 Sep 2020 13:31:10 +0000 (22:31 +0900)
source/src/vm/fmtowns/fmtowns.cpp
source/src/vm/fmtowns/keyboard.cpp

index b91adb4..5b81417 100644 (file)
@@ -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)
index 501edd8..f6bb87b 100644 (file)
@@ -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;
        }
 }