int digi_init (GPPort *port, CameraPrivateLibrary *priv) { char c[0x14]; int i,j=0; unsigned char *catalog = calloc(0x4010,1); unsigned char *catalog_tmp; if (!catalog) return GP_ERROR_NO_MEMORY; SQWRITE (port, 0x0c, 0x14f4, 0x0, NULL, 0); SQREAD (port, 0x0c, 0xf5, 0x00, c, 0x14); SQWRITE (port, 0x0c, 0x1440, 0x110f, NULL, 0); digi_reset (port); SQWRITE (port, 0x0c, 0x14f0, 0x0, NULL, 0); gp_port_read (port, c, 0x14); digi_reset(port); SQWRITE (port, 0x0c, 0x20, 0x40, NULL, 0); gp_port_read(port, (char *)catalog, 0x4000); /* We need 16 bytes for each photo. */ digi_reset (port); /* The first occurence of a zero denotes end of files entries */ for (i=0; i<0x4000 && catalog[i]; i+=16); priv->nb_entries = i>>4; catalog_tmp = realloc(catalog, i+16); memset (catalog_tmp+i, 0, 16); if (i) { /* * 0x913c cameras allow individual photo deletion. This causes * the relevant catalog line to start with 0x64. So the related * lines of config data must be removed, and the deleted * images need to be cast out from the count. */ for (j=0; j<i; j+=16) { if ((!catalog[j])||(catalog_tmp[j] == 0x64)) { memcpy(catalog_tmp+j, catalog_tmp+j+16, i+16-j); priv->nb_entries -- ; } } if (catalog_tmp) priv->catalog = catalog_tmp; else priv->catalog = catalog; } else { free (catalog); priv->catalog = NULL; /* We just have freed catalog_tmp */ } digi_reset (port); priv->last_fetched_entry = -1; priv->init_done=1; return GP_OK; }
int digi_rewind (GPPort *port, CameraPrivateLibrary *priv) { static char dummy_buf[0x4000]; GP_DEBUG("REWIND cam's data pointer"); /* One has to read the catalog to rewind the data stream... * I don't know if it's by design. There ought to be something better to do... :-/ */ digi_reset(port); SQWRITE (port, 0x0c, 0x20, 0x40, NULL, 0); /* Access config */ gp_port_read(port, dummy_buf, 0x4000); digi_reset (port); priv->last_fetched_entry = -1; return GP_OK; }
int digi_delete_all (GPPort *port, CameraPrivateLibrary *priv) { int size; int num_pics; unsigned char get_size[0x50]; unsigned char *junk=NULL; num_pics = priv->nb_entries; GP_DEBUG("number of entries is %i\n", num_pics); digi_reset (port); digi_reset (port); if(!num_pics) { GP_DEBUG("Camera is already empty!\n"); return GP_OK; } SQWRITE (port, 0x0c, 0x1440, 0x110f, NULL, 0); if ((gp_port_read(port, (char *)get_size, 0x50)!=0x50)) { GP_DEBUG("Error in reading data\n"); return GP_ERROR; } GP_DEBUG("get_size[0x40] = 0x%x\n", get_size[0x40]); size = get_size[0x40]|(get_size[0x41]<<8)|(get_size[0x42]<<16)| (get_size[0x43]<<24); GP_DEBUG("size = 0x%x\n", size); if(size <= 0xff) { GP_DEBUG("No size to read. This will not work.\n"); digi_reset(port); return GP_OK; } junk = malloc(size); if(! junk) { GP_DEBUG("allocation of junk space failed\n"); return GP_ERROR_NO_MEMORY; } gp_port_read(port, (char *)junk, size); free(junk); digi_reset (port); return GP_OK; }
int HandleTestKey(int key) { switch (key) { #ifdef SHOW_EXIT_PATH case KEY_DEBUGGED+KEY_1: create_special_path(); break; #endif case KEY_DEBUGGED+KEY_Y: do_controlcen_destroyed_stuff(NULL); break; case KEY_BACKSP: case KEY_CTRLED+KEY_BACKSP: case KEY_ALTED+KEY_BACKSP: case KEY_SHIFTED+KEY_BACKSP: case KEY_SHIFTED+KEY_ALTED+KEY_BACKSP: case KEY_CTRLED+KEY_ALTED+KEY_BACKSP: case KEY_SHIFTED+KEY_CTRLED+KEY_BACKSP: case KEY_SHIFTED+KEY_CTRLED+KEY_ALTED+KEY_BACKSP: Int3(); break; case KEY_DEBUGGED+KEY_S: digi_reset(); break; case KEY_DEBUGGED+KEY_P: if (Game_suspended & SUSP_ROBOTS) Game_suspended &= ~SUSP_ROBOTS; //robots move else Game_suspended |= SUSP_ROBOTS; //robots don't move break; case KEY_DEBUGGED+KEY_K: Players[Player_num].shields = 1; break; // a virtual kill case KEY_DEBUGGED+KEY_SHIFTED + KEY_K: Players[Player_num].shields = -1; break; // an actual kill case KEY_DEBUGGED+KEY_X: Players[Player_num].lives++; break; // Extra life cheat key. case KEY_DEBUGGED+KEY_H: if (Player_is_dead) return 0; Players[Player_num].flags ^= PLAYER_FLAGS_CLOAKED; if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) { #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_cloak(); #endif ai_do_cloak_stuff(); Players[Player_num].cloak_time = GameTime64; } break; case KEY_DEBUGGED+KEY_R: cheats.robotfiringsuspended = !cheats.robotfiringsuspended; break; #ifdef EDITOR //editor-specific functions case KEY_E + KEY_DEBUGGED: window_set_visible(Game_wind, 0); // don't let the game do anything while we set the editor up init_editor(); window_close(Game_wind); break; case KEY_C + KEY_SHIFTED + KEY_DEBUGGED: if (!Player_is_dead && !( Game_mode & GM_MULTI )) move_player_2_segment(Cursegp,Curside); break; //move eye to curseg case KEY_DEBUGGED+KEY_W: draw_world_from_game(); break; #endif //#ifdef EDITOR case KEY_DEBUGGED+KEY_LAPOSTRO: Show_view_text_timer = 0x30000; object_goto_next_viewer(); break; case KEY_DEBUGGED+KEY_SHIFTED+KEY_LAPOSTRO: Viewer=ConsoleObject; break; case KEY_DEBUGGED+KEY_O: toggle_outline_mode(); break; case KEY_DEBUGGED+KEY_T: *Toggle_var = !*Toggle_var; break; case KEY_DEBUGGED + KEY_L: if (++Lighting_on >= 2) Lighting_on = 0; break; case KEY_DEBUGGED + KEY_SHIFTED + KEY_L: Beam_brightness=0x38000-Beam_brightness; break; case KEY_PAD5: slew_stop(); break; #ifndef NDEBUG case KEY_DEBUGGED + KEY_F11: play_test_sound(); break; case KEY_DEBUGGED + KEY_SHIFTED+KEY_F11: advance_sound(); play_test_sound(); break; #endif case KEY_DEBUGGED + KEY_M: Debug_spew = !Debug_spew; if (Debug_spew) { HUD_init_message_literal(HM_DEFAULT, "Debug Spew: ON" ); } else { HUD_init_message_literal(HM_DEFAULT, "Debug Spew: OFF" ); } break; case KEY_DEBUGGED + KEY_C: do_cheat_menu(); break; case KEY_DEBUGGED + KEY_SHIFTED + KEY_A: do_megawow_powerup(10); break; case KEY_DEBUGGED + KEY_A: { do_megawow_powerup(200); break; } case KEY_DEBUGGED+KEY_SPACEBAR: //KEY_F7: // Toggle physics flying slew_stop(); game_flush_inputs(); if ( ConsoleObject->control_type != CT_FLYING ) { fly_init(ConsoleObject); Game_suspended &= ~SUSP_ROBOTS; //robots move } else { slew_init(ConsoleObject); //start player slewing Game_suspended |= SUSP_ROBOTS; //robots don't move } break; case KEY_DEBUGGED+KEY_COMMA: Render_zoom = fixmul(Render_zoom,62259); break; case KEY_DEBUGGED+KEY_PERIOD: Render_zoom = fixmul(Render_zoom,68985); break; #ifndef NDEBUG case KEY_DEBUGGED+KEY_D: if ((GameArg.DbgUseDoubleBuffer = !GameArg.DbgUseDoubleBuffer)!=0) init_cockpit(); break; #endif #ifdef EDITOR case KEY_DEBUGGED+KEY_Q: stop_time(); dump_used_textures_all(); start_time(); break; #endif case KEY_DEBUGGED+KEY_B: { newmenu_item m; char text[FILENAME_LEN]=""; int item; m.type=NM_TYPE_INPUT; m.text_len = FILENAME_LEN; m.text = text; item = newmenu_do( NULL, "Briefing to play?", 1, &m, NULL, NULL ); if (item != -1) { do_briefing_screens(text,1); } break; } case KEY_DEBUGGED+KEY_SHIFTED+KEY_B: if (Player_is_dead) return 0; kill_and_so_forth(); break; case KEY_DEBUGGED+KEY_G: GameTime64 = (0x7fffffffffffffffLL) - (F1_0*10); HUD_init_message(HM_DEFAULT, "GameTime %li - Reset in 10 seconds!", GameTime64); break; default: return 0; break; } return 1; }