OSDN Git Service

[VM][FM7] EMUFM7: passed compilation, still not link.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 11 Mar 2015 09:11:17 +0000 (18:11 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 11 Mar 2015 09:11:17 +0000 (18:11 +0900)
source/src/vm/fm7/display.cpp
source/src/vm/fm7/fm7.cpp
source/src/vm/fm7/fm7.h
source/src/vm/fm7/fm7_common.h
source/src/vm/fm7/fm7_display.h
source/src/vm/fm7/fm7_keyboard.h
source/src/vm/fm7/keyboard.cpp

index bcfa4d3..fa5b7f7 100644 (file)
@@ -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
 }
index 401fdcc..9d5acea 100644 (file)
@@ -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()
index 1de5733..0f33ff7 100644 (file)
@@ -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
 
index 2179a76..2104888 100644 (file)
@@ -171,6 +171,7 @@ enum {
        SIG_FM7_SUB_CANCEL,
        SIG_FM7_SUB_BANK,
        SIG_FM7_SUB_MULTIPAGE,
+       SIG_FM7_SUB_KEY_FIRQ,
 };
 
 // KEYBOARD
index 4375278..dd21dbc 100644 (file)
@@ -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) {
index 7f11a38..fe24929 100644 (file)
 
 
 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
index 256b495..3a5b41b 100644 (file)
@@ -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
+