OSDN Git Service

[VM][FM7][JCOMMCARD] Fix name of FIRMWAREs.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 13 Jan 2018 18:49:20 +0000 (03:49 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sat, 13 Jan 2018 18:49:20 +0000 (03:49 +0900)
[VM][FM7] Use #define to define name of firmwares.
[VM][FM7][JCOMMCARD] Use AND:: gate to notify halting.
[VM][FM7][KANIROM] WIP: JIS78 patch mode.From XM7 3,4L77a.

15 files changed:
doc/VMs/fm7.txt
doc/VMs/fm77av.txt
source/src/qt/machines/fm7/MainWindow.cpp
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_mainio.cpp
source/src/vm/fm7/fm7_mainmem.cpp
source/src/vm/fm7/fm7_mainmem.h
source/src/vm/fm7/jcommcard.cpp
source/src/vm/fm7/jcommcard.h
source/src/vm/fm7/kanjirom.cpp
source/src/vm/fm7/kanjirom.h
source/src/vm/fm7/mainmem_utils.cpp

index 9dcdaa1..6382692 100644 (file)
@@ -21,7 +21,7 @@
        KANJI1.ROM      JIS class 1 Kanji ROM $20000 bytes
        KANJI.ROM       JIS class 1 Kanji ROM $20000 bytes
 
-       JSUBSYS.ROM             Firmware of Japanese communication board (FM-7/77/AV). $4000 bytes.
+       JSUBMON.ROM             Firmware of Japanese communication board (FM-7/77/AV). $4000 bytes.
        JSUBDICT.ROM    Dictionary of Japanese communication board (FM-7/77/AV). $40000 bytes.
        JSUBKANJI.ROM   Kanji data of Japanese communication board (FM-7/77/AV). $20000 bytes.
                        If you don't have, KANJI.ROM/KANJI1.ROM is used for fallback.
index ba983d5..c5ae09b 100644 (file)
@@ -37,7 +37,7 @@
        KANJI2.ROM      JIS class 2 Kanji ROM $20000 bytes.
 
        Optional (for eFM77AV only):
-       JSUBSYS.ROM             Firmware of Japanese communication board (FM-7/77/AV). $4000 bytes.
+       JSUBMON.ROM             Firmware of Japanese communication board (FM-7/77/AV). $4000 bytes.
        JSUBDICT.ROM    Dictionary of Japanese communication board (FM-7/77/AV). $40000 bytes.
        JSUBKANJI.ROM   Kanji data of Japanese communication board (FM-7/77/AV). $20000 bytes.
                        If you don't have, KANJI.ROM/KANJI1.ROM is used for fallback.
index 928b375..0b6e0fb 100644 (file)
@@ -339,23 +339,43 @@ void META_MainWindow::retranslateUi(void)
        menuBootMode->setTitle(QApplication::translate("Machine", "BOOT Mode", 0));
        menuBootMode->setToolTipsVisible(true);
        actionBootMode[0]->setText(QApplication::translate("Machine", "BASIC", 0));
-       actionBootMode[1]->setText(QApplication::translate("Machine", "DOS", 0));       
        actionBootMode[0]->setToolTip(QApplication::translate("Machine", "Boot with F-BASIC.", 0));
-       actionBootMode[1]->setToolTip(QApplication::translate("Machine", "DOS boot mode.\nUse for CP/M, FLEX, OS-9, R-DOS and some OSs.", 0));  
+       actionBootMode[1]->setText(QApplication::translate("Machine", "DOS", 0));       
+       actionBootMode[1]->setToolTip(QApplication::translate("Machine", "DOS boot mode.\nUse for CP/M, FLEX, OS-9, R-DOS and some OSs.", 0));
+       
+       actionBootMode[2]->setVisible(false);
+       actionBootMode[3]->setVisible(false);
 #if defined(_FM77_VARIANTS)
-       actionBootMode[2]->setVisible(true);
        actionBootMode[2]->setText(QString::fromUtf8("MMR"));
        actionBootMode[2]->setToolTip(QApplication::translate("Machine", "MMR boot mode.\nThis is FM-77 feature and I don't know about this.", 0));
+
+       actionBootMode[3]->setText(QString::fromUtf8("1MB FD"));
+       actionBootMode[3]->setToolTip(QApplication::translate("Machine", "Boot from 1MB FD for FM-77.\n", 0));
+       
+       actionBootMode[2]->setVisible(true);
+       actionBootMode[3]->setVisible(true);
 #elif defined(_FM8)
        actionBootMode[2]->setText(QApplication::translate("Machine", "Bubble Casette", 0));
-       actionBootMode[3]->setText(QApplication::translate("Machine", "8Inch FD", 0));
        actionBootMode[2]->setToolTip(QApplication::translate("Machine", "Boot for bubble casette.\nYou must install boot rom for this.", 0));
+       
+       actionBootMode[3]->setText(QApplication::translate("Machine", "8Inch FD", 0));
        actionBootMode[3]->setToolTip(QApplication::translate("Machine", "Boot for 8inch floppy disk.\nYou must install boot rom for this.", 0));
        
        actionBootMode[2]->setVisible(true);
        actionBootMode[3]->setVisible(true);
 #elif defined(_FM7) || defined(_FMNEW7)        
-       actionBootMode[2]->setVisible(false);
+       actionBootMode[2]->setText(QApplication::translate("Machine", "Bubble Casette", 0));
+       actionBootMode[2]->setToolTip(QApplication::translate("Machine", "Boot for bubble casette.\nYou must install boot rom for this.", 0));
+       
+       actionBootMode[2]->setVisible(true);
+       actionBootMode[3]->setVisible(false);
+#else // 77AV
+       actionBootMode[2]->setText(QString::fromUtf8("MMR"));
+       actionBootMode[2]->setToolTip(QApplication::translate("Machine", "MMR boot mode.\nThis is FM-77 feature and I don't know about this.", 0));
+       actionBootMode[3]->setVisible(false);
+       
+       actionBootMode[2]->setVisible(true);
+       actionBootMode[3]->setVisible(false);
 #endif
 
 #if defined(_FM8) || defined(_FM7) || defined(_FMNEW7)
@@ -515,10 +535,10 @@ void META_MainWindow::setupUI_Emu(void)
 
 #if defined(_FM8)
        ConfigCPUBootMode(4);
-#elif defined(_FM77AV_VARIANTS)
-       ConfigCPUBootMode(2);
+#elif defined(_FM77_VARIANTS)
+       ConfigCPUBootMode(4);
 #else
-       ConfigCPUBootMode(3);
+       ConfigCPUBootMode(4);
 #endif
 #if defined(_FM8) || defined(_FM7) || defined(_FMNEW7)
        actionKanjiRom = new Action_Control_7(this, using_flags);
index 2fcb663..fd85c46 100644 (file)
@@ -2778,10 +2778,10 @@ void DISPLAY::initialize()
        
        diag_load_subrom_c = false;
 #if defined(_FM8)      
-       if(read_bios(_T("SUBSYS_8.ROM"), subsys_c, 0x2800) >= 0x2800) diag_load_subrom_c = true;
+       if(read_bios(_T(ROM_FM8_SUBSYSTEM), subsys_c, 0x2800) >= 0x2800) diag_load_subrom_c = true;
        this->out_debug_log(_T("SUBSYSTEM ROM READING : %s"), diag_load_subrom_c ? "OK" : "NG");
 #else
-       if(read_bios(_T("SUBSYS_C.ROM"), subsys_c, 0x2800) >= 0x2800) diag_load_subrom_c = true;
+       if(read_bios(_T(ROM_FM7_SUBSYSTEM_TYPE_C), subsys_c, 0x2800) >= 0x2800) diag_load_subrom_c = true;
        this->out_debug_log(_T("SUBSYSTEM ROM Type C READING : %s"), diag_load_subrom_c ? "OK" : "NG");
 #endif
 #if defined(_FM77AV_VARIANTS)
@@ -2791,15 +2791,15 @@ void DISPLAY::initialize()
        memset(submem_hidden, 0x00, sizeof(submem_hidden));
    
        diag_load_subrom_a = false;
-       if(read_bios(_T("SUBSYS_A.ROM"), subsys_a, 0x2000) >= 0x2000) diag_load_subrom_a = true;
+       if(read_bios(_T(ROM_FM7_SUBSYSTEM_TYPE_A), subsys_a, 0x2000) >= 0x2000) diag_load_subrom_a = true;
        this->out_debug_log(_T("SUBSYSTEM ROM Type A READING : %s"), diag_load_subrom_a ? "OK" : "NG");
 
        diag_load_subrom_b = false;
-       if(read_bios(_T("SUBSYS_B.ROM"), subsys_b, 0x2000) >= 0x2000) diag_load_subrom_b = true;
+       if(read_bios(_T(ROM_FM7_SUBSYSTEM_TYPE_B), subsys_b, 0x2000) >= 0x2000) diag_load_subrom_b = true;
        this->out_debug_log(_T("SUBSYSTEM ROM Type B READING : %s"), diag_load_subrom_b ? "OK" : "NG");
 
        diag_load_subrom_cg = false;
-       if(read_bios(_T("SUBSYSCG.ROM"), subsys_cg, 0x2000) >= 0x2000) diag_load_subrom_cg = true;
+       if(read_bios(_T(ROM_FM7_SUBSYSTEM_CG), subsys_cg, 0x2000) >= 0x2000) diag_load_subrom_cg = true;
        this->out_debug_log(_T("SUBSYSTEM CG ROM READING : %s"), diag_load_subrom_cg ? "OK" : "NG");
 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
     defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
index ca8822e..e4791ad 100644 (file)
@@ -95,11 +95,13 @@ VM::VM(EMU* parent_emu): emu(parent_emu)
 #endif
 #if defined(CAPABLE_JCOMMCARD)
        if((config.dipswitch & FM7_DIPSW_JSUBCARD_ON) != 0) {
-               jsubcpu = new MC6809(this, parent_emu);
-               jcommcard = new FM7_JCOMMCARD(this, parent_emu);
+               jsubcpu = new MC6809(this, emu);
+               jcommcard = new FM7_JCOMMCARD(this, emu);
+               g_jsubhalt = new AND(this, emu);
        } else {
                jsubcpu = NULL;
                jcommcard = NULL;
+               g_jsubhalt = NULL;
        }
 #endif
 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || defined(_FM77AV20) || defined(_FM77AV20EX)
@@ -234,6 +236,9 @@ VM::VM(EMU* parent_emu): emu(parent_emu)
        if(jcommcard != NULL) {
                jcommcard->set_device_name(_T("Japanese COMM BOARD"));
        }
+       if(g_jsubhalt != NULL) {
+               g_jsubhalt->set_device_name(_T("J.COMM BOARD HALT(MC6809)"));
+       }
 # ifdef WITH_Z80
        if(z80cpu != NULL) z80cpu->set_device_name(_T("Z80 CPU BOARD"));
 # endif
@@ -400,9 +405,15 @@ void VM::connect_bus(void)
        if((jsubcpu != NULL) && (jcommcard != NULL)) {
                event->set_context_cpu(jsubcpu,  JCOMMCARD_CLOCK);
                jcommcard->set_context_cpu(jsubcpu);
-               jsubcpu->set_context_bus_ba(jcommcard, FM7_JCOMMCARD_BUS_BA, 0x00000001);
-               jsubcpu->set_context_bus_bs(jcommcard, FM7_JCOMMCARD_BUS_BS, 0x00000001);
-               mainio->set_context_jcommcard(jcommcard);
+               if(g_jsubhalt != NULL) {
+                       g_jsubhalt->set_mask(SIG_AND_BIT_0);
+                       g_jsubhalt->set_mask(SIG_AND_BIT_1);
+               
+                       jsubcpu->set_context_bus_ba(g_jsubhalt, SIG_AND_BIT_0, 0xffffffff);
+                       jsubcpu->set_context_bus_bs(g_jsubhalt, SIG_AND_BIT_1, 0xffffffff);
+                       g_jsubhalt->set_context_out(jcommcard, FM7_JCOMMCARD_BUS_HALT, 0xffffffff);
+                       mainio->set_context_jcommcard(jcommcard);
+               }
        }
 #endif
        event->set_context_sound(pcm1bit);
index 33ae7b4..a962aef 100644 (file)
@@ -85,6 +85,7 @@
 #   define FM77_EXRAM_BANKS    3
 # endif
 #define MAX_DRIVE  4
+#define CAPABLE_JCOMMCARD 1
 
 #elif defined(_FM77L4)
 #define DEVICE_NAME            "FUJITSU FM-77L4"
@@ -96,7 +97,7 @@
 #define HAS_400LINECARD
 //#define CAPABLE_KANJI_CLASS2
 #define _FM77_VARIANTS
-#define CAPABLE_Z80
+# define CAPABLE_Z80
 # ifndef FM77_EXRAM_BANKS
 #  define FM77_EXRAM_BANKS     3
 # endif
 #elif defined(_FM8)
 #define USE_BOOT_MODE         4
 #elif defined(_FM7) || defined(_FMNEW7)
-#define USE_BOOT_MODE         3
+#define USE_BOOT_MODE         4
 #else
-#define USE_BOOT_MODE         2
+#define USE_BOOT_MODE         4
 #endif
 
 // 0 = PSG or NONE
@@ -499,6 +500,7 @@ protected:
 #if defined(CAPABLE_JCOMMCARD)
        MC6809 *jsubcpu;
        FM7_JCOMMCARD *jcommcard;
+       AND *g_jsubhalt;
 #endif
        bool connect_320kfdc;
        bool connect_1Mfdc;
index eeae4e5..5e41e15 100644 (file)
@@ -156,8 +156,6 @@ enum {
        FM7_MAINCLOCK_MMRHIGH
 };
 enum {
-       FM7_JCOMMCARD_BUS_BA = 0x400000,
-       FM7_JCOMMCARD_BUS_BS,
 };
 
 enum {
@@ -171,8 +169,10 @@ enum {
        FM7_MAINIO_EXTBANK,
        FM7_MAINIO_EXTROM,
        FM7_MAINIO_MODE320,
+       
        FM7_MAINIO_SUBMONITOR_ROM,
        FM7_MAINIO_SUBMONITOR_RAM,
+       
        FM7_MAINIO_MMR_ENABLED,
        FM7_MAINIO_FASTMMR_ENABLED,
        FM7_MAINIO_WINDOW_ENABLED,
@@ -180,7 +180,8 @@ enum {
        FM7_MAINIO_MMR_SEGMENT,
        FM7_MAINIO_MMR_EXTENDED,
        FM7_MAINIO_WINDOW_FAST,
-       FM7_MAINMEM_REFRESH_FAST,
+       FM7_MAINIO_MEM_REFRESH_FAST,
+       
        FM7_MAINIO_UART0_SYNDET,
        FM7_MAINIO_UART0_RXRDY,
        FM7_MAINIO_UART0_TXRDY,
@@ -192,6 +193,8 @@ enum {
        FM7_MAINIO_MIDI_RXRDY,
        FM7_MAINIO_MIDI_TXRDY,
        
+       FM7_JCOMMCARD_BUS_HALT,
+       
        FM7_MAINIO_MMR_BANK = 0x200100,
 
 };
@@ -321,4 +324,45 @@ enum {
        KANJIROM_DIRECTADDR = 0x20000,
 };
 
+#define ROM_KANJI_CLASS1_FALLBACK "KANJI.ROM"
+#define ROM_KANJI_CLASS1          "KANJI1.ROM"
+#define ROM_KANJI_CLASS2          "KANJI2.ROM"
+
+#define ROM_FM8_SUBSYSTEM         "SUBSYS_8.ROM"
+#define ROM_FM7_SUBSYSTEM_TYPE_A  "SUBSYS_A.ROM"
+#define ROM_FM7_SUBSYSTEM_TYPE_B  "SUBSYS_B.ROM"
+#define ROM_FM7_SUBSYSTEM_TYPE_C  "SUBSYS_C.ROM"
+#define ROM_FM7_SUBSYSTEM_CG      "SUBSYSCG.ROM"
+
+#define ROM_FM8_BOOT_BASIC        "BOOT_BAS8.ROM"
+#define ROM_FM8_BOOT_DOS          "BOOT_DOS8.ROM"
+#define ROM_FM8_BOOT_BUBBLE       "BOOT_BBL8.ROM"
+#define ROM_FM8_BOOT_BUBBLE_128K  "BOOTBBL128.ROM"
+#define ROM_FM8_BOOT_DOS_FD8      "BOOT_SFD8.ROM"
+#define ROM_FM8_FBASICV10         "FBASIC10.ROM"
+
+#define ROM_FM7_BOOT_BASIC        "BOOT_BAS.ROM"
+#define ROM_FM7_BOOT_DOS          "BOOT_DOS.ROM"
+#define ROM_FM7_BOOT_MMR          "BOOT_MMR.ROM"
+#define ROM_FM7_BOOT_BUBBLE_7     "BOOTBBL7.ROM"
+#define ROM_FM7_BOOT_2HD          "BOOT_1MB.ROM"
+
+#define ROM_FM7_FBASICV30          "FBASIC30.ROM"
+#define ROM_FM7_FBASICV30L00       "FBASIC300.ROM"
+#define ROM_FM7_FBASICV30L10       "FBASIC301.ROM"
+#define ROM_FM7_FBASICV30L20       "FBASIC302.ROM"
+
+#define ROM_FM77AV_INITIATOR      "INITIATE.ROM"
+#define ROM_FM77AV_DICTIONARY     "DICROM.ROM"
+#define ROM_FM77AV40EX_EXTSUB     "EXTSUB.ROM"
+
+#define ROM_JCOMM_FIRMWARE        "JSUBMON.ROM"
+#define ROM_JCOMM_DICTIONARY      "JSUBDICT.ROM"
+#define ROM_JCOMM_KANJI           "JSUBKANJI.ROM"
+
+
+#define RAM_JCOMM_BACKUP          "JCOMMCARD.bin"
+#define RAM_FM77AV_DIC_BACKUP     "USERDIC.DAT"
+
+
 #endif // _FM7_COMMON_H_
index c04eb97..420d908 100644 (file)
@@ -1334,8 +1334,10 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr)
 #if defined(CAPABLE_JCOMMCARD)
                case 0x28:
                case 0x29:
+# if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
                case 0x2a:
                case 0x2b:
+# endif
                        if(jcommcard != NULL) {
                                retval = (uint32_t)(jcommcard->read_io8(addr));
                        } else {
@@ -1714,7 +1716,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data)
     defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
                case 0x94:
                        mainmem->write_signal(FM7_MAINIO_MMR_EXTENDED, data, 0x80);
-                       mainmem->write_signal(FM7_MAINMEM_REFRESH_FAST, data, 0x04);
+                       mainmem->write_signal(FM7_MAINIO_MEM_REFRESH_FAST, data, 0x04);
                        mainmem->write_signal(FM7_MAINIO_WINDOW_FAST , data, 0x01);
 
                        break;
index c99ff38..17eb8ca 100644 (file)
@@ -251,7 +251,7 @@ uint32_t FM7_MAINMEM::read_signal(int sigid)
        case FM7_MAINIO_MMR_EXTENDED:
                value = (mmr_extend) ? 0xffffffff : 0x00000000;
                break;
-       case FM7_MAINMEM_REFRESH_FAST:
+       case FM7_MAINIO_MEM_REFRESH_FAST:
                value = (refresh_fast) ? 0xffffffff : 0x00000000;
                break;
 #endif                 
@@ -335,7 +335,7 @@ void FM7_MAINMEM::write_signal(int sigid, uint32_t data, uint32_t mask)
                case FM7_MAINIO_MMR_EXTENDED:
                        mmr_extend = flag;
                        break;
-               case FM7_MAINMEM_REFRESH_FAST:
+               case FM7_MAINIO_MEM_REFRESH_FAST:
                        refresh_fast = flag;
                        setclock(config.cpu_type);
                        break;
@@ -490,7 +490,7 @@ void FM7_MAINMEM::update_config()
        //setclock(config.cpu_type);
 }
 
-#define STATE_VERSION 2
+#define STATE_VERSION 3
 void FM7_MAINMEM::save_state(FILEIO *state_fio)
 {
        state_fio->FputUint32_BE(STATE_VERSION);
@@ -508,6 +508,11 @@ void FM7_MAINMEM::save_state(FILEIO *state_fio)
        state_fio->FputBool(diag_load_bootrom_bas);
        state_fio->FputBool(diag_load_bootrom_dos);
        state_fio->FputBool(diag_load_bootrom_mmr);
+       state_fio->FputBool(diag_load_bootrom_bubble);
+       state_fio->FputBool(diag_load_bootrom_bubble_128k);
+       state_fio->FputBool(diag_load_bootrom_sfd8);
+       state_fio->FputBool(diag_load_bootrom_2hd);
+
        state_fio->Fwrite(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1);
        state_fio->Fwrite(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1);
        state_fio->Fwrite(fm7_mainmem_basicrom, sizeof(fm7_mainmem_basicrom), 1);
@@ -613,6 +618,10 @@ bool FM7_MAINMEM::load_state(FILEIO *state_fio)
                diag_load_bootrom_bas = state_fio->FgetBool();
                diag_load_bootrom_dos = state_fio->FgetBool();
                diag_load_bootrom_mmr = state_fio->FgetBool();
+               diag_load_bootrom_bubble = state_fio->FgetBool();
+               diag_load_bootrom_bubble_128k = state_fio->FgetBool();
+               diag_load_bootrom_sfd8 = state_fio->FgetBool();
+               diag_load_bootrom_2hd = state_fio->FgetBool();
                
                state_fio->Fread(fm7_mainmem_omote, sizeof(fm7_mainmem_omote), 1);
                state_fio->Fread(fm7_mainmem_ura, sizeof(fm7_mainmem_ura), 1);
index 6a4e262..812f29d 100644 (file)
@@ -134,6 +134,10 @@ class FM7_MAINMEM : public DEVICE
        bool diag_load_bootrom_bas;
        bool diag_load_bootrom_dos;
        bool diag_load_bootrom_mmr;
+       bool diag_load_bootrom_bubble;
+       bool diag_load_bootrom_bubble_128k;
+       bool diag_load_bootrom_sfd8;
+       bool diag_load_bootrom_2hd;
 
        int check_extrom(uint32_t raddr, uint32_t *realaddr);
        
index 17fcb9c..337adfb 100644 (file)
@@ -18,7 +18,6 @@ FM7_JCOMMCARD::FM7_JCOMMCARD(VM *parent_vm, EMU *parent_emu) : DEVICE(parent_vm,
 {
        n_bank = 0;
        rcb_address = 0;
-       cpu_ba = cpu_bs = false;
        halted = false;
        kanji_address = 0x00000;
        jis78_emulation = false;
@@ -39,8 +38,9 @@ FM7_JCOMMCARD::~FM7_JCOMMCARD()
 void FM7_JCOMMCARD::initialize(void)
 {
        FILEIO *fio = new FILEIO();
-               
-       if(fio->Fopen(create_local_path(_T("JSUBSYS.ROM")), FILEIO_READ_BINARY)) {
+       bool b_stat = false;
+       
+       if(fio->Fopen(create_local_path(_T(ROM_JCOMM_FIRMWARE)), FILEIO_READ_BINARY)) { // 20180114
                fio->Fread(prog_rom, sizeof(prog_rom), 1);
                fio->Fclose();
                firmware_ok = true;
@@ -51,23 +51,27 @@ void FM7_JCOMMCARD::initialize(void)
                prog_rom[0x000d] = 0x88;
        }
        /* Change: DICT.ROM to JSUBDICT.ROM */
-       if(fio->Fopen(create_local_path(_T("JSUBDICT.ROM")), FILEIO_READ_BINARY)) {
+       if(fio->Fopen(create_local_path(_T(ROM_JCOMM_DICTIONARY)), FILEIO_READ_BINARY)) {
                fio->Fread(dict_rom, sizeof(dict_rom), 1);
                fio->Fclose();
        }
        /* KANJI ROM */
-       if(fio->Fopen(create_local_path(_T("JSUBKANJI.ROM")), FILEIO_READ_BINARY)) {
+       if(fio->Fopen(create_local_path(_T(ROM_JCOMM_KANJI)), FILEIO_READ_BINARY)) {
                fio->Fread(kanji_rom, sizeof(kanji_rom), 1);
                fio->Fclose();
-       } else if(fio->Fopen(create_local_path(_T("KANJI.ROM")), FILEIO_READ_BINARY)) {
+               b_stat = true;
+       } else if(fio->Fopen(create_local_path(_T(ROM_KANJI_CLASS1)), FILEIO_READ_BINARY)) {
                fio->Fread(kanji_rom, sizeof(kanji_rom), 1);
                fio->Fclose();
-       } else if(fio->Fopen(create_local_path(_T("KANJI1.ROM")), FILEIO_READ_BINARY)) {
+               b_stat = true;
+       } else if(fio->Fopen(create_local_path(_T(ROM_KANJI_CLASS1_FALLBACK)), FILEIO_READ_BINARY)) {
                fio->Fread(kanji_rom, sizeof(kanji_rom), 1);
                fio->Fclose();
+               b_stat = true;
        }
+       this->out_debug_log(_T("KANJIROM READ %s."), b_stat ? "OK" : "FAILED");
 
-       if(fio->Fopen(create_local_path(_T("JCOMMCARD.bin")), FILEIO_READ_BINARY)) {
+       if(fio->Fopen(create_local_path(_T(RAM_JCOMM_BACKUP)), FILEIO_READ_BINARY)) {
                fio->Fread(backup_ram, sizeof(backup_ram), 1);
                fio->Fclose();
                modified = false;
@@ -75,22 +79,95 @@ void FM7_JCOMMCARD::initialize(void)
        delete fio;
 
 #if defined(_FM77AV_VARIANTS)
-       jis78_emulation = true;
+       jis78_emulation = false;
 #else
        jis78_emulation = ((config.dipswitch & FM7_DIPSW_JIS78EMU_ON) != 0);
 #endif
+       if(jis78_emulation && b_stat) {
+               patch_jis78();
+       }
+}
+
+bool FM7_JCOMMCARD::patch_jis78(void)
+{
+       // JIS78 Undefined table (Refer from FM77AV)
+       // Made by Ryu Takegami.From XM7 v3.4 L77a
+       static const uint32_t jis78_table[] = {
+               0xffffffff, 0x00000001, 0xffff8001, 0xfc00ffff,
+               0x00000001, 0x00000001, 0xfe000001, 0x00000001,
+               0xffffffff, 0x80000000, 0xffffffff, 0xf8000001,
+               0xfff00000, 0xff800000, 0xffffffff, 0xfffc0000,
+               0xffffffff, 0x00000000, 0xffffffff, 0xf8000001,
+               0x00000000, 0x00000000, 0xfe000001, 0x0001fffc,
+       };
+       static const uint32_t convert_table[][2] = {
+               /* 第1水準code addr            第2水準code addr */
+               {/*鯵 0x3033*/0x4130,  /*鰺 0x724D*/0xE4D0},
+               {/*鴬 0x3229*/0x4490,  /*鶯 0x7274*/0xD540},
+               {/*蛎 0x3342*/0x6620,  /*蠣 0x695A*/0x93A0},
+               {/*撹 0x3349*/0x6690,  /*攪 0x5978*/0x5380},
+               {/*竃 0x3376*/0x8760,  /*竈 0x635E*/0x87E0},
+               {/*潅 0x3443*/0x6830,  /*灌 0x5E75*/0x5D50},
+               {/*諌 0x3452*/0x6920,  /*諫 0x6B5D*/0x97D0},
+               {/*頚 0x375B*/0x6FB0,  /*頸 0x7074*/0xD140},
+               {/*砿 0x395C*/0x73C0,  /*礦 0x6268*/0xA480},
+               {/*蕊 0x3C49*/0x7890,  /*蘂 0x6922*/0x7220},
+               {/*靭 0x3F59*/0x7F90,  /*靱 0x7057*/0xE170},
+               {/*賎 0x4128*/0xA280,  /*賤 0x6C4D*/0x98D0},
+               {/*壷 0x445B*/0xC9B0,  /*壺 0x5464*/0x4840},
+               {/*砺 0x4557*/0xCB70,  /*礪 0x626A*/0xA4A0},
+               {/*梼 0x456E*/0xEAE0,  /*檮 0x5B6D*/0x56D0},
+               {/*涛 0x4573*/0xEB30,  /*濤 0x5E39*/0x1D90},
+               {/*迩 0x4676*/0xED60,  /*邇 0x6D6E*/0xBAE0},
+               {/*蝿 0x4768*/0xEE80,  /*蠅 0x6A24*/0x7440},
+               {/*桧 0x4930*/0xB300,  /*檜 0x5B58*/0x3780},
+               {/*侭 0x4B79*/0xF790,  /*儘 0x5056*/0x2160},
+               {/*薮 0x4C79*/0xF990,  /*藪 0x692E*/0x72E0},
+               {/*篭 0x4F36*/0xBF60,  /*籠 0x6446*/0x8860},
+               {/*尭 0x3646*/0x6C60,  /*堯 0x7421*/0xC810},
+               {/*槙 0x4B6A*/0xF6A0,  /*槇 0x7422*/0xC820},
+               {/*遥 0x4D5A*/0xDBA0,  /*遙 0x7423*/0xC830},
+               {0, 0},
+       };
+
+       for(uint32_t patchaddr = 0; patchaddr < 0x6000; patchaddr += 32) {
+               if((jis78_table[patchaddr >> 10] & (1 << (patchaddr >> 5))) != 0) {
+                       for(uint32_t offset = 0; offset < 32; offset++) {
+                               kanji_rom[patchaddr + offset] = (uint8_t)(offset & 1);
+                       }
+               }
+       }
+       // Patch ROM to JIS83 by Ryu Takegami.From XM7 v3.4L77a.
+       uint8_t *tmpbuf = (uint8_t *)malloc(0x20000);
+       if(tmpbuf == NULL) return false;
+       
+       FILEIO *fio = new FILEIO();
+       if(fio->Fopen(create_local_path(_T(ROM_KANJI_CLASS2)), FILEIO_READ_BINARY)) {
+               fio->Fread(tmpbuf, 0x20000, 1);
+               fio->Fclose();
+       } else {
+               delete fio;
+               free(tmpbuf);
+               return false;
+       }
+
+       for (uint32_t patchaddr = 0; convert_table[patchaddr][0] != 0; patchaddr++) {
+               for (uint32_t offset = 0; offset < 32; offset++) {
+                       kanji_rom[convert_table[patchaddr][0] * 2 + offset] =
+                               tmpbuf[convert_table[patchaddr][1] * 2 + offset];
+               }
+       }
+       
+       free(tmpbuf);
+       return true;
 }
 
 void FM7_JCOMMCARD::write_signal(int id, uint32_t data, uint32_t mask)
 {
+       bool b = ((data & mask) != 0);
        switch(id) {
-       case FM7_JCOMMCARD_BUS_BA:
-               cpu_ba = ((data & mask) != 0);
-               halted = cpu_ba & cpu_bs;
-               break;
-       case FM7_JCOMMCARD_BUS_BS:
-               cpu_bs = ((data & mask) != 0);
-               halted = cpu_ba & cpu_bs;
+       case FM7_JCOMMCARD_BUS_HALT:
+               halted = b;
                break;
        }
 }
@@ -115,12 +192,16 @@ uint32_t FM7_JCOMMCARD::read_io8(uint32_t address)
        case 2:
        case 3:
                /* Kanji Data */
+#if !defined(_FM77AV_VARIANTS)
                if((jis78_emulation) && (kanji_address >= 0x3000) && (kanji_address < 0x4000)) {
                        /* JIS78 */
                        data =  address & 1;
                } else {
                        data = kanji_rom[(kanji_address << 1) + (address & 1)];
                }
+#else
+               data = kanji_rom[(kanji_address << 1) + (address & 1)];
+#endif         
                break;
        }
        return data;
@@ -141,8 +222,12 @@ void FM7_JCOMMCARD::write_io8(uint32_t address, uint32_t data)
                /* REQUEST TO HALT */
                if((data & 0x80) != 0) {
                        if(cpu != NULL) cpu->write_signal(SIG_CPU_HALTREQ, 0x00000000, 0xffffffff);
+                       //haltreq = false;
+                       //halted = false;
                } else {
                        if(cpu != NULL) cpu->write_signal(SIG_CPU_HALTREQ, 0xffffffff, 0xffffffff);
+                       //haltreq = true;
+                       //halted = true;
                        rcb_address = 0;
                }
                break;
@@ -184,7 +269,8 @@ void FM7_JCOMMCARD::write_data8(uint32_t address, uint32_t data)
        if(address < 0x8000) return;
        if(address >= 0xa000) return;
        if(address == 0x9fff) {
-               if(cpu != NULL) cpu->write_signal(SIG_CPU_HALTREQ, ((data & 0x80) != 0) ? 0 : 0xffffffff, 0xffffffff);
+               if(cpu != NULL) cpu->write_signal(SIG_CPU_HALTREQ, ((data & 0x80) == 0) ? 0xffffffff : 0, 0xffffffff);
+               //halted = ((data & 0x80) == 0);
                n_bank = (uint8_t)(data & 0x3f); 
        } else if(address < 0x9fff) {
                modified = true;
@@ -196,7 +282,7 @@ void FM7_JCOMMCARD::release(void)
 {
        FILEIO *fio = new FILEIO();
        if(modified) {
-               if(fio->Fopen(create_local_path(_T("JCOMMCARD.bin")), FILEIO_WRITE_BINARY)) {
+               if(fio->Fopen(create_local_path(_T(RAM_JCOMM_BACKUP)), FILEIO_WRITE_BINARY)) {
                        fio->Fwrite(backup_ram, sizeof(backup_ram), 1);
                        fio->Fclose();
                        modified = false;
@@ -209,16 +295,15 @@ void FM7_JCOMMCARD::reset(void)
        rcb_address = 0x00;
        kanji_address = 0x00000;
        if(cpu != NULL) cpu->write_signal(SIG_CPU_HALTREQ, 0, 0xffffffff);
-       cpu_ba = cpu_bs = false;
-       halted = false;
 #if defined(_FM77AV_VARIANTS)
        jis78_emulation = false;
 #else
        jis78_emulation = ((config.dipswitch & FM7_DIPSW_JIS78EMU_ON) != 0);
 #endif
+       if(cpu != NULL) cpu->reset();
 }
 
-#define STATE_VERSION 1
+#define STATE_VERSION 2
 
 void FM7_JCOMMCARD::save_state(FILEIO *state_fio)
 {
@@ -230,8 +315,7 @@ void FM7_JCOMMCARD::save_state(FILEIO *state_fio)
        state_fio->FputUint8(rcb_address);
        state_fio->FputUint32_BE(kanji_address);
 
-       state_fio->FputBool(cpu_ba);
-       state_fio->FputBool(cpu_bs);
+       state_fio->FputBool(halted);
 
        state_fio->Fwrite(prog_rom, sizeof(prog_rom), 1);
        state_fio->Fwrite(dict_rom, sizeof(dict_rom), 1);
@@ -256,9 +340,7 @@ bool FM7_JCOMMCARD::load_state(FILEIO *state_fio)
                rcb_address = state_fio->FgetUint8();
                kanji_address = state_fio->FgetUint32_BE();
 
-               cpu_ba = state_fio->FgetBool();
-               cpu_bs = state_fio->FgetBool();
-               halted = cpu_ba & cpu_bs;
+               halted = state_fio->FgetBool();
 
                state_fio->Fread(prog_rom, sizeof(prog_rom), 1);
                state_fio->Fread(dict_rom, sizeof(dict_rom), 1);
index fca23c0..d9a127b 100644 (file)
@@ -18,8 +18,6 @@ private:
        
        bool jis78_emulation;
 
-       bool cpu_ba;
-       bool cpu_bs;
        bool halted;
 
        bool modified;
@@ -29,6 +27,8 @@ private:
        uint8_t dict_rom[0x40000];
        uint8_t kanji_rom[0x20000];
        uint8_t backup_ram[0x2000];
+       
+       bool patch_jis78(void);
 public:
        FM7_JCOMMCARD(VM *parent_vm, EMU *parent_emu);
        ~FM7_JCOMMCARD();
index d6da593..9e0e348 100644 (file)
@@ -29,7 +29,7 @@ KANJIROM::KANJIROM(VM *parent_vm, EMU* parent_emu, bool type_2std): DEVICE(paren
 #endif
        if(type_2std) {
                class2 = true;
-               if(fio->Fopen(create_local_path(_T("KANJI2.ROM")), FILEIO_READ_BINARY)) {
+               if(fio->Fopen(create_local_path(_T(ROM_KANJI_CLASS2)), FILEIO_READ_BINARY)) {
                  fio->Fread(data_table, 0x20000, 1);
                        fio->Fclose();
                        read_ok = true;
@@ -37,15 +37,16 @@ KANJIROM::KANJIROM(VM *parent_vm, EMU* parent_emu, bool type_2std): DEVICE(paren
                }
        } else {
                class2 = false;
-               if(fio->Fopen(create_local_path(_T("KANJI1.ROM")), FILEIO_READ_BINARY)) {
+               if(fio->Fopen(create_local_path(_T(ROM_KANJI_CLASS1)), FILEIO_READ_BINARY)) {
                  fio->Fread(data_table, 0x20000, 1);
                        fio->Fclose();
                        read_ok = true;
-               } else if(fio->Fopen(create_local_path(_T("KANJI.ROM")), FILEIO_READ_BINARY)) {
+               } else if(fio->Fopen(create_local_path(_T(ROM_KANJI_CLASS1_FALLBACK)), FILEIO_READ_BINARY)) {
                  fio->Fread(data_table, 0x20000, 1);
                        fio->Fclose();
                        read_ok = true;
-               } 
+               }
+               
        }
        if(class2) {
                set_device_name(_T("FM7_KANJI_CLASS2"));
@@ -57,6 +58,15 @@ KANJIROM::KANJIROM(VM *parent_vm, EMU* parent_emu, bool type_2std): DEVICE(paren
        } else {
                set_device_name(_T("FM7_KANJI_CLASS1"));
        }
+       this->out_debug_log(_T("KANJIROM READ %s."), read_ok ? "OK" : "FAILED");
+       
+       if(jis78_emulation && read_ok) {
+               if(patch_jis78()) {
+                       this->out_debug_log(_T("PATCHED KANJIROM to emulate JIS78 feature."));
+               } else {
+                       this->out_debug_log(_T("FAILED TO PATCH KANJIROM."));
+               }                               
+       }
        kanjiaddr.d = 0;
        delete fio;
        return;
@@ -69,11 +79,81 @@ KANJIROM::~KANJIROM()
 void KANJIROM::reset(void)
 {
        kanjiaddr.d = 0;
-#if defined(_FM77AV_VARIANTS)
-       jis78_emulation = false;
-#else
-       jis78_emulation = ((config.dipswitch & FM7_DIPSW_JIS78EMU_ON) != 0);
-#endif
+}
+
+bool KANJIROM::patch_jis78(void)
+{
+       if(class2) return true;
+       // JIS78 Undefined table (Refer from FM77AV)
+       // Made by Ryu Takegami.From XM7 v3.4 L77a
+       static const uint32_t jis78_table[] = {
+               0xffffffff, 0x00000001, 0xffff8001, 0xfc00ffff,
+               0x00000001, 0x00000001, 0xfe000001, 0x00000001,
+               0xffffffff, 0x80000000, 0xffffffff, 0xf8000001,
+               0xfff00000, 0xff800000, 0xffffffff, 0xfffc0000,
+               0xffffffff, 0x00000000, 0xffffffff, 0xf8000001,
+               0x00000000, 0x00000000, 0xfe000001, 0x0001fffc,
+       };
+       static const uint32_t convert_table[][2] = {
+               /* 第1水準code addr            第2水準code addr */
+               {/*鯵 0x3033*/0x4130,  /*鰺 0x724D*/0xE4D0},
+               {/*鴬 0x3229*/0x4490,  /*鶯 0x7274*/0xD540},
+               {/*蛎 0x3342*/0x6620,  /*蠣 0x695A*/0x93A0},
+               {/*撹 0x3349*/0x6690,  /*攪 0x5978*/0x5380},
+               {/*竃 0x3376*/0x8760,  /*竈 0x635E*/0x87E0},
+               {/*潅 0x3443*/0x6830,  /*灌 0x5E75*/0x5D50},
+               {/*諌 0x3452*/0x6920,  /*諫 0x6B5D*/0x97D0},
+               {/*頚 0x375B*/0x6FB0,  /*頸 0x7074*/0xD140},
+               {/*砿 0x395C*/0x73C0,  /*礦 0x6268*/0xA480},
+               {/*蕊 0x3C49*/0x7890,  /*蘂 0x6922*/0x7220},
+               {/*靭 0x3F59*/0x7F90,  /*靱 0x7057*/0xE170},
+               {/*賎 0x4128*/0xA280,  /*賤 0x6C4D*/0x98D0},
+               {/*壷 0x445B*/0xC9B0,  /*壺 0x5464*/0x4840},
+               {/*砺 0x4557*/0xCB70,  /*礪 0x626A*/0xA4A0},
+               {/*梼 0x456E*/0xEAE0,  /*檮 0x5B6D*/0x56D0},
+               {/*涛 0x4573*/0xEB30,  /*濤 0x5E39*/0x1D90},
+               {/*迩 0x4676*/0xED60,  /*邇 0x6D6E*/0xBAE0},
+               {/*蝿 0x4768*/0xEE80,  /*蠅 0x6A24*/0x7440},
+               {/*桧 0x4930*/0xB300,  /*檜 0x5B58*/0x3780},
+               {/*侭 0x4B79*/0xF790,  /*儘 0x5056*/0x2160},
+               {/*薮 0x4C79*/0xF990,  /*藪 0x692E*/0x72E0},
+               {/*篭 0x4F36*/0xBF60,  /*籠 0x6446*/0x8860},
+               {/*尭 0x3646*/0x6C60,  /*堯 0x7421*/0xC810},
+               {/*槙 0x4B6A*/0xF6A0,  /*槇 0x7422*/0xC820},
+               {/*遥 0x4D5A*/0xDBA0,  /*遙 0x7423*/0xC830},
+               {0, 0},
+       };
+
+       for(uint32_t patchaddr = 0; patchaddr < 0x6000; patchaddr += 32) {
+               if((jis78_table[patchaddr >> 10] & (1 << (patchaddr >> 5))) != 0) {
+                       for(uint32_t offset = 0; offset < 32; offset++) {
+                               data_table[patchaddr + offset] = (uint8_t)(offset & 1);
+                       }
+               }
+       }
+       // Patch ROM to JIS83 by Ryu Takegami.From XM7 v3.4L77a.
+       uint8_t *tmpbuf = (uint8_t *)malloc(0x20000);
+       if(tmpbuf == NULL) return false;
+       
+       FILEIO *fio = new FILEIO();
+       if(fio->Fopen(create_local_path(_T(ROM_KANJI_CLASS2)), FILEIO_READ_BINARY)) {
+               fio->Fread(tmpbuf, 0x20000, 1);
+               fio->Fclose();
+       } else {
+               delete fio;
+               free(tmpbuf);
+               return false;
+       }
+
+       for (uint32_t patchaddr = 0; convert_table[patchaddr][0] != 0; patchaddr++) {
+               for (uint32_t offset = 0; offset < 32; offset++) {
+                       data_table[convert_table[patchaddr][0] * 2 + offset] =
+                               tmpbuf[convert_table[patchaddr][1] * 2 + offset];
+               }
+       }
+       
+       free(tmpbuf);
+       return true;
 }
 
 void KANJIROM::write_data8(uint32_t addr, uint32_t data)
@@ -92,14 +172,18 @@ void KANJIROM::write_data8(uint32_t addr, uint32_t data)
 uint32_t KANJIROM::read_data8(uint32_t addr)
 {
        if(addr == KANJIROM_DATA_HI) {
+#if !defined(_FM77AV_VARIANTS)
                if((jis78_emulation) && (kanjiaddr.d >= 0x3000) && (kanjiaddr.d < 0x4000)) {
                        return 0;
                }
+#endif
                return data_table[(kanjiaddr.d << 1) & 0x1ffff];
        } else if(addr == KANJIROM_DATA_LO) {
+#if !defined(_FM77AV_VARIANTS)
                if((jis78_emulation) && (kanjiaddr.d >= 0x3000) && (kanjiaddr.d < 0x4000)) {
                        return 1;
                }
+#endif
                return data_table[((kanjiaddr.d << 1) & 0x1ffff) + 1];
        } else if(addr == KANJIROM_READSTAT) {
                return (read_ok) ? 0xffffffff : 0x00000000;
index 04a789d..a4a5263 100644 (file)
@@ -23,6 +23,8 @@ private:
        pair_t kanjiaddr;
 
        bool jis78_emulation;
+       
+       bool patch_jis78(void);
 public:
        KANJIROM(VM *parent_vm, EMU* parent_emu, bool type_2std);
        ~KANJIROM();
index 3c4d148..d6dff53 100644 (file)
@@ -16,6 +16,10 @@ void FM7_MAINMEM::initialize(void)
        diag_load_bootrom_bas = false;
        diag_load_bootrom_dos = false;
        diag_load_bootrom_mmr = false;
+       diag_load_bootrom_bubble = false;
+       diag_load_bootrom_bubble_128k = false;
+       diag_load_bootrom_sfd8 = false;
+       diag_load_bootrom_2hd = false;
 
 #if defined(_FM77AV_VARIANTS)
        dictrom_connected = false;
@@ -80,40 +84,46 @@ void FM7_MAINMEM::initialize(void)
        }
 #endif 
 #if defined(_FM8)
-       if(read_bios(_T("BOOT_BAS8.ROM"), fm7_bootroms[0], 0x200) >= 0x1e0) {
+       if(read_bios(_T(ROM_FM8_BOOT_BASIC), fm7_bootroms[0], 0x200) >= 0x1e0) {
                diag_load_bootrom_bas = true;
-       } else {
-               diag_load_bootrom_bas = false;
        }
-       if(read_bios(_T("BOOT_DOS8.ROM"), fm7_bootroms[1], 0x200) >= 0x1e0) {
+       if(read_bios(_T(ROM_FM8_BOOT_DOS), fm7_bootroms[1], 0x200) >= 0x1e0) {
                diag_load_bootrom_dos = true;
-       } else {
-               diag_load_bootrom_dos = false;
        }
-       diag_load_bootrom_mmr = false;
+       if(read_bios(_T(ROM_FM8_BOOT_BUBBLE_128K), fm7_bootroms[2], 0x200) >= 0x1e0) {
+               diag_load_bootrom_bubble_128k = true;
+       } else if(read_bios(_T(ROM_FM8_BOOT_BUBBLE), fm7_bootroms[2], 0x200) >= 0x1e0) {
+               diag_load_bootrom_bubble = true;
+       }
+       if(read_bios(_T(ROM_FM8_BOOT_DOS_FD8), fm7_bootroms[3], 0x200) >= 0x1e0) {
+               diag_load_bootrom_sfd8 = true;
+       }
+       
 # elif defined(_FM7) || defined(_FMNEW7) || defined(_FM77_VARIANTS)
-       if(read_bios(_T("BOOT_BAS.ROM"), fm7_bootroms[0], 0x200) >= 0x1e0) {
+       if(read_bios(_T(ROM_FM7_BOOT_BASIC), fm7_bootroms[0], 0x200) >= 0x1e0) {
                diag_load_bootrom_bas = true;
-       } else {
-               diag_load_bootrom_bas = false;
        }
-       if(read_bios(_T("BOOT_DOS.ROM"), fm7_bootroms[1], 0x200) >= 0x1e0) {
+       if(read_bios(_T(ROM_FM7_BOOT_DOS), fm7_bootroms[1], 0x200) >= 0x1e0) {
                diag_load_bootrom_dos = true;
-       } else {
-               diag_load_bootrom_dos = false;
        }
 #  if defined(_FM77_VARIANTS)
-       if(read_bios(_T("BOOT_MMR.ROM"), fm7_bootroms[2], 0x200) >= 0x1e0) {
+       if(read_bios(_T(ROM_FM7_BOOT_MMR), fm7_bootroms[2], 0x200) >= 0x1e0) {
                diag_load_bootrom_mmr = true;
-       } else {
-               diag_load_bootrom_mmr = false;
+       }
+       if(read_bios(_T(ROM_FM7_BOOT_2HD), fm7_bootroms[3], 0x200) >= 0x1e0) {
+               diag_load_bootrom_2hd = true;
        }
    
        i = FM7_MAINMEM_BOOTROM_RAM;
        memset(fm7_bootram, 0x00, 0x200 * sizeof(uint8_t)); // RAM
+
 #  else
        // FM-7/8
-       diag_load_bootrom_mmr = false;
+       if(read_bios(_T(ROM_FM7_BOOT_BUBBLE_7), fm7_bootroms[2], 0x200) >= 0x1e0) {
+               diag_load_bootrom_bubble = true;
+       } else {
+               diag_load_bootrom_bubble = false;
+       }
 #  endif
 # elif defined(_FM77AV_VARIANTS)
        i = FM7_MAINMEM_AV_PAGE0;
@@ -126,11 +136,12 @@ void FM7_MAINMEM::initialize(void)
        diag_load_initrom = false;
        memset(fm7_mainmem_initrom, 0xff, 0x2000 * sizeof(uint8_t));
 
-       if(read_bios(_T("INITIATE.ROM"), fm7_mainmem_initrom, 0x2000) >= 0x2000) diag_load_initrom = true;
+       if(read_bios(_T(ROM_FM77AV_INITIATOR), fm7_mainmem_initrom, 0x2000) >= 0x2000) diag_load_initrom = true;
        this->out_debug_log(_T("77AV INITIATOR ROM READING : %s"), diag_load_initrom ? "OK" : "NG");
 
-       if(read_bios(_T("BOOT_MMR.ROM"), fm77av_hidden_bootmmr, 0x200) < 0x1e0) {
+       if(read_bios(_T(ROM_FM7_BOOT_MMR), fm77av_hidden_bootmmr, 0x200) < 0x1e0) {
                memcpy(fm77av_hidden_bootmmr, &fm7_mainmem_initrom[0x1a00], 0x200);
+               diag_load_bootrom_mmr = true;
        }
        fm77av_hidden_bootmmr[0x1fe] = 0xfe;
        fm77av_hidden_bootmmr[0x1fe] = 0x00;
@@ -152,8 +163,27 @@ void FM7_MAINMEM::initialize(void)
 #endif
        this->out_debug_log(_T("BOOT ROM (basic mode) READING : %s"), diag_load_bootrom_bas ? "OK" : "NG");
        this->out_debug_log(_T("BOOT ROM (DOS   mode) READING : %s"), diag_load_bootrom_dos ? "OK" : "NG");
+
 #if defined(_FM77_VARIANTS)
        this->out_debug_log(_T("BOOT ROM (MMR   mode) READING : %s"), diag_load_bootrom_mmr ? "OK" : "NG");
+       this->out_debug_log(_T("BOOT ROM (2HD   mode) READING : %s"), diag_load_bootrom_2hd ? "OK" : "NG");
+#elif defined(_FM8)
+       if(diag_load_bootrom_bubble_128k) {
+               this->out_debug_log(_T("BOOT ROM (BUBBLE 128K) READING : %s"), "OK");
+       } else if(diag_load_bootrom_bubble) {
+               this->out_debug_log(_T("BOOT ROM (BUBBLE  32K) READING : %s"), "OK");
+       } else {
+               this->out_debug_log(_T("BOOT ROM (BUBBLE  32K) READING : %s"), "NG");
+       }               
+       this->out_debug_log(_T("BOOT ROM (2HD   mode) READING : %s"), diag_load_bootrom_2hd ? "OK" : "NG");
+#elif defined(_FM7) || defined(_FM7)
+       if(diag_load_bootrom_bubble) {
+               this->out_debug_log(_T("BOOT ROM (BUBBLE mode) READING : %s"), "OK");
+       } else {
+               this->out_debug_log(_T("BOOT ROM (BUBBLE mode) READING : %s"), "NG");
+       }
+#else // FM77AV*
+       this->out_debug_log(_T("BOOT ROM (MMR   mode) READING : %s"), diag_load_bootrom_mmr ? "OK" : "NG");
 #endif
 
 
@@ -173,16 +203,18 @@ void FM7_MAINMEM::initialize(void)
        memset(fm7_mainmem_basicrom, 0xff, 0x7c00 * sizeof(uint8_t));
 
 #if !defined(_FM8)
-       if(read_bios(_T("FBASIC302.ROM"), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
+       if(read_bios(_T(ROM_FM7_FBASICV30L20), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
+               diag_load_basicrom = true;
+       } else if(read_bios(_T(ROM_FM7_FBASICV30L10), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
                diag_load_basicrom = true;
-       } else if(read_bios(_T("FBASIC300.ROM"), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
+       } else if(read_bios(_T(ROM_FM7_FBASICV30L00), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
                diag_load_basicrom = true;
-       } else if(read_bios(_T("FBASIC30.ROM"), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
+       } else if(read_bios(_T(ROM_FM7_FBASICV30), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) {
                diag_load_basicrom = true;
        }
    
 #else // FM8
-       if(read_bios(_T("FBASIC10.ROM"), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) diag_load_basicrom = true;
+       if(read_bios(_T(ROM_FM8_FBASICV10), fm7_mainmem_basicrom, 0x7c00) == 0x7c00) diag_load_basicrom = true;
 #endif 
        this->out_debug_log(_T("BASIC ROM READING : %s"), diag_load_basicrom ? "OK" : "NG");
    
@@ -192,7 +224,7 @@ void FM7_MAINMEM::initialize(void)
        diag_load_dictrom = false;
        i = FM7_MAINMEM_DICTROM;
        memset(fm7_mainmem_dictrom, 0xff, 0x40000 * sizeof(uint8_t));
-       if(read_bios(_T("DICROM.ROM"), fm7_mainmem_dictrom, 0x40000) == 0x40000) diag_load_dictrom = true;
+       if(read_bios(_T(ROM_FM77AV_DICTIONARY), fm7_mainmem_dictrom, 0x40000) == 0x40000) diag_load_dictrom = true;
        this->out_debug_log(_T("DICTIONARY ROM READING : %s"), diag_load_dictrom ? "OK" : "NG");
        dictrom_connected = diag_load_dictrom;
        
@@ -200,7 +232,7 @@ void FM7_MAINMEM::initialize(void)
        diag_load_learndata = false;
        memset(fm7_mainmem_learndata, 0x00, 0x2000 * sizeof(uint8_t));
        
-       if(read_bios(_T("USERDIC.DAT"), fm7_mainmem_learndata, 0x2000) == 0x2000) diag_load_learndata = true;
+       if(read_bios(_T(RAM_FM77AV_DIC_BACKUP), fm7_mainmem_learndata, 0x2000) == 0x2000) diag_load_learndata = true;
        this->out_debug_log(_T("DICTIONARY BACKUPED RAM READING : %s"), diag_load_learndata ? "OK" : "NG");
        if(!diag_load_learndata) write_bios(_T("USERDIC.DAT"), fm7_mainmem_learndata, 0x2000);
 #endif
@@ -209,7 +241,7 @@ void FM7_MAINMEM::initialize(void)
 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
        diag_load_extrarom = false;
        memset(fm7_mainmem_extrarom, 0xff, sizeof(fm7_mainmem_extrarom));
-       if(read_bios(_T("EXTSUB.ROM"), fm7_mainmem_extrarom, 0xc000) == 0xc000) diag_load_extrarom = true;
+       if(read_bios(_T(ROM_FM77AV40_EXTSUB), fm7_mainmem_extrarom, 0xc000) == 0xc000) diag_load_extrarom = true;
        this->out_debug_log(_T("AV40SX/EX EXTRA ROM READING : %s"), diag_load_extrarom ? "OK" : "NG");
 #endif
        init_data_table();