From: K.Ohta Date: Sat, 29 Sep 2018 19:11:23 +0000 (+0900) Subject: [VM][General] Merge Upstream 20180530. X-Git-Url: http://git.osdn.net/view?p=csp-qt%2Fcommon_source_project-fm7.git;a=commitdiff_plain;h=80df61fb1e009ab0d229a335f546cd788d54b158 [VM][General] Merge Upstream 20180530. --- diff --git a/source/history.txt b/source/history.txt index 7dd2675fd..891246d7c 100644 --- a/source/history.txt +++ b/source/history.txt @@ -1,3 +1,33 @@ +9/30/2018 + +[COMMON/FILEIO] improve Fseek for compressed file by gzip +[EMU] improve to mount/unmount hard disk image in reset() if not hot swappable +[EMU/DEBUGGER] add commands for checkpoint +[EMU/DEBUGGER] improve to read/write files in initial current directory + +[VM/DISK] improve for case 2D disk is inserted to 2DD drive (thanks Mr.Sato) +[VM/HARDDISK] support Virtual98 hdd image +[VM/HARDDISK] improve for solid image file +[VM/IO] improve debug log +[VM/MSM58321] fix pulse event (thanks Mr.Artane.) +[VM/SCSI_DEV] add is_hot_swappable +[VM/SCSI_HDD] improve to mount/unmount image in reset() if not hot swappable +[VM/SASI_HDD] support SASI hard disk drive +[VM/SN76489AN] fix save/load state function +[VM/UPD71071] fix verify command + +[FM77L4] add eFM77L4 codes (thanks Mr.Artane.) +[MZ80A] improve to switch 2D/2DD drive type +[MZ80B] improve to switch 2D/2DD drive type +[MZ1500] improve to switch 2D/2DD drive type +[MZ2500] improve to switch 2D/2DD drive type +[MZ2800/FLOPPY] improve to switch 2D/2DD drive type +[MZ2800/SASI] support SASI I/F and HDD (partial) +[PC98XA] support NEC PC-98XA +[PC9801/MEMBUS] fix save/load state function +[X1TURBO/FLOPPY] improve to switch 2D/2DD drive type (thanks Mr.Sato) + + 5/24/2018 [COMMON] import Mr.Artane.'s fixes (Commits on May 10, 2018) diff --git a/source/readme.txt b/source/readme.txt index 104245f91..0f6107030 100644 --- a/source/readme.txt +++ b/source/readme.txt @@ -1,5 +1,5 @@ Binary archive of retro pc emulator common source code - 5/24/2018 + 9/30/2018 --- What's this ? @@ -31,6 +31,7 @@ This archive includes the binaries of the emulators listed below: eFM8 FM-8 (by Mr.Artane.) eFM7 FM-7 (by Mr.Artane.) eFM77 FM-77 (by Mr.Artane.) + eFM77L4 FM-77L4 (by Mr.Artane.) eFM77AV FM77AV (by Mr.Artane.) eFM77AV40 FM77AV40 (by Mr.Artane.) eFM77AV40EX FM77AV40EX (by Mr.Artane.) @@ -74,6 +75,7 @@ This archive includes the binaries of the emulators listed below: ePC-9801VM PC-9801VM ePC-9801VX PC-9801VX ePC-9801RA PC-9801RA + ePC-98XA PC-98XA ePC-98XL PC-98XL ePC-98RL PC-98RL ePC-98DO PC-98DO diff --git a/source/revision.txt b/source/revision.txt index 3af35be67..d7ca69796 100644 --- a/source/revision.txt +++ b/source/revision.txt @@ -1,3 +1,3 @@ -Upstream 2018-05-24
-Qt Port and FM7 series 2018-08-07
+Upstream 2018-09-30
+Qt Port and FM7 series 2018-09-30
diff --git a/source/src/common.cpp b/source/src/common.cpp index 8149a80db..5a94f4e5f 100644 --- a/source/src/common.cpp +++ b/source/src/common.cpp @@ -43,6 +43,11 @@ std::string DLL_PREFIX sRssDir; #endif +void common_initialize() +{ + get_initial_current_path(); +} + uint32_t DLL_PREFIX EndianToLittle_DWORD(uint32_t x) { #if defined(__LITTLE_ENDIAN__) @@ -966,6 +971,32 @@ const _TCHAR *DLL_PREFIX get_application_path() return (const _TCHAR *)app_path; } +const _TCHAR *DLL_PREFIX get_initial_current_path() +{ + static _TCHAR current_path[_MAX_PATH]; + static bool initialized = false; + + if(!initialized) { +#if defined(_WIN32) && !defined(_USE_QT) + GetCurrentDirectoryA(_MAX_PATH, current_path); +#else + getcwd(current_path, _MAX_PATH); +#endif + int len = strlen(current_path); + if(current_path[len - 1] != '\\' && current_path[len - 1] != '/') { +#if defined(_WIN32) || defined(Q_OS_WIN) + current_path[len] = '\\'; +#else + current_path[len] = '/'; +#endif + current_path[len + 1] = '\0'; + } + + initialized = true; + } + return (const _TCHAR *)current_path; +} + const _TCHAR *DLL_PREFIX create_local_path(const _TCHAR *format, ...) { static _TCHAR file_path[8][_MAX_PATH]; @@ -1003,25 +1034,6 @@ bool DLL_PREFIX is_absolute_path(const _TCHAR *file_path) return (_tcslen(file_path) > 1 && (file_path[0] == _T('/') || file_path[0] == _T('\\'))); } -const _TCHAR *DLL_PREFIX create_absolute_path(const _TCHAR *file_name) -{ - static _TCHAR file_path[8][_MAX_PATH]; - static unsigned int table_index = 0; - unsigned int output_index = (table_index++) & 7; - - if(is_absolute_path(file_name)) { - my_tcscpy_s(file_path[output_index], _MAX_PATH, file_name); - } else { - my_tcscpy_s(file_path[output_index], _MAX_PATH, create_local_path(file_name)); - } - return (const _TCHAR *)file_path[output_index]; -} - -void DLL_PREFIX create_absolute_path(_TCHAR *file_path, int length, const _TCHAR *file_name) -{ - my_tcscpy_s(file_path, length, create_absolute_path(file_name)); -} - const _TCHAR *DLL_PREFIX create_date_file_path(const _TCHAR *extension) { cur_time_t cur_time; diff --git a/source/src/common.h b/source/src/common.h index ba7bb9ee7..d6e715349 100644 --- a/source/src/common.h +++ b/source/src/common.h @@ -1107,12 +1107,11 @@ bool DLL_PREFIX load_wav_to_monoral(void *__fio, int16_t **buffer, uint32_t *rat // file path const _TCHAR *DLL_PREFIX get_application_path(); +const _TCHAR *DLL_PREFIX get_initial_current_path(); const _TCHAR *DLL_PREFIX create_local_path(const _TCHAR *format, ...); void DLL_PREFIX create_local_path(_TCHAR *file_path, int length, const _TCHAR *format, ...); const _TCHAR *DLL_PREFIX create_date_file_path(const _TCHAR *extension); bool DLL_PREFIX is_absolute_path(const _TCHAR *file_path); -const _TCHAR *DLL_PREFIX create_absolute_path(const _TCHAR *file_name); -void DLL_PREFIX create_absolute_path(_TCHAR *file_path, int length, const _TCHAR *file_name); void DLL_PREFIX create_date_file_path(_TCHAR *file_path, int length, const _TCHAR *extension); bool DLL_PREFIX check_file_extension(const _TCHAR *file_path, const _TCHAR *ext); const _TCHAR *DLL_PREFIX get_file_path_without_extensiton(const _TCHAR *file_path); @@ -1130,6 +1129,8 @@ const wchar_t *DLL_PREFIX tchar_to_wchar(const _TCHAR *ts); // misc +void common_initialize(); + int32_t DLL_PREFIX muldiv_s32(int32_t nNumber, int32_t nNumerator, int32_t nDenominator); uint32_t DLL_PREFIX muldiv_u32(uint32_t nNumber, uint32_t nNumerator, uint32_t nDenominator); diff --git a/source/src/config.cpp b/source/src/config.cpp index c9e44d8f4..2a8accf7f 100644 --- a/source/src/config.cpp +++ b/source/src/config.cpp @@ -312,6 +312,7 @@ void load_config(const _TCHAR *config_path) for(int i = 0; i < MAX_HISTORY; i++) { MyGetPrivateProfileString(_T("RecentFiles"), create_string(_T("RecentHardDiskPath%d_%d"), drv + 1, i + 1), _T(""), config.recent_hard_disk_path[drv][i], _MAX_PATH, config_path); } + MyGetPrivateProfileString(_T("RecentFiles"), create_string(_T("LastHardDiskPath%d"), drv + 1), _T(""), config.last_hard_disk_path[drv], _MAX_PATH, config_path); } #endif #ifdef USE_TAPE @@ -667,6 +668,7 @@ void save_config(const _TCHAR *config_path) for(int i = 0; i < MAX_HISTORY; i++) { MyWritePrivateProfileString(_T("RecentFiles"), create_string(_T("RecentHardDiskPath%d_%d"), drv + 1, i + 1), config.recent_hard_disk_path[drv][i], config_path); } + MyWritePrivateProfileString(_T("RecentFiles"), create_string(_T("LastHardDiskPath%d"), drv + 1), config.last_hard_disk_path[drv], config_path); } #endif #ifdef USE_TAPE diff --git a/source/src/config.h b/source/src/config.h index bf4db5d92..9aef1fc79 100644 --- a/source/src/config.h +++ b/source/src/config.h @@ -177,6 +177,7 @@ typedef struct { #if defined(USE_SHARED_DLL) || defined(USE_HARD_DISK) _TCHAR initial_hard_disk_dir[_MAX_PATH]; _TCHAR recent_hard_disk_path[USE_HARD_DISK_TMP][MAX_HISTORY][_MAX_PATH]; + _TCHAR last_hard_disk_path[USE_HARD_DISK_TMP][_MAX_PATH]; #endif #if defined(USE_SHARED_DLL) || defined(USE_TAPE) _TCHAR initial_tape_dir[_MAX_PATH]; diff --git a/source/src/debugger.cpp b/source/src/debugger.cpp index 1e3c685db..b3edcc991 100644 --- a/source/src/debugger.cpp +++ b/source/src/debugger.cpp @@ -37,6 +37,18 @@ static FILEIO* logfile = NULL; static FILEIO* cmdfile = NULL; +const _TCHAR *my_absolute_path(const _TCHAR *file_name) +{ + static _TCHAR file_path[_MAX_PATH]; + + if(is_absolute_path(file_name)) { + my_tcscpy_s(file_path, _MAX_PATH, file_name); + } else { + my_stprintf_s(file_path, _MAX_PATH, _T("%s%s"), get_initial_current_path(), file_name); + } + return (const _TCHAR *)file_path; +} + void my_printf(OSD *osd, const _TCHAR *format, ...) { _TCHAR buffer[1024]; @@ -160,7 +172,7 @@ const _TCHAR *my_get_value_and_symbol(DEVICE *target, const _TCHAR *format, uint break_point_t *get_break_point(DEBUGGER *debugger, const _TCHAR *command) { - if(command[0] == _T('B') || command[0] == _T('b')) { + if(command[0] == _T('B') || command[0] == _T('b') || command[0] == _T('C') || command[0] == _T('c')) { return &debugger->bp; } else if(command[0] == _T('R') || command[0] == _T('r')) { return &debugger->rbp; @@ -595,12 +607,12 @@ void* debugger_thread(void *lpx) if(num >= 2 && params[1][0] == _T('\"')) { my_tcscpy_s(buffer, 1024, prev_command); if((token = my_tcstok_s(buffer, _T("\""), &context)) != NULL && (token = my_tcstok_s(NULL, _T("\""), &context)) != NULL) { - my_tcscpy_s(debugger->file_path, _MAX_PATH, create_absolute_path(token)); + my_tcscpy_s(debugger->file_path, _MAX_PATH, my_absolute_path(token)); } else { my_printf(p->osd, _T("invalid parameter\n")); } } else if(num == 2) { - my_tcscpy_s(debugger->file_path, _MAX_PATH, create_absolute_path(params[1])); + my_tcscpy_s(debugger->file_path, _MAX_PATH, my_absolute_path(params[1])); } else { my_printf(p->osd, _T("invalid parameter number\n")); } @@ -744,7 +756,8 @@ void* debugger_thread(void *lpx) } else { my_printf(p->osd, _T("invalid parameter number\n")); } - } else if(_tcsicmp(params[0], _T( "BP")) == 0 || _tcsicmp(params[0], _T("RBP")) == 0 || _tcsicmp(params[0], _T("WBP")) == 0) { + } else if(_tcsicmp(params[0], _T( "BP")) == 0 || _tcsicmp(params[0], _T("RBP")) == 0 || _tcsicmp(params[0], _T("WBP")) == 0 || + _tcsicmp(params[0], _T( "CP")) == 0 || _tcsicmp(params[0], _T("RCP")) == 0 || _tcsicmp(params[0], _T("WCP")) == 0) { break_point_t *bp = get_break_point(debugger, params[0]); if(num == 2) { uint32_t addr = my_hexatoi(cpu, params[1]); @@ -754,6 +767,7 @@ void* debugger_thread(void *lpx) bp->table[i].addr = addr; bp->table[i].mask = cpu->get_debug_prog_addr_mask(); bp->table[i].status = 1; + bp->table[i].check_point = (params[0][0] == 'C' || params[0][0] == 'c' || params[0][1] == 'C' || params[0][1] == 'c'); found = true; } } @@ -763,7 +777,8 @@ void* debugger_thread(void *lpx) } else { my_printf(p->osd, _T("invalid parameter number\n")); } - } else if(_tcsicmp(params[0], _T("IBP")) == 0 || _tcsicmp(params[0], _T("OBP")) == 0) { + } else if(_tcsicmp(params[0], _T("IBP")) == 0 || _tcsicmp(params[0], _T("OBP")) == 0 || + _tcsicmp(params[0], _T("ICP")) == 0 || _tcsicmp(params[0], _T("OCP")) == 0) { break_point_t *bp = get_break_point(debugger, params[0]); if(num == 2 || num == 3) { uint32_t addr = my_hexatoi(cpu, params[1]), mask = 0xff; @@ -776,6 +791,7 @@ void* debugger_thread(void *lpx) bp->table[i].addr = addr; bp->table[i].mask = mask; bp->table[i].status = 1; + bp->table[i].check_point = (params[0][1] == 'C' || params[0][1] == 'c'); found = true; } } @@ -831,7 +847,10 @@ void* debugger_thread(void *lpx) break_point_t *bp = get_break_point(debugger, params[0]); for(int i = 0; i < MAX_BREAK_POINTS; i++) { if(bp->table[i].status) { - my_printf(p->osd, _T("%d %c %s\n"), i + 1, bp->table[i].status == 1 ? _T('e') : _T('d'), my_get_value_and_symbol(cpu, _T("%08X"), bp->table[i].addr)); + my_printf(p->osd, _T("%d %c %s %s\n"), i + 1, + bp->table[i].status == 1 ? _T('e') : _T('d'), + my_get_value_and_symbol(cpu, _T("%08X"), bp->table[i].addr), + bp->table[i].check_point ? "checkpoint" : ""); } } } else { @@ -842,7 +861,11 @@ void* debugger_thread(void *lpx) break_point_t *bp = get_break_point(debugger, params[0]); for(int i = 0; i < MAX_BREAK_POINTS; i++) { if(bp->table[i].status) { - my_printf(p->osd, _T("%d %c %08X %08X\n"), i + 1, bp->table[i].status == 1 ? _T('e') : _T('d'), bp->table[i].addr, bp->table[i].mask); + my_printf(p->osd, _T("%d %c %s %08X %s\n"), i + 1, + bp->table[i].status == 1 ? _T('e') : _T('d'), + my_get_value_and_symbol(cpu, _T("%08X"), bp->table[i].addr), + bp->table[i].mask, + bp->table[i].check_point ? "checkpoint" : ""); } } } else { @@ -856,14 +879,17 @@ void* debugger_thread(void *lpx) debugger->bp.table[0].addr = (cpu->get_next_pc() + cpu->debug_dasm(cpu->get_next_pc(), buffer, 1024)) & cpu->get_debug_prog_addr_mask(); debugger->bp.table[0].mask = cpu->get_debug_prog_addr_mask(); debugger->bp.table[0].status = 1; + debugger->bp.table[0].check_point = false; break_points_stored = true; } else if(num >= 2) { debugger->store_break_points(); debugger->bp.table[0].addr = my_hexatoi(cpu, params[1]) & cpu->get_debug_prog_addr_mask(); debugger->bp.table[0].mask = cpu->get_debug_prog_addr_mask(); debugger->bp.table[0].status = 1; + debugger->bp.table[0].check_point = false; break_points_stored = true; } +RESTART_GO: debugger->now_going = true; debugger->now_suspended = false; #if defined(_MSC_VER) @@ -919,24 +945,33 @@ void* debugger_thread(void *lpx) if(_tcsicmp(params[0], _T("G")) == 0) { my_printf(p->osd, _T("breaked at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc())); } + debugger->bp.hit = false; + if(debugger->bp.restart) goto RESTART_GO; } else if(debugger->rbp.hit) { my_printf(p->osd, _T("breaked at %s: memory %s was read at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), my_get_value_and_symbol(cpu, _T("%08X"), debugger->rbp.hit_addr), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->rbp.hit = false; + if(debugger->rbp.restart) goto RESTART_GO; } else if(debugger->wbp.hit) { my_printf(p->osd, _T("breaked at %s: memory %s was written at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), my_get_value_and_symbol(cpu, _T("%08X"), debugger->wbp.hit_addr), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->wbp.hit = false; + if(debugger->wbp.restart) goto RESTART_GO; } else if(debugger->ibp.hit) { my_printf(p->osd, _T("breaked at %s: port %s was read at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), my_get_value_and_symbol(cpu, _T("%08X"), debugger->ibp.hit_addr), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->ibp.hit = false; + if(debugger->ibp.restart) goto RESTART_GO; } else if(debugger->obp.hit) { my_printf(p->osd, _T("breaked at %s: port %s was written at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), my_get_value_and_symbol(cpu, _T("%08X"), debugger->obp.hit_addr), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->obp.hit = false; + if(debugger->obp.restart) goto RESTART_GO; } - debugger->bp.hit = debugger->rbp.hit = debugger->wbp.hit = debugger->ibp.hit = debugger->obp.hit = false; } else { p->osd->set_console_text_attribute(FOREGROUND_RED | FOREGROUND_INTENSITY); my_printf(p->osd, _T("breaked at %s: esc key was pressed\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc())); @@ -989,33 +1024,41 @@ void* debugger_thread(void *lpx) my_printf(p->osd, _T("%s\n"), buffer); } - if(debugger->hit() || (p->osd->is_console_key_pressed(VK_ESCAPE) && p->osd->is_console_active())) { + if(debugger->hit()) { + p->osd->set_console_text_attribute(FOREGROUND_RED | FOREGROUND_INTENSITY); + if(debugger->bp.hit) { + my_printf(p->osd, _T("breaked at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc())); + debugger->bp.hit = false; + if(!debugger->bp.restart) break; + } else if(debugger->rbp.hit) { + my_printf(p->osd, _T("breaked at %s: memory %s was read at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), + my_get_value_and_symbol(cpu, _T("%08X"), debugger->rbp.hit_addr), + my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->rbp.hit = false; + if(!debugger->rbp.restart) break; + } else if(debugger->wbp.hit) { + my_printf(p->osd, _T("breaked at %s: memory %s was written at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), + my_get_value_and_symbol(cpu, _T("%08X"), debugger->wbp.hit_addr), + my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->wbp.hit = false; + if(!debugger->wbp.restart) break; + } else if(debugger->ibp.hit) { + my_printf(p->osd, _T("breaked at %s: port %s was read at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), + my_get_value_and_symbol(cpu, _T("%08X"), debugger->ibp.hit_addr), + my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->ibp.hit = false; + if(!debugger->ibp.restart) break; + } else if(debugger->obp.hit) { + my_printf(p->osd, _T("breaked at %s: port %s was written at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), + my_get_value_and_symbol(cpu, _T("%08X"), debugger->obp.hit_addr), + my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); + debugger->obp.hit = false; + if(!debugger->obp.restart) break; + } + } else if(p->osd->is_console_key_pressed(VK_ESCAPE) && p->osd->is_console_active()) { break; } } - if(debugger->hit()) { - p->osd->set_console_text_attribute(FOREGROUND_RED | FOREGROUND_INTENSITY); - if(debugger->bp.hit) { - my_printf(p->osd, _T("breaked at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc())); - } else if(debugger->rbp.hit) { - my_printf(p->osd, _T("breaked at %s: memory %s was read at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), - my_get_value_and_symbol(cpu, _T("%08X"), debugger->rbp.hit_addr), - my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); - } else if(debugger->wbp.hit) { - my_printf(p->osd, _T("breaked at %s: memory %s was written at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), - my_get_value_and_symbol(cpu, _T("%08X"), debugger->wbp.hit_addr), - my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); - } else if(debugger->ibp.hit) { - my_printf(p->osd, _T("breaked at %s: port %s was read at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), - my_get_value_and_symbol(cpu, _T("%08X"), debugger->ibp.hit_addr), - my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); - } else if(debugger->obp.hit) { - my_printf(p->osd, _T("breaked at %s: port %s was written at %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), - my_get_value_and_symbol(cpu, _T("%08X"), debugger->obp.hit_addr), - my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_pc())); - } - debugger->bp.hit = debugger->rbp.hit = debugger->wbp.hit = debugger->ibp.hit = debugger->obp.hit = false; - } p->osd->set_console_text_attribute(FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); cpu->debug_dasm(cpu->get_next_pc(), buffer, 1024); my_printf(p->osd, _T("next\t%s %s\n"), my_get_value_and_symbol(cpu, _T("%08X"), cpu->get_next_pc()), buffer); @@ -1036,7 +1079,7 @@ void* debugger_thread(void *lpx) logfile = NULL; } logfile = new FILEIO(); - logfile->Fopen(create_absolute_path(params[1]), FILEIO_WRITE_ASCII); + logfile->Fopen(my_absolute_path(params[1]), FILEIO_WRITE_ASCII); } else { my_printf(p->osd, _T("invalid parameter number\n")); } @@ -1049,7 +1092,7 @@ void* debugger_thread(void *lpx) } else { cmdfile = new FILEIO(); } - if(!cmdfile->Fopen(create_absolute_path(params[1]), FILEIO_READ_ASCII)) { + if(!cmdfile->Fopen(my_absolute_path(params[1]), FILEIO_READ_ASCII)) { delete cmdfile; cmdfile = NULL; my_printf(p->osd, _T("can't open %s\n"), params[1]); @@ -1206,6 +1249,7 @@ void* debugger_thread(void *lpx) my_printf(p->osd, _T("{I,O}BP [] - set breakpoint (break at i/o access)\n")); my_printf(p->osd, _T("[{R,W,I,O}]B{C,D,E} {*,} - clear/disable/enable breakpoint(s)\n")); my_printf(p->osd, _T("[{R,W,I,O}]BL - list breakpoint(s)\n")); + my_printf(p->osd, _T("[{R,W,I,O}]CP
[] - set checkpoint (don't break)\n")); my_printf(p->osd, _T("G - go (press esc key to break)\n")); my_printf(p->osd, _T("G
- go and break at address\n")); diff --git a/source/src/emu.cpp b/source/src/emu.cpp index dde03a6db..c9254188e 100644 --- a/source/src/emu.cpp +++ b/source/src/emu.cpp @@ -111,6 +111,14 @@ EMU::EMU() vm->set_sound_device_volume(i, config.sound_volume_l[i], config.sound_volume_r[i]); } #endif +#ifdef USE_HARD_DISK + for(int drv = 0; drv < USE_HARD_DISK; drv++) { + if(config.last_hard_disk_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(config.last_hard_disk_path[drv])) { + vm->open_hard_disk(drv, config.last_hard_disk_path[drv]); + my_tcscpy_s(hard_disk_status[drv].path, _MAX_PATH, config.last_hard_disk_path[drv]); + } + } +#endif vm->reset(); now_suspended = false; } @@ -263,10 +271,10 @@ void EMU::reset() vm->set_sound_device_volume(i, config.sound_volume_l[i], config.sound_volume_r[i]); } #endif - vm->reset(); - osd->unlock_vm(); // restore inserted medias restore_media(); + vm->reset(); + osd->unlock_vm(); } else { // reset virtual machine osd->lock_vm(); @@ -1826,6 +1834,8 @@ static _TCHAR prev_buffer[1024] = {0}; void EMU::out_debug_log(const _TCHAR* format, ...) { + common_initialize(); + #ifdef _DEBUG_LOG va_list ap; _TCHAR buffer[1024]; @@ -2357,9 +2367,9 @@ void EMU::open_hard_disk(int drv, const _TCHAR* file_path) hard_disk_status[drv].wait_count = (int)(FRAMES_PER_SEC / 2); #endif #if USE_HARD_DISK > 1 - out_message(_T("HD%d: Ejected"), drv + BASE_HARD_DISK_NUM); + out_message(_T("HD%d: Unmounted"), drv + BASE_HARD_DISK_NUM); #else - out_message(_T("HD: Ejected")); + out_message(_T("HD: Unmounted")); #endif } else if(hard_disk_status[drv].wait_count == 0) { vm->open_hard_disk(drv, file_path); @@ -2370,6 +2380,7 @@ void EMU::open_hard_disk(int drv, const _TCHAR* file_path) #endif } my_tcscpy_s(hard_disk_status[drv].path, _MAX_PATH, file_path); + my_tcscpy_s(config.last_hard_disk_path[drv], _MAX_PATH, file_path); } } @@ -2379,10 +2390,11 @@ void EMU::close_hard_disk(int drv) vm->close_hard_disk(drv); clear_media_status(&hard_disk_status[drv]); #if USE_HARD_DISK > 1 - out_message(_T("HD%d: Ejected"), drv + BASE_HARD_DISK_NUM); + out_message(_T("HD%d: Unmounted"), drv + BASE_HARD_DISK_NUM); #else - out_message(_T("HD: Ejected")); + out_message(_T("HD: Unmounted")); #endif + config.last_hard_disk_path[drv][0] = '\0'; } } @@ -2974,11 +2986,13 @@ bool EMU::load_state_tmp(const _TCHAR* file_path) vm->set_sound_device_volume(i, config.sound_volume_l[i], config.sound_volume_r[i]); } #endif + restore_media(); vm->reset(); //osd->unlock_vm(); + } else { + // restore inserted medias + restore_media(); } - // restore inserted medias - restore_media(); // load vm state if(vm->load_state(fio)) { // check end of state diff --git a/source/src/fileio.cpp b/source/src/fileio.cpp index 1cc4e7751..dddaf8cc9 100644 --- a/source/src/fileio.cpp +++ b/source/src/fileio.cpp @@ -824,11 +824,11 @@ int FILEIO::Fseek(long offset, int origin) if(gz != NULL) { switch(origin) { case FILEIO_SEEK_CUR: - return gzseek(gz, offset, SEEK_CUR); + return (gzseek(gz, offset, SEEK_CUR) == -1 ? -1 : 0); case FILEIO_SEEK_END: - return gzseek(gz, offset + gz_size, SEEK_SET); + return (gzseek(gz, offset + gz_size, SEEK_SET) == -1 ? -1 : 0); case FILEIO_SEEK_SET: - return gzseek(gz, offset, SEEK_SET); + return (gzseek(gz, offset, SEEK_SET) == -1 ? -1 : 0); } } else #endif diff --git a/source/src/qt/emuutils/CMakeLists.txt b/source/src/qt/emuutils/CMakeLists.txt index 4e4bb1612..e6502e0d4 100644 --- a/source/src/qt/emuutils/CMakeLists.txt +++ b/source/src/qt/emuutils/CMakeLists.txt @@ -15,7 +15,7 @@ set(s_qt_emuutils_srcs QT5_WRAP_CPP(s_qt_emuutils_headers_MOC ${s_qt_emuutils_headers}) -SET(THIS_LIB_VERSION 2.12.2) +SET(THIS_LIB_VERSION 2.12.3) add_definitions(-D__LIBEMU_UTIL_VERSION=\"libCSPemu_utils.${THIS_LIB_VERSION}\") diff --git a/source/src/qt/gui/menu_harddisk.cpp b/source/src/qt/gui/menu_harddisk.cpp index df2677987..f5ee1cc18 100644 --- a/source/src/qt/gui/menu_harddisk.cpp +++ b/source/src/qt/gui/menu_harddisk.cpp @@ -38,7 +38,10 @@ void Menu_HDDClass::connect_menu_device_sub(void) void Menu_HDDClass::retranslate_pulldown_menu_device_sub(void) { //action_insert->setIcon(icon_floppy); - action_insert->setToolTip(QApplication::translate("MenuMedia", "Connect virtual hard disk file.", 0)); - action_eject->setToolTip(QApplication::translate("MenuMedia", "Disconnect virtual hard disk.", 0)); + action_insert->setText(QApplication::translate("MenuHDD", "Mount", 0)); + action_insert->setToolTip(QApplication::translate("MenuHDD", "Mount virtual hard disk file.", 0)); + + action_eject->setText(QApplication::translate("MenuHDD", "Unmount", 0)); + action_eject->setToolTip(QApplication::translate("MenuHDD", "Unmount virtual hard disk.", 0)); } diff --git a/source/src/qt/gui/util_hdd.cpp b/source/src/qt/gui/util_hdd.cpp index eea58d918..b33c25a65 100644 --- a/source/src/qt/gui/util_hdd.cpp +++ b/source/src/qt/gui/util_hdd.cpp @@ -46,7 +46,7 @@ void Ui_MainWindowBase::eject_hard_disk(int drv) void Ui_MainWindowBase::CreateHardDiskMenu(int drv, int drv_base) { { - QString ext = "*.thd;*.nhd;*.hdi;*.dat"; + QString ext = "*.thd;*.nhd;*.hdi;*.hdd;*.dat"; QString desc1 = "Hard Disk Drive"; menu_hdds[drv] = new Menu_HDDClass(menubar, QString::fromUtf8("HDD"), using_flags, this, drv, drv_base); menu_hdds[drv]->create_pulldown_menu(); diff --git a/source/src/res/credits.html b/source/src/res/credits.html index a31119606..c08d2d364 100644 --- a/source/src/res/credits.html +++ b/source/src/res/credits.html @@ -8,8 +8,8 @@

Common Source Code Project

-Upstream Version: 2018-05-24
-Qt Port and FM7 series 2018-08-07
+Upstream Version: 2018-09-30
+Qt Port and FM7 series 2018-09-30
FFMPEG 4.0 + liblame 3.99 + libx264-155
@@RevisionString@@
diff --git a/source/src/res/fm77l4.ico b/source/src/res/fm77l4.ico new file mode 100644 index 000000000..a46195d09 Binary files /dev/null and b/source/src/res/fm77l4.ico differ diff --git a/source/src/res/fm77l4.rc b/source/src/res/fm77l4.rc new file mode 100644 index 000000000..d38ceae97 --- /dev/null +++ b/source/src/res/fm77l4.rc @@ -0,0 +1,389 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Japanese resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Japanese resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE +BEGIN + VK_RETURN, ID_ACCEL_MOUSE, VIRTKEY, CONTROL, NOINVERT + VK_RETURN, ID_ACCEL_SCREEN, VIRTKEY, ALT, NOINVERT + VK_APPS, ID_ACCEL_SPEED, VIRTKEY, NOINVERT + VK_APPS, ID_ACCEL_ROMAJI, VIRTKEY, CONTROL, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MENU1 MENU DISCARDABLE +BEGIN + POPUP "Control" + BEGIN + MENUITEM "Reset", ID_RESET + MENUITEM SEPARATOR + MENUITEM "CPU x1", ID_CPU_POWER0 + MENUITEM "CPU x2", ID_CPU_POWER1 + MENUITEM "CPU x4", ID_CPU_POWER2 + MENUITEM "CPU x8", ID_CPU_POWER3 + MENUITEM "CPU x16", ID_CPU_POWER4 + MENUITEM "Full Speed", ID_FULL_SPEED + MENUITEM SEPARATOR + MENUITEM "Paste", ID_AUTOKEY_START + MENUITEM "Stop", ID_AUTOKEY_STOP + MENUITEM "Romaji to Kana", ID_ROMAJI_TO_KANA + MENUITEM SEPARATOR + POPUP "Save State" + BEGIN + MENUITEM "State 0", ID_SAVE_STATE0 + MENUITEM "State 1", ID_SAVE_STATE1 + MENUITEM "State 2", ID_SAVE_STATE2 + MENUITEM "State 3", ID_SAVE_STATE3 + MENUITEM "State 4", ID_SAVE_STATE4 + MENUITEM "State 5", ID_SAVE_STATE5 + MENUITEM "State 6", ID_SAVE_STATE6 + MENUITEM "State 7", ID_SAVE_STATE7 + MENUITEM "State 8", ID_SAVE_STATE8 + MENUITEM "State 9", ID_SAVE_STATE9 + END + POPUP "Load State" + BEGIN + MENUITEM "State 0", ID_LOAD_STATE0 + MENUITEM "State 1", ID_LOAD_STATE1 + MENUITEM "State 2", ID_LOAD_STATE2 + MENUITEM "State 3", ID_LOAD_STATE3 + MENUITEM "State 4", ID_LOAD_STATE4 + MENUITEM "State 5", ID_LOAD_STATE5 + MENUITEM "State 6", ID_LOAD_STATE6 + MENUITEM "State 7", ID_LOAD_STATE7 + MENUITEM "State 8", ID_LOAD_STATE8 + MENUITEM "State 9", ID_LOAD_STATE9 + END + MENUITEM SEPARATOR + MENUITEM "Debug Main CPU", ID_OPEN_DEBUGGER0 + MENUITEM "Debug Sub CPU", ID_OPEN_DEBUGGER1 + MENUITEM "Close Debugger", ID_CLOSE_DEBUGGER + MENUITEM SEPARATOR + MENUITEM "Exit", ID_EXIT + END + POPUP "FD1" + BEGIN + MENUITEM "Insert", ID_OPEN_FD1 + MENUITEM "Eject", ID_CLOSE_FD1 + MENUITEM SEPARATOR + MENUITEM "Write Protected", ID_WRITE_PROTECT_FD1 + MENUITEM "Correct Timing", ID_CORRECT_TIMING_FD1 + MENUITEM "Ignore CRC Errors", ID_IGNORE_CRC_FD1 + MENUITEM SEPARATOR + MENUITEM "Recent", ID_RECENT_FD1 + END + POPUP "FD2" + BEGIN + MENUITEM "Insert", ID_OPEN_FD2 + MENUITEM "Eject", ID_CLOSE_FD2 + MENUITEM SEPARATOR + MENUITEM "Write Protected", ID_WRITE_PROTECT_FD2 + MENUITEM "Correct Timing", ID_CORRECT_TIMING_FD2 + MENUITEM "Ignore CRC Errors", ID_IGNORE_CRC_FD2 + MENUITEM SEPARATOR + MENUITEM "Recent", ID_RECENT_FD2 + END + POPUP "CMT" + BEGIN + MENUITEM "Play", ID_PLAY_TAPE1 + MENUITEM "Rec", ID_REC_TAPE1 + MENUITEM "Eject", ID_CLOSE_TAPE1 + MENUITEM SEPARATOR + MENUITEM "Play Button", ID_PLAY_BUTTON1 + MENUITEM "Stop Button", ID_STOP_BUTTON1 + MENUITEM "Fast Forward", ID_FAST_FORWARD1 + MENUITEM "Fast Rewind", ID_FAST_REWIND1 + MENUITEM SEPARATOR + MENUITEM "Waveform Shaper", ID_USE_WAVE_SHAPER1 + MENUITEM SEPARATOR + MENUITEM "Recent", ID_RECENT_TAPE1 + END + POPUP "Device" + BEGIN + POPUP "Boot" + BEGIN + MENUITEM "BASIC" ID_VM_BOOT_MODE0 + MENUITEM "DOS" ID_VM_BOOT_MODE1 + MENUITEM "MMR" ID_VM_BOOT_MODE2 + END + POPUP "CPU" + BEGIN + MENUITEM "68B09 2.0MHz", ID_VM_CPU_TYPE0 + MENUITEM "68B09 1.2MHz", ID_VM_CPU_TYPE1 + END + POPUP "Option" + BEGIN + MENUITEM "Cycle Steal", ID_VM_DIPSWITCH0 + MENUITEM "Extra RAM", ID_VM_DIPSWITCH1 + MENUITEM "1MB FDD", ID_VM_DIPSWITCH7 + END + POPUP "Mouse" + BEGIN + MENUITEM "None", ID_VM_MOUSE_TYPE0 + MENUITEM "JS-Port1", ID_VM_MOUSE_TYPE1 + MENUITEM "JS-Port2", ID_VM_MOUSE_TYPE2 + END + POPUP "Sound" + BEGIN + MENUITEM "PSG", ID_VM_SOUND_TYPE0 + MENUITEM "PSG+OPN", ID_VM_SOUND_TYPE1 + MENUITEM "PSG+WHG", ID_VM_SOUND_TYPE2 + MENUITEM "PSG+OPN+WHG", ID_VM_SOUND_TYPE3 + MENUITEM "PSG+THG", ID_VM_SOUND_TYPE4 + MENUITEM "PSG+OPN+THG", ID_VM_SOUND_TYPE5 + MENUITEM "PSG+WHG+THG", ID_VM_SOUND_TYPE6 + MENUITEM "PSG+OPN+WHG+THG", ID_VM_SOUND_TYPE7 + MENUITEM SEPARATOR + MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD + MENUITEM "Play CMT Noise", ID_VM_SOUND_NOISE_CMT + MENUITEM "Play CMT Sound", ID_VM_SOUND_PLAY_TAPE + END + POPUP "Display" + BEGIN + MENUITEM "Scanline", ID_VM_MONITOR_SCANLINE + END + POPUP "Printer" + BEGIN + MENUITEM "Write Printer to File", ID_VM_PRINTER_TYPE0 + MENUITEM "Dempa Joystick #1", ID_VM_PRINTER_TYPE1 + MENUITEM "Dempa Joystick #2", ID_VM_PRINTER_TYPE2 + MENUITEM "None", ID_VM_PRINTER_TYPE3 + END + END + POPUP "Host" + BEGIN + MENUITEM "Rec Movie 60fps", ID_HOST_REC_MOVIE_60FPS + MENUITEM "Rec Movie 30fps", ID_HOST_REC_MOVIE_30FPS + MENUITEM "Rec Movie 15fps", ID_HOST_REC_MOVIE_15FPS + MENUITEM "Rec Sound", ID_HOST_REC_SOUND + MENUITEM "Stop", ID_HOST_REC_STOP + MENUITEM "Capture Screen", ID_HOST_CAPTURE_SCREEN + MENUITEM SEPARATOR + POPUP "Screen" + BEGIN + MENUITEM "Window x1", ID_SCREEN_WINDOW + MENUITEM "Fullscreen 640x400", ID_SCREEN_FULLSCREEN + MENUITEM SEPARATOR + MENUITEM "Window Stretch 1", ID_SCREEN_WINDOW_STRETCH + MENUITEM "Window Stretch 2", ID_SCREEN_WINDOW_ASPECT + MENUITEM SEPARATOR + MENUITEM "Fullscreen Stretch 1", ID_SCREEN_FULLSCREEN_DOTBYDOT + MENUITEM "Fullscreen Stretch 2", ID_SCREEN_FULLSCREEN_STRETCH + MENUITEM "Fullscreen Stretch 3", ID_SCREEN_FULLSCREEN_ASPECT + MENUITEM "Fullscreen Stretch 4", ID_SCREEN_FULLSCREEN_FILL + MENUITEM SEPARATOR + MENUITEM "Rotate 0deg", ID_SCREEN_ROTATE_0 + MENUITEM "Rotate +90deg", ID_SCREEN_ROTATE_90 + MENUITEM "Rotate 180deg", ID_SCREEN_ROTATE_180 + MENUITEM "Rotate -90deg", ID_SCREEN_ROTATE_270 + END + POPUP "Filter" + BEGIN + MENUITEM "RGB Filter", ID_FILTER_RGB + MENUITEM "None", ID_FILTER_NONE + END + POPUP "Sound" + BEGIN + MENUITEM "2000Hz", ID_SOUND_FREQ0 + MENUITEM "4000Hz", ID_SOUND_FREQ1 + MENUITEM "8000Hz", ID_SOUND_FREQ2 + MENUITEM "11025Hz", ID_SOUND_FREQ3 + MENUITEM "22050Hz", ID_SOUND_FREQ4 + MENUITEM "44100Hz", ID_SOUND_FREQ5 + MENUITEM "48000Hz", ID_SOUND_FREQ6 + MENUITEM "96000Hz", ID_SOUND_FREQ7 + MENUITEM SEPARATOR + MENUITEM "50msec", ID_SOUND_LATE0 + MENUITEM "100msec", ID_SOUND_LATE1 + MENUITEM "200msec", ID_SOUND_LATE2 + MENUITEM "300msec", ID_SOUND_LATE3 + MENUITEM "400msec", ID_SOUND_LATE4 + MENUITEM SEPARATOR + MENUITEM "Realtime Mix", ID_SOUND_STRICT_RENDER + MENUITEM "Light Weight Mix", ID_SOUND_LIGHT_RENDER + MENUITEM SEPARATOR + MENUITEM "Volume", ID_SOUND_VOLUME + END + POPUP "Input" + BEGIN + MENUITEM "Joystick #1", ID_INPUT_JOYSTICK0 + MENUITEM "Joystick #2", ID_INPUT_JOYSTICK1 + END + MENUITEM SEPARATOR + MENUITEM "Use Direct3D9", ID_HOST_USE_D3D9 + MENUITEM "Wait Vsync", ID_HOST_WAIT_VSYNC + MENUITEM "Use DirectInput", ID_HOST_USE_DINPUT + MENUITEM "Disable Windows 8 DWM", ID_HOST_DISABLE_DWM + MENUITEM "Show Status Bar", ID_HOST_SHOW_STATUS_BAR + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Image +// + +IDI_BITMAP_ACCESS_OFF BITMAP DISCARDABLE "indicator/access_off.bmp" +IDI_BITMAP_ACCESS_ON BITMAP DISCARDABLE "indicator/access_on.bmp" + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON DISCARDABLE "fm77l4.ico" +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_VOLUME DIALOG DISCARDABLE 0, 0, 250, 360 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Volume" +FONT 9, "MS PGothic" +BEGIN + LTEXT "Sound Device #1",IDC_VOLUME_CAPTION0,6,6,60,8 + CONTROL "",IDC_VOLUME_PARAM_L0,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,6,175,12 + CONTROL "",IDC_VOLUME_PARAM_R0,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,21,175,12 + LTEXT "Sound Device #2",IDC_VOLUME_CAPTION1,6,36,60,8 + CONTROL "",IDC_VOLUME_PARAM_L1,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,36,175,12 + CONTROL "",IDC_VOLUME_PARAM_R1,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,51,175,12 + LTEXT "Sound Device #3",IDC_VOLUME_CAPTION2,6,66,60,8 + CONTROL "",IDC_VOLUME_PARAM_L2,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,66,175,12 + CONTROL "",IDC_VOLUME_PARAM_R2,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,81,175,12 + LTEXT "Sound Device #4",IDC_VOLUME_CAPTION3,6,96,60,8 + CONTROL "",IDC_VOLUME_PARAM_L3,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,96,175,12 + CONTROL "",IDC_VOLUME_PARAM_R3,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,111,175,12 + LTEXT "Sound Device #5",IDC_VOLUME_CAPTION4,6,126,60,8 + CONTROL "",IDC_VOLUME_PARAM_L4,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,126,175,12 + CONTROL "",IDC_VOLUME_PARAM_R4,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,141,175,12 + LTEXT "Sound Device #6",IDC_VOLUME_CAPTION5,6,156,60,8 + CONTROL "",IDC_VOLUME_PARAM_L5,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,156,175,12 + CONTROL "",IDC_VOLUME_PARAM_R5,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,171,175,12 + LTEXT "Sound Device #7",IDC_VOLUME_CAPTION6,6,186,60,8 + CONTROL "",IDC_VOLUME_PARAM_L6,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,186,175,12 + CONTROL "",IDC_VOLUME_PARAM_R6,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,201,175,12 + LTEXT "Sound Device #8",IDC_VOLUME_CAPTION7,6,216,60,8 + CONTROL "",IDC_VOLUME_PARAM_L7,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,216,175,12 + CONTROL "",IDC_VOLUME_PARAM_R7,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,231,175,12 + LTEXT "Sound Device #9",IDC_VOLUME_CAPTION8,6,246,60,8 + CONTROL "",IDC_VOLUME_PARAM_L8,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,246,175,12 + CONTROL "",IDC_VOLUME_PARAM_R8,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,261,175,12 + LTEXT "Sound Device #10",IDC_VOLUME_CAPTION9,6,276,60,8 + CONTROL "",IDC_VOLUME_PARAM_L9,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,276,175,12 + CONTROL "",IDC_VOLUME_PARAM_R9,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,291,175,12 + LTEXT "Sound Device #11",IDC_VOLUME_CAPTION10,6,306,60,8 + CONTROL "",IDC_VOLUME_PARAM_L10,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,306,175,12 + CONTROL "",IDC_VOLUME_PARAM_R10,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,70,321,175,12 + DEFPUSHBUTTON "OK",IDOK,70,340,50,14 + DEFPUSHBUTTON "Reset",IDC_VOLUME_RESET,130,340,50,14 +END + +IDD_JOYSTICK DIALOG DISCARDABLE 0, 0, 175, 120 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Joystick #1" +FONT 9, "MS PGothic" +BEGIN + LTEXT "Button #1",IDC_JOYSTICK_CAPTION0,6,6,40,8 + EDITTEXT IDC_JOYSTICK_PARAM0,50,4,120,14,ES_MULTILINE + LTEXT "Button #2",IDC_JOYSTICK_CAPTION1,6,21,40,8 + EDITTEXT IDC_JOYSTICK_PARAM1,50,19,120,14,ES_MULTILINE + LTEXT "Button #3",IDC_JOYSTICK_CAPTION2,6,36,40,8 + EDITTEXT IDC_JOYSTICK_PARAM2,50,34,120,14,ES_MULTILINE + LTEXT "Button #4",IDC_JOYSTICK_CAPTION3,6,51,40,8 + EDITTEXT IDC_JOYSTICK_PARAM3,50,49,120,14,ES_MULTILINE + LTEXT "Button #5",IDC_JOYSTICK_CAPTION4,6,66,40,8 + EDITTEXT IDC_JOYSTICK_PARAM4,50,64,120,14,ES_MULTILINE + LTEXT "Button #6",IDC_JOYSTICK_CAPTION5,6,81,40,8 + EDITTEXT IDC_JOYSTICK_PARAM5,50,79,120,14,ES_MULTILINE + DEFPUSHBUTTON "OK",IDOK,35,100,50,14 + DEFPUSHBUTTON "Reset",IDC_JOYSTICK_RESET,90,100,50,14 +END + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/source/src/res/fmr30.rc b/source/src/res/fmr30.rc index 0ca23e8f8..67dc04cfb 100644 --- a/source/src/res/fmr30.rc +++ b/source/src/res/fmr30.rc @@ -151,29 +151,29 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END POPUP "HD4" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/fmr50_i286.rc b/source/src/res/fmr50_i286.rc index b9b7da42a..89a46999a 100644 --- a/source/src/res/fmr50_i286.rc +++ b/source/src/res/fmr50_i286.rc @@ -173,29 +173,29 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END POPUP "HD4" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/fmr50_i386.rc b/source/src/res/fmr50_i386.rc index 5d01d4262..83fef03b3 100644 --- a/source/src/res/fmr50_i386.rc +++ b/source/src/res/fmr50_i386.rc @@ -173,29 +173,29 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END POPUP "HD4" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/fmr50_i486.rc b/source/src/res/fmr50_i486.rc index 2f3c51786..c2ebc598f 100644 --- a/source/src/res/fmr50_i486.rc +++ b/source/src/res/fmr50_i486.rc @@ -173,29 +173,29 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END POPUP "HD4" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/fmr60.rc b/source/src/res/fmr60.rc index d2726c914..1785a67ff 100644 --- a/source/src/res/fmr60.rc +++ b/source/src/res/fmr60.rc @@ -173,29 +173,29 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END POPUP "HD4" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/fmr70.rc b/source/src/res/fmr70.rc index 9f1ca7a96..77ebb4284 100644 --- a/source/src/res/fmr70.rc +++ b/source/src/res/fmr70.rc @@ -173,29 +173,29 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END POPUP "HD4" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/fmr80.rc b/source/src/res/fmr80.rc index 060a555b5..c1f6c9505 100644 --- a/source/src/res/fmr80.rc +++ b/source/src/res/fmr80.rc @@ -173,29 +173,29 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END POPUP "HD4" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/mz1500.rc b/source/src/res/mz1500.rc index b576689b0..6ba2ccccc 100644 --- a/source/src/res/mz1500.rc +++ b/source/src/res/mz1500.rc @@ -172,11 +172,6 @@ BEGIN END POPUP "Device" BEGIN - POPUP "Drive" - BEGIN - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE1 - END POPUP "Sound" BEGIN MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD diff --git a/source/src/res/mz2200.rc b/source/src/res/mz2200.rc index 442940492..1744bc765 100644 --- a/source/src/res/mz2200.rc +++ b/source/src/res/mz2200.rc @@ -202,11 +202,6 @@ BEGIN MENUITEM "4MHz", ID_VM_CPU_TYPE0 MENUITEM "6MHz", ID_VM_CPU_TYPE1 END - POPUP "Drive" - BEGIN - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE1 - END POPUP "Sound" BEGIN MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD diff --git a/source/src/res/mz2500.rc b/source/src/res/mz2500.rc index 6dd59e5f3..331e29369 100644 --- a/source/src/res/mz2500.rc +++ b/source/src/res/mz2500.rc @@ -189,25 +189,20 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END POPUP "Device" BEGIN - POPUP "Drive" - BEGIN - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE1 - END POPUP "Sound" BEGIN MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD diff --git a/source/src/res/mz2800.rc b/source/src/res/mz2800.rc index e6ba81d4a..3480d5ac1 100644 --- a/source/src/res/mz2800.rc +++ b/source/src/res/mz2800.rc @@ -171,6 +171,20 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_FD4 END + POPUP "HD1" + BEGIN + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 + MENUITEM SEPARATOR + MENUITEM "Recent", ID_RECENT_HD1 + END + POPUP "HD2" + BEGIN + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 + MENUITEM SEPARATOR + MENUITEM "Recent", ID_RECENT_HD2 + END POPUP "Device" BEGIN POPUP "Sound" diff --git a/source/src/res/mz800.rc b/source/src/res/mz800.rc index 31b78eb91..210338644 100644 --- a/source/src/res/mz800.rc +++ b/source/src/res/mz800.rc @@ -176,11 +176,6 @@ BEGIN MENUITEM "MZ-800" ID_VM_BOOT_MODE0 MENUITEM "MZ-700" ID_VM_BOOT_MODE1 END - POPUP "Drive" - BEGIN - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE1 - END POPUP "Sound" BEGIN MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD diff --git a/source/src/res/mz80a.rc b/source/src/res/mz80a.rc index 868d6824c..1455f89bc 100644 --- a/source/src/res/mz80a.rc +++ b/source/src/res/mz80a.rc @@ -187,11 +187,6 @@ BEGIN END POPUP "Device" BEGIN - POPUP "Drive" - BEGIN - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE1 - END POPUP "Option" BEGIN MENUITEM "PCG-8000", ID_VM_DIPSWITCH0 diff --git a/source/src/res/mz80b.rc b/source/src/res/mz80b.rc index 03a04d79b..65c677fb1 100644 --- a/source/src/res/mz80b.rc +++ b/source/src/res/mz80b.rc @@ -194,11 +194,6 @@ BEGIN MENUITEM "4MHz", ID_VM_CPU_TYPE0 MENUITEM "6MHz", ID_VM_CPU_TYPE1 END - POPUP "Drive" - BEGIN - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE1 - END POPUP "Sound" BEGIN MENUITEM "Play FDD Noise", ID_VM_SOUND_NOISE_FDD diff --git a/source/src/res/pc9801ra.rc b/source/src/res/pc9801ra.rc index 96af48c96..ea5326a76 100644 --- a/source/src/res/pc9801ra.rc +++ b/source/src/res/pc9801ra.rc @@ -151,15 +151,15 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END diff --git a/source/src/res/pc9801vx.rc b/source/src/res/pc9801vx.rc index a5423f800..3a34792fe 100644 --- a/source/src/res/pc9801vx.rc +++ b/source/src/res/pc9801vx.rc @@ -151,15 +151,15 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END diff --git a/source/src/res/pc98rl.rc b/source/src/res/pc98rl.rc index 84634a17f..e6e832103 100644 --- a/source/src/res/pc98rl.rc +++ b/source/src/res/pc98rl.rc @@ -151,15 +151,15 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END diff --git a/source/src/res/pc98xa.rc b/source/src/res/pc98xa.rc index f9f240f2b..8bd3d5855 100644 --- a/source/src/res/pc98xa.rc +++ b/source/src/res/pc98xa.rc @@ -151,15 +151,15 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END diff --git a/source/src/res/pc98xl.rc b/source/src/res/pc98xl.rc index 9e084fcc9..0d69e5eea 100644 --- a/source/src/res/pc98xl.rc +++ b/source/src/res/pc98xl.rc @@ -151,15 +151,15 @@ BEGIN END POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END diff --git a/source/src/res/x1.rc b/source/src/res/x1.rc index 5bd940700..6073ee1f7 100644 --- a/source/src/res/x1.rc +++ b/source/src/res/x1.rc @@ -169,31 +169,31 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_TAPE1 END - POPUP "HD1" + POPUP "HD0" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END - POPUP "HD2" + POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END - POPUP "HD3" + POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END - POPUP "HD4" + POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/res/x1turbo.rc b/source/src/res/x1turbo.rc index a4da2ec89..3dfc328e7 100644 --- a/source/src/res/x1turbo.rc +++ b/source/src/res/x1turbo.rc @@ -169,41 +169,41 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_TAPE1 END - POPUP "HD1" + POPUP "HD0" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END - POPUP "HD2" + POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END - POPUP "HD3" + POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END - POPUP "HD4" + POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END POPUP "Device" BEGIN - POPUP "Drive" + POPUP "Boot Device" BEGIN - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE1 - MENUITEM "Floppy Drive 2HD", ID_VM_DRIVE_TYPE2 + MENUITEM "5/3-inch 2D", ID_VM_DRIVE_TYPE0 + MENUITEM "5/3-inch 2DD", ID_VM_DRIVE_TYPE1 + MENUITEM "5/3-inch 2HD", ID_VM_DRIVE_TYPE2 END POPUP "Keyboard" BEGIN diff --git a/source/src/res/x1turboz.rc b/source/src/res/x1turboz.rc index 7454ba7ae..0ce478992 100644 --- a/source/src/res/x1turboz.rc +++ b/source/src/res/x1turboz.rc @@ -169,41 +169,41 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_TAPE1 END - POPUP "HD1" + POPUP "HD0" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END - POPUP "HD2" + POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END - POPUP "HD3" + POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END - POPUP "HD4" + POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END POPUP "Device" BEGIN - POPUP "Drive" + POPUP "Boot Device" BEGIN - MENUITEM "Floppy Drive 2D", ID_VM_DRIVE_TYPE0 - MENUITEM "Floppy Drive 2DD", ID_VM_DRIVE_TYPE1 - MENUITEM "Floppy Drive 2HD", ID_VM_DRIVE_TYPE2 + MENUITEM "5/3-inch 2D", ID_VM_DRIVE_TYPE0 + MENUITEM "5/3-inch 2DD", ID_VM_DRIVE_TYPE1 + MENUITEM "5/3-inch 2HD", ID_VM_DRIVE_TYPE2 END POPUP "Keyboard" BEGIN diff --git a/source/src/res/x1twin.rc b/source/src/res/x1twin.rc index b1d712c00..f1871f728 100644 --- a/source/src/res/x1twin.rc +++ b/source/src/res/x1twin.rc @@ -170,31 +170,31 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_TAPE1 END - POPUP "HD1" + POPUP "HD0" BEGIN - MENUITEM "Insert", ID_OPEN_HD1 - MENUITEM "Eject", ID_CLOSE_HD1 + MENUITEM "Mount", ID_OPEN_HD1 + MENUITEM "Unmount", ID_CLOSE_HD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD1 END - POPUP "HD2" + POPUP "HD1" BEGIN - MENUITEM "Insert", ID_OPEN_HD2 - MENUITEM "Eject", ID_CLOSE_HD2 + MENUITEM "Mount", ID_OPEN_HD2 + MENUITEM "Unmount", ID_CLOSE_HD2 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD2 END - POPUP "HD3" + POPUP "HD2" BEGIN - MENUITEM "Insert", ID_OPEN_HD3 - MENUITEM "Eject", ID_CLOSE_HD3 + MENUITEM "Mount", ID_OPEN_HD3 + MENUITEM "Unmount", ID_CLOSE_HD3 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD3 END - POPUP "HD4" + POPUP "HD3" BEGIN - MENUITEM "Insert", ID_OPEN_HD4 - MENUITEM "Eject", ID_CLOSE_HD4 + MENUITEM "Mount", ID_OPEN_HD4 + MENUITEM "Unmount", ID_CLOSE_HD4 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_HD4 END diff --git a/source/src/vm/common_vm/CMakeLists.txt b/source/src/vm/common_vm/CMakeLists.txt index d383d4b68..76643b00f 100644 --- a/source/src/vm/common_vm/CMakeLists.txt +++ b/source/src/vm/common_vm/CMakeLists.txt @@ -1,6 +1,6 @@ message("* vm/common_vm") -SET(THIS_LIB_VERSION 2.0.0) +SET(THIS_LIB_VERSION 2.1.0) #include(cotire) set(s_vm_common_vm_srcs diff --git a/source/src/vm/debugger.h b/source/src/vm/debugger.h index 002b80f4c..0ca4172c3 100644 --- a/source/src/vm/debugger.h +++ b/source/src/vm/debugger.h @@ -25,8 +25,9 @@ typedef struct { struct { uint32_t addr, mask; int status; // 0 = none, 1 = enabled, other = disabled + bool check_point; } table[MAX_BREAK_POINTS], stored[MAX_BREAK_POINTS]; - bool hit; + bool hit, restart; uint32_t hit_addr; } break_point_t; @@ -42,6 +43,7 @@ private: if(addr >= bp->table[i].addr && addr < bp->table[i].addr + length) { bp->hit = now_suspended = true; bp->hit_addr = bp->table[i].addr; + bp->restart = bp->table[i].check_point; break; } } @@ -54,6 +56,7 @@ private: if((addr & bp->table[i].mask) == (bp->table[i].addr & bp->table[i].mask)) { bp->hit = now_suspended = true; bp->hit_addr = addr; + bp->restart = bp->table[i].check_point; break; } } diff --git a/source/src/vm/disk.cpp b/source/src/vm/disk.cpp index 14b96c160..5c20d6b3f 100644 --- a/source/src/vm/disk.cpp +++ b/source/src/vm/disk.cpp @@ -918,7 +918,12 @@ void DISK::save_as_d88(const _TCHAR* file_path) bool DISK::get_track(int trk, int side) { if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) { - if(trk >= 0) trk >>= 1; + if(trk >= 0) { + if(trk & 1) { + return false; // unformat + } + trk >>= 1; + } } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) { if(trk >= 0) trk <<= 1; } @@ -1074,7 +1079,12 @@ bool DISK::get_track_tmp(int trk, int side) bool DISK::make_track(int trk, int side) { if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) { - if(trk >= 0) trk >>= 1; + if(trk >= 0) { + if(trk & 1) { + return false; // unformat + } + trk >>= 1; + } } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) { if(trk >= 0) trk <<= 1; } @@ -1179,7 +1189,12 @@ bool DISK::make_track_tmp(int trk, int side) bool DISK::get_sector(int trk, int side, int index) { if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) { - if(trk >= 0) trk >>= 1; + if(trk >= 0) { + if(trk & 1) { + return false; // unformat + } + trk >>= 1; + } } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) { if(trk >= 0) trk <<= 1; } @@ -1301,7 +1316,12 @@ void DISK::set_data_mark_missing() bool DISK::format_track(int trk, int side) { if(media_type == MEDIA_TYPE_2D && drive_type == DRIVE_TYPE_2DD) { - if(trk >= 0) trk >>= 1; + if(trk >= 0) { + if(trk & 1) { + return false; // unformat + } + trk >>= 1; + } } else if(media_type == MEDIA_TYPE_2DD && drive_type == DRIVE_TYPE_2D) { if(trk >= 0) trk <<= 1; } diff --git a/source/src/vm/fm7/display.cpp b/source/src/vm/fm7/display.cpp index 90952fe4a..803a9f1fc 100644 --- a/source/src/vm/fm7/display.cpp +++ b/source/src/vm/fm7/display.cpp @@ -13,7 +13,7 @@ # include "mb61vh010.h" #endif #if defined(_FM77L4) -#include "hd46505.h" +#include "../hd46505.h" #endif #include "fm7_mainio.h" diff --git a/source/src/vm/fm7/fm7.cpp b/source/src/vm/fm7/fm7.cpp index 76792f56c..6a25ac9b8 100644 --- a/source/src/vm/fm7/fm7.cpp +++ b/source/src/vm/fm7/fm7.cpp @@ -40,7 +40,7 @@ #include "hd6844.h" #endif #if defined(_FM77L4) -#include "hd46505.h" +#include "../hd46505.h" #endif #if defined(_FM8) diff --git a/source/src/vm/fm7/vram.cpp b/source/src/vm/fm7/vram.cpp index e20cd38a5..d0786d1b5 100644 --- a/source/src/vm/fm7/vram.cpp +++ b/source/src/vm/fm7/vram.cpp @@ -9,7 +9,7 @@ #include "emu.h" #include "fm7_display.h" #if defined(_FM77L4) -#include "hd46505.h" +#include "../hd46505.h" #endif diff --git a/source/src/vm/fmr30/floppy.cpp b/source/src/vm/fmr30/floppy.cpp index 4a7982828..beab6daea 100644 --- a/source/src/vm/fmr30/floppy.cpp +++ b/source/src/vm/fmr30/floppy.cpp @@ -71,7 +71,7 @@ uint32_t FLOPPY::read_io8(uint32_t addr) case 0x35: { uint32_t value = fdsl & 0x3f; - if(d_fdc->media_type(drvsel) == MEDIA_TYPE_2D || d_fdc->media_type(drvsel) == MEDIA_TYPE_2DD) { + if(d_fdc->get_media_type(drvsel) == MEDIA_TYPE_2D || d_fdc->get_media_type(drvsel) == MEDIA_TYPE_2DD) { drvsel |= (drvsel & 2) ? 0x80 : 0x40; } return value; diff --git a/source/src/vm/fmr30/fmr30.cpp b/source/src/vm/fmr30/fmr30.cpp index 636040f1d..d39b37a32 100644 --- a/source/src/vm/fmr30/fmr30.cpp +++ b/source/src/vm/fmr30/fmr30.cpp @@ -205,11 +205,9 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) } decl_state(); for(int drv = 0; drv < USE_HARD_DISK; drv++) { -#ifdef OPEN_HARD_DISK_IN_RESET - create_local_path(hd_file_path[drv], _MAX_PATH, _T("SCSI%d.DAT"), drv); -#else - open_hard_disk_tmp(drv, create_local_path(_T("SCSI%d.DAT"), drv)); -#endif + if(!(config.last_hard_disk_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(config.last_hard_disk_path[drv]))) { + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("SCSI%d.DAT"), drv); + } } if(bios) { for(int drv = 0; drv < MAX_DRIVE; drv++) { @@ -260,17 +258,6 @@ void VM::reset() // set devices sio_kb->write_signal(SIG_I8251_DSR, 1, 1); sio_sub->write_signal(SIG_I8251_DSR, 0, 0); - -#if defined(OPEN_HARD_DISK_IN_RESET) - // open/close hard disk images - for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(hd_file_path[drv][0] != _T('\0')) { - open_hard_disk_tmp(drv, hd_file_path[drv]); - } else { - close_hard_disk_tmp(drv); - } - } -#endif } void VM::run() @@ -393,33 +380,21 @@ uint32_t VM::is_floppy_disk_accessed() void VM::open_hard_disk(int drv, const _TCHAR* file_path) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - my_tcscpy_s(hd_file_path[drv], _MAX_PATH, file_path); -#else - open_hard_disk_tmp(drv, file_path); -#endif + scsi_hdd[drv]->open(0, file_path, 512); } } void VM::close_hard_disk(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - hd_file_path[drv][0] = _T('\0'); -#else - close_hard_disk_tmp(drv); -#endif + scsi_hdd[drv]->close(0); } } bool VM::is_hard_disk_inserted(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - return (hd_file_path[drv][0] != _T('\0')); -#else - return is_hard_disk_inserted_tmp(drv); -#endif + return scsi_hdd[drv]->mounted(0); } return false; } @@ -427,36 +402,15 @@ bool VM::is_hard_disk_inserted(int drv) uint32_t VM::is_hard_disk_accessed() { uint32_t status = 0; + for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(scsi_hdd[drv]->get_disk_handler(0)->accessed()) { + if(scsi_hdd[drv]->accessed(0)) { status |= 1 << drv; } } return status; } -void VM::open_hard_disk_tmp(int drv, const _TCHAR* file_path) -{ - if(drv < USE_HARD_DISK) { - scsi_hdd[drv]->get_disk_handler(0)->open(file_path, 512); - } -} - -void VM::close_hard_disk_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - scsi_hdd[drv]->get_disk_handler(0)->close(); - } -} - -bool VM::is_hard_disk_inserted_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - return scsi_hdd[drv]->get_disk_handler(0)->mounted(); - } - return false; -} - bool VM::is_frame_skippable() { return event->is_frame_skippable(); diff --git a/source/src/vm/fmr30/fmr30.h b/source/src/vm/fmr30/fmr30.h index e68bab4b1..040a95430 100644 --- a/source/src/vm/fmr30/fmr30.h +++ b/source/src/vm/fmr30/fmr30.h @@ -38,7 +38,6 @@ // device informations for win32 #define USE_FLOPPY_DISK 2 #define USE_HARD_DISK 7 -#define OPEN_HARD_DISK_IN_RESET #define NOTIFY_KEY_DOWN #define USE_SHIFT_NUMPAD_KEY #define USE_ALT_F10_KEY @@ -128,13 +127,6 @@ protected: SYSTEM* system; TIMER* timer; -#if defined(OPEN_HARD_DISK_IN_RESET) - _TCHAR hd_file_path[USE_HARD_DISK][_MAX_PATH]; -#endif - void open_hard_disk_tmp(int drv, const _TCHAR* file_path); - void close_hard_disk_tmp(int drv); - bool is_hard_disk_inserted_tmp(int drv); - public: // ---------------------------------------- // initialize diff --git a/source/src/vm/fmr50/bios.cpp b/source/src/vm/fmr50/bios.cpp index 008ef448c..cfc16f77b 100644 --- a/source/src/vm/fmr50/bios.cpp +++ b/source/src/vm/fmr50/bios.cpp @@ -274,7 +274,7 @@ void BIOS::reset() } for(int i = 0; i < USE_HARD_DISK; i++) { if(harddisk[i] != NULL && harddisk[i]->mounted()) { - scsi_blocks[i] = harddisk[i]->cylinders * harddisk[i]->surfaces * harddisk[i]->sectors * harddisk[i]->sector_size / BLOCK_SIZE; + scsi_blocks[i] = harddisk[i]->sector_size * harddisk[i]->sector_num / BLOCK_SIZE; } else { scsi_blocks[i] = 0; } diff --git a/source/src/vm/fmr50/fmr50.cpp b/source/src/vm/fmr50/fmr50.cpp index c96d49d0d..315b3ab3e 100644 --- a/source/src/vm/fmr50/fmr50.cpp +++ b/source/src/vm/fmr50/fmr50.cpp @@ -323,11 +323,9 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) } for(int drv = 0; drv < USE_HARD_DISK; drv++) { -#ifdef OPEN_HARD_DISK_IN_RESET - create_local_path(hd_file_path[drv], _MAX_PATH, _T("SCSI%d.DAT"), drv); -#else - open_hard_disk_tmp(drv, create_local_path(_T("SCSI%d.DAT"), drv)); -#endif + if(!(config.last_hard_disk_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(config.last_hard_disk_path[drv]))) { + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("SCSI%d.DAT"), drv); + } } if(bios) { for(int drv = 0; drv < MAX_DRIVE; drv++) { @@ -375,17 +373,6 @@ void VM::reset() for(DEVICE* device = first_device; device; device = device->next_device) { device->reset(); } - -#if defined(OPEN_HARD_DISK_IN_RESET) - // open/close hard disk images - for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(hd_file_path[drv][0] != _T('\0')) { - open_hard_disk_tmp(drv, hd_file_path[drv]); - } else { - close_hard_disk_tmp(drv); - } - } -#endif } void VM::run() @@ -508,33 +495,21 @@ uint32_t VM::is_floppy_disk_accessed() void VM::open_hard_disk(int drv, const _TCHAR* file_path) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - my_tcscpy_s(hd_file_path[drv], _MAX_PATH, file_path); -#else - open_hard_disk_tmp(drv, file_path); -#endif + scsi_hdd[drv]->open(0, file_path, 512); } } void VM::close_hard_disk(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - hd_file_path[drv][0] = _T('\0'); -#else - close_hard_disk_tmp(drv); -#endif + scsi_hdd[drv]->close(0); } } bool VM::is_hard_disk_inserted(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - return (hd_file_path[drv][0] != _T('\0')); -#else - return is_hard_disk_inserted_tmp(drv); -#endif + return scsi_hdd[drv]->mounted(0); } return false; } @@ -542,36 +517,15 @@ bool VM::is_hard_disk_inserted(int drv) uint32_t VM::is_hard_disk_accessed() { uint32_t status = 0; + for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(scsi_hdd[drv]->get_disk_handler(0)->accessed()) { + if(scsi_hdd[drv]->accessed(0)) { status |= 1 << drv; } } return status; } -void VM::open_hard_disk_tmp(int drv, const _TCHAR* file_path) -{ - if(drv < USE_HARD_DISK) { - scsi_hdd[drv]->get_disk_handler(0)->open(file_path, 512); - } -} - -void VM::close_hard_disk_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - scsi_hdd[drv]->get_disk_handler(0)->close(); - } -} - -bool VM::is_hard_disk_inserted_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - return scsi_hdd[drv]->get_disk_handler(0)->mounted(); - } - return false; -} - bool VM::is_frame_skippable() { return event->is_frame_skippable(); diff --git a/source/src/vm/fmr50/fmr50.h b/source/src/vm/fmr50/fmr50.h index 80872be8f..90fb1eeb3 100644 --- a/source/src/vm/fmr50/fmr50.h +++ b/source/src/vm/fmr50/fmr50.h @@ -78,7 +78,6 @@ #define USE_CPU_TYPE 2 #define USE_FLOPPY_DISK 4 #define USE_HARD_DISK 7 -#define OPEN_HARD_DISK_IN_RESET #define NOTIFY_KEY_DOWN #define USE_SHIFT_NUMPAD_KEY #define USE_ALT_F10_KEY @@ -179,13 +178,6 @@ protected: // SERIAL* serial; TIMER* timer; -#if defined(OPEN_HARD_DISK_IN_RESET) - _TCHAR hd_file_path[USE_HARD_DISK][_MAX_PATH]; -#endif - void open_hard_disk_tmp(int drv, const _TCHAR* file_path); - void close_hard_disk_tmp(int drv); - bool is_hard_disk_inserted_tmp(int drv); - public: // ---------------------------------------- // initialize diff --git a/source/src/vm/harddisk.cpp b/source/src/vm/harddisk.cpp index 8f7b76020..75f827e09 100644 --- a/source/src/vm/harddisk.cpp +++ b/source/src/vm/harddisk.cpp @@ -10,11 +10,6 @@ #include "harddisk.h" #include "../fileio.h" -void HARDDISK::open(const _TCHAR* file_path) -{ - open(file_path, 256); -} - void HARDDISK::open(const _TCHAR* file_path, int default_sector_size) { uint8_t header[512]; @@ -27,9 +22,13 @@ void HARDDISK::open(const _TCHAR* file_path, int default_sector_size) if(fio->Fopen(file_path, FILEIO_READ_WRITE_BINARY)) { // from NP2 sxsihdd.c + const char sig_vhd[8] = "VHD1.00"; + const char sig_nhd[15] = "T98HDDIMAGE.R0"; + + fio->Fread(header, 256, 1); + if(check_file_extension(file_path, _T(".thd"))) { // T98 - fio->Fread(header, 256, 1); /* typedef struct thd_header_s { int16_t cylinders; @@ -37,14 +36,13 @@ void HARDDISK::open(const _TCHAR* file_path, int default_sector_size) */ header_size = 256; tmp.read_2bytes_le_from(header + 0); - cylinders = tmp.sd; + int cylinders = tmp.sd; surfaces = 8; - sectors = 33; + int sectors = 33; sector_size = 256; - - } else if(check_file_extension(file_path, _T(".nhd"))) { + sector_num = cylinders * surfaces * sectors; + } else if(check_file_extension(file_path, _T(".nhd")) && memcmp(header, sig_nhd, 15) == 0) { // T98Next - fio->Fread(header, 256, 1); /* typedef struct nhd_header_s { char sig[16]; @@ -60,16 +58,16 @@ void HARDDISK::open(const _TCHAR* file_path, int default_sector_size) tmp.read_4bytes_le_from(header + 272); header_size = tmp.sd; tmp.read_4bytes_le_from(header + 276); - cylinders = tmp.sd; + int cylinders = tmp.sd; tmp.read_2bytes_le_from(header + 280); surfaces = tmp.sd; tmp.read_2bytes_le_from(header + 282); - sectors = tmp.sd; + int sectors = tmp.sd; tmp.read_2bytes_le_from(header + 284); sector_size = tmp.sd; + sector_num = cylinders * surfaces * sectors; } else if(check_file_extension(file_path, _T(".hdi"))) { // ANEX86 - fio->Fread(header, 32, 1); /* typedef struct hdi_header_s { int32_t dummy; // + 0 @@ -87,47 +85,48 @@ void HARDDISK::open(const _TCHAR* file_path, int default_sector_size) tmp.read_4bytes_le_from(header + 16); sector_size = tmp.sd; tmp.read_4bytes_le_from(header + 20); - sectors = tmp.sd; + int sectors = tmp.sd; tmp.read_4bytes_le_from(header + 24); surfaces = tmp.sd; tmp.read_4bytes_le_from(header + 28); - cylinders = tmp.sd; + int cylinders = tmp.sd; + sector_num = cylinders * surfaces * sectors; + } else if(check_file_extension(file_path, _T(".hdd")) && memcmp(header, sig_vhd, 5) == 0) { + // Virtual98 +/* + typedef struct { + char sig[3]; // + 0 + char ver[4]; // + 3 + char delimita; // + 7 + char comment[128]; // + 8 + uint8_t pad1[4]; // +136 + int16_t mbsize; // +140 + int16_t sectorsize; // +142 + uint8_t sectors; // +144 + uint8_t surfaces; // +145 + int16_t cylinders; // +146 + int32_t totals; // +148 + uint8_t pad2[0x44]; // +152 + } virtual98_header_t; +*/ + header_size = 288; + tmp.read_2bytes_le_from(header + 142); + sector_size = tmp.sd; +// int sectors = header[144]; + surfaces = header[145]; +// tmp.read_2bytes_le_from(header + 146); +// int cylinders = tmp.sd; + tmp.read_4bytes_le_from(header + 148); + sector_num = tmp.sd; +// sector_num = cylinders * surfaces * sectors; } else { // solid - typedef struct { - int sectors, surfaces, cylinders, sector_size; - } hd_format_t; - long length = fio->FileLength(); - header_size = 0; - cylinders = (int)(length / (8 * 33 * default_sector_size)); - surfaces = 8; - sectors = 33; + // sectors = 33, surfaces = 4, cylinders = 153, sector_size = 256 // 5MB + // sectors = 33, surfaces = 4, cylinders = 310, sector_size = 256 // 10MB + surfaces = (default_sector_size == 256 && fio->FileLength() <= 33 * 4 * 310 * 256) ? 4 : 8; sector_size = default_sector_size; - - if(default_sector_size == 256) { - static const hd_format_t hd_formats[] = { - {33, 4, 153, 256}, // 5MB - {33, 4, 310, 256}, // 10MB - {33, 6, 310, 256}, // 15MB - {33, 8, 310, 256}, // 20MB - {33, 4, 615, 256}, // 20MB (not used!) - {33, 6, 615, 256}, // 30MB - {33, 8, 615, 256}, // 40MB - }; - for(int i = 0; i < (int)array_length(hd_formats); i++) { - const hd_format_t *p = &hd_formats[i]; - if(length == p->sectors * p->surfaces * p->cylinders * p->sector_size) { - cylinders = p->cylinders; - surfaces = p->surfaces; - sectors = p->sectors; - sector_size = p->sector_size; - break; - } - } - } else if(default_sector_size == 512) { - - } + sector_num = fio->FileLength() / sector_size; } } } @@ -203,10 +202,11 @@ void HARDDISK::save_state(FILEIO* state_fio) state_fio->FputInt32(0); } state_fio->FputInt32(header_size); - state_fio->FputInt32(cylinders); +// state_fio->FputInt32(cylinders); state_fio->FputInt32(surfaces); - state_fio->FputInt32(sectors); +// state_fio->FputInt32(sectors); state_fio->FputInt32(sector_size); + state_fio->FputInt32(sector_num); } bool HARDDISK::load_state(FILEIO* state_fio) @@ -247,10 +247,11 @@ bool HARDDISK::load_state(FILEIO* state_fio) } } header_size = state_fio->FgetInt32(); - cylinders = state_fio->FgetInt32(); +// cylinders = state_fio->FgetInt32(); surfaces = state_fio->FgetInt32(); - sectors = state_fio->FgetInt32(); +// sectors = state_fio->FgetInt32(); sector_size = state_fio->FgetInt32(); + sector_num = state_fio->FgetInt32(); return true; } */ diff --git a/source/src/vm/harddisk.h b/source/src/vm/harddisk.h index d084c1335..7f89b1d1c 100644 --- a/source/src/vm/harddisk.h +++ b/source/src/vm/harddisk.h @@ -39,7 +39,6 @@ public: close(); } - void open(const _TCHAR* file_path); void open(const _TCHAR* file_path, int default_sector_size); void close(); bool mounted(); @@ -47,10 +46,11 @@ public: bool read_buffer(long position, int length, uint8_t *buffer); bool write_buffer(long position, int length, uint8_t *buffer); - int cylinders; +// int cylinders; int surfaces; - int sectors; +// int sectors; int sector_size; + int sector_num; int drive_num; bool access; diff --git a/source/src/vm/hd146818p.cpp b/source/src/vm/hd146818p.cpp index 3a0d93916..da352f040 100644 --- a/source/src/vm/hd146818p.cpp +++ b/source/src/vm/hd146818p.cpp @@ -154,8 +154,7 @@ void HD146818P::event_callback(int event_id, int err) update_intr(); } else if(event_id == EVENT_SQW) { // periodic interrupt - sqw = !sqw; - if(sqw) { // OK? 20180516 K.Ohta + if((sqw = !sqw) == true) { regs[0x0c] |= 0x40; update_intr(); } diff --git a/source/src/vm/io.cpp b/source/src/vm/io.cpp index 7f0c8323f..51f79a8fd 100644 --- a/source/src/vm/io.cpp +++ b/source/src/vm/io.cpp @@ -137,7 +137,7 @@ void IO::write_port8(uint32_t addr, uint32_t data, bool is_dma) if(!wr_table[laddr].dev->this_device_id && !wr_table[laddr].is_flipflop) { this->out_debug_log(_T("UNKNOWN:\t")); } - this->out_debug_log(_T("%06x\tOUT8\t%04x,%02x\n"), get_cpu_pc(cpu_index), addr, data); + this->out_debug_log(_T("%06x\tOUT8\t%04x,%02x\n"), get_cpu_pc(cpu_index), addr, data & 0xff); #endif if(wr_table[laddr].is_flipflop) { rd_table[laddr].value = data & 0xff; @@ -157,7 +157,7 @@ uint32_t IO::read_port8(uint32_t addr, bool is_dma) if(!rd_table[laddr].dev->this_device_id && !rd_table[laddr].value_registered) { this->out_debug_log(_T("UNKNOWN:\t")); } - this->out_debug_log(_T("%06x\tIN8\t%04x = %02x\n"), get_cpu_pc(cpu_index), addr, val); + this->out_debug_log(_T("%06x\tIN8\t%04x = %02x\n"), get_cpu_pc(cpu_index), addr, val & 0xff); #endif return val & 0xff; } @@ -170,7 +170,7 @@ void IO::write_port16(uint32_t addr, uint32_t data, bool is_dma) if(!wr_table[laddr].dev->this_device_id && !wr_table[laddr].is_flipflop) { this->out_debug_log(_T("UNKNOWN:\t")); } - this->out_debug_log(_T("%06x\tOUT16\t%04x,%04x\n"), get_cpu_pc(cpu_index), addr, data); + this->out_debug_log(_T("%06x\tOUT16\t%04x,%04x\n"), get_cpu_pc(cpu_index), addr, data & 0xffff); #endif if(wr_table[laddr].is_flipflop) { rd_table[laddr].value = data & 0xffff; @@ -190,7 +190,7 @@ uint32_t IO::read_port16(uint32_t addr, bool is_dma) if(!rd_table[laddr].dev->this_device_id && !rd_table[laddr].value_registered) { this->out_debug_log(_T("UNKNOWN:\t")); } - this->out_debug_log(_T("%06x\tIN16\t%04x = %04x\n"), get_cpu_pc(cpu_index), addr, val); + this->out_debug_log(_T("%06x\tIN16\t%04x = %04x\n"), get_cpu_pc(cpu_index), addr, val & 0xffff); #endif return val & 0xffff; } diff --git a/source/src/vm/mb8877.cpp b/source/src/vm/mb8877.cpp index 9e6fbc353..4017b2742 100644 --- a/source/src/vm/mb8877.cpp +++ b/source/src/vm/mb8877.cpp @@ -1905,7 +1905,7 @@ bool MB8877::is_disk_protected(int drv) return false; } -uint8_t MB8877::media_type(int drv) +uint8_t MB8877::get_media_type(int drv) { if(drv < _max_drive) { if(disk[drv]->inserted) { diff --git a/source/src/vm/mb8877.h b/source/src/vm/mb8877.h index 448af6cde..4fb940f8f 100644 --- a/source/src/vm/mb8877.h +++ b/source/src/vm/mb8877.h @@ -236,7 +236,7 @@ public: bool is_disk_inserted(int drv); void is_disk_protected(int drv, bool value); bool is_disk_protected(int drv); - uint8_t media_type(int drv); + uint8_t get_media_type(int drv); void set_drive_type(int drv, uint8_t type); uint8_t get_drive_type(int drv); void set_drive_rpm(int drv, int rpm); diff --git a/source/src/vm/mz2500/mz2500.cpp b/source/src/vm/mz2500/mz2500.cpp index d7e86ea84..11f5c30f6 100644 --- a/source/src/vm/mz2500/mz2500.cpp +++ b/source/src/vm/mz2500/mz2500.cpp @@ -80,7 +80,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) pcm = new PCM1BIT(this, emu); rtc = new RP5C01(this, emu); // RP-5C15 sasi_host = new SCSI_HOST(this, emu); - sasi_hdd = new SCSI_HDD(this, emu); + sasi_hdd = new SASI_HDD(this, emu); sasi_hdd->set_device_name(_T("SASI Hard Disk Drive")); sasi_hdd->scsi_id = 0; sasi_hdd->bytes_per_sec = 32 * 1024; // 32KB/s @@ -242,12 +242,17 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) device->initialize(); } + for(int drv = 0; drv < MAX_DRIVE; drv++) { +// if(config.drive_type) { +// fdc->set_drive_type(drv, DRIVE_TYPE_2D); +// } else { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); +// } + } for(int drv = 0; drv < USE_HARD_DISK; drv++) { -#if defined(OPEN_HARD_DISK_IN_RESET) - create_local_path(hd_file_path[drv], _MAX_PATH, _T("SASI%d.DAT"), drv); -#else - open_hard_disk_tmp(drv, create_local_path(_T("SASI%d.DAT"), drv)); -#endif + if(!(config.last_hard_disk_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(config.last_hard_disk_path[drv]))) { + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("SASI%d.DAT"), drv); + } } monitor_type = config.monitor_type; decl_state(); @@ -284,27 +289,9 @@ void VM::reset() for(DEVICE* device = first_device; device; device = device->next_device) { device->reset(); } - for(int i = 0; i < MAX_DRIVE; i++) { - if(config.drive_type) { - fdc->set_drive_type(i, DRIVE_TYPE_2D); - } else { - fdc->set_drive_type(i, DRIVE_TYPE_2DD); - } - } // set initial port status opn->write_signal(SIG_YM2203_PORT_B, (monitor_type & 2) ? 0x77 : 0x37, 0xff); - -#if defined(OPEN_HARD_DISK_IN_RESET) - // open/close hard disk images - for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(hd_file_path[drv][0] != _T('\0')) { - open_hard_disk_tmp(drv, hd_file_path[drv]); - } else { - close_hard_disk_tmp(drv); - } - } -#endif } void VM::special_reset() @@ -445,6 +432,16 @@ void VM::inc_socket_recv_buffer_ptr(int ch, int size) void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank) { fdc->open_disk(drv, file_path, bank); + + if(fdc->get_media_type(drv) == MEDIA_TYPE_2DD) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2D) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); + } + } else if(fdc->get_media_type(drv) == MEDIA_TYPE_2D) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2DD) { + fdc->set_drive_type(drv, DRIVE_TYPE_2D); + } + } } void VM::close_floppy_disk(int drv) @@ -475,33 +472,21 @@ uint32_t VM::is_floppy_disk_accessed() void VM::open_hard_disk(int drv, const _TCHAR* file_path) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - my_tcscpy_s(hd_file_path[drv], _MAX_PATH, file_path); -#else - open_hard_disk_tmp(drv, file_path); -#endif + sasi_hdd->open(drv, file_path, 256); } } void VM::close_hard_disk(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - hd_file_path[drv][0] = _T('\0'); -#else - close_hard_disk_tmp(drv); -#endif + sasi_hdd->close(drv); } } bool VM::is_hard_disk_inserted(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - return (hd_file_path[drv][0] != _T('\0')); -#else - return is_hard_disk_inserted_tmp(drv); -#endif + return sasi_hdd->mounted(drv); } return false; } @@ -511,36 +496,13 @@ uint32_t VM::is_hard_disk_accessed() uint32_t status = 0; for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(sasi_hdd->get_disk_handler(drv)->accessed()) { + if(sasi_hdd->accessed(drv)) { status |= 1 << drv; } } return status; } -void VM::open_hard_disk_tmp(int drv, const _TCHAR* file_path) -{ - if(drv < USE_HARD_DISK) { - sasi_hdd->get_disk_handler(drv)->open(file_path); - } -} - -void VM::close_hard_disk_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - sasi_hdd->get_disk_handler(drv)->close(); - } -} - -bool VM::is_hard_disk_inserted_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - return sasi_hdd->get_disk_handler(drv)->mounted(); - } - return false; -} - - void VM::play_tape(int drv, const _TCHAR* file_path) { bool value = drec->play_tape(file_path); diff --git a/source/src/vm/mz2500/mz2500.h b/source/src/vm/mz2500/mz2500.h index 21a26c857..52a8c9df2 100644 --- a/source/src/vm/mz2500/mz2500.h +++ b/source/src/vm/mz2500/mz2500.h @@ -38,12 +38,10 @@ // device informations for win32 #define USE_SPECIAL_RESET -#define USE_DRIVE_TYPE 2 #define USE_FLOPPY_DISK 4 #define USE_TAPE 1 #define USE_TAPE_BUTTON #define USE_HARD_DISK 2 -#define OPEN_HARD_DISK_IN_RESET #define USE_SOCKET #define USE_SHIFT_NUMPAD_KEY #define USE_ALT_F10_KEY @@ -84,7 +82,7 @@ class IO; class MB8877; class PCM1BIT; class RP5C01; -class SCSI_HDD; +class SASI_HDD; class SCSI_HOST; class W3100A; class YM2203; @@ -125,7 +123,7 @@ protected: MB8877* fdc; PCM1BIT* pcm; RP5C01* rtc; - SCSI_HDD* sasi_hdd; + SASI_HDD* sasi_hdd; SCSI_HOST* sasi_host; W3100A* w3100a; YM2203* opn; @@ -150,13 +148,6 @@ protected: SERIAL* serial; TIMER* timer; -#if defined(OPEN_HARD_DISK_IN_RESET) - _TCHAR hd_file_path[2][_MAX_PATH]; -#endif - void open_hard_disk_tmp(int drv, const _TCHAR* file_path); - void close_hard_disk_tmp(int drv); - bool is_hard_disk_inserted_tmp(int drv); - // monitor type cache int monitor_type; diff --git a/source/src/vm/mz2500/mz80b.cpp b/source/src/vm/mz2500/mz80b.cpp index 91576179a..e1a5a2aa9 100644 --- a/source/src/vm/mz2500/mz80b.cpp +++ b/source/src/vm/mz2500/mz80b.cpp @@ -270,6 +270,13 @@ VM::~VM() delete device; device = next_device; } + for(int drv = 0; drv < MAX_DRIVE; drv++) { +// if(config.drive_type) { +// fdc->set_drive_type(drv, DRIVE_TYPE_2D); +// } else { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); +// } + } } DEVICE* VM::get_device(int id) @@ -292,13 +299,6 @@ void VM::reset() for(DEVICE* device = first_device; device; device = device->next_device) { device->reset(); } - for(int i = 0; i < MAX_DRIVE; i++) { - if(config.drive_type) { - fdc->set_drive_type(i, DRIVE_TYPE_2DD); - } else { - fdc->set_drive_type(i, DRIVE_TYPE_2D); - } - } } void VM::special_reset() @@ -398,6 +398,16 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r) void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank) { fdc->open_disk(drv, file_path, bank); + + if(fdc->get_media_type(drv) == MEDIA_TYPE_2DD) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2D) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); + } + } else if(fdc->get_media_type(drv) == MEDIA_TYPE_2D) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2DD) { + fdc->set_drive_type(drv, DRIVE_TYPE_2D); + } + } } void VM::close_floppy_disk(int drv) diff --git a/source/src/vm/mz2500/mz80b.h b/source/src/vm/mz2500/mz80b.h index 219e2ca9c..c7382d402 100644 --- a/source/src/vm/mz2500/mz80b.h +++ b/source/src/vm/mz2500/mz80b.h @@ -52,7 +52,6 @@ // device informations for win32 #define USE_SPECIAL_RESET #define USE_CPU_TYPE 2 -#define USE_DRIVE_TYPE 2 #define USE_FLOPPY_DISK 4 #ifdef SUPPORT_QUICK_DISK #define USE_QUICK_DISK 1 diff --git a/source/src/vm/mz2800/floppy.cpp b/source/src/vm/mz2800/floppy.cpp index a84bc7947..e9636d9af 100644 --- a/source/src/vm/mz2800/floppy.cpp +++ b/source/src/vm/mz2800/floppy.cpp @@ -37,7 +37,11 @@ void FLOPPY::write_io8(uint32_t addr, uint32_t data) if(data & 1) { d_fdc->set_drive_type(i, DRIVE_TYPE_2HD); } else { - d_fdc->set_drive_type(i, DRIVE_TYPE_2DD); + if(d_fdc->get_media_type(i) == MEDIA_TYPE_2DD) { + d_fdc->set_drive_type(i, DRIVE_TYPE_2DD); + } else { + d_fdc->set_drive_type(i, DRIVE_TYPE_2D); + } } } break; diff --git a/source/src/vm/mz2800/mz2800.cpp b/source/src/vm/mz2800/mz2800.cpp index 7e10273e5..a37023c77 100644 --- a/source/src/vm/mz2800/mz2800.cpp +++ b/source/src/vm/mz2800/mz2800.cpp @@ -12,6 +12,8 @@ #include "../device.h" #include "../event.h" +#include "../disk.h" +#include "../harddisk.h" #include "../i8253.h" #include "../i8255.h" #include "../i8259.h" @@ -25,7 +27,8 @@ //#include "../pcpr201.h" #include "../prnfile.h" #include "../rp5c01.h" -//#include "../sasi.h" +#include "../scsi_hdd.h" +#include "../scsi_host.h" #include "../upd71071.h" #include "../ym2203.h" #include "../z80pio.h" @@ -43,6 +46,7 @@ #include "mouse.h" #include "printer.h" #include "reset.h" +#include "sasi.h" #include "serial.h" #include "sysport.h" @@ -72,7 +76,16 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) pcm = new PCM1BIT(this, emu); rtc = new RP5C01(this, emu); // RP-5C15 -// sasi = new SASI(this, emu); + sasi_host = new SCSI_HOST(this, emu); + for(int i = 0; i < USE_HARD_DISK; i++) { + sasi_hdd[i] = new SASI_HDD(this, emu); + sasi_hdd[i]->set_device_name(_T("SASI Hard Disk Drive #%d"), i + 1); + sasi_hdd[i]->scsi_id = i; + sasi_hdd[i]->set_disk_handler(0, new HARDDISK(emu)); + sasi_hdd[i]->set_context_interface(sasi_host); + sasi_hdd[i]->bytes_per_sec = 32 * 1024; // 32KB/s + sasi_host->set_context_target(sasi_hdd[i]); + } dma = new UPD71071(this, emu); opn = new YM2203(this, emu); pio1 = new Z80PIO(this, emu); @@ -86,6 +99,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) mouse = new MOUSE(this, emu); printer = new PRINTER(this, emu); rst = new RESET(this, emu); + sasi = new SASI(this, emu); serial = new SERIAL(this, emu); sysport = new SYSPORT(this, emu); @@ -116,10 +130,10 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) not_busy->set_context_out(pic, SIG_I8259_CHIP1 | SIG_I8259_IR1, 1); rtc->set_context_alarm(pic, SIG_I8259_CHIP1 | SIG_I8259_IR2, 1); rtc->set_context_pulse(opn, SIG_YM2203_PORT_B, 8); -// sasi->set_context_drq(dma, SIG_UPD71071_CH0, 1); -// sasi->set_context_irq(pic, SIG_I8259_CHIP0 | SIG_I8259_IR4, 1); + sasi_host->set_context_irq(sasi, SIG_SASI_IRQ, 1); + sasi_host->set_context_drq(sasi, SIG_SASI_DRQ, 1); dma->set_context_memory(memory); -// dma->set_context_ch0(sasi); + dma->set_context_ch0(sasi); dma->set_context_ch1(fdc); dma->set_context_tc(pic, SIG_I8259_CHIP0 | SIG_I8259_IR3, 1); opn->set_context_irq(pic, SIG_I8259_CHIP1 | SIG_I8259_IR7, 1); @@ -157,6 +171,9 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) } else { printer->set_context_prn(dummy); } + sasi->set_context_host(sasi_host); + sasi->set_context_dma(dma); + sasi->set_context_pic(pic); serial->set_context_sio(sio); sysport->set_context_pit(pit); sysport->set_context_sio(sio); @@ -185,7 +202,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) for(uint32_t p = 0xae; p <= 0x1fae; p += 0x100) { io->set_iomap_single_w(p, crtc); } -// io->set_iomap_single_rw(0xaf, sasi); + io->set_iomap_range_rw(0xa4, 0xa5, sasi); io->set_iomap_range_rw(0xb0, 0xb3, serial); io->set_iomap_single_r(0xbe, sysport); io->set_iomap_range_rw(0xc8, 0xc9, opn); @@ -231,6 +248,11 @@ VM::~VM() delete device; device = next_device; } + for(int drv = 0; drv < USE_HARD_DISK; drv++) { + if(!(config.last_hard_disk_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(config.last_hard_disk_path[drv]))) { + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("SASI%d.DAT"), drv); + } + } } DEVICE* VM::get_device(int id) @@ -344,6 +366,16 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r) void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank) { fdc->open_disk(drv, file_path, bank); + + if(fdc->get_media_type(drv) == MEDIA_TYPE_2DD) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2D) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); + } + } else if(fdc->get_media_type(drv) == MEDIA_TYPE_2D) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2DD) { + fdc->set_drive_type(drv, DRIVE_TYPE_2D); + } + } } void VM::close_floppy_disk(int drv) @@ -371,6 +403,40 @@ uint32_t VM::is_floppy_disk_accessed() return fdc->read_signal(0); } +void VM::open_hard_disk(int drv, const _TCHAR* file_path) +{ + if(drv < USE_HARD_DISK) { + sasi_hdd[drv]->open(0, file_path, 1024); + } +} + +void VM::close_hard_disk(int drv) +{ + if(drv < USE_HARD_DISK) { + sasi_hdd[drv]->close(0); + } +} + +bool VM::is_hard_disk_inserted(int drv) +{ + if(drv < USE_HARD_DISK) { + return sasi_hdd[drv]->mounted(0); + } + return false; +} + +uint32_t VM::is_hard_disk_accessed() +{ + uint32_t status = 0; + + for(int drv = 0; drv < USE_HARD_DISK; drv++) { + if(sasi_hdd[drv]->accessed(0)) { + status |= 1 << drv; + } + } + return status; +} + bool VM::is_frame_skippable() { return event->is_frame_skippable(); @@ -383,7 +449,7 @@ void VM::update_config() } } -#define STATE_VERSION 4 +#define STATE_VERSION 5 #include "../../statesub.h" #include "../../qt/gui/csp_logger.h" diff --git a/source/src/vm/mz2800/mz2800.h b/source/src/vm/mz2800/mz2800.h index 26cb87499..a4027b6bd 100644 --- a/source/src/vm/mz2800/mz2800.h +++ b/source/src/vm/mz2800/mz2800.h @@ -27,9 +27,11 @@ #define SINGLE_MODE_DMA #define HAS_RP5C15 #define IO_ADDR_MAX 0x8000 +#define SCSI_HOST_AUTO_ACK // device informations for win32 #define USE_FLOPPY_DISK 4 +#define USE_HARD_DISK 2 #define USE_SHIFT_NUMPAD_KEY #define USE_ALT_F10_KEY #define USE_AUTO_KEY 5 @@ -69,7 +71,8 @@ class MB8877; class NOT; class PCM1BIT; class RP5C01; -//class SASI; +class SASI_HDD; +class SCSI_HOST; class UPD71071; class YM2203; class Z80PIO; @@ -83,6 +86,7 @@ class MEMORY; class MOUSE; class PRINTER; class RESET; +class SASI; class SERIAL; class SYSPORT; @@ -104,7 +108,8 @@ protected: NOT* not_busy; PCM1BIT* pcm; RP5C01* rtc; -// SASI* sasi; + SASI_HDD* sasi_hdd[4]; + SCSI_HOST* sasi_host; UPD71071* dma; YM2203* opn; Z80PIO* pio1; @@ -118,6 +123,7 @@ protected: MOUSE* mouse; PRINTER* printer; RESET* rst; + SASI* sasi; SERIAL* serial; SYSPORT* sysport; @@ -161,6 +167,10 @@ public: void is_floppy_disk_protected(int drv, bool value); bool is_floppy_disk_protected(int drv); uint32_t is_floppy_disk_accessed(); + void open_hard_disk(int drv, const _TCHAR* file_path); + void close_hard_disk(int drv); + bool is_hard_disk_inserted(int drv); + uint32_t is_hard_disk_accessed(); bool is_frame_skippable(); void update_config(); diff --git a/source/src/vm/mz2800/sasi.cpp b/source/src/vm/mz2800/sasi.cpp new file mode 100644 index 000000000..e50163600 --- /dev/null +++ b/source/src/vm/mz2800/sasi.cpp @@ -0,0 +1,149 @@ +/* + SHARP MZ-2800 Emulator 'EmuZ-2800' + + Author : Takeda.Toshiya + Date : 2018.05.25 - + + [ SASI I/F ] +*/ + +#include "sasi.h" +#include "../i8259.h" +#include "../upd71071.h" +#include "../scsi_host.h" + +#define STATUS_INT 0x01 +#define STATUS_IXO 0x04 +#define STATUS_CXD 0x08 +#define STATUS_MSG 0x10 +#define STATUS_BSY 0x20 +#define STATUS_ACK 0x40 +#define STATUS_REQ 0x80 + +void SASI::reset() +{ + control = 0x00; + irq_status = drq_status = false; +} + +void SASI::write_io8(uint32_t addr, uint32_t data) +{ + switch(addr & 0xff) { + case 0xa4: + #ifdef _SCSI_DEBUG_LOG + this->out_debug_log(_T("[SASI] out %04X %02X\n"), addr, data); + #endif +// if(!d_host->read_signal(SIG_SCSI_IO)) { + d_host->write_dma_io8(addr, data); +// } + break; + case 0xa5: + #ifdef _SCSI_DEBUG_LOG + this->out_debug_log(_T("[SASI] out %04X %02X\n"), addr, data); + #endif + if((control & 0x20) != (data & 0x20)) { + d_host->write_signal(SIG_SCSI_SEL, data, 0x20); + } + if((control & 0x08) != (data & 0x08)) { + d_host->write_signal(SIG_SCSI_RST, data, 0x08); + } + control = data; + break; + } +} + +uint32_t SASI::read_io8(uint32_t addr) +{ + uint32_t val = 0; + + switch(addr & 0xff) { + case 0xa4: +// if(d_host->read_signal(SIG_SCSI_IO)) { + val = d_host->read_dma_io8(addr); +// } + #ifdef _SCSI_DEBUG_LOG + this->out_debug_log(_T("[SASI] in %04X %02X\n"), addr, val); + #endif + return val; + case 0xa5: + val = (d_host->read_signal(SIG_SCSI_REQ) ? STATUS_REQ : 0) | +// (d_host->read_signal(SIG_SCSI_ACK) ? STATUS_ACK : 0) | + (d_host->read_signal(SIG_SCSI_BSY) ? STATUS_BSY : 0) | + (d_host->read_signal(SIG_SCSI_MSG) ? STATUS_MSG : 0) | + (d_host->read_signal(SIG_SCSI_CD ) ? STATUS_CXD : 0) | + (d_host->read_signal(SIG_SCSI_IO ) ? STATUS_IXO : 0) | + (irq_status ? STATUS_INT : 0); + irq_status = false; + #ifdef _SCSI_DEBUG_LOG + this->out_debug_log(_T("[SASI] in %04X %02X (REQ=%d,BSY=%d,MSG=%d,CxD=%d,IxO=%d)\n"), addr, val, + (val & STATUS_REQ) ? 1 : 0, + (val & STATUS_BSY) ? 1 : 0, + (val & STATUS_MSG) ? 1 : 0, + (val & STATUS_CXD) ? 1 : 0, + (val & STATUS_IXO) ? 1 : 0); + #endif + return val | 0x02; + } + return 0xff; +} + +void SASI::write_dma_io8(uint32_t addr, uint32_t data) +{ + write_io8(0xa4, data); +} + +uint32_t SASI::read_dma_io8(uint32_t addr) +{ + return read_io8(0xa4); +} + +void SASI::write_signal(int id, uint32_t data, uint32_t mask) +{ + switch(id) { + case SIG_SASI_IRQ: + #ifdef _SCSI_DEBUG_LOG + this->out_debug_log(_T("[SASI] IRQ=%d\n"), (data & mask) ? 1 : 0); + #endif + if(control & 0x01) { + d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR4, data, mask); + } + irq_status = ((data & mask) != 0); + break; + case SIG_SASI_DRQ: + #ifdef _SCSI_DEBUG_LOG + this->out_debug_log(_T("[SASI] DRQ=%d\n"), (data & mask) ? 1 : 0); + #endif + if(control & 0x02) { + d_dma->write_signal(SIG_UPD71071_CH0, data, mask); + } + drq_status = ((data & mask) != 0); + break; + } +} + +#define STATE_VERSION 2 + +void SASI::save_state(FILEIO* state_fio) +{ + state_fio->FputUint32(STATE_VERSION); + state_fio->FputInt32(this_device_id); + + state_fio->FputUint8(control); + state_fio->FputBool(irq_status); + state_fio->FputBool(drq_status); +} + +bool SASI::load_state(FILEIO* state_fio) +{ + if(state_fio->FgetUint32() != STATE_VERSION) { + return false; + } + if(state_fio->FgetInt32() != this_device_id) { + return false; + } + control = state_fio->FgetUint8(); + irq_status = state_fio->FgetBool(); + drq_status = state_fio->FgetBool(); + return true; +} + diff --git a/source/src/vm/mz2800/sasi.h b/source/src/vm/mz2800/sasi.h new file mode 100644 index 000000000..c2461f65c --- /dev/null +++ b/source/src/vm/mz2800/sasi.h @@ -0,0 +1,64 @@ +/* + SHARP MZ-2800 Emulator 'EmuZ-2800' + + Author : Takeda.Toshiya + Date : 2018.05.25 - + + [ SASI I/F ] +*/ + +#ifndef _SASI_H_ +#define _SASI_H_ + +#include "../vm.h" +#include "../../emu.h" +#include "../device.h" + +#define SIG_SASI_IRQ 0 +#define SIG_SASI_DRQ 1 + +class SASI : public DEVICE +{ +private: + DEVICE *d_host; + DEVICE *d_dma, *d_pic; + + // sasi + uint8_t control; + bool irq_status; + bool drq_status; + +public: + SASI(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) + { + set_device_name(_T("SASI I/F")); + } + ~SASI() {} + + // common functions + void reset(); + void write_io8(uint32_t addr, uint32_t data); + uint32_t read_io8(uint32_t addr); + void write_dma_io8(uint32_t addr, uint32_t data); + uint32_t read_dma_io8(uint32_t addr); + void write_signal(int id, uint32_t data, uint32_t mask); + void save_state(FILEIO* state_fio); + bool load_state(FILEIO* state_fio); + + // unique function + void set_context_host(DEVICE* device) + { + d_host = device; + } + void set_context_dma(DEVICE* device) + { + d_dma = device; + } + void set_context_pic(DEVICE* device) + { + d_pic = device; + } +}; + +#endif + diff --git a/source/src/vm/mz700/mz700.cpp b/source/src/vm/mz700/mz700.cpp index f4aa492e1..d51aa0449 100644 --- a/source/src/vm/mz700/mz700.cpp +++ b/source/src/vm/mz700/mz700.cpp @@ -382,7 +382,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) // printer io->set_iovalue_single_r(0xfe, 0xc0); #endif - + // initialize all devices #if defined(__GIT_REPO_VERSION) strncpy(_git_revision, __GIT_REPO_VERSION, sizeof(_git_revision) - 1); @@ -390,6 +390,15 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) for(DEVICE* device = first_device; device; device = device->next_device) { device->initialize(); } +#if defined(_MZ800) || defined(_MZ1500) + for(int drv = 0; drv < MAX_DRIVE; drv++) { +// if(config.drive_type) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); +// } else { +// fdc->set_drive_type(drv, DRIVE_TYPE_2D); +// } + } +#endif decl_state(); } @@ -424,15 +433,6 @@ void VM::reset() for(DEVICE* device = first_device; device; device = device->next_device) { device->reset(); } -#if defined(_MZ800) || defined(_MZ1500) - for(int i = 0; i < MAX_DRIVE; i++) { - if(config.drive_type) { - fdc->set_drive_type(i, DRIVE_TYPE_2DD); - } else { - fdc->set_drive_type(i, DRIVE_TYPE_2D); - } - } -#endif and_int->write_signal(SIG_AND_BIT_0, 0, 1); // CLOCK = L and_int->write_signal(SIG_AND_BIT_1, 1, 1); // INTMASK = H #if defined(_MZ800) || defined(_MZ1500) @@ -637,6 +637,16 @@ uint32_t VM::is_quick_disk_accessed() void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank) { fdc->open_disk(drv, file_path, bank); + + if(fdc->get_media_type(drv) == MEDIA_TYPE_2DD) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2D) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); + } + } else if(fdc->get_media_type(drv) == MEDIA_TYPE_2D) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2DD) { + fdc->set_drive_type(drv, DRIVE_TYPE_2D); + } + } } void VM::close_floppy_disk(int drv) diff --git a/source/src/vm/mz700/mz700.h b/source/src/vm/mz700/mz700.h index a3b291685..c57bb86fa 100644 --- a/source/src/vm/mz700/mz700.h +++ b/source/src/vm/mz700/mz700.h @@ -56,7 +56,6 @@ #define USE_TAPE 1 #define USE_TAPE_BUTTON #if defined(_MZ800) || defined(_MZ1500) -#define USE_DRIVE_TYPE 2 #define USE_FLOPPY_DISK 2 #define USE_QUICK_DISK 1 #endif diff --git a/source/src/vm/mz80k/mz80k.cpp b/source/src/vm/mz80k/mz80k.cpp index 6fef14455..dfa4ed10e 100644 --- a/source/src/vm/mz80k/mz80k.cpp +++ b/source/src/vm/mz80k/mz80k.cpp @@ -197,6 +197,20 @@ VM::~VM() delete device; device = next_device; } +#if defined(SUPPORT_MZ80AIF) + for(int drv = 0; drv < MAX_DRIVE; drv++) { +// if(config.drive_type) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); +// } else { +// fdc->set_drive_type(drv, DRIVE_TYPE_2D); +// } + } +#elif defined(SUPPORT_MZ80FIO) + for(int drv = 0; drv < MAX_DRIVE; drv++) { + fdc->set_drive_type(drv, DRIVE_TYPE_2D); +// fdc->set_drive_mfm(drv, false); + } +#endif } DEVICE* VM::get_device(int id) @@ -219,20 +233,6 @@ void VM::reset() for(DEVICE* device = first_device; device; device = device->next_device) { device->reset(); } -#if defined(SUPPORT_MZ80AIF) - for(int i = 0; i < MAX_DRIVE; i++) { - if(config.drive_type) { - fdc->set_drive_type(i, DRIVE_TYPE_2DD); - } else { - fdc->set_drive_type(i, DRIVE_TYPE_2D); - } - } -#elif defined(SUPPORT_MZ80FIO) - for(int i = 0; i < MAX_DRIVE; i++) { - fdc->set_drive_type(i, DRIVE_TYPE_2D); -// fdc->set_drive_mfm(i, false); - } -#endif #if defined(_MZ1200) || defined(_MZ80A) and_int->write_signal(SIG_AND_BIT_0, 0, 1); // CLOCK = L and_int->write_signal(SIG_AND_BIT_1, 1, 1); // INTMASK = H @@ -345,6 +345,18 @@ bool VM::get_kana_locked() void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank) { fdc->open_disk(drv, file_path, bank); + +#if defined(SUPPORT_MZ80AIF) + if(fdc->get_media_type(drv) == MEDIA_TYPE_2DD) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2D) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); + } + } else if(fdc->get_media_type(drv) == MEDIA_TYPE_2D) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2DD) { + fdc->set_drive_type(drv, DRIVE_TYPE_2D); + } + } +#endif } void VM::close_floppy_disk(int drv) diff --git a/source/src/vm/pc9801/membus.cpp b/source/src/vm/pc9801/membus.cpp index 784d2d43b..88dad9f05 100644 --- a/source/src/vm/pc9801/membus.cpp +++ b/source/src/vm/pc9801/membus.cpp @@ -533,7 +533,7 @@ void MEMBUS::update_nec_ems() #endif #endif -#define STATE_VERSION 3 +#define STATE_VERSION 4 #include "../statesub.h" @@ -575,8 +575,8 @@ void MEMBUS::decl_state() #endif #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS) DECL_STATE_ENTRY_UINT8(dma_access_ctrl); - DECL_STATE_ENTRY_INT32(window_80000h); - DECL_STATE_ENTRY_INT32(window_a0000h); + DECL_STATE_ENTRY_UINT32(window_80000h); + DECL_STATE_ENTRY_UINT32(window_a0000h); #endif leave_decl_state(); diff --git a/source/src/vm/pc9801/pc9801.cpp b/source/src/vm/pc9801/pc9801.cpp index f5739e61e..aa2021b49 100644 --- a/source/src/vm/pc9801/pc9801.cpp +++ b/source/src/vm/pc9801/pc9801.cpp @@ -221,7 +221,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) noise_head_up = new NOISE(this, emu); #if defined(SUPPORT_SASI_IF) sasi_host = new SCSI_HOST(this, emu); - sasi_hdd = new SCSI_HDD(this, emu); + sasi_hdd = new SASI_HDD(this, emu); sasi_hdd->set_device_name(_T("SASI Hard Disk Drive")); sasi_hdd->scsi_id = 0; sasi_hdd->bytes_per_sec = 625 * 1024; // 625KB/s @@ -931,27 +931,17 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) #endif #if defined(USE_HARD_DISK) for(int drv = 0; drv < USE_HARD_DISK; drv++) { + if(!(config.last_hard_disk_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(config.last_hard_disk_path[drv]))) { #if defined(SUPPORT_SASI_IF) - #if defined(OPEN_HARD_DISK_IN_RESET) - create_local_path(hd_file_path[drv], _MAX_PATH, _T("SASI%d.DAT"), drv); - #else - open_hard_disk_tmp(drv, create_local_path(_T("SASI%d.DAT"), drv)); - #endif + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("SASI%d.DAT"), drv); #endif #if defined(SUPPORT_SCSI_IF) - #if defined(OPEN_HARD_DISK_IN_RESET) - create_local_path(hd_file_path[drv], _MAX_PATH, _T("SCSI%d.DAT"), drv); - #else - open_hard_disk_tmp(drv, create_local_path(_T("SCSI%d.DAT"), drv)); - #endif + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("SCSI%d.DAT"), drv); #endif #if defined(SUPPORT_IDE_IF) - #if defined(OPEN_HARD_DISK_IN_RESET) - create_local_path(hd_file_path[drv], _MAX_PATH, _T("IDE%d.DAT"), drv); - #else - open_hard_disk_tmp(drv, create_local_path(_T("IDE%d.DAT"), drv)); - #endif + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("IDE%d.DAT"), drv); #endif + } } #endif } @@ -1121,17 +1111,6 @@ void VM::reset() pc88pio->write_signal(SIG_I8255_PORT_C, 0, 0xff); pc88pio_sub->write_signal(SIG_I8255_PORT_C, 0, 0xff); #endif - -#if defined(USE_HARD_DISK) && defined(OPEN_HARD_DISK_IN_RESET) - // open/close hard disk images - for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(hd_file_path[drv][0] != _T('\0')) { - open_hard_disk_tmp(drv, hd_file_path[drv]); - } else { - close_hard_disk_tmp(drv); - } - } -#endif } void VM::run() @@ -1406,24 +1385,24 @@ bool VM::is_floppy_disk_protected(int drv) uint32_t VM::is_floppy_disk_accessed() { - uint32_t value = 0; + uint32_t status = 0; #if defined(_PC98DO) || defined(_PC98DOPLUS) if(boot_mode != 0) { - value = pc88fdc_sub->read_signal(0) & 3; + status = pc88fdc_sub->read_signal(0) & 3; } else { - value = fdc->read_signal(0) & 3; + status = fdc->read_signal(0) & 3; } #else for(int drv = 0; drv < USE_FLOPPY_DISK; drv += 2) { UPD765A *controller = get_floppy_disk_controller(drv); if(controller != NULL) { - value |= (controller->read_signal(0) & 3) << drv; + status |= (controller->read_signal(0) & 3) << drv; } } #endif - return value; + return status; } UPD765A *VM::get_floppy_disk_controller(int drv) @@ -1468,10 +1447,14 @@ DISK *VM::get_floppy_disk_handler(int drv) void VM::open_hard_disk(int drv, const _TCHAR* file_path) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - my_tcscpy_s(hd_file_path[drv], _MAX_PATH, file_path); -#else - open_hard_disk_tmp(drv, file_path); +#if defined(SUPPORT_SASI_IF) + sasi_hdd->open(drv, file_path, 256); +#endif +#if defined(SUPPORT_SCSI_IF) + scsi_hdd[drv]->open(0, file_path, 512); +#endif +#if defined(SUPPORT_IDE_IF) + ide_hdd[drv]->open(0, file_path, 512); #endif } } @@ -1479,10 +1462,14 @@ void VM::open_hard_disk(int drv, const _TCHAR* file_path) void VM::close_hard_disk(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - hd_file_path[drv][0] = _T('\0'); -#else - close_hard_disk_tmp(drv); +#if defined(SUPPORT_SASI_IF) + sasi_hdd->close(drv); +#endif +#if defined(SUPPORT_SCSI_IF) + scsi_hdd[drv]->close(0); +#endif +#if defined(SUPPORT_IDE_IF) + ide_hdd[drv]->close(0); #endif } } @@ -1490,10 +1477,14 @@ void VM::close_hard_disk(int drv) bool VM::is_hard_disk_inserted(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - return (hd_file_path[drv][0] != _T('\0')); -#else - return is_hard_disk_inserted_tmp(drv); +#if defined(SUPPORT_SASI_IF) + return sasi_hdd->mounted(drv); +#endif +#if defined(SUPPORT_SCSI_IF) + return scsi_hdd[drv]->mounted(0); +#endif +#if defined(SUPPORT_IDE_IF) + return ide_hdd[drv]->mounted(0); #endif } return false; @@ -1504,57 +1495,23 @@ uint32_t VM::is_hard_disk_accessed() uint32_t status = 0; for(int drv = 0; drv < USE_HARD_DISK; drv++) { - HARDDISK *handler = get_hard_disk_handler(drv); - - if(handler != NULL && handler->accessed()) { +#if defined(SUPPORT_SASI_IF) + if(sasi_hdd->accessed(drv)) { status |= 1 << drv; } - } - return status; -} - -void VM::open_hard_disk_tmp(int drv, const _TCHAR* file_path) -{ - HARDDISK *handler = get_hard_disk_handler(drv); - - if(handler != NULL) { - handler->open(file_path); - } -} - -void VM::close_hard_disk_tmp(int drv) -{ - HARDDISK *handler = get_hard_disk_handler(drv); - - if(handler != NULL) { - handler->close(); - } -} - -bool VM::is_hard_disk_inserted_tmp(int drv) -{ - HARDDISK *handler = get_hard_disk_handler(drv); - - if(handler != NULL) { - return handler->mounted(); - } - return false; -} - -HARDDISK *VM::get_hard_disk_handler(int drv) -{ - if(drv < USE_HARD_DISK) { -#if defined(SUPPORT_SASI_IF) - return sasi_hdd->get_disk_handler(drv); #endif #if defined(SUPPORT_SCSI_IF) - return scsi_hdd[drv]->get_disk_handler(0); + if(scsi_hdd[drv]->accessed(0)) { + status |= 1 << drv; + } #endif #if defined(SUPPORT_IDE_IF) - return ide_hdd[drv]->get_disk_handler(0); + if(ide_hdd[drv]->accessed(0)) { + status |= 1 << drv; + } #endif } - return NULL; + return status; } #endif diff --git a/source/src/vm/pc9801/pc9801.h b/source/src/vm/pc9801/pc9801.h index aefbdf038..bdfd8a3b6 100644 --- a/source/src/vm/pc9801/pc9801.h +++ b/source/src/vm/pc9801/pc9801.h @@ -247,7 +247,6 @@ #endif #if defined(SUPPORT_SASI_IF) || defined(SUPPORT_SCSI_IF) || defined(SUPPORT_IDE_IF) #define USE_HARD_DISK 2 -#define OPEN_HARD_DISK_IN_RESET #endif #if defined(SUPPORT_CMT_IF) || defined(_PC98DO) || defined(_PC98DOPLUS) #define USE_TAPE 1 @@ -361,7 +360,11 @@ class NOT; #if !defined(SUPPORT_OLD_BUZZER) class PCM1BIT; #endif -#if defined(SUPPORT_SASI_IF) || defined(SUPPORT_SCSI_IF) +#if defined(SUPPORT_SASI_IF) +class SASI_HDD; +class SCSI_HOST; +#define SCSI_HOST_AUTO_ACK +#elif defined(SUPPORT_SCSI_IF) class SCSI_HDD; class SCSI_HOST; #define SCSI_HOST_AUTO_ACK @@ -452,7 +455,7 @@ protected: NOT* not_prn; #endif #if defined(SUPPORT_SASI_IF) - SCSI_HDD* sasi_hdd; + SASI_HDD* sasi_hdd; SCSI_HOST* sasi_host; #endif #if defined(SUPPORT_SCSI_IF) @@ -544,15 +547,6 @@ protected: // drives UPD765A *get_floppy_disk_controller(int drv); DISK *get_floppy_disk_handler(int drv); -#if defined(USE_HARD_DISK) -#if defined(OPEN_HARD_DISK_IN_RESET) - _TCHAR hd_file_path[2][_MAX_PATH]; -#endif - void open_hard_disk_tmp(int drv, const _TCHAR* file_path); - void close_hard_disk_tmp(int drv); - bool is_hard_disk_inserted_tmp(int drv); - HARDDISK *get_hard_disk_handler(int drv); -#endif public: // ---------------------------------------- diff --git a/source/src/vm/pc9801/sasi.cpp b/source/src/vm/pc9801/sasi.cpp index 15a52d2c2..04df07c74 100644 --- a/source/src/vm/pc9801/sasi.cpp +++ b/source/src/vm/pc9801/sasi.cpp @@ -102,7 +102,7 @@ uint32_t SASI::read_io8(uint32_t addr) uint32_t dt = 7, ct = 0; if(unit != NULL && unit->mounted()) { - double size = unit->cylinders * unit->surfaces * unit->sectors * unit->sector_size; + double size = unit->sector_num * unit->sector_size; int size_mb = (int)(size / 1024.0 / 1024.0 + 0.5); if(size_mb <= 6) { diff --git a/source/src/vm/pc9801/sasi.h b/source/src/vm/pc9801/sasi.h index ef2d22685..8f3fc37e3 100644 --- a/source/src/vm/pc9801/sasi.h +++ b/source/src/vm/pc9801/sasi.h @@ -22,13 +22,13 @@ #define SIG_SASI_DRQ 1 #define SIG_SASI_TC 2 -class SCSI_HDD; +class SASI_HDD; class SASI : public DEVICE { private: DEVICE *d_host; - SCSI_HDD *d_hdd; + SASI_HDD *d_hdd; DEVICE *d_dma, *d_pic; uint8_t ocr; @@ -57,7 +57,7 @@ public: { d_host = device; } - void set_context_hdd(SCSI_HDD* device) + void set_context_hdd(SASI_HDD* device) { d_hdd = device; } diff --git a/source/src/vm/pc98ha/bios.cpp b/source/src/vm/pc98ha/bios.cpp index 9806350db..0fb76817b 100644 --- a/source/src/vm/pc98ha/bios.cpp +++ b/source/src/vm/pc98ha/bios.cpp @@ -26,7 +26,7 @@ bool BIOS::bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* case 0x10: case 0x70: // 2DD - if(d_fdc->is_disk_inserted(AL & 0x03) && d_fdc->media_type(AL & 0x03) != MEDIA_TYPE_2DD) { + if(d_fdc->is_disk_inserted(AL & 0x03) && d_fdc->get_media_type(AL & 0x03) != MEDIA_TYPE_2DD) { AH = 0xe0; *CarryFlag = 1; return true; @@ -35,7 +35,7 @@ bool BIOS::bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* case 0x90: case 0xf0: // 2HD - if(d_fdc->is_disk_inserted(AL & 0x03) && d_fdc->media_type(AL & 0x03) != MEDIA_TYPE_2HD) { + if(d_fdc->is_disk_inserted(AL & 0x03) && d_fdc->get_media_type(AL & 0x03) != MEDIA_TYPE_2HD) { AH = 0xe0; *CarryFlag = 1; return true; diff --git a/source/src/vm/scsi_cdrom.cpp b/source/src/vm/scsi_cdrom.cpp index cb97b15f5..958fed44e 100644 --- a/source/src/vm/scsi_cdrom.cpp +++ b/source/src/vm/scsi_cdrom.cpp @@ -434,29 +434,39 @@ void SCSI_CDROM::start_command() SCSI_DEV::start_command(); } -void SCSI_CDROM::read_buffer(int length) +bool SCSI_CDROM::read_buffer(int length) { - if(fio_img->IsOpened()) { - uint32_t offset = (uint32_t)(position % 2352); + if(!fio_img->IsOpened()) { + set_sense_code(SCSI_SENSE_NOTREADY); + return false; + } + uint32_t offset = (uint32_t)(position % 2352); + + if(fio_img->Fseek((long)position, FILEIO_SEEK_SET) != 0) { + set_sense_code(SCSI_SENSE_ILLGLBLKADDR); //SCSI_SENSE_SEEKERR + return false; + } + while(length > 0) { + uint8_t tmp_buffer[SCSI_BUFFER_SIZE]; + int tmp_length = min(length, (int)sizeof(tmp_buffer)); - fio_img->Fseek((long)position, FILEIO_SEEK_SET); - while(length > 0) { - uint8_t tmp_buffer[SCSI_BUFFER_SIZE]; - int tmp_length = min(length, (int)sizeof(tmp_buffer)); - - fio_img->Fread(tmp_buffer, tmp_length, 1); - for(int i = 0; i < tmp_length && length > 0; i++) { - if(offset >= 16 && offset < 16 + 2048) { - int value = tmp_buffer[i]; - buffer->write(value); - length--; - } - position++; - offset = (offset + 1) % 2352; + if(fio_img->Fread(tmp_buffer, tmp_length, 1) != 1) { + set_sense_code(SCSI_SENSE_ILLGLBLKADDR); //SCSI_SENSE_NORECORDFND + return false; + } + for(int i = 0; i < tmp_length && length > 0; i++) { + if(offset >= 16 && offset < 16 + 2048) { + int value = tmp_buffer[i]; + buffer->write(value); + length--; } - access = true; + position++; + offset = (offset + 1) % 2352; } + access = true; } + set_sense_code(SCSI_SENSE_NOSENSE); + return true; } int get_frames_from_msf(const char *string) diff --git a/source/src/vm/scsi_cdrom.h b/source/src/vm/scsi_cdrom.h index 6b4a47b80..d7a03fd0b 100644 --- a/source/src/vm/scsi_cdrom.h +++ b/source/src/vm/scsi_cdrom.h @@ -63,6 +63,7 @@ public: my_sprintf_s(product_id, 17, "SCSI-CDROM"); device_type = 0x05; // CD-ROM drive is_removable = true; + is_hot_swappable = false; // seek_time = 400000; // 400msec (temporary) seek_time = 10.0; bytes_per_sec = 2048 * 75; // speed x1 @@ -105,7 +106,7 @@ public: } int get_command_length(int value); void start_command(); - void read_buffer(int length); + bool read_buffer(int length); // unique functions void set_context_done(DEVICE* device, int id, uint32_t mask) diff --git a/source/src/vm/scsi_dev.cpp b/source/src/vm/scsi_dev.cpp index 05f369e9a..36b661d69 100644 --- a/source/src/vm/scsi_dev.cpp +++ b/source/src/vm/scsi_dev.cpp @@ -35,6 +35,7 @@ void SCSI_DEV::reset() event_sel = event_phase = event_req = -1; set_phase(SCSI_PHASE_BUS_FREE); + set_sense_code(SCSI_SENSE_NOSENSE); } void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask) @@ -184,7 +185,12 @@ void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask) case SCSI_CMD_WRITE12: // flush buffer if(buffer->full()) { - write_buffer(buffer->count()); + if(!write_buffer(buffer->count())) { + // change to status phase + set_dat(SCSI_STATUS_CHKCOND); + set_phase_delay(SCSI_PHASE_STATUS, 10.0); + break; + } } // request to write next data { @@ -209,7 +215,12 @@ void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask) case SCSI_CMD_WRITE12: // flush buffer if(!buffer->empty()) { - write_buffer(buffer->count()); + if(!write_buffer(buffer->count())) { + // change to status phase + set_dat(SCSI_STATUS_CHKCOND); + set_phase_delay(SCSI_PHASE_STATUS, 10.0); + break; + } } break; default: @@ -221,6 +232,7 @@ void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask) } // change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; @@ -229,10 +241,12 @@ void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask) if(--remain > 0) { // update buffer if(buffer->count() == 0) { - if(remain > SCSI_BUFFER_SIZE) { - read_buffer(SCSI_BUFFER_SIZE); - } else { - read_buffer((int)remain); + int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain; + if(!read_buffer(length)) { + // change to status phase + set_dat(SCSI_STATUS_CHKCOND); + set_phase_delay(SCSI_PHASE_STATUS, 10.0); + break; } } // request to read next data @@ -254,6 +268,7 @@ void SCSI_DEV::write_signal(int id, uint32_t data, uint32_t mask) } else { // change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; @@ -487,7 +502,13 @@ void SCSI_DEV::start_command() this->out_debug_log(_T("[SCSI_DEV:ID=%d] Command: Test Unit Ready\n"), scsi_id); #endif // change to status phase - set_dat(is_device_ready() ? SCSI_STATUS_GOOD : SCSI_STATUS_CHKCOND); + if(!is_device_ready()) { + set_dat(SCSI_STATUS_CHKCOND); + set_sense_code(SCSI_SENSE_NOTREADY); + } else { + set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); + } set_phase_delay(SCSI_PHASE_STATUS, 10.0); break; @@ -627,10 +648,12 @@ void SCSI_DEV::start_command() if(remain != 0) { // read data buffer buffer->clear(); - if(remain > SCSI_BUFFER_SIZE) { - read_buffer(SCSI_BUFFER_SIZE); - } else { - read_buffer((int)remain); + int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain; + if(!read_buffer(length)) { + // change to status phase + set_dat(SCSI_STATUS_CHKCOND); + set_phase_delay(SCSI_PHASE_STATUS, 10.0); + break; } // change to data in phase set_dat(buffer->read()); @@ -638,6 +661,7 @@ void SCSI_DEV::start_command() } else { // transfer length is zero, change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; @@ -659,6 +683,7 @@ void SCSI_DEV::start_command() } else { // transfer length is zero, change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; @@ -676,10 +701,12 @@ void SCSI_DEV::start_command() if(remain != 0) { // read data buffer buffer->clear(); - if(remain > SCSI_BUFFER_SIZE) { - read_buffer(SCSI_BUFFER_SIZE); - } else { - read_buffer((int)remain); + int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain; + if(!read_buffer(length)) { + // change to status phase + set_dat(SCSI_STATUS_CHKCOND); + set_phase_delay(SCSI_PHASE_STATUS, 10.0); + break; } // change to data in phase set_dat(buffer->read()); @@ -687,6 +714,7 @@ void SCSI_DEV::start_command() } else { // transfer length is zero, change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; @@ -715,6 +743,7 @@ void SCSI_DEV::start_command() } else { // transfer length is zero, change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; @@ -732,10 +761,12 @@ void SCSI_DEV::start_command() if(remain != 0) { // read data buffer buffer->clear(); - if(remain > SCSI_BUFFER_SIZE) { - read_buffer(SCSI_BUFFER_SIZE); - } else { - read_buffer((int)remain); + int length = remain > SCSI_BUFFER_SIZE ? SCSI_BUFFER_SIZE : (int)remain; + if(!read_buffer(length)) { + // change to status phase + set_dat(SCSI_STATUS_CHKCOND); + set_phase_delay(SCSI_PHASE_STATUS, 10.0); + break; } // change to data in phase set_dat(buffer->read()); @@ -743,6 +774,7 @@ void SCSI_DEV::start_command() } else { // transfer length is zero, change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; @@ -765,22 +797,11 @@ void SCSI_DEV::start_command() } else { // transfer length is zero, change to status phase set_dat(SCSI_STATUS_GOOD); + set_sense_code(SCSI_SENSE_NOSENSE); set_phase_delay(SCSI_PHASE_STATUS, 10.0); } break; - case SASI_CMD_SPECIFY: - #ifdef _SCSI_DEBUG_LOG - this->out_debug_log(_T("[SCSI_DEV:ID=%d] Command: SASI Command 0xC2\n"), scsi_id); - #endif - // transfer length - remain = 10; - // clear data buffer - buffer->clear(); - // change to data in phase - set_phase_delay(SCSI_PHASE_DATA_OUT, 1.0); - break; - default: #ifdef _SCSI_DEBUG_LOG this->out_debug_log(_T("[SCSI_DEV:ID=%d] Command: Unknown %02X\n"), scsi_id, command[0]); @@ -790,23 +811,27 @@ void SCSI_DEV::start_command() } } -void SCSI_DEV::read_buffer(int length) +bool SCSI_DEV::read_buffer(int length) { for(int i = 0; i < length; i++) { buffer->write(0); position++; } + set_sense_code(SCSI_SENSE_NOSENSE); + return true; } -void SCSI_DEV::write_buffer(int length) +bool SCSI_DEV::write_buffer(int length) { for(int i = 0; i < length; i++) { buffer->read(); position++; } + set_sense_code(SCSI_SENSE_NOSENSE); + return true; } -#define STATE_VERSION 2 +#define STATE_VERSION 3 #include "../statesub.h" @@ -835,6 +860,7 @@ void SCSI_DEV::decl_state() DECL_STATE_ENTRY_FIFO(buffer); DECL_STATE_ENTRY_UINT64(position); DECL_STATE_ENTRY_UINT64(remain); + DECL_STATE_ENTRY_UINT8(sense_code); // leave_decl_state(); } diff --git a/source/src/vm/scsi_dev.h b/source/src/vm/scsi_dev.h index 689f05832..36f9553f3 100644 --- a/source/src/vm/scsi_dev.h +++ b/source/src/vm/scsi_dev.h @@ -94,12 +94,11 @@ static const _TCHAR* scsi_phase_name[9] = { #define SCSI_CMD_READHEADER 0x44 // Read Header (O) #define SCSI_CMD_SUBCHANNEL 0x42 // Read Subchannel (O) #define SCSI_CMD_READ_TOC 0x43 // Read TOC (O) -#define SASI_CMD_SPECIFY 0xc2 // SASI Specify #define SCSI_STATUS_GOOD 0x00 // Status Good #define SCSI_STATUS_CHKCOND 0x02 // Check Condition #define SCSI_STATUS_CONDMET 0x04 // Condition Met -#define SCSI_STATUS_BUSY 0x08 // Busy +#define SCSI_STATUS_BUSY 0x08 // Busy #define SCSI_STATUS_INTERM 0x10 // Intermediate #define SCSI_STATUS_INTCDMET 0x14 // Intermediate-Condition Met #define SCSI_STATUS_RESCONF 0x18 // Reservation Conflict @@ -126,6 +125,13 @@ static const _TCHAR* scsi_phase_name[9] = { #define SCSI_KEY_MISCOMP 0x0E // Miscompare (Search) #define SCSI_KEY_RESERVED 0x0F // Reserved +#define SCSI_SENSE_NOSENSE 0x00 // No Sense +#define SCSI_SENSE_NOTREADY 0x04 // Not Ready +#define SCSI_SENSE_NORECORDFND 0x14 // No Record Found +#define SCSI_SENSE_SEEKERR 0x15 // Seek Error +#define SCSI_SENSE_ILLGLBLKADDR 0x21 // Illegal Block Address +#define SCSI_SENSE_WRITEPROTCT 0x27 // Write Protected + class FIFO; class SCSI_DEV : public DEVICE @@ -147,6 +153,8 @@ private: uint32_t first_req_clock; double next_req_usec; + uint8_t sense_code; + public: SCSI_DEV(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) { @@ -186,6 +194,14 @@ public: register_output_signal(&outputs_msg, device, SIG_SCSI_MSG, 1 << scsi_id); register_output_signal(&outputs_req, device, SIG_SCSI_REQ, 1 << scsi_id); } + uint8_t get_sense_code() + { + return sense_code; + } + void set_sense_code(uint8_t value) + { + sense_code = value; + } void set_phase(int value); void set_phase_delay(int value, double usec); void set_dat(int value); @@ -219,8 +235,8 @@ public: } virtual int get_command_length(int value); virtual void start_command(); - virtual void read_buffer(int length); - virtual void write_buffer(int length); + virtual bool read_buffer(int length); + virtual bool write_buffer(int length); uint8_t get_cur_command() { @@ -240,6 +256,7 @@ public: char product_id[16 + 1]; uint8_t device_type; bool is_removable; + bool is_hot_swappable; double seek_time; int bytes_per_sec; diff --git a/source/src/vm/scsi_hdd.cpp b/source/src/vm/scsi_hdd.cpp index 0e6b38813..ccfa06142 100644 --- a/source/src/vm/scsi_hdd.cpp +++ b/source/src/vm/scsi_hdd.cpp @@ -4,7 +4,7 @@ Author : Takeda.Toshiya Date : 2016.03.01- - [ SCSI hard disk drive ] + [ SCSI/SASI hard disk drive ] */ #include "scsi_hdd.h" @@ -22,6 +22,65 @@ void SCSI_HDD::release() SCSI_DEV::release(); } +void SCSI_HDD::reset() +{ + if(!is_hot_swappable) { + for(int drv = 0; drv < 8; drv++) { + if(disk[drv] != NULL) { + if(image_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(image_path[drv])) { + disk[drv]->open(image_path[drv], sector_size[drv]); + } else { + disk[drv]->close(); + } + } + } + } + SCSI_DEV::reset(); +} + +void SCSI_HDD::open(int drv, const _TCHAR* file_path, int default_sector_size) +{ + if(drv < 8 && disk[drv] != NULL) { + if(!is_hot_swappable) { + my_tcscpy_s(image_path[drv], _MAX_PATH, file_path); + sector_size[drv] = default_sector_size; + } else { + disk[drv]->open(file_path, default_sector_size); + } + } +} + +void SCSI_HDD::close(int drv) +{ + if(drv < 8 && disk[drv] != NULL) { + if(!is_hot_swappable) { + image_path[drv][0] = _T('\0'); + } else { + disk[drv]->close(); + } + } +} + +bool SCSI_HDD::mounted(int drv) +{ + if(drv < 8 && disk[drv] != NULL) { + if(!is_hot_swappable) { + return (image_path[drv][0] != _T('\0')); + } else { + return disk[drv]->mounted(); + } + } + return false; +} + +bool SCSI_HDD::accessed(int drv) +{ + if(drv < 8 && disk[drv] != NULL) { + return disk[drv]->accessed(); + } + return false; +} + bool SCSI_HDD::is_device_existing() { for(int i = 0; i < 8; i++) { @@ -39,7 +98,7 @@ uint32_t SCSI_HDD::physical_block_size() if(unit != NULL && unit->mounted()) { return unit->sector_size; } - return 512; + return 0;// 512; } uint32_t SCSI_HDD::logical_block_size() @@ -49,65 +108,83 @@ uint32_t SCSI_HDD::logical_block_size() if(unit != NULL && unit->mounted()) { return unit->sector_size; } - return 512; + return 0;// 512; } uint32_t SCSI_HDD::max_logical_block_addr() { HARDDISK *unit = disk[get_logical_unit_number()]; - if(unit != NULL && unit->mounted()) { - return unit->cylinders * unit->surfaces * unit->sectors; + if(unit != NULL && unit->mounted() && unit->sector_num > 0) { + return unit->sector_num - 1; } return 0; } -void SCSI_HDD::read_buffer(int length) +bool SCSI_HDD::read_buffer(int length) { HARDDISK *unit = disk[get_logical_unit_number()]; - if(unit != NULL && unit->mounted()) { - while(length > 0) { - uint8_t tmp_buffer[SCSI_BUFFER_SIZE]; - int tmp_length = min(length, (int)sizeof(tmp_buffer)); - - unit->read_buffer((long)position, tmp_length, tmp_buffer); - for(int i = 0; i < tmp_length; i++) { - buffer->write(tmp_buffer[i]); - } - length -= tmp_length; - position += tmp_length; - } + if(!(unit != NULL && unit->mounted())) { + set_sense_code(SCSI_SENSE_NOTREADY); + return false; } + while(length > 0) { + uint8_t tmp_buffer[SCSI_BUFFER_SIZE]; + int tmp_length = min(length, (int)sizeof(tmp_buffer)); + + if(!unit->read_buffer((long)position, tmp_length, tmp_buffer)) { + set_sense_code(SCSI_SENSE_ILLGLBLKADDR); //SCSI_SENSE_NORECORDFND + return false; + } + for(int i = 0; i < tmp_length; i++) { + buffer->write(tmp_buffer[i]); + } + length -= tmp_length; + position += tmp_length; + } + set_sense_code(SCSI_SENSE_NOSENSE); + return true; } -void SCSI_HDD::write_buffer(int length) +bool SCSI_HDD::write_buffer(int length) { HARDDISK *unit = disk[get_logical_unit_number()]; - if(unit != NULL && unit->mounted()) { - while(length > 0) { - uint8_t tmp_buffer[SCSI_BUFFER_SIZE]; - int tmp_length = min(length, (int)sizeof(tmp_buffer)); - - for(int i = 0; i < tmp_length; i++) { - tmp_buffer[i] = buffer->read(); - } - unit->write_buffer((long)position, tmp_length, tmp_buffer); - length -= tmp_length; - position += tmp_length; - } + if(!(unit != NULL && unit->mounted())) { + set_sense_code(SCSI_SENSE_NOTREADY); + return false; } + while(length > 0) { + uint8_t tmp_buffer[SCSI_BUFFER_SIZE]; + int tmp_length = min(length, (int)sizeof(tmp_buffer)); + + for(int i = 0; i < tmp_length; i++) { + tmp_buffer[i] = buffer->read(); + } + if(!unit->write_buffer((long)position, tmp_length, tmp_buffer)) { + set_sense_code(SCSI_SENSE_ILLGLBLKADDR); //SCSI_SENSE_NORECORDFND + return false; + } + length -= tmp_length; + position += tmp_length; + } + set_sense_code(SCSI_SENSE_NOSENSE); + return true; } -#define STATE_VERSION 1 +#define STATE_VERSION 3 #include "../statesub.h" void SCSI_HDD::decl_state() { enter_decl_state(STATE_VERSION); - + + for(int i = 0; i < 8; i++) { + DECL_STATE_ENTRY_STRING_MEMBER(&(image_path[i][0]), MAX_PATH, i); + } + DECL_STATE_ENTRY_1D_ARRAY(sector_size, sizeof(sector_size) / sizeof(int)); leave_decl_state(); SCSI_DEV::decl_state(); diff --git a/source/src/vm/scsi_hdd.h b/source/src/vm/scsi_hdd.h index 6e37a7e35..bd57929c6 100644 --- a/source/src/vm/scsi_hdd.h +++ b/source/src/vm/scsi_hdd.h @@ -4,7 +4,7 @@ Author : Takeda.Toshiya Date : 2016.03.01- - [ SCSI hard disk drive ] + [ SCSI/SASI hard disk drive ] */ #ifndef _SCSI_HDD_H_ @@ -23,20 +23,25 @@ private: //protected: // csp_state_utils *state_entry; + _TCHAR image_path[8][MAX_PATH]; + int sector_size[8]; + public: SCSI_HDD(VM_TEMPLATE* parent_vm, EMU* parent_emu) : SCSI_DEV(parent_vm, parent_emu) { for(int i = 0; i < 8; i++) { disk[i] = NULL; + image_path[i][0] = _T('\0'); } my_sprintf_s(vendor_id, 9, "NECITSU"); my_sprintf_s(product_id, 17, "SCSI-HDD"); device_type = 0x00; - is_removable = false; + is_removable = is_hot_swappable = false; + seek_time = 10000; // 10msec bytes_per_sec = 0x500000; // 5MB/sec - default_drive_size = 0x2800000; // 40MB +// default_drive_size = 0x2800000; // 40MB set_device_name(_T("SCSI HDD")); } ~SCSI_HDD() {} @@ -48,12 +53,13 @@ public: // virtual scsi functions void release(); + void reset(); bool is_device_existing(); uint32_t physical_block_size(); uint32_t logical_block_size(); uint32_t max_logical_block_addr(); - void read_buffer(int length); - void write_buffer(int length); + bool read_buffer(int length); + bool write_buffer(int length); // unique functions void set_disk_handler(int drv, HARDDISK* device) @@ -69,7 +75,24 @@ public: } return NULL; } - uint32_t default_drive_size; + void open(int drv, const _TCHAR* file_path, int default_sector_size); + void close(int drv); + bool mounted(int drv); + bool accessed(int drv); +}; + +class SASI_HDD : public SCSI_HDD +{ +public: + SASI_HDD(VM* parent_vm, EMU* parent_emu) : SCSI_HDD(parent_vm, parent_emu) + { + set_device_name(_T("SASI Hard Disk Drive")); + } + ~SASI_HDD() {} + + // virtual scsi functions + int get_command_length(int value); + void start_command(); }; #endif diff --git a/source/src/vm/upd71071.cpp b/source/src/vm/upd71071.cpp index 1b38c4d38..b1613876c 100644 --- a/source/src/vm/upd71071.cpp +++ b/source/src/vm/upd71071.cpp @@ -199,7 +199,12 @@ void UPD71071::do_dma() /* if((dma[c].mode & 0x01) == 1) { // 16bit transfer mode - if((dma[c].mode & 0x0c) == 4) { + if((dma[c].mode & 0x0c) == 0x00) { + // verify + uint32_t val = dma[c].dev->read_dma_io16(0); + // update temporary register + tmp = val; + } else if((dma[c].mode & 0x0c) == 0x04) { // io -> memory uint32_t val; if(dma[c].dev != NULL) { @@ -210,7 +215,7 @@ void UPD71071::do_dma() d_mem->write_dma_data16(dma[c].areg, val); // update temporary register tmp = val; - } else if((dma[c].mode & 0x0c) == 8) { + } else if((dma[c].mode & 0x0c) == 0x08) { // memory -> io uint32_t val = d_mem->read_dma_data16(dma[c].areg); if(dma[c].dev != NULL) dma[c].dev->write_dma_io16(0, val); @@ -226,14 +231,19 @@ void UPD71071::do_dma() */ { // 8bit transfer mode - if((dma[c].mode & 0x0c) == 4) { + if((dma[c].mode & 0x0c) == 0x00) { + // verify + uint32_t val = dma[c].dev->read_dma_io8(0); + // update temporary register + tmp = (tmp >> 8) | (val << 8); + } else if((dma[c].mode & 0x0c) == 0x04) { // io -> memory uint32_t val; val = dma[c].dev->read_dma_io8(0); d_mem->write_dma_data8(dma[c].areg, val); // update temporary register tmp = (tmp >> 8) | (val << 8); - } else if((dma[c].mode & 0x0c) == 8) { + } else if((dma[c].mode & 0x0c) == 0x08) { // memory -> io uint32_t val = d_mem->read_dma_data8(dma[c].areg); dma[c].dev->write_dma_io8(0, val); diff --git a/source/src/vm/upd765a.cpp b/source/src/vm/upd765a.cpp index f35d1f741..d51e44010 100644 --- a/source/src/vm/upd765a.cpp +++ b/source/src/vm/upd765a.cpp @@ -1753,7 +1753,7 @@ bool UPD765A::is_disk_protected(int drv) return false; } -uint8_t UPD765A::media_type(int drv) +uint8_t UPD765A::get_media_type(int drv) { if(drv < _max_drive && disk[drv]->inserted) { return disk[drv]->media_type; diff --git a/source/src/vm/upd765a.h b/source/src/vm/upd765a.h index 368456ca3..913cdca5d 100644 --- a/source/src/vm/upd765a.h +++ b/source/src/vm/upd765a.h @@ -241,7 +241,7 @@ public: bool disk_ejected(); // current hdu void is_disk_protected(int drv, bool value); bool is_disk_protected(int drv); - uint8_t media_type(int drv); + uint8_t get_media_type(int drv); void set_drive_type(int drv, uint8_t type); uint8_t get_drive_type(int drv); void set_drive_rpm(int drv, int rpm); diff --git a/source/src/vm/x1/floppy.cpp b/source/src/vm/x1/floppy.cpp index 4d7133722..4c77b80d5 100644 --- a/source/src/vm/x1/floppy.cpp +++ b/source/src/vm/x1/floppy.cpp @@ -22,9 +22,6 @@ void FLOPPY::reset() { register_id = -1; -#ifdef _X1TURBO_FEATURE - select_2dd = false; -#endif } void FLOPPY::write_io8(uint32_t addr, uint32_t data) @@ -64,23 +61,20 @@ uint32_t FLOPPY::read_io8(uint32_t addr) switch(addr) { case 0xffc: // FM // d_fdc->set_drive_mfm(prev & 3, false); - select_2dd = false; return 0xff; case 0xffd: // MFM // d_fdc->set_drive_mfm(prev & 3, true); - select_2dd = false; return 0xff; case 0xffe: // 2HD d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2HD); // d_fdc->set_drive_rpm(prev & 3, 360); return 0xff; case 0xfff: // 2D/2DD - if(!select_2dd) { - d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D); - } else { + if(d_fdc->get_media_type(prev & 3) == MEDIA_TYPE_2DD) { d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD); + } else { + d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D); } - select_2dd = !select_2dd; // d_fdc->set_drive_rpm(prev & 3, 300); return 0xff; } @@ -100,7 +94,7 @@ void FLOPPY::event_callback(int event_id, int err) register_id = -1; } -#define STATE_VERSION 2 +#define STATE_VERSION 3 #include "../statesub.h" @@ -109,9 +103,6 @@ void FLOPPY::decl_state() enter_decl_state(STATE_VERSION); DECL_STATE_ENTRY_INT32(prev); -#ifdef _X1TURBO_FEATURE - DECL_STATE_ENTRY_BOOL(select_2dd); -#endif DECL_STATE_ENTRY_BOOL(motor_on); DECL_STATE_ENTRY_INT32(register_id); leave_decl_state(); diff --git a/source/src/vm/x1/floppy.h b/source/src/vm/x1/floppy.h index c54b7053d..b7f67cf43 100644 --- a/source/src/vm/x1/floppy.h +++ b/source/src/vm/x1/floppy.h @@ -27,9 +27,6 @@ class FLOPPY : public DEVICE private: MB8877 *d_fdc; int prev; -#ifdef _X1TURBO_FEATURE - bool select_2dd; -#endif bool motor_on; int register_id; diff --git a/source/src/vm/x1/x1.cpp b/source/src/vm/x1/x1.cpp index cb5dc7ca4..776a67160 100644 --- a/source/src/vm/x1/x1.cpp +++ b/source/src/vm/x1/x1.cpp @@ -94,7 +94,7 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) fdc->set_context_noise_head_up(new NOISE(this, emu)); sasi_host = new SCSI_HOST(this, emu); for (int i = 0; i < array_length(sasi_hdd); i++) { - sasi_hdd[i] = new SCSI_HDD(this, emu); + sasi_hdd[i] = new SASI_HDD(this, emu); sasi_hdd[i]->set_device_name(_T("SASI Hard Disk Drive #%d"), i + 1); sasi_hdd[i]->scsi_id = i; sasi_hdd[i]->bytes_per_sec = 32 * 1024; // 32KB/s @@ -458,19 +458,18 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) } for(int drv = 0; drv < MAX_DRIVE; drv++) { //#ifdef _X1TURBO_FEATURE -// fdc->set_drive_type(drv, DRIVE_TYPE_2DD); -//#else +// if(config.drive_type == 2) { +// fdc->set_drive_type(drv, DRIVE_TYPE_2HD); +// } else +///#ndif fdc->set_drive_type(drv, DRIVE_TYPE_2D); -//#endif // fdc->set_drive_rpm(drv, 300); // fdc->set_drive_mfm(drv, true); } for(int drv = 0; drv < USE_HARD_DISK; drv++) { -#if defined(OPEN_HARD_DISK_IN_RESET) - create_local_path(hd_file_path[drv], _MAX_PATH, _T("SASI%d.DAT"), drv); -#else - open_hard_disk_tmp(drv, create_local_path(_T("SASI%d.DAT"), drv)); -#endif + if(!(config.last_hard_disk_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(config.last_hard_disk_path[drv]))) { + create_local_path(config.last_hard_disk_path[drv], _MAX_PATH, _T("SASI%d.DAT"), drv); + } } decl_state(); } @@ -508,17 +507,6 @@ void VM::reset() } pio->write_signal(SIG_I8255_PORT_B, 0x00, 0x08); // busy = low psg->set_reg(0x2e, 0); // set prescaler - -#if defined(OPEN_HARD_DISK_IN_RESET) - // open/close hard disk images - for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(hd_file_path[drv][0] != _T('\0')) { - open_hard_disk_tmp(drv, hd_file_path[drv]); - } else { - close_hard_disk_tmp(drv); - } - } -#endif } void VM::special_reset() @@ -736,6 +724,18 @@ bool VM::get_kana_locked() void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank) { fdc->open_disk(drv, file_path, bank); + +#ifdef _X1TURBO_FEATURE + if(fdc->get_media_type(drv) == MEDIA_TYPE_2DD) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2D) { + fdc->set_drive_type(drv, DRIVE_TYPE_2DD); + } + } else if(fdc->get_media_type(drv) == MEDIA_TYPE_2D) { + if(fdc->get_drive_type(drv) == DRIVE_TYPE_2DD) { + fdc->set_drive_type(drv, DRIVE_TYPE_2D); + } + } +#endif } void VM::close_floppy_disk(int drv) @@ -766,33 +766,21 @@ uint32_t VM::is_floppy_disk_accessed() void VM::open_hard_disk(int drv, const _TCHAR* file_path) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - my_tcscpy_s(hd_file_path[drv], _MAX_PATH, file_path); -#else - open_hard_disk_tmp(drv, file_path); -#endif + sasi_hdd[drv >> 1]->open(drv & 1, file_path, 256); } } void VM::close_hard_disk(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - hd_file_path[drv][0] = _T('\0'); -#else - close_hard_disk_tmp(drv); -#endif + sasi_hdd[drv >> 1]->close(drv & 1); } } bool VM::is_hard_disk_inserted(int drv) { if(drv < USE_HARD_DISK) { -#if defined(OPEN_HARD_DISK_IN_RESET) - return (hd_file_path[drv][0] != _T('\0')); -#else - return is_hard_disk_inserted_tmp(drv); -#endif + return sasi_hdd[drv >> 1]->mounted(drv & 1); } return false; } @@ -802,35 +790,13 @@ uint32_t VM::is_hard_disk_accessed() uint32_t status = 0; for(int drv = 0; drv < USE_HARD_DISK; drv++) { - if(sasi_hdd[drv >> 1]->get_disk_handler(drv & 1)->accessed()) { + if(sasi_hdd[drv >> 1]->accessed(drv & 1)) { status |= 1 << drv; } } return status; } -void VM::open_hard_disk_tmp(int drv, const _TCHAR* file_path) -{ - if(drv < USE_HARD_DISK) { - sasi_hdd[drv >> 1]->get_disk_handler(drv & 1)->open(file_path); - } -} - -void VM::close_hard_disk_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - sasi_hdd[drv >> 1]->get_disk_handler(drv & 1)->close(); - } -} - -bool VM::is_hard_disk_inserted_tmp(int drv) -{ - if(drv < USE_HARD_DISK) { - return sasi_hdd[drv >> 1]->get_disk_handler(drv & 1)->mounted(); - } - return false; -} - void VM::play_tape(int drv, const _TCHAR* file_path) { bool value = drec->play_tape(file_path); diff --git a/source/src/vm/x1/x1.h b/source/src/vm/x1/x1.h index 49708d595..fc1804c01 100644 --- a/source/src/vm/x1/x1.h +++ b/source/src/vm/x1/x1.h @@ -95,7 +95,6 @@ #define USE_FLOPPY_DISK 2 #define BASE_FLOPPY_DISK_NUM 0 #define USE_HARD_DISK 4 -#define OPEN_HARD_DISK_IN_RESET #define USE_TAPE 1 #define USE_TAPE_BUTTON #ifdef _X1TWIN @@ -261,7 +260,7 @@ class HD46505; class I8255; class IO; class MB8877; -class SCSI_HDD; +class SASI_HDD; class SCSI_HOST; class YM2151; //class YM2203; @@ -307,7 +306,7 @@ protected: I8255* pio; IO* io; MB8877* fdc; - SCSI_HDD* sasi_hdd[(USE_HARD_DISK >> 1) + (USE_HARD_DISK & 1)]; + SASI_HDD* sasi_hdd[(USE_HARD_DISK >> 1) + (USE_HARD_DISK & 1)]; SCSI_HOST* sasi_host; YM2151* opm1; YM2151* opm2; @@ -342,13 +341,6 @@ protected: bool pseudo_sub_cpu; int sound_type; -#if defined(OPEN_HARD_DISK_IN_RESET) - _TCHAR hd_file_path[USE_HARD_DISK][_MAX_PATH]; -#endif - void open_hard_disk_tmp(int drv, const _TCHAR* file_path); - void close_hard_disk_tmp(int drv); - bool is_hard_disk_inserted_tmp(int drv); - #ifdef _X1TWIN // device for pce EVENT* pceevent; diff --git a/source/src/win32/winmain.cpp b/source/src/win32/winmain.cpp index 3dbdda9fa..85ae925fd 100644 --- a/source/src/win32/winmain.cpp +++ b/source/src/win32/winmain.cpp @@ -2600,7 +2600,7 @@ void open_hard_disk_dialog(HWND hWnd, int drv) { _TCHAR* path = get_open_file_name( hWnd, - _T("Supported Files (*.thd;*.nhd;*.hdi;*.dat)\0*.thd;*.nhd;*.hdi;*.dat\0All Files (*.*)\0*.*\0\0"), + _T("Supported Files (*.thd;*.nhd;*.hdi;*.hdd;*.dat)\0*.thd;*.nhd;*.hdi;*.hdd;*.dat\0All Files (*.*)\0*.*\0\0"), _T("Hard Disk"), config.initial_hard_disk_dir, _MAX_PATH ); @@ -2866,7 +2866,8 @@ void open_any_file(const _TCHAR* path) #if defined(USE_HARD_DISK) if(check_file_extension(path, _T(".thd")) || check_file_extension(path, _T(".nhd")) || - check_file_extension(path, _T(".hdi"))) { + check_file_extension(path, _T(".hdi")) || + check_file_extension(path, _T(".hdd"))) { UPDATE_HISTORY(path, config.recent_hard_disk_path[0]); my_tcscpy_s(config.initial_hard_disk_dir, _MAX_PATH, get_parent_dir(path)); emu->open_hard_disk(0, path); diff --git a/source/tool/installer_unix.sh b/source/tool/installer_unix.sh index 2d45014dd..75dbb4e4b 100755 --- a/source/tool/installer_unix.sh +++ b/source/tool/installer_unix.sh @@ -7,7 +7,7 @@ LDCONFIG=/sbin/ldconfig CSP_ARCH="x86_64-linux-gnu" MULTIARCH="Yes" CSP_PREFIX=/usr/local -CSP_GUILIB="libCSPgui.so.2.15.3 libCSPosd.so.2.13.2 libCSPemu_utils.so.2.12.2 libCSPavio.2.8.2 libCSPfmgen.so.1.3.0 libCSPcommon_vm.so.2.0.0" +CSP_GUILIB="libCSPfmgen.so.1.4.0 libCSPcommon_vm.so.2.1.0 libCSPosd.so.2.13.2 libCSPemu_utils.so.2.12.3 libCSPgui.so.2.15.3 libCSPavio.2.9.2 " for i in "$@"; do case "$1" in diff --git a/source/tool/mz2500/create_hd.vcproj b/source/tool/mz2500/create_hd.vcproj new file mode 100644 index 000000000..b2633a036 --- /dev/null +++ b/source/tool/mz2500/create_hd.vcproj @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/vc++2008/build9.bat b/source/vc++2008/build9.bat index 405373d7d..d805929d8 100644 --- a/source/vc++2008/build9.bat +++ b/source/vc++2008/build9.bat @@ -45,10 +45,12 @@ copy Release\fm8.exe build_xp\fm8\. devenv.com fm7.vcproj /Rebuild Release devenv.com fm77.vcproj /Rebuild Release +devenv.com fm77l4.vcproj /Rebuild Release devenv.com fm77av.vcproj /Rebuild Release mkdir build_xp\fm7 copy Release\fm7.exe build_xp\fm7\. copy Release\fm77.exe build_xp\fm7\. +copy Release\fm77l4.exe build_xp\fm7\. copy Release\fm77av.exe build_xp\fm7\. devenv.com fm77av40.vcproj /Rebuild Release @@ -279,6 +281,10 @@ devenv.com pc98rl.vcproj /Rebuild Release mkdir build_xp\pc98rl copy Release\pc98rl.exe build_xp\pc98rl\. +devenv.com pc98xa.vcproj /Rebuild Release +mkdir build_xp\pc98xa +copy Release\pc98xa.exe build_xp\pc98xa\. + devenv.com pc98xl.vcproj /Rebuild Release mkdir build_xp\pc98xl copy Release\pc98xl.exe build_xp\pc98xl\. diff --git a/source/vc++2008/fm77l4.vcproj b/source/vc++2008/fm77l4.vcproj new file mode 100644 index 000000000..cbd3caab1 --- /dev/null +++ b/source/vc++2008/fm77l4.vcproj @@ -0,0 +1,1485 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/vc++2008/mz2800.vcproj b/source/vc++2008/mz2800.vcproj index d9b04e52e..bcded95d0 100644 --- a/source/vc++2008/mz2800.vcproj +++ b/source/vc++2008/mz2800.vcproj @@ -508,6 +508,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1246,6 +1350,18 @@ > + + + + + + @@ -1343,6 +1459,10 @@ > + + diff --git a/source/vc++2008/pc98xa.vcproj b/source/vc++2008/pc98xa.vcproj new file mode 100644 index 000000000..94a13de04 --- /dev/null +++ b/source/vc++2008/pc98xa.vcproj @@ -0,0 +1,1545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/vc++2013/build12.bat b/source/vc++2013/build12.bat index a9b164d8c..c7d151f6d 100644 --- a/source/vc++2013/build12.bat +++ b/source/vc++2013/build12.bat @@ -54,11 +54,14 @@ devenv.com fm7.vcxproj /Rebuild Release call :clean devenv.com fm77.vcxproj /Rebuild Release call :clean +devenv.com fm77l4.vcxproj /Rebuild Release +call :clean devenv.com fm77av.vcxproj /Rebuild Release call :clean mkdir build_vc12\fm7 copy binary_vc12\fm7.exe build_vc12\fm7\. copy binary_vc12\fm77.exe build_vc12\fm7\. +copy binary_vc12\fm77l4.exe build_vc12\fm7\. copy binary_vc12\fm77av.exe build_vc12\fm7\. devenv.com fm77av40.vcxproj /Rebuild Release @@ -354,6 +357,11 @@ call :clean mkdir build_vc12\pc98rl copy binary_vc12\pc98rl.exe build_vc12\pc98rl\. +devenv.com pc98xa.vcxproj /Rebuild Release +call :clean +mkdir build_vc12\pc98xa +copy binary_vc12\pc98xa.exe build_vc12\pc98xa\. + devenv.com pc98xl.vcxproj /Rebuild Release call :clean mkdir build_vc12\pc98xl diff --git a/source/vc++2013/fm77l4.vcxproj b/source/vc++2013/fm77l4.vcxproj new file mode 100644 index 000000000..024629671 --- /dev/null +++ b/source/vc++2013/fm77l4.vcxproj @@ -0,0 +1,267 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {19644030-FB96-4EE0-8819-86D8D13C25A7} + fm77l4 + + + + Application + v120_xp + false + MultiByte + + + Application + v120_xp + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>12.0.21005.1 + + + .\Debug\ + .\Debug\ + true + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(DXSDK_DIR)Include + $(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(DXSDK_DIR)Lib\x86 + + + .\Release\ + .\Release\ + false + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(DXSDK_DIR)Include + $(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(DXSDK_DIR)Lib\x86 + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/fm77l4.tlb + + + + Disabled + WIN32;_DEBUG;_WINDOWS;_FM77L4;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + .\Debug/fm77l4.pch + .\Debug/ + .\Debug/ + .\Debug/ + true + Level3 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0411 + + + odbc32.lib;odbccp32.lib;winmm.lib;imm32.lib;%(AdditionalDependencies) + .\Debug/fm77l4.exe + true + true + .\Debug/fm77l4.pdb + Windows + false + + MachineX86 + false + Libcmtd.lib + + + true + .\Debug/fm77l4.bsc + + + ..\src\res\vista.manifest + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release/fm77l4.tlb + + + + MaxSpeed + AnySuitable + WIN32;NDEBUG;_WINDOWS;_FM77L4;%(PreprocessorDefinitions) + true + MultiThreaded + true + StreamingSIMDExtensions2 + .\Release/fm77l4.pch + .\Release/ + .\Release/ + .\Release/ + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + odbc32.lib;odbccp32.lib;winmm.lib;imm32.lib;%(AdditionalDependencies) + .\Release/fm77l4.exe + true + .\Release/fm77l4.pdb + Windows + false + + MachineX86 + false + + + true + .\Release/fm77l4.bsc + + + ..\src\res\vista.manifest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\src\res;%(AdditionalIncludeDirectories) + ..\src\res;%(AdditionalIncludeDirectories) + + + + + + \ No newline at end of file diff --git a/source/vc++2013/fm77l4.vcxproj.filters b/source/vc++2013/fm77l4.vcxproj.filters new file mode 100644 index 000000000..2649112f9 --- /dev/null +++ b/source/vc++2013/fm77l4.vcxproj.filters @@ -0,0 +1,355 @@ + + + + + {10ef7a33-3af8-4679-ac06-3b46075e2af0} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {c96d4b4d-8ff4-4d46-9853-4c1b4334c200} + cpp + + + {e85c6a45-3836-4385-83eb-18c94e85bab8} + cpp + + + {012e62c8-23a2-430e-82dc-09e2afa6ff70} + cpp + + + {92a9973f-418e-44ec-95dd-3e1cdc4dd832} + cpp + + + {e9db7648-a2b3-4f4c-84ae-c0a4b52d041a} + cpp + + + {5a937306-3529-49fb-8f3a-aca51d816fd4} + h;hpp;hxx;hm;inl + + + {0e1c7b9d-6a66-4cf7-a7f9-1e74acccc9ec} + h + + + {7b317943-722a-406b-bda1-fed6a771c875} + h + + + {31929b93-5ac2-44ad-90e2-83ca343e36f8} + h + + + {d35244d4-a7be-4950-bcfe-10e56ebbf9e9} + + + {f1c9f606-1824-406e-8460-dcc967a514ea} + h + + + {3d5e5fcc-6af8-404e-b278-0c45a58e6365} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\EMU Source Files + + + Source Files\EMU Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\EMU Header Files + + + Header Files\OSD Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Resource Files + + + + + Resource Files + + + Resource Files + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/source/vc++2013/mz2800.vcxproj b/source/vc++2013/mz2800.vcxproj index eb62875cb..1fd85a9c6 100644 --- a/source/vc++2013/mz2800.vcxproj +++ b/source/vc++2013/mz2800.vcxproj @@ -168,6 +168,7 @@ + @@ -180,6 +181,9 @@ + + + @@ -197,6 +201,7 @@ + @@ -211,6 +216,7 @@ + @@ -223,6 +229,9 @@ + + + @@ -245,6 +254,7 @@ + diff --git a/source/vc++2013/mz2800.vcxproj.filters b/source/vc++2013/mz2800.vcxproj.filters index fed23ffb3..fd4c0a147 100644 --- a/source/vc++2013/mz2800.vcxproj.filters +++ b/source/vc++2013/mz2800.vcxproj.filters @@ -96,6 +96,9 @@ Source Files\VM Common Source Files + + Source Files\VM Common Source Files + Source Files\VM Common Source Files @@ -132,6 +135,15 @@ Source Files\VM Common Source Files + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + Source Files\VM Common Source Files @@ -183,6 +195,9 @@ Source Files\VM Driver Source Files + + Source Files\VM Driver Source Files + Source Files\VM Driver Source Files @@ -221,6 +236,9 @@ Header Files\VM Common Header Files + + Header Files\VM Common Header Files + Header Files\VM Common Header Files @@ -257,6 +275,15 @@ Header Files\VM Common Header Files + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + Header Files\VM Common Header Files @@ -323,6 +350,9 @@ Header Files\VM Driver Header Files + + Header Files\VM Driver Header Files + Header Files\VM Driver Header Files diff --git a/source/vc++2013/pc98xa.vcxproj b/source/vc++2013/pc98xa.vcxproj new file mode 100644 index 000000000..b2f3d147e --- /dev/null +++ b/source/vc++2013/pc98xa.vcxproj @@ -0,0 +1,278 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {699AB843-1860-4ABF-B52C-D6A84D0F81E8} + pc98xa + + + + Application + v120_xp + false + MultiByte + + + Application + v120_xp + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>12.0.21005.1 + + + .\Debug\ + .\Debug\ + true + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(DXSDK_DIR)Include + $(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(DXSDK_DIR)Lib\x86 + + + .\Release\ + .\Release\ + false + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(DXSDK_DIR)Include + $(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(DXSDK_DIR)Lib\x86 + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/pc98xa.tlb + + + + Disabled + WIN32;_DEBUG;_WINDOWS;_PC98XA;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + .\Debug/pc98xa.pch + .\Debug/ + .\Debug/ + .\Debug/ + true + Level3 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0411 + + + odbc32.lib;odbccp32.lib;winmm.lib;imm32.lib;%(AdditionalDependencies) + .\Debug/pc98xa.exe + true + true + .\Debug/pc98xa.pdb + Windows + false + + MachineX86 + false + Libcmtd.lib + + + true + .\Debug/pc98xa.bsc + + + ..\src\res\vista.manifest + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release/pc98xa.tlb + + + + MaxSpeed + AnySuitable + WIN32;NDEBUG;_WINDOWS;_PC98XA;%(PreprocessorDefinitions) + true + MultiThreaded + true + StreamingSIMDExtensions2 + .\Release/pc98xa.pch + .\Release/ + .\Release/ + .\Release/ + true + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + odbc32.lib;odbccp32.lib;winmm.lib;imm32.lib;%(AdditionalDependencies) + .\Release/pc98xa.exe + true + .\Release/pc98xa.pdb + Windows + false + + MachineX86 + false + + + true + .\Release/pc98xa.bsc + + + ..\src\res\vista.manifest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\src\res;%(AdditionalIncludeDirectories) + ..\src\res;%(AdditionalIncludeDirectories) + + + + + + \ No newline at end of file diff --git a/source/vc++2013/pc98xa.vcxproj.filters b/source/vc++2013/pc98xa.vcxproj.filters new file mode 100644 index 000000000..0a3ef51a6 --- /dev/null +++ b/source/vc++2013/pc98xa.vcxproj.filters @@ -0,0 +1,388 @@ + + + + + {c1bc22e0-d975-4459-bc92-74bf57d0ca3d} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {7399e7ae-51e6-4508-812b-a8c3b9b77b31} + cpp + + + {bd04e394-1f95-4fe9-aaac-23d9c562f4f6} + cpp + + + {c35f19a4-c556-4bf6-9ffd-49c23634fb9a} + cpp + + + {298bdf7e-477c-4ac4-b56e-15e1d4bdf968} + cpp + + + {ff64cbd3-aba2-4480-93be-f3a323e56aef} + cpp + + + {46709b1d-d844-48e9-bfac-a4878530d336} + h;hpp;hxx;hm;inl + + + {ea269616-3959-4490-8c68-6d6b8103d43c} + h + + + {d56ae9bc-0e13-4883-8407-37e4be658359} + h + + + {c686b539-5a19-48ff-9577-9948827c3564} + h + + + {435e5c08-d7e7-4ea5-9a98-b006f96e0b0a} + + + {4df0faad-cdc5-4edb-b596-dc6e6c612db7} + h + + + {d2b292c8-0a0f-401d-80c4-f1611187bcf1} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\EMU Source Files + + + Source Files\EMU Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\OSD Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Common Source Files\fmgen Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + Source Files\VM Driver Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\EMU Header Files + + + Header Files\OSD Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Common Header Files\fmgen Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Header Files\VM Driver Header Files + + + Resource Files + + + + + Resource Files + + + Resource Files + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file