The other day, I saw that Bard’s Tale for Android had an Apple IIGS emulator hiding in it. Given that the game was $2.99, and I have an HP TouchPad running Android handy, I decided to grab it, just to see what was going on with the emulator.
Here’s my initial analysis, in the form of a YouTube video (sorry for the poor quality):
Bard’s Tale (Android) embedded Apple IIGS emulator – YouTube
So, now that I had identified what the emulator actually was, I decided to go for a deeper look.
All executable code is within the APK, and it appears to be all done in libBardTale.so. (Interestingly, a MIPS version is included.)
Well, the easiest thing here is to break out strings
, and take a look at what’s in there. Line numbers given are of the strings
output on the armeabi-v7a version of libBardTale.so. Click to expand.
I’ll start with the KEGS-related ones, given that was my intent.
_ZN3JBE9SingletonIN7BT_KEGS7DiskManEE11s_pInstanceE
_ZN7BT_KEGS7DiskManD2Ev
_ZN7BT_KEGS7DiskMan3RunEv
_Z11insert_diskiiPKciiS0_i
_ZN7BT_KEGS7DiskManC1ENS_6GameIDE
_ZN3JBE9SingletonIN7BT_KEGS7DiskManEE21s_bAllowImpliciteInitE
_ZTVN7BT_KEGS4DiskE
_ZZN3JBE3Mem7SysHeapINS0_8MainHeapEE10GetInstBufEvE4sBuf
_ZTVN7BT_KEGS4SlotE
_ZnajPN3JBE3Mem4HeapEPKcz
_ZN7BT_KEGS7DiskManC2ENS_6GameIDE
_ZTVN7BT_KEGS12TextureClassE
_ZN7BT_KEGS14KeyboardActiveEv
_ZN7BT_KEGS8ShutdownEv
_Z13update_windowv
g_full_refresh_needed
g_upd_count
g_border_special_refresh_needed
g_a2_screen_buffer_changed
g_status_refresh_needed
g_border_sides_refresh_needed
_Z14x_hide_pointeri
_Z13x_full_screeni
_Z17show_xcolor_arrayv
_Z25x_dialog_create_kegs_confPKc
_Z12x_show_alertiPKc
_Z16x_auto_repeat_oni
_Z14x_update_coloriiiij
_Z26x_update_physical_colormapv
_Z12x_calc_ratioRfS_
_Z11x_push_donev
_Z21x_redraw_status_linesv
_Z9adb_abortv
_Z5rowIsPhhhh
_Z15setup_kegs_filePciiiPPKc
_Z11macsnd_initPj
_Z14set_audio_ratei
_Z16child_sound_loopiiPj
_Z14mac_send_audioPhi
_Z13x_push_kimageP7_Kimageiiiiii
bitmapBytesPerRow
bitmapData
_Z20child_sound_init_macv
_Z16x_release_kimageP7_Kimage
_Z11xdriver_endv
bitmapDataRGBA
g_screen_depth
g_mainwin_kimage
_ZN7BT_KEGS19StartEnableKeyboardEv
_ZN7BT_KEGS20StartDismissKeyboardEv
_Z12x_get_kimageP7_Kimage
_ZN7BT_KEGS15ConfirmShutdownEv
_ZN7BT_KEGS15VirtualKeyboardEv
_ZN7BT_KEGS15DismissKeyboardEv
localtime
_Z8kegsmainiPPc
_ZN7BT_KEGS10S5D2DialogEv
_ZTV9KBTexture
_Z14dev_video_initv
bitmapByteCount
_Z17video_get_kimagesv
_Z16video_get_kimageP7_Kimageiii
_Z22video_update_color_rawii
g_screen_mdepth
g_lores_colors
g_a2palette_8to1624
g_palette_8to1624
g_installed_full_superhires_colormap
_ZN3JBE4Sort9QuickSortI8KeyStateNS_2RT5ArrayENS0_17DefaultComparatorIS2_EEEEvRT0_IT_EiiRKT1_
_Z18check_input_eventsv
g_limit_speed
g_num_lines_prev_superhires
_Z12update_mouseiiii
_Z12set_halt_acti
_Z23adb_physical_key_updateii
_Z8do_resetv
g_use_shmem
g_auto_repeat_on
g_x_shift_control_state
g_alt_left_up
g_alt_right_up
g_adb_init
_Z7adb_logji
g_adb_log_pos
g_adb_state
g_adb_log
_Z12show_adb_logv
_Z12read_adb_ramj
adb_memory
g_rom_version
g_c025_val
_Z17adb_get_keypad_xyi
g_keypad_key_is_down
_Z19mouse_compress_fifod
g_mouse_fifo_pos
g_mouse_fifo
_Z15adb_access_c010v
g_hard_key_down
g_kbd_chars_buffered
g_kbd_buf
g_kbd_read_no_update
_Z13adb_read_c025v
_Z19adb_is_cmd_key_downv
_Z22adb_is_option_key_downv
_Z19adb_increment_speedv
_Z18adb_kbd_repeat_offv
g_key_down
_Z13adb_read_c027v
_Z11halt_printfPKcz
halt_on_all_c027
g_c027_val
g_adb_mouse_valid_data
g_adb_interrupt_byte
g_adb_data_pending
g_adb_mouse_coord
_Z9adb_errorv
_Z13write_adb_ramji
_Z16adb_set_new_modej
g_adb_mode
_Z14adb_set_configjjj
g_mouse_ctl_addr
g_kbd_ctl_addr
g_adb_repeat_delay
g_adb_repeat_rate
_Z19adb_clear_mouse_intv
_Z10remove_irqj
_Z15mouse_read_c024d
g_mouse_dev_addr
g_mouse_a2_x
g_mouse_a2_y
g_slow_memory_ptr
g_mem_size_total
g_warp_pointer
g_memory_ptr
g_hide_pointer
g_mouse_a2_button
g_unhide_pointer
_Z18adb_clear_data_intv
_Z14adb_write_c027i
_Z13adb_read_c026v
g_irq_pending
g_adb_data
_Z17adb_clear_kbd_srqv
_Z9adb_resetv
g_kbd_dev_addr
g_kbd_reg0_pos
g_kbd_reg3_16bit
_Z17adb_add_mouse_intv
_Z7add_irqj
_Z12halt2_printfPKcz
g_mouse_raw_x
g_mouse_raw_y
g_cur_dcycs
g_mouse_warp_x
g_mouse_warp_y
g_num_lines_prev_superhires640
_Z16adb_add_data_intv
_Z13adb_key_eventii
g_config_control_panel
g_a2code_down
g_cfg_vbl_count
g_adb_repeat_vbl
_Z22adb_virtual_key_updateii
g_virtual_key_up
_Z13adb_read_c000v
_Z19adb_response_packetij
_Z17adb_kbd_talk_reg0v
g_kbd_reg0_data
_Z14adb_send_bytesijjj
_Z14adb_send_1bytej
_Z10do_adb_cmdv
g_adb_cmd
g_adb_cmd_data
_Z14adb_write_c026i
g_adb_cmd_len
g_adb_cmd_so_far
g_adb_char_set
g_adb_repeat_info
g_adb_layout_lang
_Z15adb_add_kbd_srqv
_Z17adb_kbd_reg0_dataii
_Z23cfg_toggle_config_panelv
_Z20change_a2vid_palettei
g_swap_paddles
g_joystick_type
g_fast_disk_emul
g_a2vid_palette
g_fullscreen
g_invert_paddles
_Z15adb_all_keys_upv
_Z8adb_initv
_Z7my_exiti
_Z27cfg_get_dsk_from_slot_driveii
_Z15cfg_get_fd_sizei
fstat
_Z10eject_diskP5_Disk
_Z22iwm_flush_disk_to_unixP5_Disk
g_c031_disk35
g_config_kegs_update_needed
_Z17eject_disk_by_numii
_Z16eject_named_diskP5_DiskPKcS2_
_Z12fatal_printfPKcz
_Z17iwm_move_to_trackP5_Diski
system
_Z33cfg_partition_find_by_name_or_numiPKciP5_Disk
_Z19disk_set_num_tracksP5_Diski
_Z16disk_unix_to_nibP5_Diskiiii
unlink
g_highest_smartport_unit
g_track_bytes_35
g_track_nibs_35
_Z16config_load_romsv
_Z18x_config_load_romsv
_Z29x_config_load_additional_romsv
g_rom_cards_ptr
g_rom_fc_ff_ptr
g_rom_c600_rom01_diffs
g_mem_size_exp
g_user_page2_shadow
g_save_cur_a2_stat
_Z8cfg_exitv
_Z13cfg_htab_vtabii
g_cfg_curs_x
g_cfg_curs_y
g_cfg_curs_inv
g_cfg_curs_mousetext
_Z17cfg_dirent_sortfnPKvS0_
_Z13cfg_str_matchPKcS0_i
_Z14cfg_fix_topentP12_Cfg_listhdr
_Z24x_clk_setup_bram_versionv
g_bram_ptr
g_bram
_Z11cfg_putchari
_Z12set_memory_cjji
_Z9cfg_cleolv
g_screen_index
_Z8cfg_homev
_Z20cfg_shorten_filenamePKci
g_cfg_file_shortened
_Z32config_generate_config_kegs_namePciP5_Diski
_Z17cfg_get_base_pathPcPKci
g_cfg_file_match
_Z19cfg_free_alldirentsP12_Cfg_listhdr
_Z19cfg_file_update_ptrPc
_Z21load_roms_init_memoryv
g_cfg_file_strptr
g_cfg_rom_path
_Z22cfg_partition_selectedv
g_cfg_partitionlist
g_cfg_slotdrive
g_cfg_file_path
g_cfg_select_partition
_Z19cfg_file_add_direntP12_Cfg_listhdrPKciiii
_Z17cfg_get_disk_namePciii
_Z13cfg_file_initv
g_cfg_tmp_path
g_cfg_file_curpath
g_cfg_dirlist
g_cfg_file_def_name
_Z14cfg_parse_menuP9_Cfg_menuiii
strtoul
g_cfg_opt_buf
g_cfg_opts_strs
g_cfg_opts_vals
_Z10cfg_printfPKcz
g_cfg_printf_buf
_Z13cfg_print_numii
_Z8cfg_statPcP4stat
_Z16cfg_file_readdirPKc
g_cfg_file_cachedpath
g_cfg_file_cachedreal
g_cfg_file_min_size
g_cfg_file_max_size
_Z13cfg_file_drawv
g_config_kegs_name
g_cfg_file_pathfield
g_cfg_cwd_str
_Z24cfg_partition_read_blockiPvii
lseek
_Z23cfg_partition_make_listi
_Z21cfg_maybe_insert_diskiiPKc
_Z17cfg_file_selectedv
_Z19cfg_file_handle_keyi
_Z20config_control_panelv
_Z12video_updatev
_Z11micro_sleepd
_Z19change_display_moded
g_save_text_screen_bytes
g_cur_a2_stat
g_a2_new_all_stat
g_new_a2_stat_cur_line
g_cfg_main_menu
g_fatal_log
g_cfg_rom_menu
_Z29config_write_config_kegs_filev
_Z14clk_write_bramP7__sFILE
_Z17config_vbl_updatei
g_config_kegs_auto_update
g_kegs_rom_card_list
g_kegs_rom_names
g_mem_size_base
_Z17config_parse_bramPcii
_Z12clk_bram_setiii
_Z19config_parse_optionPciii
strtol
_Z15kegs_malloc_strPc
g_cfg_defval_index
g_cfg_defvals
_Z29config_parse_config_kegs_filev
_Z13clk_bram_zerov
getcwd
fgets
chdir
g_config_kegs_buf
_Z17config_init_menusP9_Cfg_menu
_Z11config_initv
g_config_kegs_name_list
_Z20cfg_text_screen_dumpv
fputs
g_reparse_delay
g_cfg_disk_menu
g_cfg_joystick_menu
g_cfg_serial_menu
g_kegs_c1rom_names
g_kegs_c2rom_names
g_kegs_c3rom_names
g_kegs_c4rom_names
g_kegs_c5rom_names
g_kegs_c6rom_names
g_kegs_c7rom_names
g_joystick_scale_factor_x
g_joystick_scale_factor_y
g_joystick_trim_amount_x
g_joystick_trim_amount_y
g_raw_serial
g_serial_out_masking
g_serial_modem
g_force_depth
g_video_line_update_interval
g_video_extra_check_inputs
g_user_halt_bad
_Z7get_numv
got_num
line_ptr
a2bank
a3bank
a1bank
_Z13debugger_helpv
_Z11do_gen_testii
_Z7show_bpv
_Z21dis_do_pattern_searchv
_Z13do_debug_loadv
_Z9show_lineP7__sFILEjjiPc
_Z14dis_do_comparev
_Z12get_memory_cji
g_a4
g_a4bank
_Z12show_hex_memijiji
_Z7xam_memi
_Z18dis_get_memory_ptrj
_Z16show_one_toolsetP7__sFILEij
_Z6do_disP7__sFILEjiiij
_Z14get_memory16_cji
_Z14get_memory24_cji
_Z13do_debug_listv
list_kpc
__sF
_Z13do_debug_unixv
old_mode
_Z14dis_do_memmovev
_Z9read_linePci
fcntl
_Z5do_gov
_Z12clr_halt_actv
_Z8run_progv
_Z9show_regsv
_Z7do_stepv
_Z8do_blankv
enter_debug
g_stepping
halt_sim
_Z9delete_bpj
_Z14setup_pageinfov
g_num_breakpoints
g_breakpts
_Z6set_bpj
_Z10fixup_brksv
_Z19show_toolset_tablesjj
_Z14do_debug_intfcv
fflush
_Z12show_scc_logv
_Z14show_scc_statev
_Z23show_bankptrs_bank0rdwrv
_Z15smartport_errorv
_Z16show_dtime_arrayv
_Z15show_all_eventsv
_Z11show_pc_logv
_Z9show_pmhzv
_Z14iwm_show_trackii
_Z14iwm_show_statsv
_Z22doc_show_ensoniq_statei
_Z18show_a2_line_stuffv
_Z16show_toolbox_logv
_Z21video_show_debug_infov
_Z14add_event_stopd
hex_line_len
stop_run_at
w_buff
g_testing_enabled
Halt_on
Verbose
_Z11do_adc_sbc8jjji
_Z12do_adc_sbc16jjji
_Z10get_itimerv
g_fcycles_stop
g_ignore_halts
g_code_red
_Z22fixed_memory_ptrs_shutv
g_slow_memory_ptr_allocated
g_dummy_memory1_ptr_allocated
g_rom_fc_ff_ptr_allocated
g_rom_cards_ptr_allocated
g_dummy_memory1_ptr
_Z22fixed_memory_ptrs_initv
_Z14memalloc_aligniiPPv
_Z17check_breakpointsj
_Z19set_memory8_io_stubjjPhPdd
_Z13set_memory_iojiPd
slow_mem_changed
page_info_rd_wr
g_last_vbl_dcycs
_Z14set_memory24_cjji
_Z24set_memory24_pieces_stubjjPdP6_Fplusi
_Z24set_memory16_pieces_stubjjPdddi
_Z14set_memory16_cjji
_Z19get_memory8_io_stubjPhPdd
_Z13get_memory_iojPd
_Z24get_memory24_pieces_stubjPhPdP6_Fplusi
_Z24get_memory16_pieces_stubjPhPdP6_Fplusi
_Z22get_remaining_operandsjjjP6_Fplus
_Z12enter_engineP11_Engine_reg
g_ret1
g_ret2
g_wait_pending
g_testing
g_num_brk
g_num_cop
bogus
g_engine_c_mode
defs_instr_start_8
defs_instr_end_8
defs_instr_start_16
defs_instr_end_16
op_routs_start
op_routs_end
_Z14iwm_init_driveP5_Diskiii
_Z9iwm_resetv
g_iwm_motor_on
_Z16iwm_read_enable2d
_Z26iwm_read_enable2_handshaked
g_cnt_enable2_handshake
_Z17iwm_write_enable2id
_Z21sector_to_partial_nibPhS_
_Z13show_hex_dataPhi
_Z25iwm_nibblize_track_nib525P5_DiskP4_TrkPhi
_Z18disk_nib_end_trackP5_Disk
_Z16iwm_show_a_trackP4_Trk
_Z12disk_nib_outP5_Diskhi
_Z16disk_4x4_nib_outP5_Diskj
_Z17iwm_read_data_525P5_Diskid
g_fast_disk_unnib
g_iwm_fake_fast
_Z16iwm_read_data_35P5_Diskid
_Z13iwm_read_dataP5_Diskid
_Z17iwm_denib_track35P5_DiskP4_TrkiPh
from_disk_byte
_Z14disk_unnib_4x4P5_Disk
_Z18iwm_denib_track525P5_DiskP4_TrkiPh
_Z23disk_check_nibblizationP5_DiskiPhi
_Z22iwm_nibblize_track_525P5_DiskP4_TrkPhi
g_check_nibblization
_Z21iwm_nibblize_track_35P5_DiskP4_TrkPhi
_Z18disk_track_to_unixP5_DiskiPh
_Z17iwm_read_status35d
_Z19iwm525_phase_changeii
_Z8iwm_initv
from_disk_byte_valid
_Z18iwm_write_data_525P5_Diskjid
g_slow_525_emul_wr
g_dcycs_end_emul_wr
_Z17iwm_write_data_35P5_Diskjid
_Z14iwm_write_dataP5_Diskjid
_Z15iwm_do_action35d
_Z18iwm_touch_switchesid
_Z9write_iwmiid
_Z8read_iwmid
_Z13iwm_read_c0ecd
_Z8iwm_shutv
_Z14iwm_vbl_updatei
_Z15draw_iwm_statusiPc
_Z24video_update_status_lineiPKc
g_c036_val_speed
_Z12moremem_initv
g_c03ef_doc_ptr
g_c02d_int_crom
g_em_emubyte_cnt
g_c041_val
g_c046_val
g_paddle_buttons
g_c034_val
g_c05x_annuncs
g_c023_val
g_c035_shadow_reg
g_c029_val_some
g_c068_statereg
g_c02b_val
g_c08x_wrdefram
g_zipgs_reg_c059
g_zipgs_reg_c05b
g_zipgs_reg_c05a
g_zipgs_reg_c05c
g_zipgs_unlock
_Z23fixup_any_bank_any_pageiiPhS_
_Z21fixup_bank0_0400_0800v
_Z21fixup_bank0_2000_4000v
_Z14fixup_hires_onv
_Z11fixup_intcxv
_Z14fixup_wrdeframi
_Z11fixup_altzpv
_Z11fixup_ramrdv
_Z12fixup_ramwrtv
_Z13fixup_lcbank2v
_Z11fixup_rdromv
_Z17fixup_shadow_txt1v
_Z17fixup_shadow_txt2v
_Z19fixup_shadow_hires1v
_Z19fixup_shadow_hires2v
_Z16fixup_shadow_shrv
_Z17fixup_shadow_iolcv
_Z17update_shadow_regi
_Z22fixup_shadow_all_banksv
transwarpcode
_Z9show_addrPh
_Z13show_bankptrsi
_Z19get_lines_since_vbld
_Z17read_vid_countersid
_Z9in_vblankd
_Z11fixup_page2d
_Z12set_stateregdi
_Z13fixup_st80cold
_Z8io_writejiPd
_Z22check_for_new_scan_intd
_Z16clock_write_c034j
_Z19change_border_colordi
_Z13scc_write_regijd
_Z14scc_write_dataijd
_Z14doc_write_c03cid
_Z14doc_write_c03did
_Z14paddle_triggerd
g_c033_data
g_num_shadow_all_banks
transwarp_low_val
_Z13doc_read_c030d
__aeabi_d2ulz
_Z7io_readjPd
_Z9float_busd
_Z12read_paddlesdi
g_kegs_version_str
g_zip_pmhz
_Z13doc_read_c03dd
_Z13doc_read_c03cd
_Z13scc_read_dataid
_Z12scc_read_regid
g_emustate_intlist
g_emustate_dbllist
g_emustate_word32list
g_paddle_trig_dcycs
_Z26paddle_fixup_joystick_typev
g_joystick_native_type2
g_joystick_native_type
g_joystick_native_type1
_Z27paddle_update_trigger_dcycsd
g_paddle_val
g_paddle_dcycs
_Z20paddle_trigger_moused
_Z21paddle_update_buttonsv
_Z23joystick_update_buttonsv
_Z21paddle_trigger_keypadd
_Z15joystick_updated
_Z7scc_logijd
g_scc_log_pos
g_scc_log
_Z17scc_evaluate_intsi
scc_stat
_Z19scc_clr_zerocnt_inti
_Z19scc_set_zerocnt_inti
_Z14scc_clr_tx_inti
_Z18scc_maybe_tx_eventid
_Z13add_event_sccdi
_Z19scc_handle_tx_eventid
_Z14scc_clr_rx_inti
_Z16scc_maybe_rx_intid
_Z18scc_maybe_rx_eventid
_Z18scc_add_to_readbufijd
g_scc_overflow
g_code_yellow
_Z19scc_add_to_readbufvidPKcz
_Z18scc_maybe_br_eventid
_Z12do_scc_eventid
_Z20scc_try_fill_readbufid
_Z23scc_socket_fill_readbufiid
_Z27scc_serial_mac_fill_readbufiid
_Z25scc_try_to_empty_writebufid
_Z25scc_socket_empty_writebufid
_Z29scc_serial_mac_empty_writebufi
_Z10scc_updated
_Z13scc_port_initi
_Z15scc_socket_initi
_Z19scc_serial_mac_initi
_Z19scc_add_to_writebufijd
_Z12scc_transmitijd
_Z16scc_regen_clocksi
_Z24scc_socket_change_paramsi
_Z28scc_serial_mac_change_paramsi
g_baud_table
_Z14scc_reset_porti
_Z19scc_hard_reset_porti
_Z9scc_resetv
_Z8scc_initv
_Z20sim65816_initglobalsv
g_halt_on_bad_read
g_ignore_bad_acc
g_use_alib
g_iw2_emul
g_config_iwm_vbl_count
g_pause
g_stp_pending
g_num_irq
g_num_enter_engine
g_io_amt
g_engine_action
g_engine_halt_event
g_engine_scan_int
g_engine_doc_int
g_debug_file_fd
g_25sec_cntr
g_last_vbl_dadjcycs
g_1sec_cntr
g_natcycs_lastvbl
g_dadjcycs
g_dnatcycs_1sec
_Z13show_regs_actP11_Engine_reg
g_event_start
_Z16setup_zip_speedsv
g_recip_projected_pmhz_zip
_Z8init_regv
_Z16clear_fatal_logsv
g_fatal_log_strs
_Z15memory_ptr_shutv
g_memory_alloc_ptr
_Z21load_roms_shut_memoryv
_Z10must_writeiPci
_Z12kegs_vprintfPKcSt9__va_list
_Z9size_failijj
_Z6do_stpv
_Z6do_waiv
_Z6do_wdmj
_Z8do_breakj
_Z18remove_event_entryi
g_event_free
_Z16remove_event_scci
_Z16remove_event_doci
_Z24check_for_one_event_typei
_Z6do_copj
_Z13handle_actionj
_Z7do_c700j
_Z7do_c70aj
_Z7do_c70dj
_Z8take_irqi
_Z10do_vbl_intv
_Z15add_event_entrydi
_Z19check_scan_line_intdi
g_scan_int_events
_Z11do_scan_intdi
_Z17add_event_vid_updi
_Z13add_event_vblv
_Z11update_60hzdd
g_vbl_index_count
g_sim_sum
sim_time
g_cur_sim_dtime
dtime_array
g_dadjcycs_array
g_sim_mhz
g_doc_vol
g_line_ref_amt
g_cycs_in_check_input
g_cycs_in_refresh_line
g_cycs_in_refresh_ximage
g_refresh_bytes_xfer
g_cycs_in_sound2
g_cycs_in_sound3
g_cycs_in_start_sound
g_fvoices
g_cycs_in_est_sound
g_cycs_in_sound1
g_num_snd_plays
g_num_doc_events
g_num_start_sounds
g_num_recalc_snd_parms
g_cycs_in_40col
g_cycs_in_xredraw
_Z12sound_updated
_Z12clock_updatev
g_cycs_in_io_read
g_cycs_in_sound4
g_num_scan_osc
g_dtime_expected
g_dtime_last_vbl
g_projected_pmhz
g_recip_projected_pmhz_unl
g_dtime_this_vbl_array
g_dtime_exp_array
g_dtime_pmhz_array
g_dtime_eff_pmhz_array
_Z13add_event_docdi
_Z17initialize_eventsv
g_event_list
_Z12quitEmulatorv
_Z24check_engine_asm_definesv
g_recip_projected_pmhz_slow
g_recip_projected_pmhz_fast
g_speed_fast
_Z9get_dtimev
_Z23video_update_event_linei
_Z16doc_handle_eventid
_Z16kegs_expand_pathPcPKci
g_argv0_path
_Z10end_screenv
g_kegs_default_paths
_Z15memory_ptr_initv
_Z11video_resetv
_Z11sound_resetd
_Z22clk_setup_bram_versionv
_Z10video_initv
_Z10sound_initv
_Z13joystick_initv
_Z14sound_shutdownv
putenv
g_accept_events
g_initialized
g_audio_enable
g_screen_redraw_skip_amt
g_preferred_rate
g_display_env
g_use_dhr140
g_use_bw_hires
_Z19toolbox_debug_4bytej
_Z15toolbox_debug_cjjPd
g_toolbox_log_pos
g_toolbox_log_array
doc_ram
g_log_pc_ptr
g_log_data_end_ptr
g_log_data_start_ptr
g_log_data_ptr
g_log_pc_end_ptr
g_log_pc_start_ptr
g_memory_ptr_allocated
g_pc_log_array
g_data_log_array
g_dtime_diff3_array
_Z13smartport_logjiii
g_smpt_log_pos
g_smpt_log
_Z12do_format_c7i
_Z11do_write_c7iji
_Z10do_read_c7iji
g_audio_rate
g_childsnd_vbl
g_childsnd_shm_addr
g_zeroes_buffered
g_zeroes_seen
g_sound_paused
g_childsnd_pos
_Z18reliable_buf_writePjii
g_bytes_written
_Z19reliable_zero_writei
g_snd_zero_buf
_Z18child_sound_playitj
g_audio_socket
_Z12doc_log_routPcidi
g_doc_log_pos
g_doc_log
g_last_sound_play_dsamp
g_doc_regs
g_drecip_audio_rate
g_dcycs_per_samp
g_daudio_rate
g_dsamps_per_dcyc
g_fsamps_per_dcyc
_Z15show_c030_sampsPii
_Z15show_c030_statev
g_samp_buf
_Z22doc_recalc_sound_parmsidd
g_drecip_osc_en_plus_2
doc_sound_ctl
g_num_c030_fsamps
_Z15check_for_rangePjii
_Z18remove_sound_eventi
_Z17wave_end_estimateidd
_Z11start_soundidd
g_doc_num_osc_en
_Z16remove_sound_irqii
g_num_osc_interrupting
doc_reg_e0
doc_saved_val
_Z13add_sound_irqi
_Z13doc_sound_endiidd
_Z10send_soundii
_Z16close_sound_filev
g_sound_file_fd
_Z15open_sound_filev
g_sound_file_num
g_send_file_bytes
_Z18send_sound_to_filePjii
_Z10sound_playd
g_sound_play_depth
g_last_c030_vbl_count
g_c030_state
g_sound_shm_pos
g_sound_shm_addr
g_send_sound_to_file
g_queued_samps
g_queued_nonsamps
_Z17doc_write_ctl_regiid
g_doc_saved_ctl
g_dcycs_per_doc_update
g_dupd_per_dcyc
g_pipe_fd
_Z28parent_sound_get_sample_ratei
_Z18sound_init_generalv
_Z12show_doc_logv
g_pipe2_fd
g_doc_dsamps_extra
_Z27video_all_stat_to_line_statii
_Z34video_update_all_stat_through_linei
_Z17redraw_changed_griiiiPhi
g_a2_line_left_edge
g_a2_line_right_edge
g_need_redraw
_Z21redraw_changed_dbl_griiiiPhi
_Z23redraw_changed_hires_bwiiiiPhi
_Z26redraw_changed_hires_coloriiiiPhi
_Z20redraw_changed_hiresiiiiiPhi
_Z27redraw_changed_dbl_hires_bwiiiiPhi
_Z30redraw_changed_dbl_hires_coloriiiiPhi
g_dhires_convert
_Z24redraw_changed_dbl_hiresiiiiiPhi
_Z43redraw_changed_super_hires_oneline_nofill_8Phiiijii
g_a2vid_palette_remap
_Z44redraw_changed_super_hires_oneline_nofill_16Phiiijii
_Z44redraw_changed_super_hires_oneline_nofill_32Phiiijii
_Z41redraw_changed_super_hires_oneline_fill_8Phiiijii
_Z42redraw_changed_super_hires_oneline_fill_16Phiiijii
_Z42redraw_changed_super_hires_oneline_fill_32Phiiijii
_Z14refresh_borderv
_Z12read_a2_fontv
g_font40_even_bits
g_font80_off0_bits
g_font80_off1_bits
g_font80_off3_bits
g_font80_off2_bits
g_font40_odd_bits
g_font_array
g_status_ptrs
g_status_buf
_Z26video_convert_kimage_depthP7_KimageS0_iiii
g_kimage_superhires
_Z22redraw_changed_text_80iiiiPhiiii
_Z24video_border_pixel_writeP7_Kimageiijii
_Z18update_border_lineiii
g_cur_border_colors
g_kimage_border_sides
g_kimage_border_special
g_kimage_text
g_border_line24_refresh_needed
_Z18update_border_infov
g_num_border_changes
g_border_last_vbl_changes
g_vbl_border_color
g_border_changes
g_border_color
g_mode_text
g_mode_superhires
g_mode_hires
g_mode_border
g_palette_change_cnt
_Z19check_a2vid_palettev
g_num_a2vid_palette_checks
g_shr_palette_used
_Z23video_update_kimage_ptrii
g_a2_line_kimage
g_kimage_hires
g_red_right_shift
g_green_right_shift
g_red_mask
g_green_mask
g_green_left_shift
g_blue_right_shift
g_blue_left_shift
g_blue_mask
g_red_left_shift
_Z21video_update_colormapv
g_palette_change_summary
_Z24video_update_color_arrayii
_Z33video_rebuild_super_hires_palettejii
g_superhires_scan_save
g_saved_line_palettes
g_expanded_col_0
g_expanded_col_1
g_expanded_col_2
_Z26redraw_changed_super_hiresiiiiPh
g_num_lines_superhires640
_Z22redraw_changed_text_40iiiiPhiiii
_Z19video_refresh_linesiii
g_a2_line_stat
g_num_lines_superhires
_Z25video_push_border_specialv
g_video_act_width
g_video_act_margin_bottom
g_video_act_margin_top
g_video_act_margin_left
_Z29video_push_border_sides_linesiiiii
_Z23video_push_border_sidesv
_Z16video_push_linesP7_Kimageiiii
_Z18video_push_kimagesv
_Z21video_release_kimagesv
_Z25video_update_through_linei
g_vid_update_last_line
g_a2_cur_all_stat
_Z14display_screenv
_Z24video_check_input_eventsv
g_video_dcycs_check_input
g_needfullrefreshfornextframe
g_screen_redraw_skip_count
g_flash_count
g_video_act_margin_right
g_video_act_height
Max_color_size
g_saved_a2vid_palette
g_new_special_border
g_cur_special_border
_Z15update_cur_timev
mktime
g_clk_next_vbl_update
g_clk_cur_time
_Z22clock_update_if_neededv
_Z13do_clock_datav
g_clk_mode
g_clk_reg1
g_clk_read
select
_Z13joystick_shutv
ioctl
_Z26scc_socket_send_modem_codeiid
_Z24scc_socket_modem_connectid
_Z23scc_socket_modem_hangupid
_Z22scc_socket_telnet_reqsid
_Z16scc_socket_closeiid
_Z24scc_socket_make_nonblockid
_Z24scc_socket_open_outgoingid
setsockopt
gethostbyname
__get_h_errno
_Z30scc_socket_maybe_open_incomingid
bind
listen
_Z21scc_socket_recvd_chariid
g_scc_dbg_print_cnt
_Z17scc_accept_socketid
accept
_Z24scc_socket_modem_do_ringid
_Z20scc_socket_do_answerid
_Z21scc_socket_do_cmd_strid
_Z22scc_socket_modem_writeiid
s5d1.tex
s5d2.tex
bt1d1.2mg
bt1_game.tex
bt1d2.2mg
bt1_char.tex
bt2d1.2mg
bt2_game.tex
bt2d2.2mg
bt2_char.tex
s6d1.tex
bt3d1.dsk
bt3_game.tex
bt3d2.dsk
bt3_char.tex
bt3d3.dsk
bt3_dungeonA.tex
bt3d4.dsk
bt3_dungeonB.tex
Are you sure you want to quit?
All progress since last save point will be lost!
Show
Hide
com.inxile.BardTale.common.Keyboard
bt%dsplash.tex
s5d2_bt%d
config.kegs.bt%d
emumap
floppy
emuhelp
KBleft
keyboardbutton
http://bardstale.brotherhood.de/talefiles/1/docs/bt1-manual.htm
http://bardstale.brotherhood.de/talefiles/1/maps/index.html
http://bardstale.brotherhood.de/talefiles/2/docs/bt2-manual.txt
http://bardstale.brotherhood.de/talefiles/2/maps/index.html
http://bardstale.brotherhood.de/talefiles/3/docs/bt3-manual.txt
http://bardstale.brotherhood.de/talefiles/3/maps/index.html
(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
com.inxile.BardTale.common.Dialog
read_c027: g_c027_val: %02x
Adb Error
ADB set mode: %02x!
Bad ADB repeat delay: %02x
Bad repeat rate: %02x
Can’t support kbd interrupts!
read_c026: ret:%02x, pend:%d
Bad ADB state: %d!
Middle button pressed
add_key_event: a2code: %04x!
a2code: %04x!
adb_response_packet, but pending: %d
adb_send_bytes: %d is too many!
g_adb_data_pending: %d
ADB ucontroller cmd %02x unknown!
Had to toss key: %02x, %d
Shift-F6 pressed
g_adb_init = %d!
Try eject dsk:%s, but motor_on!
Invalid slot for insertiing disk: %d
Invalid drive for inserting disk: %d
set -o noclobber;gunzip -c %c%s%c > %c%s%c
Disk image %s does not exist!
Disk 5.25 error: size is %d, not 140K. Will try to mount anyway
Disk 3.5 error: size is %d, not 800K. Will try to mount anyway
,%d,
:%s:
;%d:
Select image for s%dd%d
Select file to use as %-40s
config.kegs path: %-56s
Current KEGS directory: %-50s
Path: %s%s
Select partition of %-50s
%3d:
%-45s
%-44s
%-45s
Partition error: No driver descriptor map found
None – Whole image
Cannot open disk image: %s
Stat’ing %s, st_mode is: %08x
In config_control_panel
YOU MUST SELECT A VALID ROM FILE
Move:
Change:
Eject:
cannot open %s! Stopping!
Open card ROM file %s failed: %d err:%d
While reading card ROM %s, file is too short. (%d) Expected %d bytes, read %d bytes
Open ROM file %s failed:%d, errno:%d
fstat returned %d on fd %d, errno: %d
The ROM size should be 128K or 256K, this file is %d bytes
While reading config.kegs, found malformed bram statement: %s
While reading config.kegs, found bad bram num: %s
bram
cannot open config.kegs at %s! Stopping!
Closing config.kegs ret: %d, errno: %d
CFG_MAX_DEFVAL overflow
name_str is %p = %s, but type: %d
kegs.screen.dump
Could not write to file %s, (%d)
kegs_conf
.config.kegs
Undefined
Disk Configuration
s5d1 =
s5d2 =
s6d1 =
s6d2 =
s7d1 =
s7d2 =
s7d3 =
s7d4 =
s7d5 =
s7d6 =
s7d7 =
s7d8 =
s7d9 =
s7d10 =
s7d11 =
Back to Main Config
Joystick Configuration
Joystick Emulation,0,Keypad Joystick,1,Mouse Joystick,2,Native Joystick 1,3,Native Joystick 2,4,No Joystick
g_joystick_type
Joystick Scale X,0x100,Standard,0x119,+10%,0x133,+20%,0x150,+30%,0xb0,-30%,0xcd,-20%,0xe7,-10%
g_joystick_scale_factor_x
Joystick Scale Y,0x100,Standard,0x119,+10%,0x133,+20%,0x150,+30%,0xb0,-30%,0xcd,-20%,0xe7,-10%
g_joystick_scale_factor_y
Joystick Trim X
g_joystick_trim_amount_x
Joystick Trim Y
g_joystick_trim_amount_y
Swap Joystick X and Y,0,Normal operation,1,Paddle 1 and Paddle 0 swapped
g_swap_paddles
Invert Joystick,0,Normal operation,1,Left becomes right and up becomes down
g_invert_paddles
ROM File Selection
ROM File
g_cfg_rom_path
Serial Port Configuration
Serial Ports,0,Only use sockets 6501-6502,1,Use real ports if avail
g_raw_serial
Serial Output,0,Send full 8-bit data,1,Mask off high bit
g_serial_out_masking
Modem on port 0 (slot 1),0,Simple socket emulation mode,1,Modem with incoming and outgoing emulation
g_serial_modem[0]
Modem on port 1 (slot 2),0,Simple socket emulation mode,1,Modem with incoming and outgoing emulation
g_serial_modem[1]
KEGS Configuration
Force X-windows display depth
g_force_depth
Auto-update config.kegs,0,Manual,1,Immediately
g_config_kegs_auto_update
Speed,0,Unlimited,1,1.0MHz,2,2.8MHz,3,8.0MHz (Zip)
g_limit_speed
Expansion Mem Size,0,0MB,0x100000,1MB,0x200000,2MB,0x300000,3MB,0x400000,4MB,0x600000,6MB,0x800000,8MB,0xa00000,10MB,0xc00000,12MB,0xe00000,14MB
g_mem_size_exp
3200 Color Enable,0,Auto (Full if fast enough),1,Full (Update every line),8,Off (Update video every 8 lines)
g_video_line_update_interval
Keyboard and mouse poll rate,0,60 times per second,1,240 times per second
g_video_extra_check_inputs
Code Red Halts,0,Do not stop on bad accesses,1,Enter debugger on bad accesses
g_user_halt_bad
Enable Text Page 2 Shadow,0,Disabled on ROM 01 (matches real hardware),1,Enabled on ROM 01 and 03
g_user_page2_shadow
Dump text screen to file
Save changes to config.kegs
Exit Config (or press F4)
ROM.01
ROM.03
c600.rom
controller.rom
disk.rom
DISK.ROM
diskII.prom
$%04x
$%04x,X
$%04x,Y
$%06x
($%04x)
($%04x,X)
#$%02x
#$%04x
$%02x
$%02x,X
$%02x,Y
$%06x,X
($%02x)
($%02x),Y
($%02x,X)
[$%02x]
[$%02x],y
$%02x,S
($%02x,S),Y
$%02x,$%02x
tool_set_info
Hit breakpoint at %06x
acc8 unk op: %02x
Halting for native break!
Halting for emul COP at %04x
acc16 unk op: %02x
overflow_sz:%03x, pos:%02x
disk_nib_out, wrote %02x, size: %d
skip, last_read:%f, dcycs:%f, dcyc_p:%f
Bad shift in partial read: %02x, but c_pass:%f, this_nib:%f, shift: %d, size: %d
I just set nib_pos: %d!
track_len: %08x is not a multiple of 4
You wrote to phase %02x! Can’t wr bk to unix!
Reading tachometer!
Read 3.5 status, state: %02x
last_phase: %d!
iwm_init called twice!
Tried to write to type: %d, drive: %d, fd: %d!
Do 3.5 action, state: %02x
Set 3.5 status with drive off!
set iwm_mode:%02x!
read iwm state 3!
Got to end of read_iwm, loc: %02x!
Adjusting image not to write through!
Valid data on a non-whole trk: %03x
Disk:%s trk:%d, unix_pos:%08x, len:%08x
lseek 525: %08x, errno: %d
Drive %s was dirty, but no track was dirty!
s6d1:%2d%s s6d2:%2d%s s5d1:%2d/%d%s s5d2:%2d/%d%s fast_disk_emul:%d,%d c036:%02x
Needed to free dsk->trks: %p
lines_since_vbl: %08x!
lines_since_vbl: %04x, dcycs: %f, last_vbl: %f
Just set rombank = %d
c023 write of %02x!!!
c029: %02x
Illegal c02d write: %02x!
UNIMP WRITE to addr %08x, val: %04x
c036: %2x
write c041: %02x
Wrote ZipGS $c05f: %02x
UNIMP READ to addr %08x
Mega II mouse read: c045
Reading ZipGS $c05d!
Reading ZipGS $c05e!
Reading ZipGS $c05f!
g_cur_a2_stat
g_paddle_buttons
g_em_emubyte_cnt
g_irq_pending
g_c023_val
g_c029_val_some
g_c02b_val
g_c02d_int_crom
g_c031_disk35
g_c033_data
g_c034_val
g_c035_shadow_reg
g_c036_val_speed
g_c03ef_doc_ptr
g_c041_val
g_c046_val
g_c05x_annuncs
g_c068_statereg
g_c08x_wrdefram
g_zipgs_unlock
g_zipgs_reg_c059
g_zipgs_reg_c05a
g_zipgs_reg_c05b
g_zipgs_reg_c05c
g_paddle_trig_dcycs
g_last_vbl_dcycs
g_mem_size_total
@br_dcycs: %f!
do_scc_event: %08x!
Read of RR2B…stopping
Tried reading c03%x with regnum: %d!
Wr c03%x to wr0 of %02x, bad cmd cd:%x!
Wr c03%x to wr3 of %02x!
Wr c03%x to wr4 of %02x!
Wr c03%x to wr5 of %02x!
Wr c03%x to wr6 of %02x!
Wr c03%x to wr7 of %02x!
val & 0x35: %02x
Wr c03%x to wr14 of %02x, bad dpll cd!
Wr c03%x to wr14 of %02x!
Size failure, val: %08x, %08x %08x
Hit STP instruction at: %06x, press RESET to continue
do_wai!
do_wdm: %02x!
do_break, kpc: %06x
remove event_entry: %08x, but not found!
in check_for_1, type %d found at depth: %d, count: %d, at %f
COP instr %02x!
Unknown special action: %08x!
Halting on IRQ
Out of queue entries!
add_event: dcycs: %f, type:%05x, cur_dcycs: %f!
check_scan_line_int: cur_video_line: %d
c023 scan_int and another on line %03x
In do_scan_int
%6.2f
2.8Mhz
1Mhz
8.0Mhz
Unlimited
dcycs:%9.1f sim MHz:%s Eff MHz:%s, sec:%1.3f vol:%02x pal:%x, Limit:%s
xfer:%08x, %5.1f ref_amt:%d ch_in:%4.1f%% ref_l:%4.1f%% ref_x:%4.1f%%
Ints:%3d I/O:%4dK BRK:%3d COP:%2d Eng:%3d act:%3d hev:%3d esi:%3d edi:%3d
snd1:%4.1f%%, 2:%4.1f%%, 3:%4.1f%%, st:%4.1f%% est:%4.1f%% %4.2f
Emulated system state suspect, save work
Code: Yellow
Emulated system state probably corrupt
Code: RED
snd_plays:%4d, doc_ev:%4d, st_snd:%4d snd_parms: %4d %s
KEGS v%-6s Press F4 for Config Menu %s
next.dcycs: %f
Could not find required file “%s” in any of these directories:
%s
*** irq remainings…
-badrd
-noignbadacc
-noignhalt
-test
-hpdev
-alib
-mem
-skip
-audio
-arate
-display
DISPLAY=%s
-noshm
-joystick
-dhr140
set_memory %06x = %02x, stopping
get_memory_io:%08x out of range==halt!
pc_log_out
${HOME}/
${HOME}/Library/KEGS/
${0}/Contents/Resources/
/usr/local/lib/
/usr/local/kegs/
/usr/local/lib/kegs/
/usr/share/kegs/
/var/lib/
/usr/lib/kegs/
${0}/
0.91
do_format_c7: unit_num: %d
c7_fd == %d!
lseek returned %08x, errno: %d
write ret %08x, errno:%d
do_write_c7: unit_num: %d
Tried to write to %08x
Write to %s, but not wr_thru!
write ret %08x bytes, errno: %d
do_read_c7: unit_num: %d
Tried to read from pos %08x on disk, (blk:%04x)
name: %s
Unknown prodos_unit: %d
c70d called native, psr: %03x!
param_cnt %d is != 3!
Unknown unit #: %d
c70d Write done
param_cnt %d is != 1!
c70d Format done
smartport code 0x44 not supported
control code: %02x unknown!
Just did smtport cmd:%02x rts_addr:%04x, cmdlst:%06x
Unknown smtport cmd:%02x, cmd_list:%06x, rts_addr:%06x
Too many clicks per vbl: %d
num_samps: %d > %d!
Sample %d of %d at snd_buf: %p is: %d/%d
start_sound: osc: %02x!
size: %08x is too small, sz: %08x!
start_sound osc: %d, already running!
REMOVE_sound_irq[%02x]=0, but e0: %02x
remove_sound_irq[%02x], but [%02x]=%d!
Reading bad doc_reg[%04x]: %02x
Adding sound_irq for %02x, but irq_p: %d
Osc %d interrupt, but it was already stop!
Doc event for osc %d, but ! running
snd.out.%d
wrote %d not %d
Nested sound_play!
play c030: [%d]:%f is %d, > %d
fpercent: %d = %f
doc_write_ctl_reg: osc: %02x, val: %02x
reset: has_irq[%02x] = %d
reset: num_osc_int:%d
doc_log_out
redraw_changed_text: mem_ptr: %08x
border write but width %d > act %d
ubl, %04x %04x %02x!
ubl-b, mod line is %d
num border changes: %d
update_a2_ptrs: mode: %d unknown!
video_update_color_array: col: %03x
type: %d bad!
video_refresh_lines called with %d, %d
Border line not 192: %d
refresh screen: mode: 0x%02x unknown!
video_push_lines: lines %d to %d, pix %d to %d
Bad c033_data in CLK_IDLE: %02x
CLK_BRAM2: c033_data: %02x!
CLK_BRAM2: clock read!
CLK_BRAM1: said wr, now read
CLK_BRAM1: said rd, now write
Reading time, but in set mode!
Write time, but in read mode!
Writing int reg: %02x with %02x
clk mode: %d unknown!
micro_sleep called with %f!!
/dev/tty.USA19H181P1.1
CONNECT
RING
NO CARRIER
ERROR
CONNECT 1200
CONNECT 9600
CONNECT 19200
CONNECT 14400
So, it’s KEGS, and based on some of the strings, I think it might be based on the Mac version. (Makes sense, there’s unrelated Mach strings in here. This was developed as an iOS game (where using the Mac version of KEGS would make perfect sense), and then was ported to Android as it was.)
In any case, as NJRoadfan pointed out on the comments on YouTube, KEGS is licensed under GPLv2. There’s no source code anywhere here, and no written offer. For that matter, there’s not even credit given.
However, I was informed in the #a2c.chat IRC channel that Kent Dickey actually maintained a version for licensing for commercial purposes, and as I’m not privy to any agreements between Square One, inXile, and Kent Dickey, I won’t call GPL violation just yet. (However, if there is no such agreement, there is a violation here.)
But, well, things get more interesting. Let’s try the braindead obvious one… let’s search for GPL.
The first sign of trouble…
And, for the smoking gun…
libavcodec license: GPL version 2 or later
@libswscale license: GPL version 2 or later
libavutil license: GPL version 2 or later
Naughty, naughty, naughty.
libcurl is also in there, but it’s not GPLed, so that’s fine.
Oh, and did I mention that everything is compiled into one .so file? I do believe that means they’re supposed to open source the whole damn thing. I’m not calling for that, for what it’s worth, just that they not be morons, split out the objects properly, and fulfill their obligations of releasing source code under the GPL v2.
Ball’s in your court, Square One Games Inc. and inXile Entertainment. I’d suggest releasing an update that splits any GPLed code (KEGS if you’re not licensed for closed source distribution of it, the ffmpeg libraries, and any GPLed code that I haven’t found yet) into a separate library, and provide source code for that, per your obligations under the GPL.
Good Work!
BTW, shipping software w/out following GPL requirements puts you in a state of copyright infringement. The normal remedies for this type of situation apply. It doesn’t require or really demand in any way that you put all the software you’ve put in the combined work under the GPL, though that’s one way to remedy the scenario.
Usually a compliant result is “Oops, we’ll stop doing that”, combined with splitting the code out correctly and making the source for the GPL parts available on their web site. Technically hosting the source isn’t required, but the other option of providing shipped media upon request is far more onerous so it’s the only sane thing to do.
A typical corporate non-compliant result is extended silence.
Did you contact inXile? The only party(ies) who can really enjoin them are the copyright holders on the various bits, but surely a concerned third party can let a corp who has made an honest mistake know about their requirement to clean up.