docs: def read_sis(fh, byteorder, dtype, count, offsetsize):
      """Read OlympusSIS structure and return as dict.
  
      No specification is avaliable. Only few fields are known.
  
      """
      result = {}
  
      (magic, _, minute, hour, day, month, year, _, name, tagcount
       ) = struct.unpack('<4s6shhhhh6s32sh', fh.read(60))
  
      if magic != b'SIS0':
          raise ValueError('invalid OlympusSIS structure')
  
      result['name'] = bytes2str(stripnull(name))
      try:
          result['datetime'] = datetime.datetime(1900+year, month+1, day,
                                                 hour, minute)
      except ValueError:
          pass
  
      data = fh.read(8 * tagcount)
      for i in range(0, tagcount*8, 8):
          tagtype, count, offset = struct.unpack('<hhI', data[i:i+8])
          fh.seek(offset)
          if tagtype == 1:
              # general data
              (_, lenexp, xcal, ycal, _, mag, _, camname, pictype,
               ) = struct.unpack('<10shdd8sd2s34s32s', fh.read(112))  # 220
              m = math.pow(10, lenexp)
              result['pixelsizex'] = xcal * m
              result['pixelsizey'] = ycal * m
              result['magnification'] = mag
              result['cameraname'] = bytes2str(stripnull(camname))
              result['picturetype'] = bytes2str(stripnull(pictype))
          elif tagtype == 10:
              # channel data
              continue
              # TODO: does not seem to work?
              # (length, _, exptime, emv, _, camname, _, mictype,
              #  ) = struct.unpack('<h22sId4s32s48s32s', fh.read(152))  # 720
              # result['exposuretime'] = exptime
              # result['emvoltage'] = emv
              # result['cameraname2'] = bytes2str(stripnull(camname))
              # result['microscopename'] = bytes2str(stripnull(mictype))
  
      return result