From 45a770a0282ea08a36d95feeb77136c42b4c3e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20DEL=20NERO?= Date: Wed, 9 Sep 2026 09:56:42 +0200 Subject: [PATCH] IDAM mask support. --- libhxcfe/sources/init.script | 4 +++ libhxcfe/sources/init_script.h | 31 +++++++++++-------- .../tracks/track_formats/iso_ibm_fm_track.c | 27 ++++++++++------ .../tracks/track_formats/iso_ibm_mfm_track.c | 29 ++++++++++------- 4 files changed, 57 insertions(+), 34 deletions(-) diff --git a/libhxcfe/sources/init.script b/libhxcfe/sources/init.script index f275b5b8..5966cf7d 100644 --- a/libhxcfe/sources/init.script +++ b/libhxcfe/sources/init.script @@ -439,6 +439,10 @@ set BATCHCONVERT_KEEP_SOURCE_FILE_NAME_EXTENSION 1 # Default sectors size ID mask set SECTOR_SIZE_FIELD_MASK 0x7 +# 0xFF mask in normal operation. 0xFC mask to extract sectors with 0xFC IDAM +set MFM_IDAM_FIELD_MASK 0xFF +set FM_IDAM_FIELD_MASK 0xFF + # # Default User interface "last state" variables # diff --git a/libhxcfe/sources/init_script.h b/libhxcfe/sources/init_script.h index 10379bee..bcf62dc7 100644 --- a/libhxcfe/sources/init_script.h +++ b/libhxcfe/sources/init_script.h @@ -5,8 +5,8 @@ // // File: init.script // -// Original size: 14999 Bytes -// Packed size: 7045 Bytes +// Original size: 15135 Bytes +// Packed size: 7123 Bytes // #ifndef DATATYPEDEF @@ -456,19 +456,24 @@ static unsigned char data__init_script[] = 0x42,0x52,0xda,0x03,0x15,0x02,0x45,0x07,0x8f,0x36,0x75,0x1c,0xe4,0x20,0x35,0x12, 0x76,0xc2,0x3a,0xce,0x24,0x6b,0x05,0x8a,0x60,0x68,0x51,0x6c,0x48,0xbd,0x13,0xd0, 0x20,0xf2,0x95,0xad,0x0a,0x2d,0xa9,0xf8,0x52,0xd0,0xf3,0x1f,0x2e,0x4b,0xe8,0xad, - 0xba,0xa9,0x45,0xf3,0x80,0x67,0x22,0x6f,0x03,0x3e,0xd3,0x40,0xaf,0xa0,0x74,0x04, - 0x46,0x67,0x53,0x81,0xc5,0x42,0x90,0x18,0x93,0x63,0x8c,0x42,0x3b,0x40,0x55,0x4f, - 0x89,0x13,0x14,0xb3,0x01,0x03,0x9b,0xa9,0x69,0x51,0x61,0x7d,0x9c,0xe2,0x16,0xe4, - 0x54,0x20,0x01,0x12,0x4a,0x68,0x81,0xc7,0x39,0x1e,0x23,0xdc,0x54,0xb3,0x36,0x99, - 0xb5,0x92,0xee,0x6d,0xa3,0xe5,0x02,0x99,0xcf,0xa0,0x60,0x84,0x20,0x11,0x25,0xbe, - 0x76,0x69,0xa4,0x9d,0xb2,0x03,0x27,0x70,0x4b,0x99,0xdd,0x35,0x40,0x7c,0xa8,0x76, - 0x6e,0x10,0x12,0x67,0x81,0x3c,0x28,0x4c,0xcf,0x12,0x74,0xd3,0xc6,0x4d,0x5c,0xee, - 0x55,0xef,0x3c,0xa9,0x86,0xbd,0x64,0xd3,0xf1,0x8b,0x02,0x94,0x63,0x4f,0x9b,0x3c, - 0x39,0xda,0xcf,0x4e,0x6f,0x24,0xb3,0x22,0x64,0xf6,0x80,0xa9,0x3d,0xc9,0xef,0x16, - 0xfc,0x00,0x01,0x00,0x00 + 0xba,0xa8,0xfa,0xae,0x17,0x36,0xc1,0x4a,0xd2,0x36,0xd3,0xf1,0x07,0x87,0x28,0xeb, + 0x8f,0xcf,0x3d,0xd1,0x85,0x00,0xf0,0x04,0x60,0x9b,0x4e,0x20,0xc9,0xa1,0x54,0x0a, + 0x1c,0x7a,0xcf,0x04,0x6f,0x49,0x76,0x09,0xa1,0xc0,0x01,0x36,0x62,0xd8,0xf2,0x09, + 0x0c,0xf1,0xd9,0xd6,0xbb,0xd4,0x09,0x33,0x8e,0x48,0x29,0x8a,0xa7,0x3c,0xde,0x82, + 0x43,0x1e,0xf0,0x82,0xd3,0xb1,0x9c,0x6c,0x92,0xe7,0x6b,0x39,0x19,0xcf,0x81,0x19, + 0x45,0xf3,0x80,0x67,0x22,0x6f,0x03,0x3e,0xd3,0x40,0xaf,0xa0,0x74,0x04,0x46,0x67, + 0x53,0x81,0xc5,0x42,0x90,0x18,0x93,0x63,0x8c,0x42,0x3b,0x40,0x55,0x4f,0x89,0x13, + 0x14,0xb3,0x01,0x03,0x9b,0xa9,0x69,0x51,0x61,0x7d,0x9e,0x62,0x16,0xe4,0x54,0x20, + 0x01,0x12,0x4a,0x68,0x81,0xc7,0x39,0x1e,0x23,0xdc,0x54,0xb3,0x36,0x99,0xb5,0x92, + 0xee,0x6d,0xa3,0xe5,0x02,0x99,0xcf,0xa0,0x60,0x84,0x20,0x11,0x25,0xbe,0x7c,0x69, + 0xa4,0x9f,0x32,0x03,0x27,0xd0,0x4b,0x99,0xf5,0x35,0x40,0x7c,0xa8,0x76,0x6e,0x10, + 0x12,0x67,0xe1,0x3f,0x28,0x4c,0xcf,0xd2,0x7a,0xd3,0xf6,0x4d,0x5c,0xfa,0x55,0xef, + 0x3f,0xa9,0x86,0xbd,0x64,0xd3,0xf1,0x8b,0x02,0x94,0x63,0x4f,0x9b,0x3f,0x39,0xf2, + 0xd0,0x0e,0x6f,0x24,0xb3,0x22,0x65,0x02,0x80,0xa9,0x40,0xca,0x07,0x16,0xfc,0x00, + 0x01,0x00,0x00 }; static datatype data_init_script[]= { - { 255, 14999, 7045, data__init_script, 0 } + { 255, 15135, 7123, data__init_script, 0 } }; diff --git a/libhxcfe/sources/tracks/track_formats/iso_ibm_fm_track.c b/libhxcfe/sources/tracks/track_formats/iso_ibm_fm_track.c index 8a1f4a38..737c542f 100644 --- a/libhxcfe/sources/tracks/track_formats/iso_ibm_fm_track.c +++ b/libhxcfe/sources/tracks/track_formats/iso_ibm_fm_track.c @@ -81,7 +81,8 @@ int get_next_FM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * s int sector_extractor_sm; int k,i; unsigned char crctable[32]; - uint8_t mask; + uint8_t sector_size_mask; + uint8_t idam_mask; // C D C D C D C D //0xF8 - 00010100 01000100 // 0x1444 @@ -92,6 +93,18 @@ int get_next_FM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * s //0xFD - 00010101 01000101 // 0x1545 unsigned short datamark[6]={0x1444,0x1445,0x1454,0x1455,0x1544,0x1545}; + sector_size_mask = hxcfe_getEnvVarValue( floppycontext, "SECTOR_SIZE_FIELD_MASK" ); + if( sector_size_mask <= 0 ) + { + sector_size_mask = 0x7; + } + + idam_mask = hxcfe_getEnvVarValue( floppycontext, "FM_IDAM_FIELD_MASK" ); + if( idam_mask <= 0 ) + { + idam_mask = 0xFF; + } + bit_offset=track_offset; memset(sector,0,sizeof(HXCFE_SECTCFG)); @@ -122,7 +135,7 @@ int get_next_FM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * s case LOOKFOR_ADDM: sector->endsectorindex = fmtobin(track->databuffer,NULL,track->tracklen,tmp_buffer,7,bit_offset,0); - if(tmp_buffer[0]==0xFE) + if( ( tmp_buffer[0] & idam_mask ) == ( 0xFE & idam_mask ) ) { sector->startsectorindex = bit_offset; sector->startdataindex = sector->endsectorindex; @@ -137,13 +150,7 @@ int get_next_FM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * s sector->head = tmp_buffer[2]; sector->sector = tmp_buffer[3]; - mask = hxcfe_getEnvVarValue( floppycontext, "SECTOR_SIZE_FIELD_MASK" ); - if( mask <= 0 ) - { - mask = 0x7; - } - - sector->sectorsize = sectorsize[tmp_buffer[4] & mask]; + sector->sectorsize = sectorsize[tmp_buffer[4] & sector_size_mask]; sector->alternate_sector_size_id = tmp_buffer[4]; sector->trackencoding = ISOFORMAT_SD; @@ -169,7 +176,7 @@ int get_next_FM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * s bit_offset = chgbitptr(track->tracklen,bit_offset,7 * 8); - floppycontext->hxc_printf(MSG_DEBUG,"Valid FM sector header found - Cyl:%d Side:%d Sect:%d Size:%d",tmp_buffer[1],tmp_buffer[2],tmp_buffer[3],sectorsize[tmp_buffer[4] & mask]); + floppycontext->hxc_printf(MSG_DEBUG,"Valid FM sector header found - Cyl:%d Side:%d Sect:%d Size:%d",tmp_buffer[1],tmp_buffer[2],tmp_buffer[3],sectorsize[tmp_buffer[4] & sector_size_mask]); old_bit_offset=bit_offset; sector_size = sector->sectorsize; diff --git a/libhxcfe/sources/tracks/track_formats/iso_ibm_mfm_track.c b/libhxcfe/sources/tracks/track_formats/iso_ibm_mfm_track.c index 5fadbf95..c39d9d58 100644 --- a/libhxcfe/sources/tracks/track_formats/iso_ibm_mfm_track.c +++ b/libhxcfe/sources/tracks/track_formats/iso_ibm_mfm_track.c @@ -81,7 +81,20 @@ int get_next_MFM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * int sector_extractor_sm; int k; unsigned char crctable[32]; - uint8_t mask; + uint8_t sector_size_mask; + uint8_t idam_mask; + + sector_size_mask = hxcfe_getEnvVarValue( floppycontext, "SECTOR_SIZE_FIELD_MASK" ); + if( sector_size_mask <= 0 ) + { + sector_size_mask = 0x7; + } + + idam_mask = hxcfe_getEnvVarValue( floppycontext, "MFM_IDAM_FIELD_MASK" ); + if( idam_mask <= 0 ) + { + idam_mask = 0xFF; + } memset(sector,0,sizeof(HXCFE_SECTCFG)); @@ -117,7 +130,7 @@ int get_next_MFM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * case LOOKFOR_ADDM: tmp_bit_offset = mfmtobin(track->databuffer,NULL,track->tracklen,tmp_buffer,3+7,bit_offset,0); - if(tmp_buffer[3]==0xFE) + if( (tmp_buffer[3] & idam_mask) == (0xFE & idam_mask) ) // Masked 0xFE { #define SECT_HEADER_SIZE (3+7) @@ -131,13 +144,7 @@ int get_next_MFM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * sector->head = tmp_buffer[5]; sector->sector = tmp_buffer[6]; - mask = hxcfe_getEnvVarValue( floppycontext, "SECTOR_SIZE_FIELD_MASK" ); - if( mask <= 0 ) - { - mask = 0x7; - } - - sector->sectorsize = sectorsize[tmp_buffer[7] & mask]; + sector->sectorsize = sectorsize[tmp_buffer[7] & sector_size_mask]; sector->alternate_sector_size_id = tmp_buffer[7]; sector->trackencoding = ISOFORMAT_DD; sector->alternate_datamark = 0x00; @@ -197,7 +204,7 @@ int get_next_MFM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * sector->startdataindex = bit_offset; sector->endsectorindex = mfmtobin(track->databuffer,tmp_sector_index,track->tracklen,tmp_sector,3+1+sector_size+2,bit_offset,0); - if(tmp_sector[3] != 0xFE) + if( (tmp_sector[3] & idam_mask) != (0xFE & idam_mask) ) { sector->alternate_datamark = tmp_sector[3]; sector->use_alternate_datamark = 0xFF; @@ -270,7 +277,7 @@ int get_next_MFM_sector(HXCFE* floppycontext,HXCFE_SIDE * track,HXCFE_SECTCFG * // "Empty" sector detection checkEmptySector(sector); - if(sector->alternate_datamark!=0xFE) + if( (sector->alternate_datamark & idam_mask) != (0xFE & idam_mask) ) bit_offset = chgbitptr( track->tracklen, bit_offset, 1 ); } else