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);
// 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)
#define EVENT_KEY_CODE 1
#define EVENT_DELAY_PUSH 2
+#define EVENT_BOOT_TIMEOUT 3
namespace FMTOWNS {
void KEYBOARD::initialize()
{
cmd_buf->release();
key_buf->release();
+
delete key_buf;
delete cmd_buf;
}
void KEYBOARD::reset_device()
{
out_debug_log("RESET\n");
- special_boot_num = -1;
last_cmd = 0x00;
memset(table, 0, sizeof(table));
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)
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)
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:
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
{
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;
}
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;
}
}
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);
}
{
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;
}
}