Difference between revisions of "DFI image format"

From DiscFerret
Jump to: navigation, search
(New-style images: Fix another stupid logic bug)
 
(2 intermediate revisions by the same user not shown)
Line 38: Line 38:
 
=== New-style images ===
 
=== New-style images ===
 
  <nowiki>
 
  <nowiki>
carry = 0
+
carry = 0   // running carry
 +
abspos = 0  // absolute timing position in stream
 
For every byte in the stream:
 
For every byte in the stream:
 
   if ((byte AND 0x7f) == 0x7f):    // if lower 7 bit value is 0x7f
 
   if ((byte AND 0x7f) == 0x7f):    // if lower 7 bit value is 0x7f
     carry = carry + 127
+
     carry = carry + 127            // ... then there was a carry
 +
    abspos = abspos + 127
 
   else if (byte AND 0x80) != 0:    // if high bit set in byte
 
   else if (byte AND 0x80) != 0:    // if high bit set in byte
     carry = carry + (byte & 0x7F)  // add lower 7 bit value to carry
+
     carry = carry + (byte & 0x7F)  // add lower 7 bit value to carry and absolute-position
     add_index_position(carry)     // add high bit to carry
+
    abspos = abspos + (byte & 0x7F)
 +
     add_index_position(abspos)     // this store was caused by an index pulse: save its absolute position
 
   else:                            // here byte < 0x7f
 
   else:                            // here byte < 0x7f
     emit((byte AND 0x7f) + carry)  // report carry + byte
+
     emit((byte AND 0x7f) + carry)  // this store was caused by a data transition: store the time-delta since last transition
 +
    abspos = abspos + (byte & 0x7F)
 
     carry = 0                      // reset carry
 
     carry = 0                      // reset carry
if carry > 0:                      //
 
  emit(carry)                      // report carry
 
  
// emit() stores the timing value
+
// Carry may be nonzero at the end of this loop. In this case, there was an incomplete transition, which should be discarded.
// add_index_position() stores the timing position of an index pulse
+
 
 +
// emit()                 stores the timing delta for a data pulse
 +
// add_index_position()   stores the absolute timing position of an index pulse
 
//  
 
//  
 
</nowiki>
 
</nowiki>

Latest revision as of 23:45, 25 April 2012


Format originator: DiscFerret software.

Overall format

All integers in this file format are stored in big-endian form.

The DFI file consists of a 4-byte magic string, followed by a series of disc sample blocks.

The magic string is "DFER" for old-style DiscFerret images, or "DFE2" for new-style DiscFerret images.

Each sample block has a header --

uint16_be cylinder;
uint16_be head;
uint16_be sector;
uint32_be data_length;

The cylinder number starts at zero and counts up to the number of cylinders on the disk. The head number follows the same rule (starts at zero, increments for each additional head). The sector number is optional, and only used for hard-sectored discs. For soft-sectored discs, it is set to zero. Data_length indicates the number of bytes of data which follow.

Decoding data

Old-style images

carry = 0
For every byte in the stream:
  if (byte AND 0x7f) == 0x00:
    carry = carry + 127
  else:
    emit((byte AND 0x7f) + carry)
    carry = 0
if carry > 0:
  emit(carry)

New-style images

carry = 0   // running carry
abspos = 0  // absolute timing position in stream
For every byte in the stream:
  if ((byte AND 0x7f) == 0x7f):    // if lower 7 bit value is 0x7f
    carry = carry + 127            // ... then there was a carry
    abspos = abspos + 127
  else if (byte AND 0x80) != 0:    // if high bit set in byte
    carry = carry + (byte & 0x7F)  // add lower 7 bit value to carry and absolute-position
    abspos = abspos + (byte & 0x7F)
    add_index_position(abspos)     // this store was caused by an index pulse: save its absolute position
  else:                            // here byte < 0x7f
    emit((byte AND 0x7f) + carry)  // this store was caused by a data transition: store the time-delta since last transition
    abspos = abspos + (byte & 0x7F)
    carry = 0                      // reset carry

// Carry may be nonzero at the end of this loop. In this case, there was an incomplete transition, which should be discarded.

// emit()                 stores the timing delta for a data pulse
// add_index_position()   stores the absolute timing position of an index pulse
//