|  | @@ -271,7 +271,7 @@ class EDSK(Image):
 | 
	
		
			
				|  |  |                  t += mfm.encode(bytes([track.gapbyte] * track.gap_1))
 | 
	
		
			
				|  |  |                  sh = dat[o+24:o+24+8*nsecs]
 | 
	
		
			
				|  |  |                  data_pos = o + 256 # skip track header and sector-info table
 | 
	
		
			
				|  |  | -                clippable, ngap3, sectors = 0, 0, []
 | 
	
		
			
				|  |  | +                clippable, ngap3, sectors, idam_included = 0, 0, [], False
 | 
	
		
			
				|  |  |                  while sh:
 | 
	
		
			
				|  |  |                      c, h, r, n, stat1, stat2, data_size = struct.unpack(
 | 
	
		
			
				|  |  |                          '<6BH', sh[:8])
 | 
	
	
		
			
				|  | @@ -296,17 +296,19 @@ class EDSK(Image):
 | 
	
		
			
				|  |  |                          sec_data = sec_data[:data_size]
 | 
	
		
			
				|  |  |                      sectors.append((c,h,r,n,errs,sec_data))
 | 
	
		
			
				|  |  |                      # IDAM
 | 
	
		
			
				|  |  | -                    t += mfm.encode(bytes(track.gap_presync))
 | 
	
		
			
				|  |  | -                    t += mfm.sync_bytes
 | 
	
		
			
				|  |  | -                    am = bytes([0xa1, 0xa1, 0xa1, mfm.IBM_MFM.IDAM,
 | 
	
		
			
				|  |  | -                                c, h, r, n])
 | 
	
		
			
				|  |  | -                    crc = mfm.crc16.new(am).crcValue
 | 
	
		
			
				|  |  | -                    if errs.id_crc_error:
 | 
	
		
			
				|  |  | -                        crc ^= 0x5555
 | 
	
		
			
				|  |  | -                    am += struct.pack('>H', crc)
 | 
	
		
			
				|  |  | -                    t += mfm.encode(am[3:])
 | 
	
		
			
				|  |  | -                    t += mfm.encode(bytes([track.gapbyte] * track.gap_2))
 | 
	
		
			
				|  |  | +                    if not idam_included:
 | 
	
		
			
				|  |  | +                        t += mfm.encode(bytes(track.gap_presync))
 | 
	
		
			
				|  |  | +                        t += mfm.sync_bytes
 | 
	
		
			
				|  |  | +                        am = bytes([0xa1, 0xa1, 0xa1, mfm.IBM_MFM.IDAM,
 | 
	
		
			
				|  |  | +                                    c, h, r, n])
 | 
	
		
			
				|  |  | +                        crc = mfm.crc16.new(am).crcValue
 | 
	
		
			
				|  |  | +                        if errs.id_crc_error:
 | 
	
		
			
				|  |  | +                            crc ^= 0x5555
 | 
	
		
			
				|  |  | +                        am += struct.pack('>H', crc)
 | 
	
		
			
				|  |  | +                        t += mfm.encode(am[3:])
 | 
	
		
			
				|  |  | +                        t += mfm.encode(bytes([track.gapbyte] * track.gap_2))
 | 
	
		
			
				|  |  |                      # DAM
 | 
	
		
			
				|  |  | +                    gap_included, idam_included = False, False
 | 
	
		
			
				|  |  |                      if errs.id_crc_error or errs.data_not_found:
 | 
	
		
			
				|  |  |                          continue
 | 
	
		
			
				|  |  |                      t += mfm.encode(bytes(track.gap_presync))
 | 
	
	
		
			
				|  | @@ -314,7 +316,6 @@ class EDSK(Image):
 | 
	
		
			
				|  |  |                      track.weak += [((s+len(t)//2+1)*16, n*16) for s,n in weak]
 | 
	
		
			
				|  |  |                      dmark = (mfm.IBM_MFM.DDAM if errs.deleted_dam
 | 
	
		
			
				|  |  |                               else mfm.IBM_MFM.DAM)
 | 
	
		
			
				|  |  | -                    gap_included = False
 | 
	
		
			
				|  |  |                      if errs.data_crc_error:
 | 
	
		
			
				|  |  |                          if sh:
 | 
	
		
			
				|  |  |                              # Look for next IDAM
 | 
	
	
		
			
				|  | @@ -335,26 +336,41 @@ class EDSK(Image):
 | 
	
		
			
				|  |  |                          # Pad short data
 | 
	
		
			
				|  |  |                          sec_data += bytes(native_size - data_size)
 | 
	
		
			
				|  |  |                      elif data_size > native_size:
 | 
	
		
			
				|  |  | -                        # Clip long data
 | 
	
		
			
				|  |  | +                        # Clip long data if it includes pre-sync 00 bytes
 | 
	
		
			
				|  |  |                          if (sec_data[-13] != 0
 | 
	
		
			
				|  |  |                              and all([v==0 for v in sec_data[-12:]])):
 | 
	
		
			
				|  |  |                              # Includes next pre-sync: Clip it.
 | 
	
		
			
				|  |  |                              sec_data = sec_data[:-12]
 | 
	
		
			
				|  |  | +                        if sh:
 | 
	
		
			
				|  |  | +                            # Look for next IDAM
 | 
	
		
			
				|  |  | +                            idam = bytes([0]*12 + [0xa1]*3 + [mfm.IBM_MFM.IDAM]
 | 
	
		
			
				|  |  | +                                         + list(sh[:4]))
 | 
	
		
			
				|  |  | +                            idx = sec_data.find(idam)
 | 
	
		
			
				|  |  | +                            if idx > native_size:
 | 
	
		
			
				|  |  | +                                # Sector data includes next IDAM. Output it
 | 
	
		
			
				|  |  | +                                # here and skip it on next iteration.
 | 
	
		
			
				|  |  | +                                t += mfm.encode(bytes([dmark]))
 | 
	
		
			
				|  |  | +                                t += mfm.encode(sec_data[:idx+12])
 | 
	
		
			
				|  |  | +                                t += mfm.sync_bytes
 | 
	
		
			
				|  |  | +                                t += mfm.encode(sec_data[idx+12+3:])
 | 
	
		
			
				|  |  | +                                idam_included = True
 | 
	
		
			
				|  |  | +                                continue
 | 
	
		
			
				|  |  |                          # Long data includes CRC and GAP
 | 
	
		
			
				|  |  |                          gap_included = True
 | 
	
		
			
				|  |  | -                    am = bytes([0xa1, 0xa1, 0xa1, dmark]) + sec_data
 | 
	
		
			
				|  |  |                      if gap_included:
 | 
	
		
			
				|  |  | -                        t += mfm.encode(am[3:])
 | 
	
		
			
				|  |  | -                    else:
 | 
	
		
			
				|  |  | -                        crc = mfm.crc16.new(am).crcValue
 | 
	
		
			
				|  |  | -                        if errs.data_crc_error:
 | 
	
		
			
				|  |  | -                            crc ^= 0x5555
 | 
	
		
			
				|  |  | -                        am += struct.pack('>H', crc)
 | 
	
		
			
				|  |  | -                        t += mfm.encode(am[3:])
 | 
	
		
			
				|  |  | -                        if sh:
 | 
	
		
			
				|  |  | -                            # GAP3 for all but last sector
 | 
	
		
			
				|  |  | -                            t += mfm.encode(bytes([track.gapbyte] * gap_3))
 | 
	
		
			
				|  |  | -                            ngap3 += 1
 | 
	
		
			
				|  |  | +                        t += mfm.encode(bytes[dmark])
 | 
	
		
			
				|  |  | +                        t += mfm.encode(sec_data)
 | 
	
		
			
				|  |  | +                        continue
 | 
	
		
			
				|  |  | +                    am = bytes([0xa1, 0xa1, 0xa1, dmark]) + sec_data
 | 
	
		
			
				|  |  | +                    crc = mfm.crc16.new(am).crcValue
 | 
	
		
			
				|  |  | +                    if errs.data_crc_error:
 | 
	
		
			
				|  |  | +                        crc ^= 0x5555
 | 
	
		
			
				|  |  | +                    am += struct.pack('>H', crc)
 | 
	
		
			
				|  |  | +                    t += mfm.encode(am[3:])
 | 
	
		
			
				|  |  | +                    if sh:
 | 
	
		
			
				|  |  | +                        # GAP3 for all but last sector
 | 
	
		
			
				|  |  | +                        t += mfm.encode(bytes([track.gapbyte] * gap_3))
 | 
	
		
			
				|  |  | +                        ngap3 += 1
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  # Special track handlers
 | 
	
		
			
				|  |  |                  special_track = cls()._build_8k_track(sectors)
 |