From: K.Ohta Date: Wed, 11 Mar 2015 09:11:17 +0000 (+0900) Subject: [VM][FM7] EMUFM7: passed compilation, still not link. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=cdf4d55356a8d5c7aea43a37a29e73c792efd16b;p=csp-qt%2Fcommon_source_project-fm7.git [VM][FM7] EMUFM7: passed compilation, still not link. --- diff --git a/source/src/vm/fm7/display.cpp b/source/src/vm/fm7/display.cpp index bcfa4d315..fa5b7f74d 100644 --- a/source/src/vm/fm7/display.cpp +++ b/source/src/vm/fm7/display.cpp @@ -21,7 +21,7 @@ DISPLAY::DISPLAY(VM* parent_vm, EMU* parent_emu) : MEMORY(parent_vm, parent_emu) { p_vm = parent_vm; p_emu = parent_emu; - initvramtbl_4096_vec(); + // initvramtbl_4096_vec(); } DISPLAY::~DISPLAY() @@ -29,13 +29,24 @@ DISPLAY::~DISPLAY() } -void DISPLAY::getvram(uint32 *pvram, uint32 pitch) +void DISPLAY::reset(void) +{ + subcpu->reset(); +} + +void DISPLAY::draw_screen(void) { int y; + int x; + int i; int height = (display_mode == DISPLAY_MODE_8_400L) ? 400 : 200; - Uint32 *p; + scrntype *p; + int yoff; Uint32 planesize = 0x4000; uint32 offset; + uint8 r, g, b; + scrntype rgbmask; + uint16 dot; #if defined(_FM77AV_VARIANTS) if(offset_77av) { @@ -57,21 +68,43 @@ void DISPLAY::getvram(uint32 *pvram, uint32 pitch) return; } - if(!crt_flag) { // Set blank - PutBlank(p, height); - } else if((display_mode == DISPLAY_MODE_8_200L) || (display_mode == DISPLAY_MODE_8_200L_TEXT) || - (display_mode == DISPLAY_MODE_8_400L) || (display_mode == DISPLAY_MODE_8_400L_TEXT)) { - for(y = 0; y < height; y++) { - p = &pvram[y * pitch]; - if(((y < window_low) && (y > window_high)) || (!window_opened)) { - //CreateVirtualVram8_Line(p, y, dpalette_pixel, planesize, offset,multimode_dispmask); + if(!crt_flag) { + for(y = 0; y < 400; y++) { + memset(emu->screen_buffer(y), 0x00, 640 * sizeof(scrntype)); + } + } else if((display_mode == DISPLAY_MODE_8_200L) || (display_mode == DISPLAY_MODE_8_200L_TEXT)) { + + yoff = offset & 0x3fff; + for(y = 0; y < 400; y += 2) { + p = emu->screen_buffer(y); + rgbmask = RGB_COLOR(((multimode_dispmask & 0x02) == 0) ? 255 : 0, + ((multimode_dispmask & 0x04) == 0) ? 255 : 0, + ((multimode_dispmask & 0x01) == 0) ? 255 : 0); + for(x = 0; x < 80; x++) { + yoff = yoff & 0x3fff; + b = gvram[yoff]; + r = gvram[yoff + 0x4000]; + g = gvram[yoff + 0x8000]; + dot = 0; + for(i = 0; i < 8; i++) { + dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7); + p[x << 3 + i] = dpalette_pixel[dot] & rgbmask; + g <<= 1; + r <<= 1; + b <<= 1; + } + yoff++; + } + if(!config.scan_line) { + memcpy((void *)emu->screen_buffer(y + 1), p, 640 * sizeof(scrntype)); } else { - // CreateVirtualVram8_WindowedLine(p, y, window_xbegin, window_xend, - // dpalette_pixel, planesize, offset, multimode_dispmask); + memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype)); } } } + + #if defined(_FM77AV_VARIANTS) else if(display_mode == DISPLAY_MODE_4096) { for(y = 0; y < height; y++) { @@ -625,6 +658,15 @@ void DISPLAY::event_callback(int event_id, int err) } } +void DISPLAY::event_frame() +{ + +} + +void DISPLAY::event_vline(int v, int clock) +{ +} + void DISPLAY::write_signal(int id, uint32 data, uint32 mask) { bool flag = ((data & mask) != 0); @@ -653,6 +695,9 @@ void DISPLAY::write_signal(int id, uint32 data, uint32 mask) case SIG_FM7_SUB_MULTIPAGE: set_multimode(data & 0xff); break; + case SIG_FM7_SUB_KEY_FIRQ: + subcpu->write_signal(SIG_CPU_FIRQ, flag ? 1 : 0, 1); + break; default: break; } @@ -1093,7 +1138,7 @@ void DISPLAY::initialize() is_cyclesteal = false; #endif register_event(this, EVENT_FM7SUB_DISPLAY_NMI, 20000.0, true, &nmi_event_id); // NEXT CYCLE_ - + subcpu->reset(); #if defined(_FM77AV_VARIANTS) #endif } diff --git a/source/src/vm/fm7/fm7.cpp b/source/src/vm/fm7/fm7.cpp index 401fdccf8..9d5acea86 100644 --- a/source/src/vm/fm7/fm7.cpp +++ b/source/src/vm/fm7/fm7.cpp @@ -22,7 +22,7 @@ #include "./fm7_mainio.h" #include "./fm7_mainmem.h" #include "./fm7_display.h" -//#include "./fm7_keyboard.h" +#include "./fm7_keyboard.h" #include "./kanjirom.h" @@ -49,6 +49,7 @@ VM::VM(EMU* parent_emu): emu(parent_emu) mainio = new FM7_MAINIO(this, emu); display = new DISPLAY(this, emu); + keyboard = new KEYBOARD(this, emu); // I/Os drec = new DATAREC(this, emu); @@ -97,7 +98,7 @@ VM::VM(EMU* parent_emu): emu(parent_emu) #ifdef CAPABLE_KANJI_CLASS2 kanjiclass2 = new KANJIROM(this, emu, true); #endif - + connect_bus(); } void VM::initialize(void) @@ -155,11 +156,18 @@ void VM::connect_bus(void) subcpu->set_context_mem(display); mainio->set_context_maincpu(maincpu); + mainio->set_context_subcpu(subcpu); + mainio->set_context_display(display); mainio->set_context_kanjirom_class1(kanjiclass1); + mainio->set_context_mainmem(mainmem); + #if defined(_FM77AV_VARIANTS) mainio->set_context_kanjirom_class2(kanjiclass2); -#endif +#endif + + keyboard->set_context_break_line(mainio, FM7_MAINIO_PUSH_BREAK, 0xffffffff); + drec->set_context_out(mainio, FM7_MAINIO_CMT_RECV, 0xffffffff); //drec->set_context_remote(mainio, FM7_MAINIO_CMT_REMOTE, 0xffffffff); @@ -211,6 +219,26 @@ void VM::connect_bus(void) #ifdef DATAREC_SOUND event->set_context_sound(drec); #endif + for(DEVICE* device = first_device; device; device = device->next_device) { + device->initialize(); + } + for(int i = 0; i < 2; i++) { +#if defined(_FM77AV20) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV40SX) + fdc->set_drive_type(i, DRIVE_TYPE_2DD); +#else + fdc->set_drive_type(i, DRIVE_TYPE_2D); +#endif +// fdc->set_drive_rpm(i, 300); +// fdc->set_drive_mfm(i, true); + } +#if defined(_FM77) || defined(_FM77L4) + for(int i = 2; i < 4; i++) { + fdc->set_drive_type(i, DRIVE_TYPE_2HD); +// fdc->set_drive_rpm(i, 300); +// fdc->set_drive_mfm(i, true); + } +#endif + } void VM::update_config() diff --git a/source/src/vm/fm7/fm7.h b/source/src/vm/fm7/fm7.h index 1de5733c0..0f33ff702 100644 --- a/source/src/vm/fm7/fm7.h +++ b/source/src/vm/fm7/fm7.h @@ -12,6 +12,9 @@ #define USE_TAPE #define USE_SOUND_DEVICE_TYPE +#define USE_SCANLINE +#define USE_DIPSWITCH +#define USE_BOOTMODE #if defined(_FM8) #define DEVICE_NAME "FUJITSU FM8" @@ -33,6 +36,7 @@ #define HAS_CYCLESTEAL #define CAPABLE_Z80 #define CAPABLE_KANJI_CLASS2 +#define USE_DRIVE_TYPE #elif defined(_FM77AV) #define DEVICE_NAME "FUJITSU FM77AV" @@ -48,6 +52,7 @@ #define HAS_MMR #define HAS_2DD_2D #define HAS_CYCLESTEAL +#define USE_DRIVE_TYPE #elif defined(_FM77AV40) #define DEVICE_NAME "FUJITSU FM77AV" @@ -57,6 +62,7 @@ #define HAS_2DD_2D #define HAS_CYCLESTEAL #define CAPABLE_KANJI_CLASS2 +#define USE_DRIVE_TYPE #endif diff --git a/source/src/vm/fm7/fm7_common.h b/source/src/vm/fm7/fm7_common.h index 2179a7694..21048882c 100644 --- a/source/src/vm/fm7/fm7_common.h +++ b/source/src/vm/fm7/fm7_common.h @@ -171,6 +171,7 @@ enum { SIG_FM7_SUB_CANCEL, SIG_FM7_SUB_BANK, SIG_FM7_SUB_MULTIPAGE, + SIG_FM7_SUB_KEY_FIRQ, }; // KEYBOARD diff --git a/source/src/vm/fm7/fm7_display.h b/source/src/vm/fm7/fm7_display.h index 437527821..dd21dbc4d 100644 --- a/source/src/vm/fm7/fm7_display.h +++ b/source/src/vm/fm7/fm7_display.h @@ -23,7 +23,6 @@ class DISPLAY: public MEMORY protected: EMU *p_emu; VM *p_vm; - void getvram(uint32 *pvram, uint32 pitch); void set_multimode(uint8 val); uint8 get_multimode(void); uint8 get_cpuaccessmask(void); @@ -159,7 +158,12 @@ class DISPLAY: public MEMORY void write_signal(int id, uint32 data, uint32 mask); uint32 read_data8(uint32 addr); void write_data8(uint32 addr, uint32 data); - void initialize(); + void initialize(void); + void reset(void); + + void draw_screen(void); + void event_frame(void); + void event_vline(int v, int clock); void set_context_kanjiclass1(MEMORY *p) { diff --git a/source/src/vm/fm7/fm7_keyboard.h b/source/src/vm/fm7/fm7_keyboard.h index 7f11a383e..fe24929b3 100644 --- a/source/src/vm/fm7/fm7_keyboard.h +++ b/source/src/vm/fm7/fm7_keyboard.h @@ -18,105 +18,105 @@ class KEYBOARD : public DEVICE { - protected: VM* p_vm; EMU* p_emu; - uint8 read_data_reg(void); - uint8 read_stat_reg(void); - uint8 get_keycode_high(void); - uint8 get_keycode_low(void); - void turn_on_ins_led(void); - void turn_off_ins_led(void); - - DEVICE *caps_led; - DEVICE *kana_led; - DEVICE *ins_led; - - DEVICE *rxrdy; - DEVICE *key_ack; - - DEVICE *maincpu; - DEVICE *subcpu; - DEVICE *z80cpu; - - uint32 keycode_7; - int keymode; + uint8 get_keycode_high(void); + uint8 get_keycode_low(void); + void turn_on_ins_led(void); + void turn_off_ins_led(void); + + outputs_t caps_led; + outputs_t kana_led; + outputs_t ins_led; + + outputs_t rxrdy; + outputs_t key_ack; + outputs_t break_line; + + uint32 keycode_7; + int keymode; private: - bool ctrl_pressed; - bool lshift_pressed; - bool rshift_pressed; - bool shift_pressed; - bool graph_pressed; - bool caps_pressed; - bool kana_pressed; - bool break_pressed; + bool ctrl_pressed; + bool lshift_pressed; + bool rshift_pressed; + bool shift_pressed; + bool graph_pressed; + bool caps_pressed; + bool kana_pressed; + bool break_pressed; + uint8 read_data_reg(void); + uint8 read_stat_reg(void); + + int event_ids[0x70]; + bool key_pressed_flag[0x70]; - int event_ids[0x70]; - bool key_pressed_flag[0x70]; - - uint8 datareg; - - uint16 vk2scancode(uint32 vk); - bool isModifier(uint16 scancode); - void set_modifiers(uint16 scancode, bool flag); - uint16 scan2fmkeycode(uint16 scancode); - void do_repeatkey(uint16 scancode); - void reset_keyboard(void); - void set_mode(void); - void get_mode(void); - void set_leds(void); - void get_leds(void); - void set_repeat_type(void); - void set_repeat_time(void); - void set_rtc(void); - void get_rtc(void); - void rtc_count(void); - void rtc_adjust(void); - - - FIFO *cmd_fifo; - FIFO *data_fifo; - DEVICE *display; - DEVICE *mainio; + uint8 datareg; + + uint16 vk2scancode(uint32 vk); + bool isModifier(uint16 scancode); + void set_modifiers(uint16 scancode, bool flag); + uint16 scan2fmkeycode(uint16 scancode); + void do_repeatkey(uint16 scancode); +#if defined(_FM77AV_VARIANTS) + void set_mode(void); + void get_mode(void); + void set_leds(void); + void get_leds(void); + void set_repeat_type(void); + void set_repeat_time(void); + void set_rtc(void); + void get_rtc(void); + void rtc_count(void); + void rtc_adjust(void); +#endif + bool repeat_mode; + int repeat_time_short; + int repeat_time_long; + FIFO *cmd_fifo; + FIFO *data_fifo; + + DEVICE *display; + DEVICE *mainio; public: - KEYBOARD(VM *parent_vm, EMU *parent_emu); - ~KEYBOARD(); - - void key_up(uint32 vk); - void key_down(uint32 vk); - void event_callback(int event_id, int err); - void write_signal(int id, uint32 data, uint32 mask); - uint32 read_data8(uint32 addr); - void write_data8(uint32 addr, uint32 data); + KEYBOARD(VM *parent_vm, EMU *parent_emu); + ~KEYBOARD(); - void set_context_display(DEVICE *p) { - display = p; - } - void set_context_maincpu(DEVICE *p) { - maincpu = p; - } - void set_context_subcpu(DEVICE *p) { - subcpu = p; - } - void set_context_z80cpu(DEVICE *p) { - subcpu = p; - } - void set_context_mainio(DEVICE *p) { - mainio = p; - } - void set_context_caps_led(DEVICE *p) { - caps_led = p; - } - void set_context_kana_led(DEVICE *p) { - kana_led = p; - } - void set_context_ins_led(DEVICE *p) { - ins_led = p; - } + void key_up(uint32 vk); + void key_down(uint32 vk); + void event_callback(int event_id, int err); + void write_signal(int id, uint32 data, uint32 mask); + uint32 read_data8(uint32 addr); + void write_data8(uint32 addr, uint32 data); + void reset(void); + + void set_context_display(DEVICE *p) { + display = p; + } + void set_context_mainio(DEVICE *p) { + mainio = p; + } + void set_context_rxrdy(DEVICE *p, int id, uint32 mask) { + register_output_signal(&rxrdy, p, id, mask); + } + void set_context_key_ack(DEVICE *p, int id, uint32 mask) { + register_output_signal(&key_ack, p, id, mask); + } + void set_context_caps_led(DEVICE *p, int id, uint32 mask) { + register_output_signal(&caps_led, p, id, mask); + } + void set_context_kana_led(DEVICE *p, int id, uint32 mask) { + register_output_signal(&kana_led, p, id, mask); + } + void set_context_ins_led(DEVICE *p, int id, uint32 mask) { + register_output_signal(&ins_led, p, id, mask); + } + void set_context_break_line(DEVICE *p, int id, uint32 mask) { + register_output_signal(&break_line, p, id, mask); + } }; -#endif \ No newline at end of file +#endif diff --git a/source/src/vm/fm7/keyboard.cpp b/source/src/vm/fm7/keyboard.cpp index 256b4955d..3a5b41bf5 100644 --- a/source/src/vm/fm7/keyboard.cpp +++ b/source/src/vm/fm7/keyboard.cpp @@ -11,7 +11,7 @@ #include "fm7_keyboard.h" // -uint16 vk_matrix[0x68] = { // VK +const uint16 vk_matrix_106[0x68] = { // VK // +0, +1, +2, +3, +4, +5, +6, +7 /* 0x00, ESC, 1 , 2, 3, 4, 5, 6 */ 0x00, VK_KANJI, '1', '2', '3', '4', '5', '6', // +0x00 @@ -691,38 +691,6 @@ const struct key_tbl_t kana_shift_key[] = { /* * I/O API (subio) */ -// 0xd431 : Read -uint8 KEYBOARD::read_data_reg(void) -{ - if(rxrdy->read_signal(0) != 0) { - if(!data_fifo->empty()) { - datareg = data_fifo->read() & 0xff; - } - } - if(data_fifo->empty()) { - rxrdy->write_signal(0x00, 0x00, 0x01); - } else { - rxrdy->write_signal(0x00, 0x01, 0x01); - } - return datareg; -} - -// 0xd432 -uint8 KEYBOARD::read_stat_reg(void) -{ - uint8 data = 0xff; - - if(!data_fifo->empty()) { - rxrdy->write_signal(0x00, 0x01, 0x01); - data &= 0x7f; - } - if(key_ack->read_signal(0) == 0x00) { - data &= 0xfe; - } - // Digityze : bit0 = '0' when waiting, - return data; -} - // 0xd400(SUB) or 0xfd00(MAIN) uint8 KEYBOARD::get_keycode_high(void) { @@ -735,21 +703,21 @@ uint8 KEYBOARD::get_keycode_high(void) uint8 KEYBOARD::get_keycode_low(void) { uint8 data = keycode_7 & 0xff; - maincpu->write_signal(SIG_CPU_IRQ, 0, 1); - subcpu->write_signal(SIG_CPU_FIRQ, 0, 1); + mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 0, 1); + display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1); return data; } // 0xd40d : R void KEYBOARD::turn_on_ins_led(void) { - ins_led->write_signal(0x00, 0x01, 0x01); + this->write_signals(&ins_led, 0xff); } // 0xd40d : W void KEYBOARD::turn_off_ins_led(void) { - ins_led->write_signal(0x00, 0x00, 0x01); + this->write_signals(&ins_led, 0x00); } // UI Handler. @@ -759,9 +727,9 @@ uint16 KEYBOARD::vk2scancode(uint32 vk) i = 0; do { - if(vk_matrix[i] == vk) return i; + if(vk_matrix_106[i] == vk) return i; i++; - } while(vk_matrix[i] != 0xffff); + } while(vk_matrix_106[i] != 0xffff); return 0x0000; } @@ -802,7 +770,7 @@ void KEYBOARD::set_modifiers(uint16 scancode, bool flag) } else { caps_pressed = true; } - if(keymode == KEYMODE_STANDARD) caps_led->write_signal(0x00, caps_pressed ? 0x01 : 0x00, 0x01); + if(keymode == KEYMODE_STANDARD) this->write_signals(&caps_led, caps_pressed ? 0xff : 0x00); } } else if(scancode == 0x5a) { // KANA // Toggle on press. @@ -812,7 +780,7 @@ void KEYBOARD::set_modifiers(uint16 scancode, bool flag) } else { kana_pressed = true; } - if(keymode == KEYMODE_STANDARD) kana_led->write_signal(0x00, kana_pressed ? 0x01 : 0x00, 0x01); + if(keymode == KEYMODE_STANDARD) this->write_signals(&kana_led, kana_pressed ? 0xff : 0x00); } } else if(scancode == 0x5c) { // Break break_pressed = flag; @@ -821,7 +789,7 @@ void KEYBOARD::set_modifiers(uint16 scancode, bool flag) uint16 KEYBOARD::scan2fmkeycode(uint16 scancode) { - struct key_tbl_t *keyptr; + const struct key_tbl_t *keyptr; uint16 code; bool stdkey = false; int i; @@ -843,30 +811,20 @@ uint16 KEYBOARD::scan2fmkeycode(uint16 scancode) break; } } - if(shift_pressed) { - // DO super-impose mode: - // F7 : PC - // F8 : IMPOSE (High brightness) - // F9 : IMPOSE (Low brightness) - // F10: TV - } - if(keymode == KEYMODE_SCAN) { - retval = scancode; - return retval; - } else if(keymode == KEYMODE_STANDARD) { + if(keymode == KEYMODE_STANDARD) { if(ctrl_pressed) { if(shift_pressed) { keyptr = ctrl_shift_key; } else { keyptr = ctrl_key; } - } else if(graphkey_pressed) { + } else if(graph_pressed) { if(shift_pressed) { keyptr = graph_shift_key; } else { keyptr = graph_key; } - } else if(kanakey_pressed) { + } else if(kana_pressed) { if(shift_pressed) { keyptr = kana_shift_key; } else { @@ -881,10 +839,22 @@ uint16 KEYBOARD::scan2fmkeycode(uint16 scancode) } } if(keyptr == NULL) return 0xffff; + } +#if defined(_FM77AV_VARIANTS) + else if(shift_pressed) { + // DO super-impose mode: + // F7 : PC + // F8 : IMPOSE (High brightness) + // F9 : IMPOSE (Low brightness) + // F10: TV + } + if(keymode == KEYMODE_SCAN) { + retval = scancode; + return retval; } else if(keymode == KEYMODE_16BETA) { // Will Implement return 0xffff; } - +#endif //_FM77AV_VARIANTS i = 0; retval = 0xffff; do { @@ -913,6 +883,7 @@ void KEYBOARD::key_up(uint32 vk) { uint16 scancode = vk2scancode(vk); bool stat_break = break_pressed; + uint32 code_7; if(scancode == 0) return; if(event_ids[scancode] >= 0){ @@ -920,17 +891,18 @@ void KEYBOARD::key_up(uint32 vk) event_ids[scancode] = -1; } if(keymode == KEYMODE_SCAN) { + code_7 = scan2fmkeycode(scancode); if(code_7 < 0x200) { keycode_7 = code_7; - maincpu->write_signal(SIG_CPU_IRQ, 1, 1); - subcpu->write_signal(SIG_CPU_FIRQ, 1, 1); + mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff); + mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 0, 1); + display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1); } } - if(this->isModifiers(scancode)) { + if(this->isModifier(scancode)) { set_modifiers(scancode, false); if(break_pressed != stat_break) { // Break key UP. - break_line->write_signal(0x00, 0, 1); - maincpu->write_signal(SIG_CPU_FIRQ, 0, 1); + this->write_signals(&break_line, 0x00); } } key_pressed_flag[scancode] = false; @@ -949,13 +921,13 @@ void KEYBOARD::key_down(uint32 vk) code_7 = scan2fmkeycode(scancode); if(code_7 < 0x200) { keycode_7 = code_7; - maincpu->write_signal(SIG_CPU_IRQ, 1, 1); - subcpu->write_signal(SIG_CPU_FIRQ, 1, 1); + mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff); + mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 1, 1); + display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 1, 1); } - if(this->isModifiers(scancode)) { // modifiers + if(this->isModifier(scancode)) { // modifiers if(break_pressed != stat_break) { // Break key Down. - break_line->write_signal(0x00, 1, 1); - maincpu->write_signal(SIG_CPU_FIRQ, 1, 1); + this->write_signals(&break_line, 0xff); } } // If repeat && !(PF) && !(BREAK) @@ -985,8 +957,9 @@ void KEYBOARD::do_repeatkey(uint16 scancode) code_7 = scan2fmkeycode(scancode); if(code_7 < 0x200) { keycode_7 = code_7; - maincpu->write_signal(SIG_CPU_IRQ, 1, 1); - subcpu->write_signal(SIG_CPU_FIRQ, 1, 1); + mainio->write_signal(FM7_MAINIO_PUSH_KEYBOARD, code_7, 0x1ff); + mainio->write_signal(FM7_MAINIO_KEYBOARDIRQ, 1, 1); + display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 1, 1); } //if(this->isModifiers(scancode)) { // modifiers //if(break_pressed != stat_break) { // Break key Down. @@ -999,11 +972,11 @@ void KEYBOARD::do_repeatkey(uint16 scancode) void KEYBOARD::event_callback(int event_id, int err) { if(event_id == ID_KEYBOARD_RXRDY_OK) { - rxrdy->write_signal(0x00, 0x01, 0x01); + write_signals(&rxrdy, 0xff); } else if(event_id == ID_KEYBOARD_RXRDY_BUSY) { - rxrdy->write_signal(0x00, 0x00, 0x01); + write_signals(&rxrdy, 0x00); } else if(event_id == ID_KEYBOARD_ACK) { - key_ack->write_signal(0x00, 0x01, 0x01); + write_signals(&key_ack, 0xff); } else if((event_id >= ID_KEYBOARD_AUTOREPEAT_FIRST) && (event_id <= (ID_KEYBOARD_AUTOREPEAT_FIRST + 0x1ff))) { uint32 scancode = event_id - ID_KEYBOARD_AUTOREPEAT_FIRST; double usec = (double)repeat_time_short * 1000.0; @@ -1021,12 +994,12 @@ void KEYBOARD::event_callback(int event_id, int err) } // Commands -void KEYBOARD::reset_keyboard(void) +void KEYBOARD::reset(void) { repeat_time_short = 70; // mS repeat_time_long = 700; // mS repeat_mode = true; - key_code = 0x00; + keycode_7 = 0x00; lshift_pressed = false; rshift_pressed = false; @@ -1037,15 +1010,47 @@ void KEYBOARD::reset_keyboard(void) data_fifo->clear(); datareg = 0x00; // Bus - rxrdy->write_signal(0x00, 0x00, 0x01); - key_ack->write_signal(0x00, 0x01, 0x01); - break_line->write_signal(0x00, 0, 1); - // leds - ins_led->write_signal(0x00, 0x00, 0x01); - caps_led->write_signal(0x00, 0x00, 0x01); - kana_led->write_signal(0x00, 0x00, 0x01); + this->write_signals(&break_line, 0x00); + this->write_signals(&rxrdy, 0x00); + this->write_signals(&key_ack, 0x00); + this->write_signals(&kana_led, 0x00); + this->write_signals(&caps_led, 0x00); + this->write_signals(&ins_led, 0x00); + } - +#if defined(_FM77AV_VARIANTS) +// 0xd431 : Read +uint8 KEYBOARD::read_data_reg(void) +{ + if(rxrdy->read_signal(0) != 0) { + if(!data_fifo->empty()) { + datareg = data_fifo->read() & 0xff; + } + } + if(data_fifo->empty()) { + rxrdy->write_signal(0x00, 0x00, 0x01); + } else { + rxrdy->write_signal(0x00, 0x01, 0x01); + } + return datareg; +} + +// 0xd432 +uint8 KEYBOARD::read_stat_reg(void) +{ + uint8 data = 0xff; + + if(!data_fifo->empty()) { + rxrdy->write_signal(0x00, 0x01, 0x01); + data &= 0x7f; + } + if(key_ack->read_signal(0) == 0x00) { + data &= 0xfe; + } + // Digityze : bit0 = '0' when waiting, + return data; +} + void KEYBOARD::set_mode(void) { int count = cmd_fifo->count(); @@ -1053,7 +1058,7 @@ void KEYBOARD::set_mode(void) if(count < 2) return; cmd = cmd_fifo->read(); keymode = cmd_fifo->read(); - if(keymode <= KEYMODE_SCAN) reset_keyboard(); + if(keymode <= KEYMODE_SCAN) reset(); cmd_fifo->clear(); data_fifo->clear(); // right? rxrdy->write_signal(0x00, 0x00, 0x01); @@ -1083,11 +1088,11 @@ void KEYBOARD::set_leds(void) if((ledvar & 0x02) != 0) { // Kana kana_pressed = ((ledvar & 0x01) == 0); - kana_led->write_signal(0x00, ~ledvar, 0x01); + kana_led.write_signal(0x00, ~ledvar, 0x01); } else { // Caps caps_pressed = ((ledvar & 0x01) == 0); - caps_led->write_signal(0x00, ~ledvar, 0x01); + caps_led.write_signal(0x00, ~ledvar, 0x01); } } cmd_fifo->clear(); @@ -1283,11 +1288,15 @@ void KEYBOARD::rtc_count(void) void KEYBOARD::rtc_adjust(void) { } +#endif // FM77AV_VARIANTS void KEYBOARD::write_signal(int id, uint32 data, uint32 mask) { - - if(id == SIG_FM7KEY_PUSH_TO_ENCODER) { + if(id == SIG_FM7KEY_SET_INSLED) { + write_signals(&ins_led, data & mask); + } +#if defined(_FM77AV_VARIANTS) + else if(id == SIG_FM7KEY_PUSH_TO_ENCODER) { /* * I refered XM7's sourcecode : VM/keyboard.c act of key-encoder. * Thanks to Ryu.Takegami and PI. @@ -1361,9 +1370,8 @@ void KEYBOARD::write_signal(int id, uint32 data, uint32 mask) break; } register_event(this, ID_KEYBOARD_ACK, 5, false, NULL); // Delay 5us until ACK is up. - } if(id == SIG_FM7KEY_SET_INSLED) { - ins_led->write_signal(0, data, mask); } +#endif } uint32 KEYBOARD::read_data8(uint32 addr) @@ -1403,33 +1411,40 @@ void KEYBOARD::write_data8(uint32 addr, uint32 data) KEYBOARD::KEYBOARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm, parent_emu) { - p_vm = parent_vm; - p_emu = parent_emu; - - rxrdy = new DEVICE(p_vm, p_emu); - key_ack = new DEVICE(p_vm, p_emu); - - keycode_7 = 0; - - ctrl_pressed = false; - lshift_pressed = false; - rshift_pressed = false; - shift_pressed = false; - graph_pressed = false; - caps_pressed = false; - kana_pressed = false; - break_pressed = false; + int i; + p_vm = parent_vm; + p_emu = parent_emu; - int i; - for(i = 0; i < 0x70; i++) { - event_ids[i] = 0; - key_pressed_flag[i] = false; - } + keycode_7 = 0; - cmd_fifo = new FIFO(16); - data_fifo = new FIFO(16); - keymode = KEYMODE_STANDARD; + ctrl_pressed = false; + lshift_pressed = false; + rshift_pressed = false; + shift_pressed = false; + graph_pressed = false; + caps_pressed = false; + kana_pressed = false; + break_pressed = false; + + for(i = 0; i < 0x70; i++) { + event_ids[i] = 0; + key_pressed_flag[i] = false; + } + cmd_fifo = new FIFO(16); + data_fifo = new FIFO(16); + keymode = KEYMODE_STANDARD; + + init_output_signals(&rxrdy); + init_output_signals(&key_ack); + + init_output_signals(&break_line); + + init_output_signals(&kana_led); + init_output_signals(&caps_led); + init_output_signals(&ins_led); + + } KEYBOARD::~KEYBOARD() @@ -1437,4 +1452,4 @@ KEYBOARD::~KEYBOARD() } - \ No newline at end of file +