#include "mb8877.h"
#include "disk.h"
+#include "noise.h"
#define FDC_ST_BUSY 0x01 // busy
#define FDC_ST_INDEX 0x02 // index hole
#define FDC_CMD_RD_TRK 7
#define FDC_CMD_WR_TRK 8
-#define EVENT_SEEK 0
-#define EVENT_SEEKEND 1
-#define EVENT_SEARCH 2
-#define EVENT_DRQ 3
-#define EVENT_MULTI1 4
-#define EVENT_MULTI2 5
-#define EVENT_LOST 6
-#define EVENT_MOTOR 7
+#define EVENT_SEEK 0
+#define EVENT_SEEKEND_VERIFY 1
+#define EVENT_SEARCH 2
+#define EVENT_DRQ 3
+#define EVENT_MULTI1 4
+#define EVENT_MULTI2 5
+#define EVENT_LOST 6
-#define DRIVE_MASK (MAX_DRIVE - 1)
+//#define DRIVE_MASK (MAX_DRIVE - 1)
#define DELAY_TIME (disk[drvreg]->drive_type == DRIVE_TYPE_2HD ? 15000 : 30000)
void MB8877::register_seek_event()
{
-
cancel_my_event(EVENT_SEEK);
if(fdc[drvreg].track == seektrk) {
register_event(this, (EVENT_SEEK << 8) | (cmdtype & 0xff), 1, false, ®ister_id[EVENT_SEEK]);
void MB8877::register_drq_event(int bytes)
{
- double usec = disk[drvreg]->get_usec_per_bytes(bytes) - get_passed_usec(prev_drq_clock);
+ double nusec = disk[drvreg]->get_usec_per_bytes(bytes); // For debug
+ double usec = nusec - get_passed_usec(prev_drq_clock);
+
if(usec < 4) {
usec = 4;
}
-#if defined(_FM7) || defined(_FM8) || defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
- if((disk[drvreg]->is_special_disk == SPECIAL_DISK_FM7_GAMBLER) ||
- (disk[drvreg]->is_special_disk == SPECIAL_DISK_FM77AV_PSYOBLADE)) {
- usec = 4;
+ if(type_fm7) {
+ if((disk[drvreg]->is_special_disk == SPECIAL_DISK_FM7_GAMBLER) ||
+ /* (disk[drvreg]->is_special_disk == SPECIAL_DISK_FM77AV_PSYOBLADE) || */
+ (config.correct_disk_timing[drvreg])) {
+ usec = 7;
+ }
}
-#endif
+ this->out_debug_log("DRQ REG: %dbytes %d:%d -> %f\n", bytes, get_current_clock(), prev_drq_clock, usec);
cancel_my_event(EVENT_DRQ);
register_event(this, (EVENT_DRQ << 8) | (cmdtype & 0xff), usec, false, ®ister_id[EVENT_DRQ]);
}
register_event(this, (EVENT_LOST << 8) | (cmdtype & 0xff), disk[drvreg]->get_usec_per_bytes(bytes), false, ®ister_id[EVENT_LOST]);
}
+bool MB8877::check_drive(void)
+{
+ if(drvreg >= _max_drive) {
+ status = FDC_ST_NOTREADY;
+ //set_drq(false);
+ set_irq(true);
+ return false;
+ }
+ return true;
+}
+bool MB8877::check_drive2(void)
+{
+ if(!check_drive()) {
+ return false;
+ }
+ if(!is_disk_inserted(drvreg & 0x7f)) {
+ status = FDC_ST_NOTREADY;
+ set_irq(true);
+ //set_drq(false);
+ return false;
+ }
+ return true;
+}
void MB8877::initialize()
{
+ DEVICE::initialize();
// initialize d88 handler
- for(int i = 0; i < MAX_DRIVE; i++) {
- _TCHAR strbuf[128];
- _TCHAR strbuf2[128];
+ if(osd->check_feature(_T("MAX_DRIVE"))) {
+ _max_drive = osd->get_feature_int_value(_T("MAX_DRIVE"));
+ } else if(osd->check_feature(_T("MAX_FD"))) {
+ _max_drive = osd->get_feature_int_value(_T("MAX_FD"));
+ } else {
+ _max_drive = 1;
+ }
+ _drive_mask = _max_drive - 1;
+ for(int i = 0; i < _max_drive; i++) {
disk[i] = new DISK(emu);
disk[i]->set_device_name(_T("%s/Disk #%d"), this_device_name, i + 1);
}
+ if(osd->check_feature(_T("MB8877_NO_BUSY_AFTER_SEEK"))) {
+ mb8877_no_busy_after_seek = true;
+ }
+ if(osd->check_feature(_T("_FDC_DEBUG_LOG"))) {
+ fdc_debug_log = true;
+ }
+ if(osd->check_feature(_T("HAS_MB8866"))) {
+ type_mb8866 = true;
+ invert_registers = true;
+ set_device_name(_T("MB8866 FDC"));
+ }
+ if(osd->check_feature(_T("HAS_MB8876"))) {
+ invert_registers = true;
+ set_device_name(_T("MB8876 FDC"));
+ } else if(osd->check_feature(_T("HAS_MB89311"))) {
+ type_mb89311 = true;
+ set_device_name(_T("MB89311 FDC"));
+ } else {
+ set_device_name(_T("MB8877 FDC"));
+ }
+ if(osd->check_feature(_T("_X1")) || osd->check_feature(_T("_X1TWIN")) ||
+ osd->check_feature(_T("_X1TURBO")) || osd->check_feature(_T("_X1TURBOZ"))) {
+ type_x1 = true;
+ }
+ if(osd->check_feature(_T("_FM7")) || osd->check_feature(_T("_FM8")) ||
+ osd->check_feature(_T("_FM77_VARIANTS")) || osd->check_feature(_T("_FM77AV_VARIANTS"))) {
+ type_fm7 = true;
+ if(osd->check_feature(_T("_FM77AV40")) || osd->check_feature(_T("_FM77AV40EX")) ||
+ osd->check_feature(_T("_FM77AV40SX")) ||
+ osd->check_feature(_T("_FM77AV20")) || osd->check_feature(_T("_FM77AV20EX"))) {
+ type_fm77av_2dd = true;
+ }
+ }
+ if(osd->check_feature(_T("_FMR50"))) {
+ type_fmr50 = true;
+ }
+ if(osd->check_feature(_T("_FMR60"))) {
+ type_fmr60 = true;
+ }
+
+ // initialize noise
+ if(d_noise_seek != NULL) {
+ d_noise_seek->set_device_name(_T("Noise Player (FDD Seek)"));
+ if(!d_noise_seek->load_wav_file(_T("FDDSEEK.WAV"))) {
+ if(!d_noise_seek->load_wav_file(_T("FDDSEEK1.WAV"))) {
+ d_noise_seek->load_wav_file(_T("SEEK.WAV"));
+ }
+ }
+ d_noise_seek->set_mute(!config.sound_noise_fdd);
+ }
+ if(d_noise_head_down != NULL) {
+ d_noise_head_down->set_device_name(_T("Noise Player (FDD Head Load)"));
+ d_noise_head_down->load_wav_file(_T("HEADDOWN.WAV"));
+ d_noise_head_down->set_mute(!config.sound_noise_fdd);
+ }
+ if(d_noise_head_up != NULL) {
+ d_noise_head_up->set_device_name(_T("Noise Player (FDD Head Unload)"));
+ d_noise_head_up->load_wav_file(_T("HEADUP.WAV"));
+ d_noise_head_up->set_mute(!config.sound_noise_fdd);
+ }
+
// initialize timing
memset(fdc, 0, sizeof(fdc));
-
+ for(int i = 0; i < 16; i++) {
+ fdc[i].track = 40; // OK?
+ fdc[i].count_immediate = false;
+ }
// initialize fdc
seektrk = 0;
seekvct = true;
void MB8877::release()
{
// release d88 handler
- for(int i = 0; i < MAX_DRIVE; i++) {
+ for(int i = 0; i < _max_drive; i++) {
if(disk[i]) {
disk[i]->close();
delete disk[i];
void MB8877::reset()
{
- touch_sound();
- for(int i = 0; i < MAX_DRIVE; i++) {
- fdc[i].track = 0;
+ for(int i = 0; i < _max_drive; i++) {
+ //fdc[i].track = 0; // Hold to track
fdc[i].index = 0;
fdc[i].access = false;
}
}
now_search = now_seek = drive_sel = false;
no_command = 0;
-#ifdef HAS_MB89311
- extended_mode = true;
-#endif
+
+//#ifdef HAS_MB89311
+ if(type_mb89311) {
+ extended_mode = true;
+ } else {
+ extended_mode = false;
+ }
+//#endif
}
void MB8877::write_io8(uint32_t addr, uint32_t data)
{
- bool _stat;
+ bool ready;
+
switch(addr & 3) {
case 0:
// command reg
cmdreg_tmp = cmdreg;
- //printf("WRITE: CMDREG to %02x\n", data);
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- cmdreg = (~data) & 0xff;
-#else
- cmdreg = data;
-#endif
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ cmdreg = (~data) & 0xff;
+ } else {
+//#else
+ cmdreg = data;
+ }
+//#endif
process_cmd();
no_command = 0;
break;
case 1:
// track reg
- //printf("WRITE: TRKREG to %02x\n", data);
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- trkreg = (~data) & 0xff;
-#else
- trkreg = data;
-#endif
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ trkreg = (~data) & 0xff;
+ } else {
+//#else
+ trkreg = data;
+ }
+//#endif
if((status & FDC_ST_BUSY) && (fdc[drvreg].index == 0)) {
// track reg is written after command starts
if(cmdtype == FDC_CMD_RD_SEC || cmdtype == FDC_CMD_RD_MSEC || cmdtype == FDC_CMD_WR_SEC || cmdtype == FDC_CMD_WR_MSEC) {
break;
case 2:
// sector reg
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- secreg = (~data) & 0xff;
-#else
- secreg = data;
-#endif
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ secreg = (~data) & 0xff;
+ } else {
+//#else
+ secreg = data;
+ }
+//#endif
if((status & FDC_ST_BUSY) && (fdc[drvreg].index == 0)) {
// sector reg is written after command starts
if(cmdtype == FDC_CMD_RD_SEC || cmdtype == FDC_CMD_RD_MSEC || cmdtype == FDC_CMD_WR_SEC || cmdtype == FDC_CMD_WR_MSEC) {
break;
case 3:
// data reg
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- datareg = (~data) & 0xff;
-#else
- datareg = data;
-#endif
-
- _stat = ((status & FDC_ST_DRQ) && !now_search);
- if(disk[drvreg]->is_special_disk != SPECIAL_DISK_FM7_RIGLAS) {
- _stat = (_stat && motor_on);
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ datareg = (~data) & 0xff;
+ } else {
+//#else
+ datareg = data;
+ }
+//#endif
+ ready = ((status & FDC_ST_DRQ) && !now_search);
+//#if defined(_FM7) || defined(_FM8) || defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
+ if(type_fm7) {
+ if(disk[drvreg]->is_special_disk != SPECIAL_DISK_FM7_RIGLAS) {
+ if(!motor_on) ready = false;
+ }
+ } else
+//#endif
+ {
+ if(!motor_on) ready = false;
}
- if(_stat) {
+// if(motor_on && (status & FDC_ST_DRQ) && !now_search) {
+ if(ready) {
if(cmdtype == FDC_CMD_WR_SEC || cmdtype == FDC_CMD_WR_MSEC) {
// write or multisector write
if(fdc[drvreg].index < disk[drvreg]->sector_size.sd) {
if((fdc[drvreg].index + 1) >= disk[drvreg]->sector_size.sd) {
if(cmdtype == FDC_CMD_WR_SEC) {
// single sector
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tEND OF SECTOR\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tEND OF SECTOR\n"));
+//#endif
status &= ~FDC_ST_BUSY;
cmdtype = 0;
set_irq(true);
} else {
// multisector
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tEND OF SECTOR (SEARCH NEXT)\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tEND OF SECTOR (SEARCH NEXT)\n"));
+//#endif
// 2HD: 360rpm, 10410bytes/track -> 0.06246bytes/us
register_my_event(EVENT_MULTI1, 30); // 0.06246bytes/us * 30us = 1.8738bytes < GAP3
register_my_event(EVENT_MULTI2, 60); // 0.06246bytes/us * 60us = 3.7476bytes < GAP3
} else {
register_drq_event(1);
}
+ if(fdc[drvreg].count_immediate) fdc[drvreg].index++;
}
status &= ~FDC_ST_DRQ;
} else if(cmdtype == FDC_CMD_WR_TRK) {
} else {
register_drq_event(1);
}
+ if(fdc[drvreg].count_immediate) fdc[drvreg].index++;
}
status &= ~FDC_ST_DRQ;
}
uint32_t MB8877::read_io8(uint32_t addr)
{
uint32_t val;
- bool _stat;
+ bool not_ready;
+ bool ready;
+
switch(addr & 3) {
case 0:
// status reg
val = FDC_ST_BUSY;
} else {
// disk not inserted, motor stop
- _stat = !disk[drvreg]->inserted;
- if(disk[drvreg]->is_special_disk != SPECIAL_DISK_FM7_RIGLAS) {
- _stat = (_stat || !motor_on);
+ not_ready = !disk[drvreg]->inserted;
+//#if defined(_FM7) || defined(_FM8) || defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
+ if(type_fm7){
+ if(disk[drvreg]->is_special_disk != SPECIAL_DISK_FM7_RIGLAS) {
+ if(!motor_on) not_ready = true;
+ }
+ } else
+//#endif
+ {
+ if(!motor_on) not_ready = true;
}
- if(_stat) {
+// if(!disk[drvreg]->inserted || !motor_on) {
+ if(not_ready) {
status |= FDC_ST_NOTREADY;
} else {
status &= ~FDC_ST_NOTREADY;
val = status;
if(cmdtype == FDC_CMD_TYPE1 && !now_seek) {
status &= ~FDC_ST_BUSY;
-#ifdef MB8877_NO_BUSY_AFTER_SEEK
- #if defined(_FM7) || defined(_FM8) || defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
- if(disk[0]->is_special_disk != SPECIAL_DISK_FM7_XANADU2_D) {
- val &= ~FDC_ST_BUSY;
+//#ifdef MB8877_NO_BUSY_AFTER_SEEK
+ if(mb8877_no_busy_after_seek) {
+ //#if defined(_FM7) || defined(_FM8) || defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
+ if(type_fm7) {
+ if(disk[0]->is_special_disk != SPECIAL_DISK_FM7_XANADU2_D) {
+ val &= ~FDC_ST_BUSY;
+ }
+ } else
+ //#endif
+ {
+ val &= ~FDC_ST_BUSY;
+ }
}
- #else
- val &= ~FDC_ST_BUSY;
- #endif
-#endif
+//#endif
}
}
if(cmdtype == 0 && !(status & FDC_ST_NOTREADY)) {
if(!(status & FDC_ST_BUSY)) {
set_irq(false);
}
-
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tSTATUS=%2x\n"), val);
-#endif
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- return (~val) & 0xff;
-#else
- return val;
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tSTATUS=%2x\n"), val);
+//#endif
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ return (~val) & 0xff;
+//#else
+ } else {
+ return val;
+ }
+//#endif
case 1:
// track reg
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- return (~trkreg) & 0xff;
-#else
- return trkreg;
-#endif
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ return (~trkreg) & 0xff;
+ } else {
+//#else
+ return trkreg;
+ }
+//#endif
case 2:
// sector reg
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- return (~secreg) & 0xff;
-#else
- return secreg;
-#endif
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ return (~secreg) & 0xff;
+ } else {
+//#else
+ return secreg;
+ }
+//#endif
case 3:
// data reg
- _stat = ((status & FDC_ST_DRQ) && !now_search);
- if(disk[drvreg]->is_special_disk != SPECIAL_DISK_FM7_RIGLAS) {
- _stat = (_stat && motor_on);
+ ready = ((status & FDC_ST_DRQ) && !now_search);
+//#if defined(_FM7) || defined(_FM8) || defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
+ if(type_fm7) {
+ if(disk[drvreg]->is_special_disk != SPECIAL_DISK_FM7_RIGLAS) {
+ if(!motor_on) ready = false;
+ }
+ } else
+//#endif
+ {
+ if(!motor_on) ready = false;
}
- if(_stat) {
- //if(motor_on && (status & FDC_ST_DRQ) && !now_search) {
+// if(motor_on && (status & FDC_ST_DRQ) && !now_search) {
+ if(ready) {
if(cmdtype == FDC_CMD_RD_SEC || cmdtype == FDC_CMD_RD_MSEC) {
// read or multisector read
if(fdc[drvreg].index < disk[drvreg]->sector_size.sd) {
datareg = disk[drvreg]->sector[fdc[drvreg].index];
- //fdc[drvreg].index++;
}
- if((fdc[drvreg].index + 1) >= disk[drvreg]->sector_size.sd) {
+ if((fdc[drvreg].index + 1) >= disk[drvreg]->sector_size.sd) { // Reading complete this sector.
if(disk[drvreg]->data_crc_error && !disk[drvreg]->ignore_crc()) {
// data crc error
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tEND OF SECTOR (DATA CRC ERROR)\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tEND OF SECTOR (DATA CRC ERROR)\n"));
+//#endif
status |= FDC_ST_CRCERR;
status &= ~FDC_ST_BUSY;
cmdtype = 0;
set_irq(true);
} else if(cmdtype == FDC_CMD_RD_SEC) {
// single sector
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tEND OF SECTOR\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tEND OF SECTOR\n"));
+//#endif
status &= ~FDC_ST_BUSY;
cmdtype = 0;
set_irq(true);
} else {
// multisector
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tEND OF SECTOR (SEARCH NEXT)\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tEND OF SECTOR (SEARCH NEXT)\n"));
+//#endif
register_my_event(EVENT_MULTI1, 30);
register_my_event(EVENT_MULTI2, 60);
}
- } else {
+ } else { // Still data remain.
register_drq_event(1);
+ if(fdc[drvreg].count_immediate) fdc[drvreg].index++;
}
status &= ~FDC_ST_DRQ;
} else if(cmdtype == FDC_CMD_RD_ADDR) {
status &= ~FDC_ST_BUSY;
cmdtype = 0;
set_irq(true);
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tEND OF ID FIELD\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tEND OF ID FIELD\n"));
+//#endif
} else {
register_drq_event(1);
+ if(fdc[drvreg].count_immediate) fdc[drvreg].index++;
}
status &= ~FDC_ST_DRQ;
} else if(cmdtype == FDC_CMD_RD_TRK) {
//fdc[drvreg].index++;
}
if((fdc[drvreg].index + 1) >= disk[drvreg]->get_track_size()) {
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tEND OF TRACK\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tEND OF TRACK\n"));
+///#endif
status &= ~FDC_ST_BUSY;
status |= FDC_ST_LOSTDATA;
cmdtype = 0;
set_irq(true);
} else {
register_drq_event(1);
+ if(fdc[drvreg].count_immediate) fdc[drvreg].index++;
}
status &= ~FDC_ST_DRQ;
}
fdc[drvreg].access = true;
}
}
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tDATA=%2x\n"), datareg);
-#endif
-#if defined(HAS_MB8866) || defined(HAS_MB8876)
- return (~datareg) & 0xff;
-#else
- return datareg;
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->force_out_debug_log(_T("FDC\tDATA=%2x\n"), datareg); // emu->force_out_debug_log()
+//#endif
+//#if defined(HAS_MB8866) || defined(HAS_MB8876)
+ if(invert_registers) {
+ return (~datareg) & 0xff;
+ } else {
+//#else
+ return datareg;
+ }
+//#endif
}
return 0xff;
}
void MB8877::write_signal(int id, uint32_t data, uint32_t mask)
{
if(id == SIG_MB8877_DRIVEREG) {
- drvreg = data & DRIVE_MASK;
+ drvreg = data & _drive_mask;
drive_sel = true;
seekend_clock = get_current_clock();
} else if(id == SIG_MB8877_SIDEREG) {
sidereg = (data & mask) ? 1 : 0;
} else if(id == SIG_MB8877_MOTOR) {
motor_on = ((data & mask) != 0);
- }
-#if defined(USE_SOUND_FILES)
- else if((id >= SIG_SOUNDER_MUTE) && (id < (SIG_SOUNDER_MUTE + 2))) {
- snd_mute = ((data & mask) != 0);
- } else if((id >= SIG_SOUNDER_RELOAD) && (id < (SIG_SOUNDER_RELOAD + 2))) {
- reload_sound_data(id - SIG_SOUNDER_RELOAD);
- }
-#endif
+ }
}
uint32_t MB8877::read_signal(int ch)
{
- // get access status
- uint32_t stat = 0;
if(ch == SIG_MB8877_DRIVEREG) {
- return drvreg & DRIVE_MASK;
+ return drvreg & _drive_mask;
} else if(ch == SIG_MB8877_SIDEREG) {
return sidereg & 1;
} else if(ch == SIG_MB8877_MOTOR) {
return motor_on ? 1 : 0;
}
- for(int i = 0; i < MAX_DRIVE; i++) {
+
+ // get access status
+ uint32_t stat = 0;
+ for(int i = 0; i < _max_drive; i++) {
if(fdc[i].access) {
stat |= 1 << i;
}
{
int event = event_id >> 8;
int cmd = event_id & 0xff;
+ //bool need_after_irq = false;
register_id[event] = -1;
// cancel event if the command is finished or other command is executed
if(cmd != cmdtype) {
- if(event == EVENT_SEEK || event == EVENT_SEEKEND) {
+ if(event == EVENT_SEEK || event == EVENT_SEEKEND_VERIFY) {
now_seek = false;
} else if(event == EVENT_SEARCH) {
now_search = false;
}
return;
}
+
switch(event) {
case EVENT_SEEK:
-#ifdef _FDC_DEBUG_LOG
+//#ifdef _FDC_DEBUG_LOG
//this->out_debug_log(_T("FDC\tSEEK START\n"));
-#endif
+//#endif
if(seektrk > fdc[drvreg].track) {
fdc[drvreg].track++;
-#if defined(USE_SOUND_FILES)
- add_sound(MB8877_SND_TYPE_SEEK);
-#endif
+ if(d_noise_seek != NULL) d_noise_seek->play();
+ //need_after_irq = true;
} else if(seektrk < fdc[drvreg].track) {
fdc[drvreg].track--;
-#if defined(USE_SOUND_FILES)
- add_sound(MB8877_SND_TYPE_SEEK);
-#endif
+ if(d_noise_seek != NULL) d_noise_seek->play();
+ //need_after_irq = true;
}
- //printf("TRK: %d\n", fdc[drvreg].track);
if((cmdreg & 0x10) || ((cmdreg & 0xf0) == 0)) {
trkreg = fdc[drvreg].track;
}
if(seektrk != fdc[drvreg].track) {
+ //if(need_after_irq) {
+ //set_drq(false);
+ //set_irq(true); // 20180118 K.O Turn ON IRQ -> Turn OFF DRQ
+ //}
register_seek_event();
break;
}
seekend_clock = get_current_clock();
-#ifdef HAS_MB89311
- if(extended_mode) {
- if((cmdreg & 0xf4) == 0x44) {
- // read-after-seek
- cmd_readdata(true);
- break;
- } else if((cmdreg & 0xf4) == 0x64) {
- // write-after-seek
- cmd_writedata(true);
- break;
+//#ifdef HAS_MB89311
+ if(type_mb89311) {
+ if(extended_mode) {
+ if((cmdreg & 0xf4) == 0x44) {
+ // read-after-seek
+ cmd_readdata(true);
+ break;
+ } else if((cmdreg & 0xf4) == 0x64) {
+ // write-after-seek
+ cmd_writedata(true);
+ break;
+ }
}
}
-#endif
+//#endif
status_tmp = status;
if(cmdreg & 4) {
// verify
} else {
time = get_usec_to_next_trans_pos(true);
}
- register_my_event(EVENT_SEEKEND, time);
+ // 20180128 K.O If seek completed, delay to make IRQ/DRQ at SEEKEND_VERIFY.
+ register_my_event(EVENT_SEEKEND_VERIFY, time);
break;
}
- case EVENT_SEEKEND:
+// case EVENT_SEEKEND: // Separate SEEK and SEEKEND when verifying. 20180128 K.O
now_seek = false;
status = status_tmp;
- set_irq(true);
-#ifdef _FDC_DEBUG_LOG
+ status &= (uint8_t)(~FDC_ST_BUSY); // 20180118 K.O Turn off BUSY flag.
+ set_drq(false);
+ set_irq(true); // 20180118 K.O Turn ON IRQ -> Turn OFF DRQ
+ break;
+ case EVENT_SEEKEND_VERIFY: // Separate SEEK and SEEKEND when verifying. 20180128 K.O
+ now_seek = false;
+ status &= (uint8_t)(~FDC_ST_BUSY); // 20180118 K.O Turn off BUSY flag.
+ set_drq(false);
+ set_irq(true); // 20180118 K.O Turn ON IRQ -> Turn OFF DRQ
+//#ifdef _FDC_DEBUG_LOG
//this->out_debug_log(_T("FDC\tSEEK END\n"));
-#endif
+//#endif
break;
case EVENT_SEARCH:
now_search = false;
if(status_tmp & FDC_ST_RECNFND) {
-#if defined(_X1) || defined(_X1TWIN) || defined(_X1TURBO) || defined(_X1TURBOZ)
- // for SHARP X1 Batten Tanuki
- if(disk[drvreg]->is_special_disk == SPECIAL_DISK_X1_BATTEN && drive_sel) {
- status_tmp &= ~FDC_ST_RECNFND;
+//#if defined(_X1) || defined(_X1TWIN) || defined(_X1TURBO) || defined(_X1TURBOZ)
+ if(type_x1) {
+ // for SHARP X1 Batten Tanuki
+ if(disk[drvreg]->is_special_disk == SPECIAL_DISK_X1_BATTEN && drive_sel) {
+ status_tmp &= ~FDC_ST_RECNFND;
+ }
}
-#endif
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tSEARCH NG\n"));
-#endif
+//#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tSEARCH NG\n"));
+//#endif
status = status_tmp & ~(FDC_ST_BUSY | FDC_ST_DRQ);
cmdtype = 0;
+ set_drq(false);
set_irq(true);
} else if(status_tmp & FDC_ST_WRITEFAULT) {
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tWRITE PROTECTED\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tWRITE PROTECTED\n"));
+//#endif
status = status_tmp & ~(FDC_ST_BUSY | FDC_ST_DRQ);
cmdtype = 0;
+ set_drq(false);
set_irq(true);
} else {
status = status_tmp | (FDC_ST_BUSY | FDC_ST_DRQ);
fdc[drvreg].prev_clock = prev_drq_clock = get_current_clock();
set_drq(true);
drive_sel = false;
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tSEARCH OK\n"));
-#endif
+ this->out_debug_log("DRQ ON@SEARCH: %d\n", prev_drq_clock);
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tSEARCH OK\n"));
+//#endif
}
break;
case EVENT_DRQ:
cmdtype == FDC_CMD_WR_SEC || cmdtype == FDC_CMD_WR_MSEC ||
cmdtype == FDC_CMD_RD_TRK || cmdtype == FDC_CMD_WR_TRK ||
cmdtype == FDC_CMD_RD_ADDR) {
- fdc[drvreg].index++;
+ if(!(fdc[drvreg].count_immediate)) fdc[drvreg].index++;
}
fdc[drvreg].prev_clock = prev_drq_clock = get_current_clock();
+
set_drq(true);
-#ifdef _FDC_DEBUG_LOG
+ this->out_debug_log("DRQ ON@DRQ: %d\n", prev_drq_clock);
+//#ifdef _FDC_DEBUG_LOG
//this->out_debug_log(_T("FDC\tDRQ!\n"));
-#endif
+//#endif
}
break;
case EVENT_MULTI1:
break;
case EVENT_LOST:
if(status & FDC_ST_BUSY) {
-#ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tDATA LOST\n"));
-#endif
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tDATA LOST\n"));
+//#endif
if(cmdtype == FDC_CMD_WR_SEC || cmdtype == FDC_CMD_WR_MSEC || cmdtype == FDC_CMD_WR_TRK) {
- if(fdc[drvreg].index == 0) {
- status &= ~FDC_ST_BUSY;
- //status &= ~FDC_ST_DRQ;
+ if(fdc[drvreg].index == 0) { // HEAD of REGION
cmdtype = 0;
+ //if((status & FDC_ST_DRQ) != 0) { // 20180130 FORCE DOWN DRQ ON LOST-DATA.
+ status |= FDC_ST_LOSTDATA;
+ status &= (uint8_t)(~(FDC_ST_DRQ | FDC_ST_BUSY));
+ set_drq(false);
+ //}
set_irq(true);
- //set_drq(false);
- } else {
+ } else { // STILL WRITING
write_io8(3, 0x00);
+ //if((status & FDC_ST_DRQ) != 0) {
+ status |= FDC_ST_LOSTDATA;
+ status &= (uint8_t)(~(FDC_ST_DRQ | FDC_ST_BUSY));
+ set_irq(true);
+ set_drq(false);
+ //cmdtype = 0;
+ //}
}
- } else {
+ } else { // READ
+ //if((status & FDC_ST_DRQ) != 0) {
+ status |= FDC_ST_LOSTDATA;
+ status &= (uint8_t)(~(FDC_ST_DRQ | FDC_ST_BUSY));
+ set_irq(true);
+ set_drq(false);
+ //}
read_io8(3);
}
status |= FDC_ST_LOSTDATA;
set_irq(false);
set_drq(false);
-#ifdef HAS_MB89311
+//#ifdef HAS_MB89311
// MB89311 mode commands
- if(cmdreg == 0xfc) {
- // delay (may be only in extended mode)
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (DELAY ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmdtype = status = 0;
- return;
- } else if(cmdreg == 0xfd) {
- // assign parameter
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (ASGN PAR) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmdtype = status = 0;
- return;
- } else if(cmdreg == 0xfe) {
- // assign mode
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (ASGN MOD) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- extended_mode = !extended_mode;
- cmdtype = status = 0;
- return;
- } else if(cmdreg == 0xff) {
- // reset (may be only in extended mode)
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (RESET ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmd_forceint();
- extended_mode = true;
- return;
- } else if(extended_mode) {
- // type-1
- if((cmdreg & 0xeb) == 0x21) {
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (STEP IN ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmd_stepin();
- return;
- } else if((cmdreg & 0xeb) == 0x22) {
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (STEP OUT) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmd_stepout();
- return;
- // type-2
- } else if((cmdreg & 0xf4) == 0x44) {
- // read-after-seek
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (RDaftSEK) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmd_seek();
- return;
- } else if((cmdreg & 0xf4) == 0x64) {
- // write-after-seek
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (WRaftSEK) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmd_seek();
- return;
- // type-3
- } else if((cmdreg & 0xfb) == 0xf1) {
- // format
- #ifdef _FDC_DEBUG_LOG
- this->out_debug_log(_T("FDC\tCMD=%2xh (FORMAT ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
- #endif
- cmd_format();
+ if(type_mb89311) {
+ if(cmdreg == 0xfc) {
+ // delay (may be only in extended mode)
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (DELAY ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmdtype = status = 0;
+ return;
+ } else if(cmdreg == 0xfd) {
+ // assign parameter
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (ASGN PAR) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmdtype = status = 0;
+ return;
+ } else if(cmdreg == 0xfe) {
+ // assign mode
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (ASGN MOD) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ extended_mode = !extended_mode;
+ cmdtype = status = 0;
+ return;
+ } else if(cmdreg == 0xff) {
+ // reset (may be only in extended mode)
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (RESET ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmd_forceint();
+ extended_mode = true;
+ return;
+ } else if(extended_mode) {
+ // type-1
+ if((cmdreg & 0xeb) == 0x21) {
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (STEP IN ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmd_stepin();
+ return;
+ } else if((cmdreg & 0xeb) == 0x22) {
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (STEP OUT) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmd_stepout();
+ return;
+ // type-2
+ } else if((cmdreg & 0xf4) == 0x44) {
+ // read-after-seek
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (RDaftSEK) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmd_seek();
+ return;
+ } else if((cmdreg & 0xf4) == 0x64) {
+ // write-after-seek
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (WRaftSEK) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmd_seek();
return;
- }
+ // type-3
+ } else if((cmdreg & 0xfb) == 0xf1) {
+ // format
+//#ifdef _FDC_DEBUG_LOG
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (FORMAT ) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
+ cmd_format();
+ return;
+ }
+ }
}
-#endif
+//#endif
// MB8877 mode commands
-#ifdef _FDC_DEBUG_LOG
+//#ifdef _FDC_DEBUG_LOG
static const _TCHAR *cmdstr[0x10] = {
_T("RESTORE "), _T("SEEK "), _T("STEP "), _T("STEP "),
_T("STEP IN "), _T("STEP IN "), _T("STEP OUT"), _T("STEP OUT"),
_T("RD DATA "), _T("RD DATA "), _T("RD DATA "), _T("WR DATA "),
_T("RD ADDR "), _T("FORCEINT"), _T("RD TRACK"), _T("WR TRACK")
};
- this->out_debug_log(_T("FDC\tCMD=%2xh (%s) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, cmdstr[cmdreg >> 4], datareg, drvreg, trkreg, sidereg, secreg);
-#endif
+ if(fdc_debug_log) this->out_debug_log(_T("FDC\tCMD=%2xh (%s) DATA=%2xh DRV=%d TRK=%3d SIDE=%d SEC=%2d\n"), cmdreg, cmdstr[cmdreg >> 4], datareg, drvreg, trkreg, sidereg, secreg);
+//#endif
switch(cmdreg & 0xf8) {
// type-1
case 0x00: case 0x08:
cmd_restore();
+ update_head_flag(drvreg, (cmdreg & 8) != 0);
break;
case 0x10: case 0x18:
cmd_seek();
+ update_head_flag(drvreg, (cmdreg & 8) != 0);
break;
case 0x20: case 0x28:
case 0x30: case 0x38:
cmd_step();
+ update_head_flag(drvreg, (cmdreg & 8) != 0);
break;
case 0x40: case 0x48:
case 0x50: case 0x58:
cmd_stepin();
+ update_head_flag(drvreg, (cmdreg & 8) != 0);
break;
case 0x60: case 0x68:
case 0x70: case 0x78:
cmd_stepout();
+ update_head_flag(drvreg, (cmdreg & 8) != 0);
break;
// type-2
case 0x80: case 0x88:
case 0x90: case 0x98:
cmd_readdata(true);
+ update_head_flag(drvreg, true);
break;
case 0xa0:case 0xa8:
case 0xb0: case 0xb8:
cmd_writedata(true);
+ update_head_flag(drvreg, true);
break;
// type-3
case 0xc0:
cmd_readaddr();
+ update_head_flag(drvreg, true);
break;
case 0xe0:
cmd_readtrack();
+ update_head_flag(drvreg, true);
break;
case 0xf0:
cmd_writetrack();
+ update_head_flag(drvreg, true);
break;
// type-4
case 0xd0: case 0xd8:
{
// type-1 restore
cmdtype = FDC_CMD_TYPE1;
- status = FDC_ST_HEADENG | FDC_ST_BUSY;
- trkreg = 0xff;
+ if(!check_drive()) {
+ return;
+ }
+ if((cmdreg & 0x08) != 0) { // Head engage
+ status = FDC_ST_HEADENG | FDC_ST_BUSY;
+ } else {
+ status = FDC_ST_BUSY;
+ }
+ set_irq(false);
+ set_drq(false);
+
+ if(fdc[drvreg].track < 0) {
+ fdc[drvreg].track = 0;
+ trkreg = 0;
+ } else if(fdc[drvreg].track >= 80) {
+ fdc[drvreg].track = 80;
+ trkreg = 80;
+ } else {
+ trkreg = fdc[drvreg].track;
+ }
datareg = 0;
seektrk = 0;
{
// type-1 seek
cmdtype = FDC_CMD_TYPE1;
- status = FDC_ST_HEADENG | FDC_ST_BUSY;
+ if(!check_drive()) {
+ return;
+ }
+ if((cmdreg & 0x08) != 0) { // Head engage
+ status = FDC_ST_HEADENG | FDC_ST_BUSY;
+ } else {
+ status = FDC_ST_BUSY;
+ }
+// seektrk = (uint8_t)(fdc[drvreg].track + datareg - trkreg);
seektrk = datareg;
- //printf("SEEK %d -> %d\n", trkreg, seektrk);
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
- defined(_FM77AV20) || defined(_FM77AV20EX)
- if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
- seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
- } else {
- seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
- }
-#else
- if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
+//#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
+ if(type_fm77av_2dd) {
+ if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
+ seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
+ } else {
+ seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
+ }
+ } else if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
} else {
seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
- }
-#endif
-// seekvct = !(datareg > trkreg);
- seekvct = !(seektrk > fdc[drvreg].track);
+ }
+ seekvct = !(seektrk > fdc[drvreg].track);
+
if(cmdreg & 4) {
// verify
if(trkreg != fdc[drvreg].track) {
trkreg = fdc[drvreg].track;
}
}
- trkreg = datareg;
register_seek_event();
}
{
// type-1 step in
cmdtype = FDC_CMD_TYPE1;
- status = FDC_ST_HEADENG | FDC_ST_BUSY;
-
- seektrk = fdc[drvreg].track + 1;
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
- defined(_FM77AV20) || defined(_FM77AV20EX)
- if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
- seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
- } else {
- seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
+ if(!check_drive()) {
+ return;
}
-#else
- if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
+ if((cmdreg & 0x08) != 0) { // Head engage
+ status = FDC_ST_HEADENG | FDC_ST_BUSY;
+ } else {
+ status = FDC_ST_BUSY;
+ }
+ seektrk = fdc[drvreg].track + 1;
+ if(type_fm77av_2dd) {
+ if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
+ seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
+ } else {
+ seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
+ }
+ } else if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
} else {
seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
- }
-#endif
+ }
seekvct = false;
+
if(cmdreg & 4) {
// verify
if(trkreg != fdc[drvreg].track) {
status |= FDC_ST_SEEKERR;
- //trkreg = fdc[drvreg].track;
+// trkreg = fdc[drvreg].track;
}
}
register_seek_event();
{
// type-1 step out
cmdtype = FDC_CMD_TYPE1;
- status = FDC_ST_HEADENG | FDC_ST_BUSY;
+ if(!check_drive()) {
+ return;
+ }
+ if((cmdreg & 0x08) != 0) { // Head engage
+ status = FDC_ST_HEADENG | FDC_ST_BUSY;
+ } else {
+ status = FDC_ST_BUSY;
+ }
seektrk = fdc[drvreg].track - 1;
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
- defined(_FM77AV20) || defined(_FM77AV20EX)
- if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
- seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
- } else {
- seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
- }
-#else
- if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
+ if(type_fm77av_2dd) {
+ if(disk[drvreg]->drive_type != DRIVE_TYPE_2D) {
+ seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
+ } else {
+ seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
+ }
+ } else if(disk[drvreg]->media_type != MEDIA_TYPE_2D){
seektrk = (seektrk > 83) ? 83 : (seektrk < 0) ? 0 : seektrk;
} else {
seektrk = (seektrk > 41) ? 41 : (seektrk < 0) ? 0 : seektrk;
- }
-#endif
+ }
seekvct = true;
+
if(cmdreg & 4) {
// verify
if(trkreg != fdc[drvreg].track) {
status |= FDC_ST_SEEKERR;
- //trkreg = fdc[drvreg].track;
+// trkreg = fdc[drvreg].track;
}
}
register_seek_event();
{
// type-2 read data
cmdtype = (cmdreg & 0x10) ? FDC_CMD_RD_MSEC : FDC_CMD_RD_SEC;
+ if(!check_drive2()) {
+ return;
+ }
status = FDC_ST_BUSY;
status_tmp = search_sector();
now_search = true;
{
// type-2 write data
cmdtype = (cmdreg & 0x10) ? FDC_CMD_WR_MSEC : FDC_CMD_WR_SEC;
+ if(!check_drive2()) {
+ return;
+ }
status = FDC_ST_BUSY;
status_tmp = search_sector() & ~FDC_ST_RECTYPE;
now_search = true;
{
// type-3 read address
cmdtype = FDC_CMD_RD_ADDR;
+ if(!check_drive2()) {
+ return;
+ }
status = FDC_ST_BUSY;
status_tmp = search_addr();
now_search = true;
{
// type-3 read track
cmdtype = FDC_CMD_RD_TRK;
+ if(!check_drive2()) {
+ return;
+ }
status = FDC_ST_BUSY;
status_tmp = 0;
{
// type-3 write track
cmdtype = FDC_CMD_WR_TRK;
+ if(!check_drive2()) {
+ return;
+ }
status = FDC_ST_BUSY;
status_tmp = 0;
cancel_my_event(EVENT_LOST);
}
-#ifdef HAS_MB89311
+//#ifdef HAS_MB89311
void MB8877::cmd_format()
{
- // type-3 format (FIXME: need to implement)
- cmdtype = FDC_CMD_WR_TRK;
- status = FDC_ST_BUSY;
- status_tmp = 0;
-
- fdc[drvreg].index = 0;
- fdc[drvreg].id_written = false;
- now_search = true;
-
- status_tmp = FDC_ST_WRITEFAULT;
- double time = (cmdreg & 4) ? DELAY_TIME : 1;
-
- register_my_event(EVENT_SEARCH, time);
- cancel_my_event(EVENT_LOST);
+ if(type_mb89311) {
+ // type-3 format (FIXME: need to implement)
+ cmdtype = FDC_CMD_WR_TRK;
+ status = FDC_ST_BUSY;
+ status_tmp = 0;
+
+ fdc[drvreg].index = 0;
+ fdc[drvreg].id_written = false;
+ now_search = true;
+
+ status_tmp = FDC_ST_WRITEFAULT;
+ double time = (cmdreg & 4) ? DELAY_TIME : 1;
+
+ register_my_event(EVENT_SEARCH, time);
+ cancel_my_event(EVENT_LOST);
+ }
}
-#endif
+//#endif
void MB8877::cmd_forceint()
{
}
now_search = now_seek = sector_changed = false;
-#ifdef HAS_MB89311
- if(cmdreg == 0xff) {
+//#ifdef HAS_MB89311
+ if((cmdreg == 0xff) && (type_mb89311)) {
// reset command
cmdtype = FDC_CMD_TYPE1;
status = FDC_ST_HEADENG;
} else {
-#endif
+//#endif
if(cmdtype == 0 || !(status & FDC_ST_BUSY)) {
cmdtype = FDC_CMD_TYPE1;
- status = FDC_ST_HEADENG;
+ if(!type_fm7) status = FDC_ST_HEADENG; // Hack for FUKUALL.d77 .
}
status &= ~FDC_ST_BUSY;
if(cmdreg & 0x0f) {
set_irq(true);
}
-#ifdef HAS_MB89311
+//#ifdef HAS_MB89311
}
-#endif
+//#endif
cancel_my_event(EVENT_SEEK);
- cancel_my_event(EVENT_SEEKEND);
+ cancel_my_event(EVENT_SEEKEND_VERIFY);
cancel_my_event(EVENT_SEARCH);
cancel_my_event(EVENT_DRQ);
cancel_my_event(EVENT_MULTI1);
cancel_my_event(EVENT_LOST);
}
+void MB8877::update_head_flag(int drv, bool head_load)
+{
+ if(fdc[drv].head_load != head_load) {
+ if(head_load) {
+ if(d_noise_head_down != NULL) d_noise_head_down->play();
+ } else {
+ if(d_noise_head_up != NULL) d_noise_head_up->play();
+ }
+ fdc[drv].head_load = head_load;
+ }
+}
+
// ----------------------------------------------------------------------------
// media handler
// ----------------------------------------------------------------------------
{
// get track
int track = fdc[drvreg].track;
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
- defined(_FM77AV20) || defined(_FM77AV20EX)
- if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
- if((disk[drvreg]->drive_type == DRIVE_TYPE_2DD) ||
- (disk[drvreg]->drive_type == DRIVE_TYPE_2HD) ||
- (disk[drvreg]->drive_type == DRIVE_TYPE_144)) {
- track >>= 1;
+//#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
+ if(type_fm77av_2dd) {
+ if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
+ if((disk[drvreg]->drive_type == DRIVE_TYPE_2DD) ||
+ (disk[drvreg]->drive_type == DRIVE_TYPE_2HD) ||
+ (disk[drvreg]->drive_type == DRIVE_TYPE_144)) {
+ track >>= 1;
+ }
+ } else { // OS-9 2DD Access fix by Ryu Takegami
+ if((disk[drvreg]->media_type != MEDIA_TYPE_2D) &&
+ (disk[drvreg]->media_type != MEDIA_TYPE_UNK)) {
+ if(disk[drvreg]->drive_type == DRIVE_TYPE_2D) {
+ track <<= 1;
+ }
+ }
}
}
-#endif
+//#endif
if(!disk[drvreg]->get_track(track, sidereg)){
return FDC_ST_SEEKERR;
}
// get track
int track = fdc[drvreg].track;
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
- defined(_FM77AV20) || defined(_FM77AV20EX)
- if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
- if((disk[drvreg]->drive_type == DRIVE_TYPE_2DD) ||
- (disk[drvreg]->drive_type == DRIVE_TYPE_2HD) ||
- (disk[drvreg]->drive_type == DRIVE_TYPE_144)) {
- track >>= 1;
+//#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
+ if(type_fm77av_2dd) {
+ if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
+ if((disk[drvreg]->drive_type == DRIVE_TYPE_2DD) ||
+ (disk[drvreg]->drive_type == DRIVE_TYPE_2HD) ||
+ (disk[drvreg]->drive_type == DRIVE_TYPE_144)) {
+ track >>= 1;
+ }
+ } else { // OS-9 2DD Access fix by Ryu Takegami
+ if((disk[drvreg]->media_type != MEDIA_TYPE_2D) &&
+ (disk[drvreg]->media_type != MEDIA_TYPE_UNK)) {
+ if(disk[drvreg]->drive_type == DRIVE_TYPE_2D) {
+ track <<= 1;
+ }
+ }
}
}
-#endif
+//#endif
if(!disk[drvreg]->get_track(track, sidereg)) {
return FDC_ST_RECNFND;
}
// get sector
int index = (first_sector + i) % sector_num;
disk[drvreg]->get_sector(-1, -1, index);
- //printf("CHRN=%02x %02x %02x %02x\n", disk[drvreg]->id[0], disk[drvreg]->id[1], disk[drvreg]->id[2], disk[drvreg]->id[3]);
+
// check id
if(disk[drvreg]->id[0] != trkreg) {
continue;
}
-#if !defined(HAS_MB8866)
- if((cmdreg & 2) && (disk[drvreg]->id[1] & 1) != ((cmdreg >> 3) & 1)) {
- continue;
+//#if !defined(HAS_MB8866)
+ if(!type_mb8866) {
+ if((cmdreg & 2) && (disk[drvreg]->id[1] & 1) != ((cmdreg >> 3) & 1)) {
+ continue;
+ }
}
-#endif
+//#endif
if(disk[drvreg]->id[2] != secreg) {
continue;
}
}
fdc[drvreg].next_am1_position = disk[drvreg]->am1_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
return (disk[drvreg]->deleted ? FDC_ST_RECTYPE : 0);
}
{
// get track
int track = fdc[drvreg].track;
-#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
- defined(_FM77AV20) || defined(_FM77AV20EX)
- if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
- if((disk[drvreg]->drive_type == DRIVE_TYPE_2DD) ||
- (disk[drvreg]->drive_type == DRIVE_TYPE_2HD) ||
- (disk[drvreg]->drive_type == DRIVE_TYPE_144)) {
- track >>= 1;
+//#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || defined(_FM77AV20) || defined(_FM77AV20EX)
+ if(type_fm77av_2dd) {
+ if(disk[drvreg]->media_type == MEDIA_TYPE_2D) {
+ if((disk[drvreg]->drive_type == DRIVE_TYPE_2DD) ||
+ (disk[drvreg]->drive_type == DRIVE_TYPE_2HD) ||
+ (disk[drvreg]->drive_type == DRIVE_TYPE_144)) {
+ track >>= 1;
+ }
+ } else { // OS-9 2DD Access fix by Ryu Takegami
+ if((disk[drvreg]->media_type != MEDIA_TYPE_2D) &&
+ (disk[drvreg]->media_type != MEDIA_TYPE_UNK)) {
+ if(disk[drvreg]->drive_type == DRIVE_TYPE_2D) {
+ track <<= 1;
+ }
+ }
}
}
-#endif
+//#endif
if(!disk[drvreg]->get_track(track, sidereg)) {
return FDC_ST_RECNFND;
}
void MB8877::open_disk(int drv, const _TCHAR* file_path, int bank)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
disk[drv]->open(file_path, bank);
+#if defined(_USE_QT)
+ if((disk[drv]->is_special_disk == SPECIAL_DISK_FM7_FLEX) || (config.disk_count_immediate[drv])) {
+#else
+ if(disk[drv]->is_special_disk == SPECIAL_DISK_FM7_FLEX) {
+#endif
+ fdc[drv].count_immediate = true;
+ } else {
+ fdc[drv].count_immediate = false;
+ }
}
}
void MB8877::close_disk(int drv)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
disk[drv]->close();
cmdtype = 0;
+ update_head_flag(drvreg, false);
+ fdc[drv].count_immediate = false;
}
}
bool MB8877::is_disk_inserted(int drv)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
return disk[drv]->inserted;
}
return false;
void MB8877::is_disk_protected(int drv, bool value)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
disk[drv]->write_protected = value;
}
}
bool MB8877::is_disk_protected(int drv)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
return disk[drv]->write_protected;
}
return false;
void MB8877::set_drive_type(int drv, uint8_t type)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
disk[drv]->drive_type = type;
}
}
uint8_t MB8877::get_drive_type(int drv)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
return disk[drv]->drive_type;
}
return DRIVE_TYPE_UNK;
void MB8877::set_drive_rpm(int drv, int rpm)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
disk[drv]->drive_rpm = rpm;
}
}
void MB8877::set_drive_mfm(int drv, bool mfm)
{
- if(drv < MAX_DRIVE) {
+ if(drv < _max_drive) {
disk[drv]->drive_mfm = mfm;
}
}
-uint8_t MB8877::fdc_status()
+void MB8877::set_track_size(int drv, int size)
{
- // for each virtual machines
-#if defined(_FMR50) || defined(_FMR60)
- return disk[drvreg]->inserted ? 2 : 0;
-#else
- return 0;
-#endif
-}
-
-// Set sound data.
-// TYPE=
-// 0: FDD SEEK
-// 1: HEAD ENGAGE (Optional?)
-#if defined(USE_SOUND_FILES)
-void MB8877::add_sound(int type)
-{
- int *p;
- if(type == MB8877_SND_TYPE_SEEK) {
- p = snd_seek_mix_tbl;
- } else if(type == MB8877_SND_TYPE_HEAD) {
- p = snd_head_mix_tbl;
- } else {
- return;
- }
- touch_sound();
- for(int i = 0; i < MB8877_SND_TBL_MAX; i++) {
- if(p[i] < 0) {
- p[i] = 0;
- break;
- }
+ if(drv < _max_drive) {
+ disk[drv]->track_size = size;
}
}
-bool MB8877::load_sound_data(int type, const _TCHAR *pathname)
+uint8_t MB8877::fdc_status()
{
- if((type < 0) || (type > 1)) return false;
- int16_t *data = NULL;
- int dst_size = 0;
- int id = (this_device_id << 8) + type;
- const _TCHAR *sp;
- sp = create_local_path(pathname);
- emu->load_sound_file(id, sp, &data, &dst_size);
- if((dst_size <= 0) || (data == NULL)) { // Failed
- this->out_debug_log("ID=%d : Failed to load SOUND FILE for %s:%s", id, (type == 0) ? _T("SEEK") : _T("HEAD") ,pathname);
- return false;
- } else {
- int utl_size = dst_size * 2 * sizeof(int16_t);
- int alloc_size = utl_size + 64;
- switch(type) {
- case MB8877_SND_TYPE_SEEK: // SEEK
- snd_seek_data = (int16_t *)malloc(alloc_size);
- memcpy(snd_seek_data, data, utl_size);
- strncpy(snd_seek_name, pathname, 511);
- snd_seek_samples_size = dst_size;
- break;
- case MB8877_SND_TYPE_HEAD: // HEAD
- snd_head_data = (int16_t *)malloc(alloc_size);
- memcpy(snd_head_data, data, utl_size);
- strncpy(snd_head_name, pathname, 511);
- snd_head_samples_size = dst_size;
- break;
- default:
- this->out_debug_log("ID=%d : Illegal type (%d): 0 (SEEK SOUND) or 1 (HEAD SOUND) is available.",
- id, type);
- return false;
- }
- this->out_debug_log("ID=%d : Success to load SOUND FILE for %s:%s",
- id, (type == 0) ? _T("SEEK") : _T("HEAD") ,
- pathname);
+ // for each virtual machines
+//#if defined(_FMR50) || defined(_FMR60)
+ if(type_fmr50 || type_fmr60) {
+ return disk[drvreg]->inserted ? 2 : 0;
}
- return true;
+//#else
+ return 0;
+//#endif
}
-void MB8877::release_sound_data(int type)
+void MB8877::update_config()
{
- switch(type) {
- case MB8877_SND_TYPE_SEEK: // SEEK
- if(snd_seek_data != NULL) free(snd_seek_data);
- memset(snd_seek_name, 0x00, sizeof(snd_seek_name));
- snd_seek_data = NULL;
- break;
- case MB8877_SND_TYPE_HEAD: // HEAD
- if(snd_head_data != NULL) free(snd_head_data);
- memset(snd_head_name, 0x00, sizeof(snd_head_name));
- snd_head_data = NULL;
- break;
- default:
- break;
+ if(d_noise_seek != NULL) {
+ d_noise_seek->set_mute(!config.sound_noise_fdd);
}
-}
-
-bool MB8877::reload_sound_data(int type)
-{
- switch(type) {
- case MB8877_SND_TYPE_SEEK: // SEEK
- if(snd_seek_data != NULL) free(snd_seek_data);
- break;
- case MB8877_SND_TYPE_HEAD:
- if(snd_head_data != NULL) free(snd_head_data);
- break;
- default:
- return false;
- break;
+ if(d_noise_head_down != NULL) {
+ d_noise_head_down->set_mute(!config.sound_noise_fdd);
}
- _TCHAR *p = (type == MB8877_SND_TYPE_SEEK) ? snd_seek_name : snd_head_name;
- _TCHAR tmps[512];
- strncpy(tmps, p, 511);
- return load_sound_data(type, tmps);
-}
-
-void MB8877::mix_main(int32_t *dst, int count, int16_t *src, int *table, int samples)
-{
- int ptr, pp;
- int i, j, k;
- int32_t data[2];
- int32_t *dst_tmp;
- if((dst == NULL) || (src == NULL)) return;
- if((count <= 0) || (samples <= 0)) return;
- for(i=0; i < MB8877_SND_TBL_MAX; i++) {
- ptr = table[i];
- if(ptr >= 0) {
- if(ptr < samples) {
- if(!snd_mute && (config.sound_fdd != 0)) {
- pp = ptr << 1;
- dst_tmp = dst;
- k = 0;
- for(j = 0; j < count; j++) {
- if(ptr >= samples) {
- break;
- }
- data[0] = (int32_t)src[pp + 0];
- data[1] = (int32_t)src[pp + 1];
- dst_tmp[k + 0] += apply_volume((int32_t)data[0], snd_level_l);
- dst_tmp[k + 1] += apply_volume((int32_t)data[1], snd_level_r);
- k += 2;
- pp += 2;
- ptr++;
- }
- } else {
- ptr += count;
- }
- }
- if(ptr >= samples) {
- table[i] = -1;
- } else {
- table[i] = ptr;
- }
- }
+ if(d_noise_head_up != NULL) {
+ d_noise_head_up->set_mute(!config.sound_noise_fdd);
}
}
-void MB8877::mix(int32_t *buffer, int cnt)
-{
- if(snd_seek_data != NULL) mix_main(buffer, cnt, snd_seek_data, snd_seek_mix_tbl, snd_seek_samples_size);
- if(snd_head_data != NULL) mix_main(buffer, cnt, snd_head_data, snd_head_mix_tbl, snd_head_samples_size);
-}
-
-void MB8877::set_volume(int ch, int decibel_l, int decibel_r)
-{
- snd_level_l = decibel_to_volume(decibel_l);
- snd_level_r = decibel_to_volume(decibel_r);
-}
-#endif
-
-#define STATE_VERSION 7
+#define STATE_VERSION 6
void MB8877::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);
state_fio->FputBool(drive_sel);
state_fio->FputUint32(prev_drq_clock);
state_fio->FputUint32(seekend_clock);
-#if defined(USE_SOUND_FILES)
- state_fio->Fwrite(snd_seek_name, sizeof(snd_seek_name), 1);
- state_fio->Fwrite(snd_head_name, sizeof(snd_head_name), 1);
- for(int i = 0; i < MB8877_SND_TBL_MAX; i++) {
- state_fio->FputInt32(snd_seek_mix_tbl[i]);
- }
- for(int i = 0; i < MB8877_SND_TBL_MAX; i++) {
- state_fio->FputInt32(snd_head_mix_tbl[i]);
- }
- state_fio->FputBool(snd_mute);
- state_fio->FputInt32(snd_level_l);
- state_fio->FputInt32(snd_level_r);
-#endif
}
bool MB8877::load_state(FILEIO* state_fio)
{
- uint32_t s_version = state_fio->FgetUint32();
- //uint32_t desired_version = STATE_VERSION;
- bool pending = false;
- if(s_version != STATE_VERSION) {
- if(s_version == 5) {
- pending = true;
- } else {
- return false;
- }
+ if(state_fio->FgetUint32() != STATE_VERSION) {
+ return false;
}
if(state_fio->FgetInt32() != this_device_id) {
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;
}
drive_sel = state_fio->FgetBool();
prev_drq_clock = state_fio->FgetUint32();
seekend_clock = state_fio->FgetUint32();
-#if defined(USE_SOUND_FILES)
- if(!pending) {
- state_fio->Fread(snd_seek_name, sizeof(snd_seek_name), 1);
- state_fio->Fread(snd_head_name, sizeof(snd_head_name), 1);
- for(int i = 0; i < MB8877_SND_TBL_MAX; i++) {
- snd_seek_mix_tbl[i] = state_fio->FgetInt32();
- }
- for(int i = 0; i < MB8877_SND_TBL_MAX; i++) {
- snd_head_mix_tbl[i] = state_fio->FgetInt32();
- }
- snd_mute = state_fio->FgetBool();
- snd_level_l = state_fio->FgetInt32();
- snd_level_r = state_fio->FgetInt32();
- if(snd_seek_data != NULL) free(snd_seek_data);
- if(snd_head_data != NULL) free(snd_head_data);
- if(strlen(snd_seek_name) > 0) {
- _TCHAR tmps[512];
- strncpy(tmps, snd_seek_name, 511);
- load_sound_data(MB8877_SND_TYPE_SEEK, (const _TCHAR *)tmps);
- }
- if(strlen(snd_head_name) > 0) {
- _TCHAR tmps[512];
- strncpy(tmps, snd_head_name, 511);
- load_sound_data(MB8877_SND_TYPE_HEAD, (const _TCHAR *)tmps);
- }
- }
-#endif
- //touch_sound();
return true;
}