static void WriteBinData( void ) /**********************************************************/ /* copy code from extra memory to loadfile */ { group_entry *group; SECTION *sect; DEBUG(( DBG_BASE, "Writing data" )); OrderGroups( CompareDosSegments ); CurrSect = Root; // needed for WriteInfo. Root->outfile->file_loc = Root->u.file_loc; Root->sect_addr = Groups->grp_addr; /* write groups and relocations */ for( group = Groups; group != NULL; ) { sect = group->section; CurrSect = sect; if( group->totalsize ) { WriteDOSGroup( group ); CodeSize += group->totalsize; } group = group->next_group; } }
static void WriteRDOSData( void ) /**********************************************************/ /* copy code from extra memory to loadfile */ { group_entry *group; SECTION *sect; struct seg_leader *leader; SEGDATA *piece; int iscode; int isdata; DEBUG(( DBG_BASE, "Writing data" )); /* write groups and relocations */ for( group = Groups; group != NULL; ) { if( leader != group->leaders ) { iscode = 0; isdata = 0; leader = group->leaders; if( leader && leader->size && Extension == E_RDV ) { piece = leader->pieces; if( piece ) { if( piece->iscode && ( leader->seg_addr.seg == FmtData.u.rdos.code_seg ) ) { iscode = 1; } if( ( piece->isidata || piece->isuninit ) && ( leader->seg_addr.seg == FmtData.u.rdos.data_seg ) ) { isdata = 1; } } } } sect = group->section; CurrSect = sect; if( isdata ) { sect->u.file_loc = HeaderSize + CodeSize + DataSize; if( StackSegPtr != NULL ) { if( group->totalsize - group->size < StackSize ) { StackSize = group->totalsize - group->size; group->totalsize = group->size; } else { group->totalsize -= StackSize; } } WriteDOSGroup( group ); if( group->totalsize > group->size ) PadLoad( group->totalsize - group->size ); DataSize += group->totalsize; } group = group->next_group; } }
static unsigned long WriteDOSData( unsigned_32 mz_hdr_size ) /**********************************************************/ /* copy code from extra memory to loadfile */ { group_entry *group; SECTION *sect; unsigned long header_size; outfilelist *fnode; bool repos; unsigned long root_size; DEBUG(( DBG_BASE, "Writing data" )); OrderGroups( CompareDosSegments ); CurrSect = Root; // needed for WriteInfo. header_size = WriteDOSRootRelocs( mz_hdr_size ); Root->u.file_loc = header_size; if( Root->areas != NULL ) { Root->outfile->file_loc = header_size + Root->size; WalkAllOvl( &AssignFileLocs ); EmitOvlTable(); } // keep track of positions within the file. for( fnode = OutFiles; fnode != NULL; fnode = fnode->next ) { fnode->file_loc = 0; } Root->outfile->file_loc = Root->u.file_loc; Root->sect_addr = Groups->grp_addr; /* write groups and relocations */ root_size = 0; for( group = Groups; group != NULL; ) { sect = group->section; CurrSect = sect; fnode = sect->outfile; repos = WriteDOSGroup( group ); group = group->next_group; if( ( group == NULL ) || ( sect != group->section ) ) { if( sect == Root ) { root_size = fnode->file_loc; } else { WriteDOSSectRelocs( sect, repos ); } } if( repos ) { SeekLoad( fnode->file_loc ); } } return( root_size ); }
static void WriteRDOSCode( void ) /**********************************************************/ { group_entry *group; SECTION *sect; struct seg_leader *leader; SEGDATA *piece; int iscode; int isdata; DEBUG(( DBG_BASE, "Writing code" )); OrderGroups( CompareDosSegments ); CurrSect = Root; // needed for WriteInfo. Root->outfile->file_loc = Root->u.file_loc; Root->sect_addr = Groups->grp_addr; leader = 0; /* write groups and relocations */ for( group = Groups; group != NULL; ) { if( leader != group->leaders ) { iscode = 0; isdata = 0; leader = group->leaders; if( leader && leader->size && Extension == E_RDV ) { piece = leader->pieces; if( piece ) { if( piece->iscode && ( leader->seg_addr.seg == FmtData.u.rdos.code_seg ) ) { iscode = 1; } if( ( piece->isidata || piece->isuninit ) && ( leader->seg_addr.seg == FmtData.u.rdos.data_seg ) ) { isdata = 1; } } } } sect = group->section; CurrSect = sect; if( iscode ) { sect->u.file_loc = HeaderSize + CodeSize; WriteDOSGroup( group ); if( group->totalsize > group->size ) PadLoad( group->totalsize - group->size ); CodeSize += group->totalsize; } group = group->next_group; } }
static unsigned_32 WritePharData( unsigned file_pos ) /***************************************************/ { group_entry *group; outfilelist * fnode; bool repos; DEBUG(( DBG_BASE, "Writing data" )); OrderGroups( CompareOffsets ); CurrSect = Root; // needed for WriteInfo. fnode = Root->outfile; fnode->file_loc = file_pos; Root->u.file_loc = file_pos; Root->sect_addr = Groups->grp_addr; for( group = Groups; group != NULL; group = group->next_group ) { repos = WriteDOSGroup( group ); if( repos ) { SeekLoad( fnode->file_loc ); } } return( fnode->file_loc - file_pos ); }