Esempio n. 1
0
int hitbuffer_inc(hitbuffer *hb, Z32 *hit) {
	hb->freq += 1LLU; //LLU for 64-bit.  OSX 10.5 is VERY finicky about this.
	int result;
	if (hb->freq < PHILO_INDEX_CUTOFF) {
		add_to_dir(hb, hit, 1);
//		fprintf(stderr, "added hit for %s...\n", hb->word);
	}
	else if (hb->freq == PHILO_INDEX_CUTOFF) {
			//when the frequency reaches 10, we start using a block-header layout.
			//each "hit" in the directory corresponds to a large, compressed block of hits.
			//by comparing the directory headers to the query, the search engine skips blocks if possible.

			result = add_to_block(hb,&(hb->dir[1*hb->db->dbspec->fields]),PHILO_INDEX_CUTOFF - 2);
			if (result == PHILO_BLOCK_FULL) {
				fprintf(stderr, "you can't fit PHILO_INDEX_CUTOFF hits into a block!  adjust your block size, or your index cutoff.\n");	
			}

			hb->dir_length = 1LLU;
			hb->type = 1;
			result = add_to_block(hb,hit,1);
//			fprintf(stderr, "clearing dir.  started new block for %s...\n", hb->word);
	}
	if (hb->freq > PHILO_INDEX_CUTOFF) {
		result = add_to_block(hb,hit,1);
		if (result == PHILO_BLOCK_FULL) {
			// IF the block add failed,
			write_blk(hb); //write the full block out, start a new one,
			add_to_dir(hb,hit,1); //then push the current hit onto the directory.
//			fprintf(stderr, "started new block for %s...\n", hb->word);
		}
	}		
	return 0;
}
Esempio n. 2
0
int hitbuffer_finish(hitbuffer *hb) {
	if (!strcmp(hb->word, "")) {
		return 0;
	}
	if (hb->type == 0) {	
	  //		fprintf(stderr, "%s: %d\n", hb->word, (int)hb->freq);
		write_dir(hb);
	}
	else if (hb->type == 1) {
	  //	fprintf(stderr, "%s: %d [%d blocks]\n", hb->word, (int)hb->freq, (int)hb->dir_length);
		write_dir(hb);
		write_blk(hb);
	}
	return 0;
}
Esempio n. 3
0
int sys_write(int fd, char *buf, size_t size)
{
	struct file *file;
	struct inode *inode;
	int res;

	if (fd > NR_OPEN || !(file = (CURRENT_TASK() )->file[fd]))
		return -EBADF;
	if (!(file->f_mode & O_WRITE))
		return -EBADF;

	inode = idup(file->f_inode);
	if (file->f_mode & O_APPEND)
		file->f_pos = inode->i_size;
	switch (inode->i_mode & S_IFMT) {
		case S_IFREG:
			res = write_file(inode, buf, file->f_pos, size);
			break;
		case S_IFDIR:
			res = -EISDIR;
			break;
		case S_IFCHR:
			res = write_char(inode->i_rdev, buf, file->f_pos,
					size);
			break;
		case S_IFBLK:
			res = write_blk(inode->i_rdev, buf, file->f_pos,
					size);
			break;
		case S_IFIFO:
			res= write_pipe(inode,buf,size);
			break;
		default:
			res = -EIO;
	}

	if (res > 0)
		file->f_pos += res;
	if(file->f_pos>inode->i_size)
		inode->i_size=file->f_pos;

	iput(inode);
	return res;
}
Esempio n. 4
0
static int request_code_segment(struct ft1000_usb *ft1000dev, u16 **s_file,
		 u8 **c_file, const u8 *endpoint, bool boot_case)
{
	long word_length;
	int status = 0;

	/*DEBUG("FT1000:REQUEST_CODE_SEGMENT\n");i*/
	word_length = get_request_value(ft1000dev);
	/*DEBUG("FT1000:word_length = 0x%x\n", (int)word_length); */
	/*NdisMSleep (100); */
	if (word_length > MAX_LENGTH) {
		DEBUG("FT1000:download:Download error: Max length exceeded\n");
		return STATUS_FAILURE;
	}
	if ((word_length * 2 + (long)c_file) > (long)endpoint) {
		/* Error, beyond boot code range.*/
		DEBUG("FT1000:download:Download error: Requested len=%d exceeds BOOT code boundary.\n", (int)word_length);
		return STATUS_FAILURE;
	}
	if (word_length & 0x1)
		word_length++;
	word_length = word_length / 2;

	if (boot_case) {
		status = write_blk(ft1000dev, s_file, c_file, word_length);
		/*DEBUG("write_blk returned %d\n", status); */
	} else {
		write_blk_fifo(ft1000dev, s_file, c_file, word_length);
		if (ft1000dev->usbboot == 0)
			ft1000dev->usbboot++;
		if (ft1000dev->usbboot == 1)
			ft1000_write_dpram16(ft1000dev,
					DWNLD_MAG1_PS_HDR_LOC, 0, 0);
	}
	return status;
}
Esempio n. 5
0
u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
		u32 FileLength)
{
	u16 status = STATUS_SUCCESS;
	u32 state;
	u16 handshake;
	struct pseudo_hdr *pseudo_header;
	u16 pseudo_header_len;
	long word_length;
	u16 request;
	u16 temp;
	u16 tempword;

	struct dsp_file_hdr *file_hdr;
	struct dsp_image_info *dsp_img_info = NULL;
	long requested_version;
	bool correct_version;
	struct drv_msg *mailbox_data;
	u16 *data = NULL;
	u16 *s_file = NULL;
	u8 *c_file = NULL;
	u8 *boot_end = NULL, *code_end = NULL;
	int image;
	long loader_code_address, loader_code_size = 0;
	long run_address = 0, run_size = 0;

	u32 templong;
	u32 image_chksum = 0;

	u16 dpram = 0;
	u8 *pbuffer;
	struct prov_record *pprov_record;
	struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);

	DEBUG("Entered   scram_dnldr...\n");

	pft1000info->fcodeldr = 0;
	pft1000info->usbboot = 0;
	pft1000info->dspalive = 0xffff;

	//
	// Get version id of file, at first 4 bytes of file, for newer files.
	//

	state = STATE_START_DWNLD;

	file_hdr = (struct dsp_file_hdr *)pFileStart;

	ft1000_write_register(ft1000dev, 0x800, FT1000_REG_MAG_WATERMARK);

	s_file = (u16 *) (pFileStart + file_hdr->loader_offset);
	c_file = (u8 *) (pFileStart + file_hdr->loader_offset);

	boot_end = (u8 *) (pFileStart + file_hdr->loader_code_end);

	loader_code_address = file_hdr->loader_code_address;
	loader_code_size = file_hdr->loader_code_size;
	correct_version = FALSE;

	while ((status == STATUS_SUCCESS) && (state != STATE_DONE_FILE)) {
		switch (state) {
		case STATE_START_DWNLD:
			DEBUG("FT1000:STATE_START_DWNLD\n");
			if (pft1000info->usbboot)
				handshake =
				    get_handshake_usb(ft1000dev,
						      HANDSHAKE_DSP_BL_READY);
			else
				handshake =
				    get_handshake(ft1000dev,
						  HANDSHAKE_DSP_BL_READY);

			if (handshake == HANDSHAKE_DSP_BL_READY) {
				DEBUG
				    ("scram_dnldr: handshake is HANDSHAKE_DSP_BL_READY, call put_handshake(HANDSHAKE_DRIVER_READY)\n");
				put_handshake(ft1000dev,
					      HANDSHAKE_DRIVER_READY);
			} else {
				DEBUG
				    ("FT1000:download:Download error: Handshake failed\n");
				status = STATUS_FAILURE;
			}

			state = STATE_BOOT_DWNLD;

			break;

		case STATE_BOOT_DWNLD:
			DEBUG("FT1000:STATE_BOOT_DWNLD\n");
			pft1000info->bootmode = 1;
			handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST);
			if (handshake == HANDSHAKE_REQUEST) {
				/*
				 * Get type associated with the request.
				 */
				request = get_request_type(ft1000dev);
				switch (request) {
				case REQUEST_RUN_ADDRESS:
					DEBUG("FT1000:REQUEST_RUN_ADDRESS\n");
					put_request_value(ft1000dev,
							  loader_code_address);
					break;
				case REQUEST_CODE_LENGTH:
					DEBUG("FT1000:REQUEST_CODE_LENGTH\n");
					put_request_value(ft1000dev,
							  loader_code_size);
					break;
				case REQUEST_DONE_BL:
					DEBUG("FT1000:REQUEST_DONE_BL\n");
					/* Reposition ptrs to beginning of code section */
					s_file = (u16 *) (boot_end);
					c_file = (u8 *) (boot_end);
					//DEBUG("FT1000:download:s_file = 0x%8x\n", (int)s_file);
					//DEBUG("FT1000:download:c_file = 0x%8x\n", (int)c_file);
					state = STATE_CODE_DWNLD;
					pft1000info->fcodeldr = 1;
					break;
				case REQUEST_CODE_SEGMENT:
					//DEBUG("FT1000:REQUEST_CODE_SEGMENT\n");
					word_length =
					    get_request_value(ft1000dev);
					//DEBUG("FT1000:word_length = 0x%x\n", (int)word_length);
					//NdisMSleep (100);
					if (word_length > MAX_LENGTH) {
						DEBUG
						    ("FT1000:download:Download error: Max length exceeded\n");
						status = STATUS_FAILURE;
						break;
					}
					if ((word_length * 2 + c_file) >
					    boot_end) {
						/*
						 * Error, beyond boot code range.
						 */
						DEBUG
						    ("FT1000:download:Download error: Requested len=%d exceeds BOOT code boundary.\n",
						     (int)word_length);
						status = STATUS_FAILURE;
						break;
					}
					/*
					 * Position ASIC DPRAM auto-increment pointer.
					 */
					dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
					if (word_length & 0x1)
						word_length++;
					word_length = word_length / 2;

					status =
					    write_blk(ft1000dev, &s_file,
						      &c_file, word_length);
					//DEBUG("write_blk returned %d\n", status);
					break;
				default:
					DEBUG
					    ("FT1000:download:Download error: Bad request type=%d in BOOT download state.\n",
					     request);
					status = STATUS_FAILURE;
					break;
				}
				if (pft1000info->usbboot)
					put_handshake_usb(ft1000dev,
							  HANDSHAKE_RESPONSE);
				else
					put_handshake(ft1000dev,
						      HANDSHAKE_RESPONSE);
			} else {
				DEBUG
				    ("FT1000:download:Download error: Handshake failed\n");
				status = STATUS_FAILURE;
			}

			break;

		case STATE_CODE_DWNLD:
			//DEBUG("FT1000:STATE_CODE_DWNLD\n");
			pft1000info->bootmode = 0;
			if (pft1000info->usbboot)
				handshake =
				    get_handshake_usb(ft1000dev,
						      HANDSHAKE_REQUEST);
			else
				handshake =
				    get_handshake(ft1000dev, HANDSHAKE_REQUEST);
			if (handshake == HANDSHAKE_REQUEST) {
				/*
				 * Get type associated with the request.
				 */
				if (pft1000info->usbboot)
					request =
					    get_request_type_usb(ft1000dev);
				else
					request = get_request_type(ft1000dev);
				switch (request) {
				case REQUEST_FILE_CHECKSUM:
					DEBUG
					    ("FT1000:download:image_chksum = 0x%8x\n",
					     image_chksum);
					put_request_value(ft1000dev,
							  image_chksum);
					break;
				case REQUEST_RUN_ADDRESS:
					DEBUG
					    ("FT1000:download:  REQUEST_RUN_ADDRESS\n");
					if (correct_version) {
						DEBUG
						    ("FT1000:download:run_address = 0x%8x\n",
						     (int)run_address);
						put_request_value(ft1000dev,
								  run_address);
					} else {
						DEBUG
						    ("FT1000:download:Download error: Got Run address request before image offset request.\n");
						status = STATUS_FAILURE;
						break;
					}
					break;
				case REQUEST_CODE_LENGTH:
					DEBUG
					    ("FT1000:download:REQUEST_CODE_LENGTH\n");
					if (correct_version) {
						DEBUG
						    ("FT1000:download:run_size = 0x%8x\n",
						     (int)run_size);
						put_request_value(ft1000dev,
								  run_size);
					} else {
						DEBUG
						    ("FT1000:download:Download error: Got Size request before image offset request.\n");
						status = STATUS_FAILURE;
						break;
					}
					break;
				case REQUEST_DONE_CL:
					pft1000info->usbboot = 3;
					/* Reposition ptrs to beginning of provisioning section */
					s_file =
					    (u16 *) (pFileStart +
						     file_hdr->commands_offset);
					c_file =
					    (u8 *) (pFileStart +
						    file_hdr->commands_offset);
					state = STATE_DONE_DWNLD;
					break;
				case REQUEST_CODE_SEGMENT:
					//DEBUG("FT1000:download: REQUEST_CODE_SEGMENT - CODELOADER\n");
					if (!correct_version) {
						DEBUG
						    ("FT1000:download:Download error: Got Code Segment request before image offset request.\n");
						status = STATUS_FAILURE;
						break;
					}

					word_length =
					    get_request_value(ft1000dev);
					//DEBUG("FT1000:download:word_length = %d\n", (int)word_length);
					if (word_length > MAX_LENGTH) {
						DEBUG
						    ("FT1000:download:Download error: Max length exceeded\n");
						status = STATUS_FAILURE;
						break;
					}
					if ((word_length * 2 + c_file) >
					    code_end) {
						/*
						 * Error, beyond boot code range.
						 */
						DEBUG
						    ("FT1000:download:Download error: Requested len=%d exceeds DSP code boundary.\n",
						     (int)word_length);
						status = STATUS_FAILURE;
						break;
					}
					/*
					 * Position ASIC DPRAM auto-increment pointer.
					 */
					dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
					if (word_length & 0x1)
						word_length++;
					word_length = word_length / 2;

					write_blk_fifo(ft1000dev, &s_file,
						       &c_file, word_length);
					if (pft1000info->usbboot == 0)
						pft1000info->usbboot++;
					if (pft1000info->usbboot == 1) {
						tempword = 0;
						ft1000_write_dpram16(ft1000dev,
								     DWNLD_MAG1_PS_HDR_LOC,
								     tempword,
								     0);
					}

					break;

				case REQUEST_MAILBOX_DATA:
					DEBUG
					    ("FT1000:download: REQUEST_MAILBOX_DATA\n");
					// Convert length from byte count to word count. Make sure we round up.
					word_length =
					    (long)(pft1000info->DSPInfoBlklen +
						   1) / 2;
					put_request_value(ft1000dev,
							  word_length);
					mailbox_data =
					    (struct drv_msg *)&(pft1000info->
								DSPInfoBlk[0]);
					/*
					 * Position ASIC DPRAM auto-increment pointer.
					 */

					data = (u16 *) & mailbox_data->data[0];
					dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
					if (word_length & 0x1)
						word_length++;

					word_length = (word_length / 2);

					for (; word_length > 0; word_length--) {	/* In words */

						templong = *data++;
						templong |= (*data++ << 16);
						status =
						    fix_ft1000_write_dpram32
						    (ft1000dev, dpram++,
						     (u8 *) & templong);

					}
					break;

				case REQUEST_VERSION_INFO:
					DEBUG
					    ("FT1000:download:REQUEST_VERSION_INFO\n");
					word_length =
					    file_hdr->version_data_size;
					put_request_value(ft1000dev,
							  word_length);
					/*
					 * Position ASIC DPRAM auto-increment pointer.
					 */

					s_file =
					    (u16 *) (pFileStart +
						     file_hdr->
						     version_data_offset);

					dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
					if (word_length & 0x1)
						word_length++;

					word_length = (word_length / 2);

					for (; word_length > 0; word_length--) {	/* In words */

						templong = ntohs(*s_file++);
						temp = ntohs(*s_file++);
						templong |= (temp << 16);
						status =
						    fix_ft1000_write_dpram32
						    (ft1000dev, dpram++,
						     (u8 *) & templong);

					}
					break;

				case REQUEST_CODE_BY_VERSION:
					DEBUG
					    ("FT1000:download:REQUEST_CODE_BY_VERSION\n");
					correct_version = FALSE;
					requested_version =
					    get_request_value(ft1000dev);

					dsp_img_info =
					    (struct dsp_image_info *)(pFileStart
								      +
								      sizeof
								      (struct
								       dsp_file_hdr));

					for (image = 0;
					     image < file_hdr->nDspImages;
					     image++) {

						if (dsp_img_info->version ==
						    requested_version) {
							correct_version = TRUE;
							DEBUG
							    ("FT1000:download: correct_version is TRUE\n");
							s_file =
							    (u16 *) (pFileStart
								     +
								     dsp_img_info->
								     begin_offset);
							c_file =
							    (u8 *) (pFileStart +
								    dsp_img_info->
								    begin_offset);
							code_end =
							    (u8 *) (pFileStart +
								    dsp_img_info->
								    end_offset);
							run_address =
							    dsp_img_info->
							    run_address;
							run_size =
							    dsp_img_info->
							    image_size;
							image_chksum =
							    (u32) dsp_img_info->
							    checksum;
							break;
						}
						dsp_img_info++;

					}	//end of for

					if (!correct_version) {
						/*
						 * Error, beyond boot code range.
						 */
						DEBUG
						    ("FT1000:download:Download error: Bad Version Request = 0x%x.\n",
						     (int)requested_version);
						status = STATUS_FAILURE;
						break;
					}
					break;

				default:
					DEBUG
					    ("FT1000:download:Download error: Bad request type=%d in CODE download state.\n",
					     request);
					status = STATUS_FAILURE;
					break;
				}
				if (pft1000info->usbboot)
					put_handshake_usb(ft1000dev,
							  HANDSHAKE_RESPONSE);
				else
					put_handshake(ft1000dev,
						      HANDSHAKE_RESPONSE);
			} else {
				DEBUG
				    ("FT1000:download:Download error: Handshake failed\n");
				status = STATUS_FAILURE;
			}

			break;

		case STATE_DONE_DWNLD:
			DEBUG("FT1000:download:Code loader is done...\n");
			state = STATE_SECTION_PROV;
			break;

		case STATE_SECTION_PROV:
			DEBUG("FT1000:download:STATE_SECTION_PROV\n");
			pseudo_header = (struct pseudo_hdr *)c_file;

			if (pseudo_header->checksum ==
			    hdr_checksum(pseudo_header)) {
				if (pseudo_header->portdest !=
				    0x80 /* Dsp OAM */ ) {
					state = STATE_DONE_PROV;
					break;
				}
				pseudo_header_len = ntohs(pseudo_header->length);	/* Byte length for PROV records */

				// Get buffer for provisioning data
				pbuffer =
				    kmalloc((pseudo_header_len +
					     sizeof(struct pseudo_hdr)),
					    GFP_ATOMIC);
				if (pbuffer) {
					memcpy(pbuffer, (void *)c_file,
					       (u32) (pseudo_header_len +
						      sizeof(struct
							     pseudo_hdr)));
					// link provisioning data
					pprov_record =
					    kmalloc(sizeof(struct prov_record),
						    GFP_ATOMIC);
					if (pprov_record) {
						pprov_record->pprov_data =
						    pbuffer;
						list_add_tail(&pprov_record->
							      list,
							      &pft1000info->
							      prov_list);
						// Move to next entry if available
						c_file =
						    (u8 *) ((unsigned long)
							    c_file +
							    (u32) ((pseudo_header_len + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr));
						if ((unsigned long)(c_file) -
						    (unsigned long)(pFileStart)
						    >=
						    (unsigned long)FileLength) {
							state = STATE_DONE_FILE;
						}
					} else {
						kfree(pbuffer);
						status = STATUS_FAILURE;
					}
				} else {
					status = STATUS_FAILURE;
				}
			} else {
				/* Checksum did not compute */
				status = STATUS_FAILURE;
			}
			DEBUG
			    ("ft1000:download: after STATE_SECTION_PROV, state = %d, status= %d\n",
			     state, status);
			break;

		case STATE_DONE_PROV:
			DEBUG("FT1000:download:STATE_DONE_PROV\n");
			state = STATE_DONE_FILE;
			break;

		default:
			status = STATUS_FAILURE;
			break;
		}		/* End Switch */

		if (status != STATUS_SUCCESS) {
			break;
		}

/****
      // Check if Card is present
      status = Harley_Read_Register(&temp, FT1000_REG_SUP_IMASK);
      if ( (status != NDIS_STATUS_SUCCESS) || (temp == 0x0000) ) {
          break;
      }

      status = Harley_Read_Register(&temp, FT1000_REG_ASIC_ID);
      if ( (status != NDIS_STATUS_SUCCESS) || (temp == 0xffff) ) {
          break;
      }
****/

	}			/* End while */

	DEBUG("Download exiting with status = 0x%8x\n", status);
	ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX,
			      FT1000_REG_DOORBELL);

	return status;
}
Esempio n. 6
0
void create_ods2(FILE *fout, char *volname, int volsize)
{
    unsigned char out_line[512];
    int i;
    struct _hm2 *pHM2$;
    struct _fh2 *pFH2;
    struct FM2_C_FORMAT2 *pFM2;
    struct _fi2*pFI2;

//volume name and size
    strcpy(volnam, volname);
    volumesize=volsize;

//cluster size...
    if (volumesize<=50000)
        clustersize=1;
    else
    {
        clustersize = roundup( ((double) volumesize)/(255 * 4096));
        if (clustersize<3) clustersize=3;
    }
    clustersize=17;
//maxfiles
    maxfiles=volumesize/((clustersize+1)*2);
    if (maxfiles>(volumesize/(clustersize+1))) maxfiles=volumesize/(clustersize+1);
//indefilesize
    indexfilesize=((4*clustersize)+roundup(((double) maxfiles)/4096)+16);
    diffsizeindexf=indexfilesize;
    indexfilesize=clustersize*roundup((double) indexfilesize/clustersize);
    diffsizeindexf=indexfilesize-diffsizeindexf;
//
    printf("Initialize device Version 0.2b\n");
    printf("Volume Size %d Cluster %d Maxfiles %d\n", volumesize, clustersize, maxfiles);
    printf("Indexfile size %d\n", indexfilesize);

//Cluster 1, 2 and 3

    //Boot Block: don't know what to do, just put all to 0
    for(i=0; i<512; i++) out_line[i]=0;
    write_blk(out_line, fout, "Boot block");

    //Home Block: construct
    pHM2$ = (struct _hm2 *) out_line;
    pHM2$->hm2$l_homelbn=1;
    pHM2$->hm2$w_homevbn=2;
    pHM2$->hm2$l_alhomelbn=clustersize*2;
    pHM2$->hm2$w_alhomevbn=clustersize*2+1;
    pHM2$->hm2$l_altidxlbn=clustersize*3;
    pHM2$->hm2$w_altidxvbn=clustersize*3+1;
    pHM2$->hm2$w_struclev=2*256+1;
    pHM2$->hm2$w_cluster=clustersize;
    pHM2$->hm2$w_ibmapvbn=VMSWORD(clustersize*4+1);
    pHM2$->hm2$l_ibmaplbn=VMSLONG(clustersize*4);
    ibmaplbn=pHM2$->hm2$l_ibmaplbn;
    pHM2$->hm2$l_maxfiles=(maxfiles);
    pHM2$->hm2$w_ibmapsize=VMSWORD(roundup( ( (double) pHM2$->hm2$l_maxfiles)/4096 ));
    ibmapsize=pHM2$->hm2$w_ibmapsize;
    pHM2$->hm2$w_resfiles=10;
    do_checksum_count(out_line,(short *)&pHM2$->hm2$w_checksum1-(short*)pHM2$);
    pHM2$->hm2$w_extend=clustersize;
    strcpy(pHM2$->hm2$t_strucname,"            ");
    strcpy(pHM2$->hm2$t_volname , volnam);
    strcpy(pHM2$->hm2$t_ownername, owner);
    strcpy(pHM2$->hm2$t_format,   "DECFILE11B  ");
    do_checksum(out_line);
    write_blk(out_line, fout, "first home Block\0"); //write first home block

    for(i=0; i<3*clustersize-2; i++) //fill the rest of the cluster and the next two clusters
    {
        pHM2$->hm2$l_homelbn=2+i;
        pHM2$->hm2$w_homevbn=3+i;
        write_blk(out_line, fout, "\0");
    }

// Cluster 4
    //Backup Index File Header
    for(i=0; i<512; i++) out_line[i]=0; //clear all

    //index file header:
    // header area
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=1;
    pFH2->fh2$w_fid.fid$w_seq=1;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"INDEXF.SYS;1");
    // map area
    pFM2 = (struct FM2_C_FORMAT2 *) (out_line+(2*pFH2->fh2$b_mpoffset));
    pFM2->fm2$w_word0=(ibmaplbn+ibmapsize)-1+16384; //Add 16384 for format type
    pFM2->fm2$v_count2=0;
    pFM2++;
    pFM2->fm2$w_word0=16-1+16384;
    pFM2->fm2$v_count2=ibmaplbn+ibmapsize;
    pFM2++;
#if 0
    pFM2->fm2$w_word0=indexfilesize-(pHM2$->hm2$l_ibmaplbn+pHM2$->hm2$w_ibmapsize+16)-1+16384;
    pFM2->fm2$v_count2=pHM2$->hm2$l_ibmaplbn+pHM2$->hm2$w_ibmapsize;
#endif
    pFH2->fh2$b_map_inuse=2*2;
    //file attribs
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=512;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(indexfilesize-diffsizeindexf);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(indexfilesize-diffsizeindexf+1); //not sure
    pFH2->fh2$w_recattr.fat$w_maxrec=512;
    do_checksum(out_line);
    write_blk(out_line, fout, "Backup Indexfile header"); //write down index file header

    // (the rest of the cluster is not used)
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    for(i=0; i<clustersize-1; i++) write_blk(out_line, fout, "\0");

// index file bitmap
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    int j = roundup(((double) maxfiles)/4096); //nbr of blocks in IFB
    out_line[0]=(unsigned char) 255;
    out_line[1]=(unsigned char) 1;   //files with number 1 to 9 reserved
    write_blk(out_line, fout, "Indexfile bitmap");
    for(i=0; i<512; i++) out_line[i]=0;  //clear all
    for(i=0; i<j-1; i++) write_blk(out_line, fout, "\0"); //rest of bitmap index

//index file header: Yeah once again !!!
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=VMSWORD(1);
    pFH2->fh2$w_fid.fid$w_seq=VMSWORD(1);
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"INDEXF.SYS;1");
    // map area
    pFM2 = (struct FM2_C_FORMAT2 *) (out_line+(2*pFH2->fh2$b_mpoffset));
    pFM2->fm2$w_word0=(ibmaplbn+ibmapsize)-1+16384; //Add 16384 for format type
    pFM2->fm2$v_count2=0;
    pFM2++;
    pFM2->fm2$w_word0=16-1+16384;
    pFM2->fm2$v_count2=ibmaplbn+ibmapsize;
    pFM2++;
#if 0
    pFM2->fm2$w_word0=indexfilesize-(pHM2$->hm2$l_ibmaplbn+pHM2$->hm2$w_ibmapsize+16)-1+16384;
    pFM2->fm2$v_count2=pHM2$->hm2$l_ibmaplbn+pHM2$->hm2$w_ibmapsize;
#endif
    pFH2->fh2$b_map_inuse=2*2;
    //file attribs
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=VMSWORD(512);
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(indexfilesize);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(indexfilesize-diffsizeindexf+1); //not sure
    pFH2->fh2$l_highwater=VMSLONG(indexfilesize+1);
    pFH2->fh2$w_recattr.fat$w_maxrec=VMSWORD(512);
    do_checksum(out_line);
    write_blk(out_line, fout, "Index file header"); //write down index file header

// header area 2.2 BITMAP.SYS;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    //pFH2->fh2$l_filechar[0]=128;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=2;
    pFH2->fh2$w_fid.fid$w_seq=2;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"BITMAP.SYS;1");
    // map area
    pFM2 = (struct FM2_C_FORMAT2 *) (out_line+(2*pFH2->fh2$b_mpoffset));
    storagebitmapsize=roundup( ( (double) (volumesize/clustersize))/4096);
    bitmapfilesize=clustersize*(roundup(((double) (storagebitmapsize+1))/clustersize));
    diffsizebitmap=bitmapfilesize-1-storagebitmapsize;
    pFM2->fm2$w_word0=bitmapfilesize-1+16384;
    pFM2->fm2$v_count2=(indexfilesize+clustersize);
    pFH2->fh2$b_map_inuse=2;
    //file attribs
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=512;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(bitmapfilesize);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(bitmapfilesize-diffsizebitmap+1);
    pFH2->fh2$l_highwater=VMSLONG(bitmapfilesize);
    pFH2->fh2$w_recattr.fat$w_maxrec=512;
    do_checksum(out_line);
    write_blk(out_line, fout, "bitmap.sys header"); //write down bitmap file header

// header area 3.3 BADBLK.SYS;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=3;
    pFH2->fh2$w_fid.fid$w_seq=3;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"BADBLK.SYS;1");
    // no map area
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=512;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(0);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(1);
    pFH2->fh2$l_highwater=VMSSWAP(1);
    pFH2->fh2$w_recattr.fat$w_maxrec=512;
    do_checksum(out_line);
    write_blk(out_line, fout, "badblk.sys header"); //write down file header

// header area 4.4 000000.DIR;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$l_filechar=128+256*32; // directory flags
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=4;
    pFH2->fh2$w_fid.fid$w_seq=4;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"000000.DIR;1");
    // map area
    pFM2 = (struct FM2_C_FORMAT2 *) (out_line+(2*pFH2->fh2$b_mpoffset));
    pFM2->fm2$w_word0=(clustersize-1)+16384;
    pFM2->fm2$v_count2=indexfilesize;
    pFH2->fh2$b_map_inuse=2; //3;
    pFH2->fh2$w_recattr.fat$b_rtype=2;
    pFH2->fh2$w_recattr.fat$b_rattrib=8;
    pFH2->fh2$w_recattr.fat$w_rsize=512;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(clustersize);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(2);
    pFH2->fh2$l_highwater=VMSSWAP(clustersize);
    pFH2->fh2$w_recattr.fat$w_maxrec=512;
    // seems .dir does not use this? pFH2->fh2$w_recattr.fat$w_ffbyte=216;
    do_checksum(out_line);
    write_blk(out_line, fout, "000000.dir header"); //write down file header

// header area 5.5 CORIMG.SYS;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=5;
    pFH2->fh2$w_fid.fid$w_seq=5;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"CORIMG.SYS;1");
    // no map area
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=512;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(0);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(1);
    pFH2->fh2$w_recattr.fat$w_maxrec=512;
    do_checksum(out_line);
    write_blk(out_line, fout, "corimg.sys header"); //write down file header

// header area 6.6 VOLSET.SYS;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=6;
    pFH2->fh2$w_fid.fid$w_seq=6;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"VOLSET.SYS;1");
    // no map area
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=64;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(0);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(1);
    pFH2->fh2$w_recattr.fat$w_maxrec=64;
    do_checksum(out_line);
    write_blk(out_line, fout, "volset.sys header"); //write down file header

// header area 7.7 CONTIN.SYS;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=7;
    pFH2->fh2$w_fid.fid$w_seq=7;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"CONTIN.SYS;1");
    // no map area
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=512;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(0);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(1);
    pFH2->fh2$w_recattr.fat$w_maxrec=512;
    do_checksum(out_line);
    write_blk(out_line, fout, "contin.sys header"); //write down file header

// header area 8.8 BACKUP.SYS;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=8;
    pFH2->fh2$w_fid.fid$w_seq=8;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"BACKUP.SYS;1");
    // no map area
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=64;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(0);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(1);
    pFH2->fh2$w_recattr.fat$w_maxrec=64;
    do_checksum(out_line);
    write_blk(out_line, fout, "backup.sys header"); //write down file header

// header area 9.9 BADLOG.SYS;1
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pFH2 = (struct _fh2 *) out_line;
    pFH2->fh2$b_idoffset=40;
    pFH2->fh2$b_mpoffset=100;
    pFH2->fh2$b_acoffset=255;
    pFH2->fh2$b_rsoffset=255;
    pFH2->fh2$w_seg_num=0;
    pFH2->fh2$w_struclev=2*256+1;
    pFH2->fh2$w_fid.fid$w_num=9;
    pFH2->fh2$w_fid.fid$w_seq=9;
    pFH2->fh2$w_fid.fid$b_rvn=0;
    pFH2->fh2$w_backlink.fid$w_num=4;
    pFH2->fh2$w_backlink.fid$w_seq=4;
    pFH2->fh2$w_backlink.fid$b_rvn=0;
    // identification area
    pFI2 = (struct _fi2*) (out_line+2*pFH2->fh2$b_idoffset);
    strcpy(pFI2->fi2$t_filename,"BADLOG.SYS;1");
    // no map area
    pFH2->fh2$w_recattr.fat$b_rtype=1;
    pFH2->fh2$w_recattr.fat$w_rsize=16;
    pFH2->fh2$w_recattr.fat$l_hiblk=VMSSWAP(0);
    pFH2->fh2$w_recattr.fat$l_efblk=VMSSWAP(1);
    pFH2->fh2$w_recattr.fat$w_maxrec=16;
    do_checksum(out_line);
    write_blk(out_line, fout, "badlog.sys header"); //write down file header

    for(i=0; i<512; i++) out_line[i]=0; //clear all

    for(i=0; i<7; i++) write_blk(out_line, fout, ""); // complete 16 file headers
    for(i=0; i<diffsizeindexf; i++) write_blk(out_line, fout, ""); // write until next cluster !

// All Above IS actually the INDEXF.SYS. Now:
// create 000000.DIR, files are in alphabetical order
    int pos=0;
    struct _dir  *pDIR;
    struct _dir1 *pDIR1;
    for(i=0; i<512; i++) out_line[i]=0; //clear all

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"000000.DIR");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=4;
    pDIR1->dir$fid.fid$w_seq=4;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"BACKUP.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=8;
    pDIR1->dir$fid.fid$w_seq=8;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"BADBLK.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=3;
    pDIR1->dir$fid.fid$w_seq=3;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"BADLOG.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=9;
    pDIR1->dir$fid.fid$w_seq=9;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"BITMAP.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=2;
    pDIR1->dir$fid.fid$w_seq=2;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"CONTIN.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=7;
    pDIR1->dir$fid.fid$w_seq=7;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"CORIMG.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=5;
    pDIR1->dir$fid.fid$w_seq=5;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"INDEXF.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=1;
    pDIR1->dir$fid.fid$w_seq=1;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    pDIR = (struct _dir *) (out_line+pos);
    pDIR1 = (struct _dir1 *) (out_line+pos+16);
    pDIR->dir$w_size=22;
    pos=pos+24;
    strcpy(pDIR->dir$t_name,"VOLSET.SYS");
    pDIR->dir$b_namecount=10;
    pDIR1->dir$fid.fid$w_num=6;
    pDIR1->dir$fid.fid$w_seq=6;
    pDIR->dir$w_verlimit=1;
    pDIR->dir$b_flags=0;
    pDIR1->dir$w_version=1;
    pDIR1->dir$fid.fid$b_rvn=0;
    pDIR1->dir$fid.fid$b_nmx=0;

    out_line[pos]=255;
    out_line[pos+1]=255; // (-1) word

    write_blk(out_line, fout, "directory file"); //write directory file - only one record, but one cluster is used
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    for(i=0; i<clustersize-1; i++) write_blk(out_line, fout, "");

// create BITMAP.SYS
    //write storage control block
    struct _scbdef *pSCB;
    for(i=0; i<512; i++) out_line[i]=0; //clear all
    pSCB = (struct _scbdef *) out_line;
    pSCB->scb$w_struclev=2*256+1;
    pSCB->scb$w_cluster=clustersize;
    pSCB->scb$l_volsize=volumesize;
    pSCB->scb$l_blksize=16065;
    pSCB->scb$l_sectors=63;
    pSCB->scb$l_tracks=255;
    pSCB->scb$l_cylinders=4998;
    do_checksum(out_line);
    write_blk(out_line, fout, "bitmap.sys SCB"); //write storage control block, some missing information...

    //storage bitmap

    // nbr of clusters on volume = volumesize/clustersize, at worse we loose clustersize-1 blocks
    int nbrcluster=volumesize/clustersize;

    // nbr of blocks in storage bitmap = roundup( ( (double) (volumesize/clustersize))/4096);
    //storagebitmapsize=roundup( ( (double) (volumesize/clustersize))/4096);
    for(i=0; i<512; i++) out_line[i]=255; //make all 512 first clusters free

    //(indexfilesize/clustersize+bitmapfilesize/clustersize+clustersize) clusters will be used.
    // indexf.sys + bitmap.sys + 000000.dir
    //It cannot be more that 512, and don't ask me why...
    int usedclusters=(indexfilesize/clustersize)+(bitmapfilesize/clustersize)+1;
    j=0;
    while(j<usedclusters)
    {
        out_line[j/8] = out_line[j/8] << 1;
        j++;
    }
    if (storagebitmapsize > 1)
    {
        write_blk(out_line, fout, "storage bitmap");

        for(i=0; i<512; i++) out_line[i]=255; //make rest of clusters free, except last one
        for(i=0; i<storagebitmapsize-2; i++) write_blk(out_line, fout, "");
    }
    j=(storagebitmapsize*4096)-nbrcluster;  //last block, some cluster bits are unusable
    i=0;
    while(i<j)
    {
        out_line[511-(i/8)] = out_line[511-(i/8)] >> 1;
        i++;
    }
    if (storagebitmapsize > 1)
        write_blk(out_line, fout, "");
    else
        write_blk(out_line, fout, "storage bitmap");
    for(i=0; i<512; i++) out_line[i]=0;
    for(i=0; i<diffsizebitmap; i++) write_blk(out_line, fout, ""); // write until next cluster !

    for(i=0; i<512; i++) out_line[i]=0;
    printf("Clearing %d blocks\n",volumesize-(usedclusters*clustersize));
    for(i=0; i<volumesize-(usedclusters*clustersize); i++) write_blk(out_line, fout, "");
}