From: K.Ohta Date: Wed, 3 May 2017 13:45:26 +0000 (+0900) Subject: [VM] Move T3444A to shared lib. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=08211c6385a004efa2c42af377ea5831e5985eac;p=csp-qt%2Fcommon_source_project-fm7.git [VM] Move T3444A to shared lib. --- diff --git a/source/build-cmake/cmake/config_mz80.cmake b/source/build-cmake/cmake/config_mz80.cmake index 1d1325556..4100351e5 100644 --- a/source/build-cmake/cmake/config_mz80.cmake +++ b/source/build-cmake/cmake/config_mz80.cmake @@ -51,10 +51,11 @@ if(BUILD_MZ1200) set(VMFILES ${VMFILES_BASE} and.cpp - t3444a.cpp +# t3444a.cpp # disk.cpp ) set(VMFILES_LIB ${VMFILES_LIB} + t3444a.cpp disk.cpp ) add_definitions(-D_MZ1200) @@ -80,10 +81,11 @@ add_definitions(-D_MZ80K) set(EXEC_TARGET emumz80k) set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/mz80k.qrc) set(VMFILES ${VMFILES_BASE} - t3444a.cpp +# t3444a.cpp # disk.cpp ) set(VMFILES_LIB ${VMFILES_LIB} + t3444a.cpp disk.cpp ) endif() diff --git a/source/src/vm/common_vm/CMakeLists.txt b/source/src/vm/common_vm/CMakeLists.txt index 47d375da7..37fcba824 100644 --- a/source/src/vm/common_vm/CMakeLists.txt +++ b/source/src/vm/common_vm/CMakeLists.txt @@ -47,7 +47,7 @@ set(s_vm_common_vm_srcs # ../scsi_host.cpp # ../sn76489an.cpp # ../sy6522.cpp -# ../t3444a.cpp + ../t3444a.cpp ../tf20.cpp ../tms3631.cpp # ../tms9918a.cpp diff --git a/source/src/vm/t3444a.cpp b/source/src/vm/t3444a.cpp index 50c0865ad..e7d33b89e 100644 --- a/source/src/vm/t3444a.cpp +++ b/source/src/vm/t3444a.cpp @@ -83,6 +83,11 @@ void T3444A::register_lost_event(int bytes) void T3444A::initialize() { DEVICE::initialize(); + _max_drive = osd->get_feature_int_value(_T("MAX_DRIVE")); + if((_max_drive <= 0) || (_max_drive >= 4)) _max_drive = 4; + _has_t3444m = osd->check_feature(_T("HAS_T3444M")); + _fdc_debug_log = osd->check_feature(_T("_FDC_DEBUG_LOG")); + _sectors_in_track = (_has_t3444m) ? 16 : 26; // initialize d88 handler for(int i = 0; i < 4; i++) { disk[i] = new DISK(emu); @@ -163,9 +168,9 @@ void T3444A::write_io8(uint32_t addr, uint32_t data) case 2: // sector reg secreg = data & 0x7f; -#ifdef HAS_T3444M - sidereg = (data >> 7) & 1; -#endif +//#ifdef HAS_T3444M + if(_has_t3444m) sidereg = (data >> 7) & 1; +//#endif break; case 3: // data reg @@ -182,9 +187,9 @@ void T3444A::write_io8(uint32_t addr, uint32_t data) cancel_my_event(EVENT_LOST); if(fdc[drvreg].index >= disk[drvreg]->sector_size.sd) { -#ifdef _FDC_DEBUG_LOG - this->out_debug_log(_T("FDC\tWRITE DATA FINISHED\n")); -#endif +//#ifdef _FDC_DEBUG_LOG + if(_fdc_debug_log) this->out_debug_log(_T("FDC\tWRITE DATA FINISHED\n")); +//#endif // 2S: 300rpm, 3100bytes/track -> 0.0155bytes/us register_my_event(EVENT_TND, 100); // 0.0155bytes/us * 100us = 1.55bytes < GAP3 } else { @@ -196,19 +201,19 @@ void T3444A::write_io8(uint32_t addr, uint32_t data) } } else if(cmdreg == FDC_CMD_WRITE_ID) { // write index/id - if(fdc[drvreg].index < SECTORS_IN_TRACK * 4) { + if(fdc[drvreg].index < _sectors_in_track * 4) { sector_id[fdc[drvreg].index++] = datareg; } set_rqm(false); cancel_my_event(EVENT_LOST); - if(fdc[drvreg].index >= SECTORS_IN_TRACK * 4) { + if(fdc[drvreg].index >= _sectors_in_track * 4) { // format in single-density bool drive_mfm = disk[drvreg]->drive_mfm; disk[drvreg]->drive_mfm = false; disk[drvreg]->format_track(fdc[drvreg].track, sidereg); disk[drvreg]->drive_mfm = drive_mfm; - for(int i = 0; i < SECTORS_IN_TRACK; i++) { + for(int i = 0; i < _sectors_in_track; i++) { disk[drvreg]->insert_sector(sector_id[i * 4], sector_id[i * 4 + 1], sector_id[i * 4 + 2], sector_id[i * 4 + 3], false, false, 0xff, 128); } status |= FDC_STA_FDC_READY; @@ -226,9 +231,9 @@ uint32_t T3444A::read_io8(uint32_t addr) switch(addr & 3) { case 0: // status reg -#ifdef _FDC_DEBUG_LOG - this->out_debug_log(_T("FDC\tSTATUS=%02x\n"),status); -#endif +//#ifdef _FDC_DEBUG_LOG + if(_fdc_debug_log) this->out_debug_log(_T("FDC\tSTATUS=%02x\n"),status); +//#endif return status; case 3: // data reg @@ -243,9 +248,9 @@ uint32_t T3444A::read_io8(uint32_t addr) cancel_my_event(EVENT_LOST); if(fdc[drvreg].index >= disk[drvreg]->sector_size.sd) { -#ifdef _FDC_DEBUG_LOG - this->out_debug_log(_T("FDC\tREAD DATA FINISHED\n")); -#endif +//#ifdef _FDC_DEBUG_LOG + if(_fdc_debug_log) this->out_debug_log(_T("FDC\tREAD DATA FINISHED\n")); +//#endif // if(status == FDC_STA_DATA_ERROR) { // status |= FDC_STA_FDC_READY; // } else { @@ -377,17 +382,17 @@ void T3444A::event_callback(int event_id, int err) break; case EVENT_TND: if(!tnd) { - if(secreg < SECTORS_IN_TRACK) { + if(secreg < _sectors_in_track) { secreg++; -#ifdef _FDC_DEBUG_LOG - this->out_debug_log(_T("FDC\tTND AND CONTINUE SEC=%d\n"), secreg); -#endif +//#ifdef _FDC_DEBUG_LOG + if(_fdc_debug_log) this->out_debug_log(_T("FDC\tTND AND CONTINUE SEC=%d\n"), secreg); +//#endif cmd_read_write(); } else { // secreg = 1; -#ifdef _FDC_DEBUG_LOG - this->out_debug_log(_T("FDC\tTND BUT TERMINATED SEC=%d\n"), secreg); -#endif +//#ifdef _FDC_DEBUG_LOG + if(_fdc_debug_log) this->out_debug_log(_T("FDC\tTND BUT TERMINATED SEC=%d\n"), secreg); +//#endif status = FDC_STA_FDC_READY | FDC_STA_LAST_SECTOR; } } else { @@ -403,7 +408,7 @@ void T3444A::event_callback(int event_id, int err) void T3444A::process_cmd() { -#ifdef _FDC_DEBUG_LOG +//#ifdef _FDC_DEBUG_LOG static const _TCHAR *cmdstr[0x10] = { _T("Seek to Zero"), _T("Sence Drive Status"), @@ -422,10 +427,12 @@ void T3444A::process_cmd() _T("Unknown"), _T("Seek and Write Data with Deleted Data Address Mark"), }; - if(cmdreg == cmdreg) { - this->out_debug_log(_T("FDC\tCMD=%2xh (%s) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, cmdstr[cmdreg], datareg, drvreg, trkreg, sidereg, secreg); + if(_fdc_debug_log) { + if(cmdreg == cmdreg) { + this->out_debug_log(_T("FDC\tCMD=%2xh (%s) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, cmdstr[cmdreg], datareg, drvreg, trkreg, sidereg, secreg); + } } -#endif +//#endif status = 0; // FDC is busy switch(cmdreg) { @@ -613,13 +620,13 @@ uint8_t T3444A::search_sector() } fdc[drvreg].next_sync_position = disk[drvreg]->sync_position[index]; fdc[drvreg].index = 0; -#ifdef _FDC_DEBUG_LOG - this->out_debug_log(_T("FDC\tSECTOR FOUND SIZE=$%04x ID=%02x %02x %02x %02x CRC=%02x %02x CRC_ERROR=%d\n"), +//#ifdef _FDC_DEBUG_LOG + if(_fdc_debug_log) this->out_debug_log(_T("FDC\tSECTOR FOUND SIZE=$%04x ID=%02x %02x %02x %02x CRC=%02x %02x CRC_ERROR=%d\n"), disk[drvreg]->sector_size.sd, disk[drvreg]->id[0], disk[drvreg]->id[1], disk[drvreg]->id[2], disk[drvreg]->id[3], disk[drvreg]->id[4], disk[drvreg]->id[5], disk[drvreg]->data_crc_error ? 1 : 0); -#endif +//#endif if(disk[drvreg]->data_crc_error && !disk[drvreg]->ignore_crc()) { return FDC_STA_DATA_ERROR; } else if(disk[drvreg]->deleted || cmdreg == FDC_CMD_WRITE_DDM) { @@ -717,14 +724,14 @@ void T3444A::set_rqm(bool val) void T3444A::open_disk(int drv, const _TCHAR* file_path, int bank) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { disk[drv]->open(file_path, bank); } } void T3444A::close_disk(int drv) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { disk[drv]->close(); update_head_flag(drvreg, false); } @@ -732,7 +739,7 @@ void T3444A::close_disk(int drv) bool T3444A::is_disk_inserted(int drv) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { return disk[drv]->inserted; } return false; @@ -740,14 +747,14 @@ bool T3444A::is_disk_inserted(int drv) void T3444A::is_disk_protected(int drv, bool value) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { disk[drv]->write_protected = value; } } bool T3444A::is_disk_protected(int drv) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { return disk[drv]->write_protected; } return false; @@ -755,14 +762,14 @@ bool T3444A::is_disk_protected(int drv) void T3444A::set_drive_type(int drv, uint8_t type) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { disk[drv]->drive_type = type; } } uint8_t T3444A::get_drive_type(int drv) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { return disk[drv]->drive_type; } return DRIVE_TYPE_UNK; @@ -770,14 +777,14 @@ uint8_t T3444A::get_drive_type(int drv) void T3444A::set_drive_rpm(int drv, int rpm) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { disk[drv]->drive_rpm = rpm; } } void T3444A::set_drive_mfm(int drv, bool mfm) { - if(drv < 4 && drv < MAX_DRIVE) { + if(drv < 4 && drv < _max_drive) { disk[drv]->drive_mfm = mfm; } } @@ -797,7 +804,7 @@ void T3444A::save_state(FILEIO* state_fio) state_fio->FputInt32(this_device_id); state_fio->Fwrite(fdc, sizeof(fdc), 1); - for(int i = 0; i < MAX_DRIVE; i++) { + for(int i = 0; i < _max_drive; i++) { disk[i]->save_state(state_fio); } state_fio->FputUint8(status); @@ -808,7 +815,7 @@ void T3444A::save_state(FILEIO* state_fio) state_fio->FputUint8(drvreg); state_fio->FputUint8(sidereg); state_fio->FputBool(timerflag); - state_fio->Fwrite(sector_id, sizeof(sector_id), 1); + state_fio->Fwrite(sector_id, sizeof(uint8_t) * _sectors_in_track, 1); state_fio->Fwrite(register_id, sizeof(register_id), 1); state_fio->FputBool(now_search); state_fio->FputInt32(seektrk); @@ -827,7 +834,7 @@ bool T3444A::load_state(FILEIO* state_fio) return false; } state_fio->Fread(fdc, sizeof(fdc), 1); - for(int i = 0; i < MAX_DRIVE; i++) { + for(int i = 0; i < _max_drive; i++) { if(!disk[i]->load_state(state_fio)) { return false; } @@ -840,7 +847,8 @@ bool T3444A::load_state(FILEIO* state_fio) drvreg = state_fio->FgetUint8(); sidereg = state_fio->FgetUint8(); timerflag = state_fio->FgetBool(); - state_fio->Fread(sector_id, sizeof(sector_id), 1); + state_fio->Fread(sector_id, sizeof(uint8_t) * _sectors_in_track, 1); + //state_fio->Fread(sector_id, sizeof(sector_id), 1); state_fio->Fread(register_id, sizeof(register_id), 1); now_search = state_fio->FgetBool(); seektrk = state_fio->FgetInt32(); diff --git a/source/src/vm/t3444a.h b/source/src/vm/t3444a.h index 73e90d1c8..844a79974 100644 --- a/source/src/vm/t3444a.h +++ b/source/src/vm/t3444a.h @@ -10,8 +10,8 @@ #ifndef _T3444A_H_ #define _T3444A_H_ -#include "vm.h" -#include "../emu.h" +//#include "vm.h" +//#include "../emu.h" #include "device.h" #define SIG_T3444A_DRIVE 0 @@ -23,11 +23,11 @@ #define SIG_T3444A_CRDY 5 #define SIG_T3444A_RQM 6 -#ifdef HAS_T3444M -#define SECTORS_IN_TRACK 16 -#else -#define SECTORS_IN_TRACK 26 -#endif +//#ifdef HAS_T3444M +//#define SECTORS_IN_TRACK 16 +//#else +//#define SECTORS_IN_TRACK 26 +//#endif class DISK; class NOISE; @@ -67,7 +67,7 @@ private: uint8_t drvreg; uint8_t sidereg; bool timerflag; - uint8_t sector_id[SECTORS_IN_TRACK * 4]; + uint8_t sector_id[26 * 4]; // SECTORS_IN_TRACK // event int register_id[5]; @@ -87,6 +87,12 @@ private: // timing uint32_t prev_rqm_clock; + + + int _max_drive; + int _sectors_in_track; + bool _has_t3444m; + bool _fdc_debug_log; int get_cur_position(); double get_usec_to_start_trans(); @@ -117,6 +123,9 @@ public: d_noise_head_up = NULL; tnd = true; motor_on = false; + _max_drive = 4; + _sectors_in_track = 26; + _has_t3444m = _fdc_debug_log = false; set_device_name(_T("T3444A FDC")); } ~T3444A() {}