[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.
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.
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.
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)
#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);
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)
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)
#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)
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
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);
# define FM77_EXRAM_BANKS 3
# endif
#define MAX_DRIVE 4
+#define CAPABLE_JCOMMCARD 1
#elif defined(_FM77L4)
#define DEVICE_NAME "FUJITSU FM-77L4"
#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
#if defined(CAPABLE_JCOMMCARD)
MC6809 *jsubcpu;
FM7_JCOMMCARD *jcommcard;
+ AND *g_jsubhalt;
#endif
bool connect_320kfdc;
bool connect_1Mfdc;
FM7_MAINCLOCK_MMRHIGH
};
enum {
- FM7_JCOMMCARD_BUS_BA = 0x400000,
- FM7_JCOMMCARD_BUS_BS,
};
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,
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,
FM7_MAINIO_MIDI_RXRDY,
FM7_MAINIO_MIDI_TXRDY,
+ FM7_JCOMMCARD_BUS_HALT,
+
FM7_MAINIO_MMR_BANK = 0x200100,
};
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_
#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 {
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;
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
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;
//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);
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);
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);
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);
{
n_bank = 0;
rcb_address = 0;
- cpu_ba = cpu_bs = false;
halted = false;
kanji_address = 0x00000;
jis78_emulation = false;
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;
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;
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;
}
}
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;
/* 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;
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;
{
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;
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)
{
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);
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);
bool jis78_emulation;
- bool cpu_ba;
- bool cpu_bs;
bool halted;
bool modified;
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();
#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;
}
} 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"));
} 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;
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)
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;
pair_t kanjiaddr;
bool jis78_emulation;
+
+ bool patch_jis78(void);
public:
KANJIROM(VM *parent_vm, EMU* parent_emu, bool type_2std);
~KANJIROM();
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;
}
#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;
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;
#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
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");
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;
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
#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();