short pass2( void ) { short int i; unsigned short reloc; register SCNHDR *sec_hdr_ptr; register SEC_DATA *sec_data_ptr; register unsigned long size; SYMBOL *sym; long where_we_were; char section_name[SYMNMLEN + 1]; pass = 2; size = 0; section_name[SYMNMLEN] = '\0'; for( i = 1, sec_hdr_ptr = §ion_header[1]; i <= (short) section_cnt; ++i, ++sec_hdr_ptr ) { strncpy( section_name, sec_hdr_ptr->s_name, SYMNMLEN); sym = symbol_lookup( section_name ); if( NULL == sym ) FATAL_ERROR("Couldn't find section header in symbol table - pass2.c:pass2()"); sym->value = 0L; if( i > 1 ) update_symbol_table( 0L, (long) size, (long) i ); size += (sec_hdr_ptr->s_size / ((sec_hdr_ptr->s_flags & SECTION_PM) == SECTION_PM ? PM_WORD_SIZE : DM_WORD_SIZE)); } if( (obj_fd = fopen( obj_name, UPDATE_BINARY )) == NULL ) { FATAL_ERROR("Error opening object file"); } header_ptr = ftell( obj_fd ); /* Seek past the object file and section headers so we can write the * the raw data for each section. */ fseek( obj_fd, (long)(header_ptr + FILHSZ + AOUTSZ + section_cnt * SCNHSZ), 0 ); glob_sym_fd = temp_file_create( WRITE_BINARY ); glob_sym_temp_index = num_open_files - 1; stat_sym_fd = temp_file_create( WRITE_BINARY ); stat_sym_temp_index = num_open_files - 1; sym_fd = temp_file_create( WRITE_BINARY ); sym_temp_index = num_open_files - 1; rel_fd = temp_file_create( WRITE_BINARY ); rel_temp_index = num_open_files - 1; line_fd = temp_file_create( WRITE_BINARY ); line_temp_index = num_open_files - 1; reloc = 0; size = 0; for( i = 1, sec_hdr_ptr = §ion_header[1], sec_data_ptr = §ion_data[1]; i <= (short) section_cnt; ++i, ++sec_hdr_ptr, ++sec_data_ptr ) { num_line = 0; num_reloc = 0; /* Code generation time */ code_process( temp_file[sec_data_ptr->temp_file_index], (long) size, i ); sec_hdr_ptr->s_nlnno = (unsigned short) num_line; sec_hdr_ptr->s_nreloc = (unsigned short) num_reloc; reloc += sec_hdr_ptr->s_nreloc; size += (sec_hdr_ptr->s_size / ((sec_hdr_ptr->s_flags & SECTION_PM) == SECTION_PM ? PM_WORD_SIZE : DM_WORD_SIZE)); } fixup_symbol_table( sym_fd ); flush_files(); /* Write the finished table to the symbol table file */ if( (glob_sym_fd = fopen(temp_file[glob_sym_temp_index], READ_BINARY )) == NULL ) FATAL_ERROR("Error opening global symbol temp file"); if( (stat_sym_fd = fopen(temp_file[stat_sym_temp_index], READ_BINARY )) == NULL ) FATAL_ERROR("Error opening static symbol temp file"); dump_symbols(); fclose( glob_sym_fd ); fclose( stat_sym_fd ); fflush( sym_fd ); fclose( sym_fd ); /* Write the object file header and the section headers */ where_we_were = ftell( obj_fd ); fseek( obj_fd, 0L, 0 ); object_headers(); fseek( obj_fd, where_we_were, 0 ); /* Write the relocation info to the object file */ if( (rel_fd = fopen(temp_file[rel_temp_index], READ_BINARY)) == NULL ) FATAL_ERROR("Error opening temp relocation file"); write_all_relocation_info( (long) reloc ); fclose( rel_fd ); if( !check_if_errors() ) { /* Append the line number entries, symbol table, and string table * to the end of the object file. */ copy_section( temp_file[line_temp_index] ); copy_section( temp_file[sym_temp_index] ); write_string_table(); fflush( obj_fd ); fclose( obj_fd ); delete_temp_files(); return( 0 ); } else { asm_exit( FATAL ); } }
void _start() #endif { dnload(); dnload_SDL_Init(SDL_INIT_VIDEO); #if defined(DNLOAD_GLESV2) && !defined(DNLOAD_VIDEOCORE) dnload_SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); dnload_SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); dnload_SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); #endif g_sdl_window = dnload_SDL_CreateWindow(NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_W, SCREEN_H, SDL_WINDOW_OPENGL | (FLAG_FULLSCREEN ? SDL_WINDOW_FULLSCREEN : 0)); #if defined(DNLOAD_GLESV2) && defined(DNLOAD_VIDEOCORE) videocore_create_native_window(SCREEN_W, SCREEN_H); egl_init(reinterpret_cast<NativeWindowType>(&g_egl_native_window), &g_egl_display, &g_egl_surface); #else dnload_SDL_GL_CreateContext(g_sdl_window); #endif dnload_SDL_ShowCursor(0); #if defined(USE_LD) glewInit(); #endif #if defined(DNLOAD_GLESV2) g_program_fragment = create_program(g_shader_vertex_quad, g_shader_fragment_quad); dnload_glUseProgram(g_program_fragment); g_uniform_t = dnload_glGetUniformLocation(g_program_fragment, "t"); #else // Shader generation inline. GLuint pipeline; GLuint program_vert = dnload_glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &g_shader_vertex_quad); g_program_fragment = dnload_glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &g_shader_fragment_quad); dnload_glGenProgramPipelines(1, &pipeline); dnload_glBindProgramPipeline(pipeline); dnload_glUseProgramStages(pipeline, 1, program_vert); dnload_glUseProgramStages(pipeline, 2, g_program_fragment); #endif unsigned start_ticks = dnload_SDL_GetTicks(); for(;;) { SDL_Event event; unsigned curr_ticks = dnload_SDL_GetTicks() - start_ticks; dnload_SDL_PollEvent(&event); if((curr_ticks >= INTRO_LENGTH) || (event.type == SDL_KEYDOWN)) { break; } draw(curr_ticks); swap_buffers(); } teardown(); #if defined(USE_LD) return 0; #else asm_exit(); #endif }