From: <sba...@us...> - 2023-10-21 10:28:54
|
This is an automated email from the git hooks/post-receive-user script. sbaldovi pushed a commit to branch master in repository fuse. View the commit online: https://sourceforge.net/p/fuse-emulator/fuse/ci/ce0a650efb17b01ca2e1a780afdb44fa2607f7c6/ commit ce0a650efb17b01ca2e1a780afdb44fa2607f7c6 Author: Gergely Szasz <sz...@hu...> AuthorDate: Sat Oct 21 06:23:01 2023 +0200 Fix SCAN bug in uPD765 FDC Allows to format a disk on CP/M Plus and Fuzix (fixes bug #453) (thanks, Phil Reynolds and Vic Chwe). --- peripherals/disk/upd_fdc.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/peripherals/disk/upd_fdc.c b/peripherals/disk/upd_fdc.c index b1263e4d..9e10e87c 100644 --- a/peripherals/disk/upd_fdc.c +++ b/peripherals/disk/upd_fdc.c @@ -688,6 +688,8 @@ abort_read_data: f->main_status |= UPD_FDC_MAIN_DATAREQ; if( f->cmd->id != UPD_CMD_SCAN ) f->main_status |= UPD_FDC_MAIN_DATA_READ; + else + f->main_status |= UPD_FDC_MAIN_DATA_WRITE; f->data_offset = 0; event_remove_type( timeout_event ); event_add_with_data( tstates + 4 * /* 2 revolution: 2 * 200 / 1000 */ @@ -871,7 +873,7 @@ upd_fdc_event( libspectrum_dword last_tstates GCC_UNUSED, int event, } if( f->read_id ) { - if( f->cmd->id == UPD_CMD_READ_DATA ) { + if( f->cmd->id == UPD_CMD_READ_DATA || f->cmd->id == UPD_CMD_SCAN ) { start_read_data( f ); } else if( f->cmd->id == UPD_CMD_READ_ID ) { start_read_id( f ); @@ -1013,7 +1015,7 @@ upd_fdc_write_data( upd_fdc *f, libspectrum_byte data ) return; if( f->main_status & UPD_FDC_MAIN_BUSY && - f->state == UPD_FDC_STATE_EXE ) { /* execution phase WRITE/FORMAT */ + f->state == UPD_FDC_STATE_EXE ) { /* execution phase WRITE/FORMAT/SCAN */ d = f->current_drive; if( f->cmd->id == UPD_CMD_WRITE_ID ) { /* FORMAT */ /* at the index hole... */ @@ -1120,7 +1122,7 @@ upd_fdc_write_data( upd_fdc *f, libspectrum_byte data ) } else { /* SCAN */ f->data_offset++; fdd_read_data( d ); crc_add( f, d ); - if( f->data_offset == 0 && d->data == data ) /* `scan hit' */ + if( f->data_offset == 1 && d->data == data ) /* `scan hit' */ f->status_register[2] |= UPD_FDC_ST2_SCAN_HIT; if( d->data != data ) /* `scan _not_ hit' */ @@ -1366,6 +1368,9 @@ upd_fdc_write_data( upd_fdc *f, libspectrum_byte data ) UPD_SCAN_LO; f->rlen = 0x80 << ( f->data_register[4] > MAX_SIZE_CODE ? MAX_SIZE_CODE : f->data_register[4] ); + f->first_rw = 1; /* always read at least one sector */ + if( f->data_register[4] == 0 && f->data_register[7] < 128 ) + f->rlen = f->data_register[7]; head_load( f ); return; } |